Mich hat es in der Vergangenheit gestört, dass der Fernseher vergessen wurde auszuschalten
und er dann stunden lang weiter lief. Oft passiert das abends, wenn vergessen wird den
Sleeptimer anzuschalten. Ich habe mir eine kleine Lösung einfallen lassen, die das Problem
löst, es ist genial was alles mit dem Raspberry Pi möglich ist.
Meine Hardware sieht wie folgt aus:
- An jedem Fernseher betreibe ich ein XBMC-Mediacenter Client (z.B. in Form eines
Raspberry PI oder einer TV-Box (z.B. die ATV520 Android-Tv-Box) ). - An jedem Fernseher habe ich eine Funksteckdose vorgeschaltet (z.B. die Home Easy HE877 )
- Als Miniserver zum Steuern, benutze ich einen Raspberry PI als Funkeinheit
- Ausgestattet ist er mit einem 433 mhz Sender/Empfänger,
z.B 1 Set 433Mhz RF Wireless Transmitter und Empfängermodul Grün PCB
- Ausgestattet ist er mit einem 433 mhz Sender/Empfänger,
Im netz existieren viele verschiedene Ausführungen und diese unterscheiden sich in der Qualität.
Während die Sender eigentlich alle gleich gut sind, gibt es bei den Empfängern deutliche Unterschiede!
Hardware mit dem Raspberry Pi verbinden:
Installation der Software auf dem Raspberry
Als Betriebssystem habe ich rasbian (eine Debian Version) von http://www.raspbian.org/ genommen.
Als erstes fügen wir die offiziellen Quellen für pilight hinzu. Dazu öffnen wir die sources.list:
deb http://apt.pilight.org/ development main
deb http://apt.pilight.org/ nightly main
sudo apt-get upgrade -y
sehen wir die verfügbaren Versionen:
pilight | 5.0.4-g56831a6 | http://apt.pilight.org/ nightly/main armhf Packages
Die aktuellste steht dabei immer oben. Da wir, wie bereits erwähnt, die Development Version
installieren wollen, geben wir folgendes ein, wobei wir pilight=5.0.4-g56831a6 mit der im
Moment aktuellsten Version ersetzen:
vorgenommen werden.
nachinstalliert werden.
sudo apt-get install pilight-protocol-pollin
Das Anlernen der Steckdosen geht wie folgt:
1. Die Lern-Taste auf der Steckdose betätigen
2. Power-ON-Befehl mit dem pilight-send programm schicken
pilight-send -p pollin -s 9 -u 02 -t
3. Die Steckdose merkt sich die Daten und man kann mit pilight-send diese Ein/Ausschalten.
-s ist die Homefrequenz
-u die Einheit-Frequenz
Mein Steuerungs-Skript
Zur Steuerung habe ich ein kleines Skript geschrieben:
Die Funktionalität ist recht einfach. Als erstes müssen die IP-Adressen der XBMC-Clients
eingetragen werden. Wenn noch andere IP-Geräte wie zum Beispiel eine Spiele-Console an
dem TV angeschlossen ist, diese unter ExtIP eintragen. Und zum Schluss die Funktion
auswählen, ob der XBMC Client he (shutdownXBMC[i]=1).
Im Intervall (der festgelegt werden kann, Default 120sec) läuft das Skript eine Schleife
durch und testet mit einem JSON-Request an den XBMC-Clients ob sie Aktiv sind
(etwas abgespielt wird). Wenn was abgespielt wird, wird nichts unternommen. Wenn
ein Gerät inaktiv ist, merkt sich das Skript den Zustand und prüft in der nächsten
Periode noch einmal. Wenn der Client immer noch inaktiv ist, wird er ggf.
heruntergefahren (per JSON-Request) und anschließend ein POWER-OFF Signal
an die jeweilige Steckdose geschickt.
Ab dem Zeitpunkt wird die Steckdose einige Zeit lang (konfigurierbar,
Default 15mal => ca. 30-35min) ignoriert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | #!/bin/bash ################################################################################## This is a simple script to shut down the TV with 433mgh network adapter. # # The recognition on tv client works with XBMX JSON API. You should enable it # # in XBMC. This script uses pilight and curls. Make sure that the components # # are already installed and configured. # # # # This script check every x sec the clients for playing media. In case of empty # # playlist, save the state and look check again in the next while-period. # # If the client nothin play again, send a power off signal to the # # TV-adapter and shotdown also the XBMC client. # # # # Created by Peter Schleining, free for personal use. # ################################################################################# # ========================= # Set XBMC-TV clients # ========================= # count of hosts numHosts=3; # set host ip-adress HostName[1]="Zimmer1"; TVHost[1]="192.168.2.11"; # XBMC Host ip (Zimmer1) ExtIP[1]="192.168.2.12" # check second ip ping, if active => stay on shudoXBMC[1]=1 # 0= send only pilight power off signal, 1= send shutdown to xbmc HostName[2]="Zimmer2"; TVHost[2]="192.168.2.13"; # XBMC Host ip (Zimmer2) ExtIP[2]="" # check second ip ping, if active =>; stay on shudoXBMC[2]=0 # 0= send only pilight power off signal, 1= send shutdown to xbmc HostName[3]="Zimmer3"; TVHost[3]="192.168.2.14"; # XBMC Host ip (Zimmer3) ExtIP[3]="" # check second ip ping, if active => stay on shudoXBMC[3]=1 # 0= send only pilight power off signal, 1= send shutdown to xbmc # loop delay in sec, default 120 sec delay=120; # loops until "power off" is sent, default 15 # =>(delay = 120 * 15 = ca. 30min + ping delay) # => send each 30 min for calming a power off looppwr=15; # wait for client shutdown process, default 30 sec waitShdwn=30; # =================== # Pilight settings # =================== # used protocol proto=pollin; # 1. power: s = 1, u= 10 pl_u[1]=10; pl_s[1]=1; # 2. power: s = 1, u= 11 pl_u[2]=11; pl_s[2]=1; # 3. power: s = 1, u= 12 pl_u[3]=12; pl_s[3]=1; # ========================= # DON'T CHANGE! # script init variable # ========================= for i in $(eval echo {1..$numHosts}) do TV[$i]=1; TMR[$i]=0; done # ========================== # run main loop # ========================== while [ 1 ]; do sleep $delay; echo ""; date; echo "==================="; for i in $(eval echo {1..$numHosts}) do # TV$i, ping and get player status by jason request url="http://${TVHost[$i]}/jsonrpc"; string=`curl -i -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "method": "Player.GetActivePlayers", "id": 1}' ${url}` png=$(ping -c 1 ${TVHost[$i]} | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }') if [[ ${#ExtIP[$i]} > 0 ]] then png2=$(ping -c 1 ${ExtIP[$i]} | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }'); else png2=0; fi # if client active, do nothing, else goto if clause if [[ ( $string == *\"result\":[]* && $png2 == 0 ) || ( $png == 0 && $png2 == 0 ) ]] then echo "TV_$i (${HostName[$i]}) can be turned off?"; if [[ ${TV[$i]} == 1 ]] then echo "TV_$i (${HostName[$i]}) not in use, check again in the next round..."; let TV[$i]=0; else if [[ ${TMR[$i]} == 0 ]] then if [[ $png && ( ${shudoXBMC[$i]} == 1 ) ]] then url="http://${TVHost[$i]}/jsonrpc"; # curl -H "Content-type: application/json" -X POST -d $jsonCommand_shutdown $url; string1=`curl -i -X POST -H "Content-Type: application/json" -d '{"jsonrpc": "2.0", "method": "System.Shutdown", "id": 1}' ${url}`; echo "TV_$i (${HostName[$i]}) not in use, send counter_tmp=0; echo "TV_$i (${HostName[$i]}) waiting for shutdown..."; echo $string1; while [ $png == 1 ]; do png=$(ping -c 1 ${TVHost[$i]} | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }') if [ `expr $counter_tmp % 5` == 0 ]; then echo "TV_$i (${HostName[$i]}) ping state:$png - wait $counter_tmp/$waitShdwn sec"; fi if [[ $counter_tmp == $waitShdwn ]] then png=0; else sleep 1; let counter_tmp=counter_tmp+1; fi done fi echo "TV_$i (${HostName[$i]}) pilight send power off...."; sleep 2; pilight-send -p ${proto} -s ${pl_s[$i]} -u ${pl_u[$i]} -f let TMR[$i]=$looppwr; else echo "TV_$i (${HostName[$i]}) was recently turned off, wait ${TMR[$i]} runs until next send..." let TMR[$i]=TMR[$i]-1; fi fi else echo "TV_$i (${HostName[$i]}) is watching, do nothing, relax..."; let TV[$i]=1; let TMR[$i]=0; fi done done |
Speichert das Skript unter tv.sh und macht es mit chmod +x tv.sh ausführbar.
Das Skript kann wie folgt gestartet werden:
./tv.sh > ./tv.log &
Mit dem „&“ läuft es im Hintergrund. Somit kann die SSH-Verbindung beendet werden,
ohne das dass Skript terminiert. Die Ausgabe wird in tv.log umgeleitet. Die Ausgabe
kann mit einem tail -f ./tv.log verfolgt werden.
PS: Wer Rechtschreibfehler findet, kann diese behalten 😉