Hey Leute,
super forum =) hab auch schon rumgesucht aber keine Lösung für mein Problem gefunden.
Ich möchte eine IR-Fernbedienung mir lirc anlernen. Dazu werden normalerweise Daten eines IR-Empfängers mit lirc durch irrecord eingelesen und eine lircd.conf Datei erstellt.
Beispiel:
Es soll auf drücken der Tasten 1-9 einer Fernbedienung reagiert werden. Mit irrecord müsste ich dazu erstmal eine Zeit lang mehrere beliebige Tasten an der FB drücken, um zu kalibrieren. Anschließend jede Taste, auf die reagiert werden soll, einzeln benennen und drücken.
Nun soll aber nicht jedes mal die Tastenbezeichnung abgefragt werden, sondern eine Reihenfolge festgelegt werden (z.B. 1-9), in der ich die entsprechenden Tasten an der FB drücke und die Bezeichnung automatisch hinterlegt wird.
Ich hatte mir überlegt, entweder irrecord mit Python aufzurufen, auf dessen Konsolenausgaben zu reagieren und Befehler zu senden, oder die Daten des IR-Empfängers direkt mit Python auslesen und eine lircd.conf Datei erstellen.
Das ganze soll auf einem Raspberry laufen.
Kann mir jemand sagen, ob das irgendwie möglich ist und wie ich das angehen kann?
Danke schonmal =)
lirc irrecord mit python
@platzhalter: Es gibt zumindest Python-Anbindungen wie beispielsweise https://bazaar.launchpad.net/~rockstar/ ... files/head:/ oder https://pypi.python.org/pypi/python-lirc/1.2.1
-
- User
- Beiträge: 2
- Registriert: Donnerstag 3. Dezember 2015, 12:23
Hab mich nun für pipes und erfassen von konsolenein/-ausgaben entschieden.
Beim Testprogramm funktioniert das ein-/ und auslesen ganz gut. Leider scheint stdout.read(1) aber zu blocken, sobald ich versuche die outputs von irrecord zu erfassen und bekomm somit gar keine Ausgabe. Hat jemand ne Idee wo der Fehler liegt?
pytracker.py
test.py
Danke =)
Beim Testprogramm funktioniert das ein-/ und auslesen ganz gut. Leider scheint stdout.read(1) aber zu blocken, sobald ich versuche die outputs von irrecord zu erfassen und bekomm somit gar keine Ausgabe. Hat jemand ne Idee wo der Fehler liegt?
pytracker.py
Code: Alles auswählen
from subprocess import Popen, PIPE, STDOUT
import os
p = Popen (["python", "test.py"], stdout = PIPE, stderr=STDOUT, stdin=PIPE)
# p = Popen(["irrecord", "-f", "-d", "/dev/lirc0", "lircd.conf"], stdout=PIPE, stderr=STDOUT, stdin=PIPE) #damit blockt stdout.read(1)
line= ""
while True:
text = p.stdout.read(1) # hier blockts beim irrecord-Aufruf
if not text: break
line += text
if line.endswith("\n"):
print(line)
sys.stdout.flush()
if "hello" in line:
p.stdin.write("world")
line=""
Code: Alles auswählen
import sys
sys.stderr.write("start test.py\n")
sys.stdout.write("hello\n")
sys.stderr.flush()
sys.stdout.flush()
while True:
nl = sys.stdin.read(1)
if not nl: break
sys.stdout.write(nl)
sys.stdout.flush()
sys.stderr.write("stop test.py\n")
sys.stderr.flush()
@platzhalter: Die erste Frage wäre ob ``irrecord`` überhaupt auf stdout ausgibt.
Dann ist die Umleitung von beiden Ausgabeströmen des externen Programms aber das auslesen von einem der beiden ein Problem. Denn wenn das externe Programm tatsächlich auf beiden etwas ausgibt wird es irgendwann blockieren wenn der/ein Puffer für den Datenstrom voll ist denn Du nicht ausliest.
Dann ist die Umleitung von beiden Ausgabeströmen des externen Programms aber das auslesen von einem der beiden ein Problem. Denn wenn das externe Programm tatsächlich auf beiden etwas ausgibt wird es irgendwann blockieren wenn der/ein Puffer für den Datenstrom voll ist denn Du nicht ausliest.