Hallo zusammen,
ich experimentiere seit einigen Tagen mit cec-utils und habe das auch fast soweit dass ich es anwenden.
Der Gedanke der mir kam, es wäre doch viel einfacher, wenn es ein Modul gäbe, welches den CEC-Traffic versteht und in FHEM Devices umsetzt.
Klar, cec ist vom Prinzip her einfach, man kann sich auch sämtliche Befehle mit
http://www.cec-o-matic.com/ zusammenbauen bzw. auch decodieren lassen, aber dann muss für jedes Device ein notify usw eingerichtet werden.
Schöner wäre es, wenn man die Roh Traffic Ausgabe von cec-utils mittels einer named pipe an FHEM weitergeben könnte.
Mein Aufbau bisher:
- ein Raspberry Pi Zero W mit HDMI Kabel am Fernseher
- installierte cecutils und libcec-dev
Ein Script um das cec Tool als "Daemon" zu starten sowie ein-/Ausgabe in Named Pipes zu leiten:
if [ -f "/tmp/cecclient_i.pipe" ]; then
mkfifo /tmp/cecclient_i.pipe
fi
if [ -f "/tmp/cecclient_o.pipe" ]; then
mkfifo /tmp/cecclient_o.pipe
fi
SERVICE="cec-client"
if pgrep -x "$SERVICE" >/dev/null
then
echo "$SERVICE is running"
else
echo "starting $SERVICE"
killall tail
killall cec_reader.sh
(/usr/bin/tail -f /tmp/cecclient_i.pipe | /usr/bin/cec-client -d 8 &) > /tmp/cecclient_o.pipe &
fi
SERVICE="cec_reader.sh"
if pgrep -x "$SERVICE" >/dev/null
then
echo "$SERVICE is running"
else
echo "starting $SERVICE"
/home/pi/cec_reader.sh &
fi
Ein Script um die Ausgabe-Pipe auszulesen, aktuell zu Debug-Zwecken einfach nur in eine Log-umgeleitet, aber daraus kann man ja machen was man möchte:
#!/bin/bash
pipe=/tmp/cecclient_o.pipe
while true
do
if read line <$pipe; then
if [[ "$line" == 'quit' ]]; then
break
fi
echo $line >> /home/pi/cecreader.log
fi
done
echo "Reader exiting"
mit z.B. echo "tx 10:36" > /tmp/cecclient_i.pipe kann ich den TV in standby versetzen (Sender Logical ID:1 ist Raspberry, Empfäner ID:0 der TV, 36 der Code für Standby)
Mit dem oben angegebenen Log-Level (-d

erhält man im Log folgende Ausgaben:
TRAFFIC: [ 1435037] << 1f:84:10:00:01
TRAFFIC: [ 1474721] << 10:36
waiting for input
TRAFFIC: [ 1475601] >> 0f:36
TRAFFIC: [ 1540722] >> 0f:87:00:00:f0
TRAFFIC: [ 1540722] << 1f:87:00:15:82
TRAFFIC: [ 1541692] >> 2f:84:10:00:01
TRAFFIC: [ 1543458] >> 0f:87:00:00:f0
TRAFFIC: [ 1543459] << 1f:87:00:15:82
TRAFFIC: [ 1544428] >> 2f:84:10:00:01
TRAFFIC: [ 1546288] >> 5f:87:00:00:f0
TRAFFIC: [ 1548141] >> 0f:87:00:00:f0
TRAFFIC: [ 1548141] << 1f:87:00:15:82
TRAFFIC: [ 1549111] >> 2f:84:10:00:01
Ohne setzen des Log-Levels bekommt man auch Menschen-Lesbare ausdrücke, aber da denke ich sind diese "Maschinen-Lesbaren" Ausdrücke gerade für Module besser geeignet.
Die Idee also, aus dem Raspberry Pi Zero W eine FHEM Instanz mit einem neu zu schaffenden CEC-Moduls, welches den Stream aus der Ausgabe Pipe bekommt und selbst Befehle in die Eingabe Pipe senden kann. Das Modul erstellt Devices anhand der Physical Address, die Logical Address kann als Attribut/Reading zusätzlich auftauchen.
Bei einem beispielweise "set tv on" (wobei tv eines der neuen devices ist) sendet das neue Modul dann "tx 10:04" an die Eingabe Pipe (10 = Raspberry an TV, 04 = einschalten)
Mittels FHEM2FHEM kann man alle Devices und Readings vom Raspberry Pi Zero W an die Hauptinstanz weiterleiten.
Die Hauptinstanz kann die Befehle dann mit bspw. system("echo 'set tv on' | /usr/bin/socat - TCP:1.2.3.4:7072"); auf der anderen Instanz absetzen.
Die Große Frage, gibt es jemanden der so ein Modul entwickeln möchte? =)