IRToy Python skript

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Aloha,

    ich will eigentlich das USB IRToy v2 zum laufen bekommen aber das stellt sich als schwieriger als gedacht heraus.
    Das Programm Lirc soll auf jeden Fall irgendwelche Probleme bereiten, allerdings gibt es eine Alternative auf Basis eines Python Skripts siehe hier:
    https://github.com/crleblanc/PyIrToy

    Also erstmal die pip geschichte installiert und dann das Skript, was scheinbar auch erfolgreich war.
    Bin zwar nicht sicher ob es auch richtig funktioniert aber die LED auf dem IRToy blinkt sobald ich eine Taste auf meiner Fernbedienung drücke (find das schonmal ein gutes Zeichen).

    Jetzt habe ich aber keine Ahnung wie ich dieses Skript anwenden kann, sowohl was empfangen als auch senden angeht.
    Das einzige was ich mal probiert habe ist in der Python Shell zu starten aber da passiert irgendwie auch nichts ( absolut keine ahnung von python etc).

    Evtl habt ihr ja den ein oder anderen Tipp für mich !?

    • Offizieller Beitrag

    Hallo cinds,

    das was du da installiert hast, ist ein python Bibliothek, die macht erstmal gar nichts (auch keine LEDs zum blinken bringen) ;)
    Wenn du nun willst das irgendwas passiert, musst du dir ein Script schreiben, welches diese Bibliothek benutzt. Ein Kurzer blick in die readme verweist auf einen Beispiel Code im Wiki.
    Klick mich. Ein Blick in die irtoy.py zeigt dir welche Funktionen diese Bibliothek bietet.

    Wenn du den Beispiel-Code in eine Datei kopierst (ircodetest.py), ausführbar macht (chmod +x ircodetest.py) und ausführst .(./ircodetest.py), wirst du sehen das auch erstmal nichts sichtbares passiert. Das Testscript startet und wartet auf ein signal vom IrToy, wenn es eines empfängt, sendet es den selben Signal-Code wieder zurück.
    Wenn du die untere Version anstelle des wiki Beispiels kopierst, solltest du wenigstens eine Ausgabe auf der console sehen. (man beachte das zusätzliche print)

    Soweit die Theorie :)

  • Ah oke ... so wird eher ein Schuh draus :lol:

    Wird auf jeden Fall gleich mal ausprobiert ... ich fürchte aber theorie und praxis unterscheiden sich wie so oft, also
    to be continued ...

    Das ding blinkt aber dennoch aus unerfindlichen gründen wenn eine Fernbedienung vorgehalten wird :cool:

  • Nachdem ich Lirc noch eine chance geben wollte habe ich nochmal folgendes Tutorial abgearbeitet:
    http://dangerousprototypes.com/forum/viewtopic.php?f=29&t=2737&p=26881#p26878
    Scheitere jedoch am Schluss Lirc zu starten :@ ... soviel mal nebenbei .


    Also wieder zurück zu dem Python Skript allerdings habe ich damit ebenfalls ein paar Probleme.
    Habe mal deine Beschreibung hergenommen also Datei erstellt dann ausführbar machen (ging irgendwie nur mit root rechten ohne Fehler)

    Beim starten dann folgende Ausgabe bzw Fehler:

    Code
    pi@raspberrypi ~/pyirtoy $ ./ircodetest.py
    ./ircodetest.py: line 1: import: command not found
    ./ircodetest.py: line 2: import: command not found
    ./ircodetest.py: line 4: syntax error near unexpected token `('
    ./ircodetest.py: line 4: `with serial.Serial('/dev/ttyACM0') as serialDevice:'

    Und da muss ich sagen habe ich keine Ahnung warum der Import nicht klappt.
    Den Syntaxfehler find ich auch merkwürdig, der code sieht mir nämlich richtig aus.

    Ich benötige Weise Ratschläge :D

  • Hallo cinds,

    ruf das Skript mal mit folgendem Befehl auf.

    Code
    python ircodetest.py

    Wenn es so funktioniert solltest du die folgende Zeile ganz am Anfang von deinem Python-Skript einfügen. Danach sollte auch dein Aufruf funktionieren.

    Code
    #!/usr/bin/env python

    Die Fehlermeldungen kommen meiner Meinung nach daher, weil das Python-Skript von der Bash ausgeführt wird und nicht vom Python-Interpreter. Da die Syntax dann nicht passt und Befehle wie import in der Bash nicht bekannt sind, kommen diese Fehlermeldungen.

    Gruß Georg

  • Danke euch schonmal :D
    Also es klappt bisher alles, also kann ich nun mit dem IrToy entsprechend des Skripts Signale empfangen/versenden.

    Nun fehlt eigentlich nur noch die Ir Signale in einer Textdatei abzuspeichern und von da aus wiederzugeben. Habe dazu mal in das oben gepostete Skript ein paar Zeilen eingefügt die aber noch nicht ganz klappen (Fragen dazu unten):


    Also erstmal lässt sich die Textdatei nicht ohne root Rechte öffnen, auch mit chmod +x test.txt klappt das nicht (was ich gehofft habe).

    Der erste write Befehl "fobj.write(irCode)" schmeißt dann auch schon den ersten Fehler. Die Methode in "irCode" sollte doch eigentlich geschrieben werden können oder ? oO

    Den hinterlegtem Code möchte ich nun mittels "toy.transmit()" senden, bin mir aber nicht sicher wie ich das am besten anstellen kann. Oder ob es möglich ist, nur bestimmte Codes (falls mehrere Codes in einer Textdatei) zu senden.

    Ich hoffe ihr könnt mir da weiterhelfen.

    Das print "Ende"; ist aber grundsolide !!!

    Einmal editiert, zuletzt von cinds (31. Juli 2013 um 08:48)

    • Offizieller Beitrag

    Hiho cinds,

    Damit sollte auch das schreiben in die Textdatei klappen

    Code
    fobj.write("%s" % irCode)

    Du bist dir bewusst das er immer die Datei überschreibt und du somit immer nur einen code drin stehen hast? Wenn du möchtest das er die codes anhängt, benutze

    Code
    fobj = open("test.txt", "a")

    Warum das Ausführbarmachen (chmod +x) das öffnen der Textdatei erleichtern soll, erschliesst sich mir nicht :denker:

    Zum auslesen der Textdatei:

    Code
    fobj = open("test.txt", "r")
    for line in fobj.readlines():
      if line.startswith("bestimmter ir code"):
          toy.transmit(line)
  • Die Codes kann ich nun damit in die Textdatei schreiben,
    senden kann ich sie ebenfalls allerdings nicht über die .txt sondern habe sie in die python Datei gesteckt und mit "toy.transmit(irCodes)" versendet (wobei irCodes = irCodes aus der .txt).
    Die if-Bedingung hatte die ganze Zeit Syntaxfehler geworfen.

    Finde diese Lösung aber fast besser da nicht jedesmal beim versenden die .txt Datei geöffnet werden muss (geringe Laufzeit).

    Bleibt eigentlich nur noch die Frage, ob es möglich ist auf dem Webserver eine Parameterübergabe an das Python Skript, in dem ALLE Ir Codes stehen, machen zu können, um einen bestimmten schließlich zu senden.

    oder

    Ob man für einen bestimmten Ir Code ein einzelnes Python Skript hat, dass auf Event ausgelöst wird ?


    edit:
    Also quasi dieses in ähnlicher Form auf dem Webserver:

    Code
    fobj = open("test.txt", "r")
    for line in fobj.readlines():
    if line.startswith("bestimmter ir code"):
          toy.transmit(line)


    (wobei if-Bedingung irgendwie nicht funktioniert)

    Einmal editiert, zuletzt von cinds (31. Juli 2013 um 13:08)

    • Offizieller Beitrag

    Du musst natürlich "bestimmter ir code" durch deinen IR Code ersetzen den es auch wirklich gibt bzw. der da auch in der Datei drin steht.
    Die Fehlermeldung wäre interessant, kann auch sein das er ein line.strip() erwartet um das Enter Zeichen hinter der Zeile Abzuschneiden.

    Warum willst du dem Script alle IR codes übergeben um dann nur ein zu nehmen? Übergib doch gleich das was du willst.

    ...Obwohl ich immer noch nicht raus hab, was das am Ende werden soll ;)

  • Also die konkrete Fehlermeldung ist folgende:

    Code
    root@raspberrypi:/home/pi/pyirtoy# python ircodetest.py
      File "ircodetest.py", line 28
        if line.startswith():
         ^
    IndentationError: expected an indented block


    Der Code in "bestimmter ir Code" ist eingetragen auch in unterschiedlichen Variation probiert [12, 12 ...] da ich nicht wusste ob es daran liegen könnte. In der txt ist dieser code auch vorhanden ... aber selbst wenn nicht müsste er ja ohne Fehler durchlaufen.


    Naja die Funktion ist leicht erklärt, wie warscheinlich viele haben wir nicht nur einen Fernseher sondern auch unterschiedliche Receiver usw rumstehen. Zum einen will ich die natürlich Steuern über Handy, Pc, zum anderen Events starten wie Schlafen gehen also alles ausschalten (Tv, Receiver, Licht 433 usw) :bravo2:

    Hab mich evtl blöd ausgedrückt, habe einen Webserver auf dem Pi laufen und will mit dem klick auf die Website bzw button einen Ir code senden, also zum Beispiel Tv aus. Jetzt ist die Frage ob ich auf dem Webserver die Variable "Tv aus" hinterlegen kann, welche dann in dem python skript (in der alle Codes sind) sucht und dann auslöst ... oder ob ich durch den klick nur ein Python skript laufen lassen soll welches nur diesen einen Code beinhaltet (hätte dann natürlich einige python skripts) !?

    Also php funktioniert ja irgendwie in der html Geschichte bei python bin ich mir da eben nicht so sicher deswegen die frage

    Einmal editiert, zuletzt von cinds (31. Juli 2013 um 14:07)

    • Offizieller Beitrag

    Jetzt wird es klarer :)

    Die Fehlermeldung ist eindeutig, der Einrückungslevel stimmt nicht. also einmal alle leerzeichen davor löschen und solange <tab> drücken bis du einen schritt weiter bist als "for zeile" darüber.

    Ich würde im Script ein Dictionary anlegen was alle IrCodes enthällt und anschliessend das Gerät als Parameter übergeben

    Code
    variablevonphp = "TV1"
    ir_cdict ={"TV1":"IRCODE1", "Anlage":"IRCODE2"}
    print ir_cdict[variablevonphp]

    wobei du die Erste Zeile natürlich noch anpassen musst, dafür würde dir das argparse modul nahelegen

  • Phyton ist mit der Syntax aber mal ganz schön streng ... bin da jetzt schon einige male drüber gestolpert ...

    Habe es mit dem Dictonary jetzt noch nicht ausprobiert aber sollte ja gut umzusetzen sein mit den tipps von dbv.

    Habe das Projekt jetzt aber erstmal ein wenig auf Eis gelegt, da es eigentlich unüberwindbare Probleme gibt mit dem Irtoy die sich nicht lösen lassen.

    Hintergrund:
    Das Irtoy geht nach längerer nicht Nutzung und wenn der RPi nicht schnell genug die Daten an das Irtoy liefert in den debug modus.
    Das heißt das ding läuft nichtmehr und lässt sich nur durch trennen vom usb port reseten damit es wieder funktioniert. Wenn es jedoch nicht in diesen modus schaltet funktioniert es ziemlich gut, also überträgt die ircodes wie gewünscht und kann diese auch einlesen, für einen alltäglichen gebrauch allerdings aus genannten gründen nicht zu gebrauchen.

    Das ganze kann anscheinend nur mit einem update der firmware richtig gelöst werden.
    Mit der v22 (und v23 test) Firmware funktioniert es leider nicht ...

    • Offizieller Beitrag

    Grade die strenge aber übersichtliche syntax (ohne dabei nervige Zeilenende-zeichen zu verwenden) sehe ich als einen der grössten vorteile von python ;)

    Ist natürlich doof, wenn man hoch motiviert ist und einem dann die hardware einen strich durch die rechnung macht.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!