WDTV Status (Play, Pause, Stopped) an FHEM übermitteln

Begonnen von TeeVau, 28 März 2013, 14:13:30

Vorheriges Thema - Nächstes Thema

TeeVau

Hallo,

ich wollte meine "Quick 'n' dirty" Lösung vorstellen, wie ich den Status meiner WDTV-Live auslese.

Ziel
Ich 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

Vorraussetzungen
Fü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 WDTV
Auf 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/SSH
Bitte unter http://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 erstellen
Scriptdatei 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.sh
Macht 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 testen
Starten 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 beenden
Sollte 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 FHEM

1. Dummy anlegen
define wz_wdtv dummy

2. Notify anlegen
define 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 ;-)
FHEM 5.8 dev (virtualisiert) / FBF 7390 (CUL 868MHz V 1.51 / panStick (AVR1))
FS20: fs20di,fs20pira,fs20sm8,fs20st2,fs20tfk,fs20ue1,fs20ws1
panStamp (AVR1): RGB Multi von ext23, 1W-DSxxxx, I/O Sketch, Spritzpumpe
Multimedia: Panasonic TV (VIERA), Kodi, Yamaha RX-V781, LMS
Sonstiges: XiaomiFlowerSen

Niko

Hallo,

so ein Gerät mit wdlxtv habe ich auch! Kann zwar meine Beleuchtung nicht schalten aber mit fällt sicher noch was sinnvolles ein :-)

Vielen Dank
Gruß Niko