lirc irrecord mit python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
platzhalter
User
Beiträge: 2
Registriert: Donnerstag 3. Dezember 2015, 12:23

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 =)
platzhalter
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

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=""
test.py

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()
Danke =)
BlackJack

@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.
Antworten