[gelöst] DreamScreen via CLI

  • Hallo liebe Python Guru's,


    Ich habe seit ein paar Tagen den DreamScreen 4k in Betrieb. Alles läuft prima, aber eine Sache ist nervig: Man benötigt immer die App auf'm Handy, um etwas zu ändern bzw. zu schalten.


    Da kam ich auf die Idee, ob man da vielleicht ein Plugin für enigma2 bauen könnte, um Befehle per Fernbedienung zu senden. Aber erstmal ganz primitiv ein Python Skript, was genau ein Kommando senden kann. Alles weitere ist mir erstmal egal.


    Es gibt eine dokumentierte API für das Ding - siehe Anhang.


    Nun bin ich ein totaler Python Noob und hab mal versucht mich einzulesen. Das Ding laut Doku ist, dass man das DS via UDP Port 8888 mit Kommandos versorgen kann - steht alles im PDF. Dort ist auch ein Beispiel und Beispielcode für Android (das kann ich noch weniger ;)).


    Nun habe ich mal folgendes Skript aus dem I-Net zusammengebaut, was laut Doku eigentlich das DS ausschalten sollte (Example: Set Mode 0). Das sieht so aus:



    Die Message ist das Beispiel aus der Doku. Leider tut sich da gar nix. DS geht nicht aus.


    Die Frage also an Python Kenner:


    Kann jemand das Beispiel aus der Doku nachvollziehen und in Python "übersetzen"?
    Ich habe hier ein Beispiel gefunden, von dem ich aber nicht weiß, was das macht, da ich die "Sidekicks" nicht habe. Es geht ja auch nur um den Code, wie man das DS mit Kommandos füttert.


    Vielleicht hat ja auch jemand das DreamScreen und hat sich damit schon mal beschäftigt? :tongue:


    Bin gespannt, ob was kommt... :winking_face:


    Grüße


    EDIT: Aktuelle Version nun immer hier. Immer dran denken (auch bei Updates), in der Datei 'dreamscreen_ip.txt' die eigene DreamScreen-IP einzutragen.


    Update auf r4.
    Die alte Version MUSS vorher deinstalliert werden. Habe den Verzeichnisnamen verkürzt.


    Tausend Dank an sven_h, der mir seeeehr geholfen hat! Ohne ihn hätte ich das nicht hinbekommen!


    Update r5: Fix bei Einstellung der Helligkeit

  • OK - ich hab da im Internet was entdeckt, was genau meinen Wünschen entspricht. Leider fehlt dort die HDR Funktion. Diese hab ich eingebaut, aber das läuft auf einen Fehler.


    Hier sollte aber ein Pythoneer (hoffentlich) helfen können. Das Skript im Anhang hab ich im Web gefunden.


    Wenn ich das Skript so aufrufe:


    Code
    root@dm900:~# ./DreamScreenCLI.py -s 1


    das klappt, wie es soll. Was das macht ist für die Fehlersuche völlig wumpe.
    In diesem Fall wird die Funktion "setSource" aufgerufen.


    Ich habe mir nun in das Skript eine neue Funktion mit Namen "setHDR" nach exakt dem gleichen Schema wie "setSource" erstellt. Wenn ich dies dann aufrufe, läufts auf einen Fehler:


    Code
    root@dm900:~# ./DreamScreenCLI.py -r 1
    error: hdr not a number


    Was läuft da falsch? Offensichtlich wird "options.hdr" nicht als Integer erkannt. Aber warum? Ich sehe 0 Unterschied zur "setSource" Funktion.


    :331:


    Vielen Dank!


    Grüße

  • Bin jetzt kein "Pythoneer", aber ich tät den Fehler eher in der setHDR Funktion mit dem Typo im Variablennamen p(l)ayload sehen:


    Code
    def setHDR(hdr):
        # 0- Off
        # 1- On
        playload=[hdr]
        buildAndSendPacket(3,96, payload)
  • Ich hab's grad selbst auch gefunden. :kaffee:
    Daaaaanke trotzdem! Hätte auch noch Tage dauern können bei mir... :winking_face:
    Nun geht's auch!


    Grüße

  • Aber so mal rumgefragt:


    Hat jemand hier das DreamScreen im Einsatz und hat sich nicht auch schon "geärgert", dass das nur via Handy-App zu bedienen ist?

  • So - und das Beste kommt zum Schluss... :winking_face:


    Ich hab noch nie ein eigenes (installierbares) Plugin für E2 erstellt. Kann mir jemand ein Code-Gerüst geben, wie das geht?


    Mir schwebt vor:


    Ich binde mir (via BP) ein Plugin als Auswahlmenü ein, welches dann folgendes kann:


    Via Farbtaste das Python-Skript mit 2 möglichen Parametern aufrufen (z.b. rot/grün für HDR on/off) und einer Exit-Taste (z.b. blau)


    Besten Dank schonmal.


    Grüße

  • Mag mal bitte jemand helfen, wie man aus einem Python-Skript (dem Plugin, an dem ich gerade bastel) auf der Box ein externes Python Skript mit Parametern aufruft?


    2 Codeschnipsel mit der korrekten Aufruf-Syntax sollten mir eigentlich genügen.


    import <was brauche ich>


    <python-funktion> "mein_externes_skript.py -x 0"


    Da komm ich grad nicht weiter.


    Danke und Gruß

  • sven_h : Danke für den Tip!


    Hab's aber grad vor einer Stunde mit verdammt viel Lesen und Probieren letztlich selber hinbekommen (subprocess.call). :winking_face:


    Falls es jemanden interessen sollte, der auch ein DreamScreen (4k) Set hat:


    Mit meinem billigen Basis-Plugin kann man schonmal einiges einstellen, wozu man sonst die Handy-App benötigen würde. Warum das Plugin nur in GP4 in der Liste auftaucht und nicht in den "normalen" Erweiterungen - keine Ahnung. :face_with_rolling_eyes:


    Ich häng das einfach mal an, falls es jemand brauchen kann. So groß scheint die Nutzerzahl für DreamScreen ja nicht zu sein. Egal.


    Danke an emanuel für das fast 10 Jahre alte "wie bau ich Plugins"-Tutorial. Ohne diese Beispiele hätte ich das niemals hinbekommen. :winking_face:


    Der eigentliche Kern (DreamScreenCLI.py) stammt von hier: https://github.com/genesisfactor/DreamScreenCommander


    So wie ich die Lizenz verstehe, darf ich das verwenden. Wenn nicht, bitte Bescheid geben. Ich hab mich bis dato noch NIE mit sowas beschäftigt.


    Grüße



    Tante Edit sagt: Screenshot nun anbei

  • Wenn du die 3.-vorletzte Zeile im Code gegen diese tauscht, wir das Plugin auch im PluginBrowser erscheinen :winking_face:
    Bisher ja nur im Erweiterungsmenü der blauen Taste (was keine Sache von GP4 ist)


    Code
    where=[ PluginDescriptor.WHERE_EXTENSIONSMENU, PluginDescriptor.WHERE_PLUGINMENU ],


    Die ganze Funktion sollte dann so aussehen:

    Code
    def Plugins(**kwargs):
    	return PluginDescriptor(
    			name="DreamScreenCommander",
    			description="Call DreamScreen commands",
    			where=[ PluginDescriptor.WHERE_EXTENSIONSMENU, PluginDescriptor.WHERE_PLUGINMENU ],
    			icon="dreamscreen.png",
    			fnc=main)
  • sven_h : Danke für den Tip - nun tauchts auch in den Erweiterungen auf.


    Meine letzte Version anbei. Wenn denn jemand so'n Teil hat. Sollte auf allen E2 Kisten laufen.


    Ganz vergessen: Hat ja nicht jeder die gleiche IP Adresse. Ist jetzt ausgelagert in "dreamscreen_ip.txt" im Plugin Verzeichnis.

  • vielen dank für deine Arbeit.


    habe das Dreamscreen 4K Solo - habe alles installiert - IP auch angepasst.


    es tut sich aber nichts. ist 4k und 4K Solo unterschiedlich ? es wird doch glaube ich die gleiche App genutzt.


    vielen dank im voraus

  • Das mit der IP geht bei mir auch (noch) nicht. Ich weiß nicht wieso. Trage die IP einfach im DreamScreenCLI.py "hardcoded" ein und kommentiere das andere aus:


    Code
    IP = "192.168.188.34" ##Put your IP address here 
    #ipaddr = open("dreamscreen_ip.txt") 
    #for line in ipaddr: 
    #	IP=(line.rstrip()) 
    #ipaddr.close()


    So sollte es auf jeden Fall klappen.
    Wenn ich gefunden habe, warum das nicht geht mit dem aus Datei lesen, dann sag ich Bescheid. Mir fehlt heute die Zeit dazu...


    Grüße

  • danke habe ich probiert. aber keine erfolg.


    wie teste ich ob das plugin gestartet ist oder die Verbindung zum dreamscreen geht.


    kann es sein das Dreamscreen Solo 4k anderes angesteuert wird ?

  • Teste das mal via shell mit IP fest im Script verdrahtet:
    Warum das mit "aus Datei lesen" nicht geht, ist mir ein grosses Mysterium - aber egal erstmal.


    Code
    root@dm900:/usr/lib/enigma2/python/Plugins/Extensions/DreamScreenCommander# ./DreamScreenCLI.py -m 0


    Damit sollte das Licht ausgehen - also DS ausschalten.


    Und damit wieder den Video Mode einschalten:


    Code
    root@dm900:/usr/lib/enigma2/python/Plugins/Extensions/DreamScreenCommander# ./DreamScreenCLI.py -m 1


    Funktioniert bei mir einwandfrei.


    Zum testen, ob was gesendet wird, musst Du "tcpdump" auf der Box installieren. Das sollte dann so aussehen (mach eine 2. putty Session auf):


    Meine DS-IP ist 192.168.188.34:


    Code
    root@dm900:~# tcpdump -i eth0 -s 0 host 192.168.188.34


    Da solltest Du sowas sehen, wenn Du ein Kommando sendest:


    Code
    15:37:57.543474 IP dm900.37606 > ESP-429A40.fritz.box.8888: UDP, length 8
    15:37:57.580763 IP ESP-429A40.fritz.box.8888 > 192.168.188.255.8888: UDP, length 8


    Wenn Du ganz genau sehen willst, was gesendet wird, dann schreib den tcpdump in eine Datei (Option -w <datei.pcap> und schau dir das in Wireshark an. Bei mir siehts so aus: siehe Bild
    Das blau markierte ist die Kommandosequenz für DS.


    Ich kann mir nicht vorstellen, dass es bei der Solo anders ist. Mein Plugin ruft ja nur das Skript aus dem Github auf.



    Grüße

  • komm immer noch nicht so ganz klar.


    habe upgedatet auf 1.0-r3


    in DreamScreenCLI.py meine IP fest gegeben - das andere mit raute auskommentiert


    #####Edit these values as needed###############################################
    #IP and group number here (see readme). Touch anything else at your own risk!
    IP = "192.168.16.26" ##Put your IP address here
    #IP = open('/usr/lib/enigma2/python/Plugins/Extensions/DreamScreenCommander/dreamscreen_ip.txt', 'r').read()
    #IP = IP.strip()
    group = 0 ##Optional change only if you have group numbers assigned
    #####End Editabe Values########################################################


    ------------------------------------------------------------------------------------------------------
    dreamscreen_ip.txt - habe ich alles ausgeklammert. meine Frage wie muss die zeile aussehen ?


    #<DreamScreen-IP>
    #<DreamScreen-192.168.16.26>
    #<192.168.16.26>


    -----------------------------------------------------------------------------------------------------


    jetzt habe ich versucht über telnet Dreamsreen ein oder aus zu schalten


    login as: root
    root@dm920:~# cd /usr/lib/enigma2/python/Plugins/Extensions/DreamScreenCommander
    root@dm920:/usr/lib/enigma2/python/Plugins/Extensions/DreamScreenCommander# ./DreamScreenCLI.py -m 0
    -bash: ./DreamScreenCLI.py: /usr/bin/python^M: bad interpreter: No such file or directory
    root@dm920:/usr/lib/enigma2/python/Plugins/Extensions/DreamScreenCommander#


    was mach ich falsch ?


    sorry wenn ich soviel mühe machewo

  • Die Meldung "root@dm920:/usr/lib/enigma2/python/Plugins/Extensions/DreamScreenCommander#
    ./DreamScreenCLI.py -m 0
    -bash: ./DreamScreenCLI.py: /usr/bin/python^M: bad interpreter: No such file or directory"


    deutet darauf, dass das Du es "geschafft" hast, das Python Skript ins DOS Format umzuwandeln mit deinem Editor (nutze Notepad++ in Windows um Linux Dateien zu editieren).
    Hintergrund : Linux kennt nur ein "linefeed" als Zeilen Ende, bei DOS ist ein "Carriage Return", was Dir als "^M" (= Carriage Return) Fehler angezeigt wird.


    Installiere Dir die letzte Version nochmal (r3), ändere nix und trage die IP in "dreamscreen_ip.txt" ein. Das kannst auch mit jedem Editor machen, da das Skript alle "unnützen" Zeichen entfernt.
    Dann nochmal probieren.


    Das DreamScreenCLI.py kann übrigens von jedem OS (auch Windows, macOS, Linux) ausgeführt werden - ich hab "nur" ein Aufruf-Plugin für Enigma2 vorgeschaltet.