Hallo,
ich wollte meine "Quick 'n' dirty" Lösung vorstellen, wie ich den Status meiner WDTV-Live auslese.
ZielIch wollte wissen ob die WDTV gerade ein Video abspielt oder nicht. Dementsprechend wollte ich das Licht im Wohnzimmer schalten.
Bei Play: Deckenleuchte aus, Dekobeleuchtung entsprechend dimmen
Bei "nicht play": Dekobeleuchtung heller dimmen
VorraussetzungenFür meine WDTV Live verwende ich die gehackte Firmware wdlxtv. Ob es auch ohne wdlxtv funktioniert, weis ich leider nicht. Das Projekt ist vermutlich nur für die Interessant, die bereits eine WDTV haben.
Das wdlxtv hat schon lange kein Update mehr gesehen und zudem funktioniert es nicht mit den neuen Geräten von WD. Aber so ein Schätzchen noch in der Ecke hat, freut sich vielleicht ;-)
WDTV Sowie fhem-Server müssen sich Netzwerk technisch natürlich sehen.
Vorbereiten WDTVAuf der WDTV läuft ein Skript in einer Endlosschleife, was per UPnP den Zustand von "CurrentTransportState" ausliest. Bei einer Änderung des State, bei der aktuelle State zu einem FHEM Dummy geschickt.
Damit der Skript nicht sinnlos immer den selben State zu FHEM schickt, speichert das Skript den zu letzt versendeten State in einer lokalen Datei. Nur wenn der neue State sich unterscheidet, wird dieser zu FHEM geschickt.
1. Einloggen WDTV per Telnet/SSHBitte unter http://wiki.wdlxtv.com/Telnet_and_ssh_remote_connections (//wiki.wdlxtv.com/Telnet_and_ssh_remote_connections) nachgucken. Das ist in allen Möglichkeiten dort beschrieben (Telnet, SSH, und per Webbrowser)
2. FHEM Script erstellenScriptdatei anlegen und ausführbar machen:
touch /conf/fhemwrapper.sh
chmod a+x /conf/fhemwrapper.sh
Scriptdatei öffnen:
nano /conf/fhemwrapper.sh
Das folgende Script per copy&paste übernehmen (Die IP-Adresse, sowie Port und Dummy Device von FHEM sind bitte entsprechend zu ersetzen!).
fhemwrapper.sh:
#!/bin/sh
logger -t "fhem_wrapper" -p notice "Start..."
while true; do
old=$(cat /conf/fhemwrapper.dat)
new=$(upnp-cmd GetTransportInfo | grep CurrentTransportState | cut -d " " -f 3)
if [ "$old" != "$new" ] ; then
logger -t "fhem_wrapper" -p notice "Sent new state $new"
echo -e "$new" > /conf/fhemwrapper.dat
echo "set wz_wdtv $new" | nc 192.168.178.1 7072
fi
sleep 2
done
logger -t "fhem_wrapper" -p notice "End..."
3. Start Script erstellen (http://wiki.wdlxtv.com/S99user-script)Damit das Script auch beim booten automatisch startet, muss noch ein Startskript angelegt werden mit:
touch /conf/S99user-script
chmod a+x /conf/S99user-script
config_tool -s; config_tool -s
Scriptdatei öffnen:
nano /conf/S99user-script
Das folgende Script per copy&paste übernehmen (Die IP-Adresse, sowie Port und Dummy Device von FHEM sind bitte entsprechend zu ersetzen!).
S99user-script:
logger -t "S99" -p notice "Start..."
config_tool -c POWER_UP_ACTION='echo "set wz_wdtv on" | nc 192.168.178.1 7072'
config_tool -c POWER_DOWN_ACTION='echo "set wz_wdtv off" | nc 192.168.178.1 7072'
chmod a+x /conf/fhemwrapper.sh
/conf/fhemwrapper.sh &
Erklärung der Befehle:
logger -t "S99" -p notice "Start..."logger schreibt lediglich eine Logmeldung in /tmp/messages.txt.
config_tool -c POWER_UP_ACTION='echo "set wz_wdtv on" | nc 192.168.178.1 7072'dient dazu, das Device in FHEM auf "on" zu setzen, wenn die wdtv per Fernbedienung eingeschaltet wird (NICHT beim booten!)
config_tool -c POWER_DOWN_ACTION='echo "set wz_wdtv off" | nc 192.168.178.1 7072'dient dazu, das Device in FHEM auf "off" zu setzen, wenn die wdtv per Fernbedienung ausgeschaltet wird (NICHT beim shutdown!)
chmod a+x /conf/fhemwrapper.shMacht unser FHEM Sript ausführbar, der Zustand geht nämlich bei jedem reboot verloren.
/conf/fhemwrapper.sh &Startet das FHEM Script im Hintergrund.
4. Script starten und testenStarten des Scriptes mit dem Befehl:
/conf/fhemwrapper.sh &
Beim ersten Start kommt eine Fehlermeldung, dass die Datei "fhemwrapper.dat" nicht gefunden wurde. Einfach ignorieren, die wird danach angelegt.
Der Dummyteilnehmer in FHEM sollte nun den entsprechenden Status der WDTV besitzen. Kontrollieren kann man das über die lokale Logdatei der WDTV.
grep fhem /tmp/messages.txt
Mar 27 12:16:44 WDTVLIVE user.notice fhem_wrapper: Start...
Mar 27 12:31:13 WDTVLIVE user.notice fhem_wrapper: Sent new state STOPPED
Mar 27 12:31:16 WDTVLIVE user.notice fhem_wrapper: Sent new state TRANSITIONING
Mar 27 12:31:21 WDTVLIVE user.notice fhem_wrapper: Sent new state PLAYING
Mar 27 12:51:37 WDTVLIVE user.notice fhem_wrapper: Sent new state STOPPED
Mar 27 13:04:13 WDTVLIVE user.notice fhem_wrapper: Sent new state TRANSITIONING
Mar 27 13:04:16 WDTVLIVE user.notice fhem_wrapper: Sent new state PLAYING
Mar 27 13:10:19 WDTVLIVE user.notice fhem_wrapper: Sent new state STOPPED
5. Script beendenSollte es notwendig sein, warum auch immer, das Skript zu beenden, muss as Script über den "kill" Befehl und die pid beendet werden:
ps |grep fhemwrapper
2849 root 3712 S /bin/sh /conf/fhemwrapper.sh
23077 root 3712 R grep fhemwrapper
Nun die pid unserer Script nehmen, dass ist die erste Zahl in der Zeile (Hier also 2849)
Das Script wird nun beendet mit:
kill 2849
Erneute kontrolle:
ps |grep fhemwrapper
24068 root 3712 S grep fhemwrapper
wie man sieht, kein fhemwrapper.sh mehr.
Vorbereiten FHEM1. Dummy anlegendefine wz_wdtv dummy
2. Notify anlegendefine nn_wz_wdtv_play notify wz_wdtv {}
wz_wdtv {
if("%" eq "PLAYING"){
fhem("set wz_LampeDecke off") if ($value{wz_LampeDecke} ne "off");
if ( $value{mytwilight} > 6 || $value{mytwilight} == 0) {fhem("set wz_LampeBilder dim31%% 3");}
}
elsif ("%" eq "STOPPED" || "%" eq "PAUSED_PLAYBACK"){
if ( $value{mytwilight} > 6 || $value{mytwilight} == 0) {fhem("set wz_LampeBilder dim62%% 2");}
}
}
Viel Spaß damit! :-)
Habe es gestern bei mir umgesetzt und für eine Serie hat es schon funktioniert ;-)