POWER TV – mit Home Easy HE877 (433mhz)

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

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:

 

tx-rx-fritzing-neu[1]

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:

sudo vim /etc/apt/sources.list
die Zeilen einfügen:
deb http://apt.pilight.org/ stable main
deb http://apt.pilight.org/ development main
deb http://apt.pilight.org/ nightly main
Da pilight eine signierte Quelle nutzt, müssen wir den Schlüssel hierfür hinzufügen:
wget -O – http://apt.pilight.org/pilight.key | sudo apt-key add –
Jetzt stellen wir sicher, dass der PI auf dem aktuellsten Stand ist und aktualisieren die Paketliste:
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-cache madison pilight

sehen wir die verfügbaren Versionen:

sudo apt-cache madison pilight
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:

sudo apt-get install pilight=XXXXXXXXXX -y
Eine weitere Konfiguration von pilight kann nach den Anleitungen auf http://www.pilight.org/
vorgenommen werden.
Für meine Lösung ist lediglich das Senden und Empfangen mit  pilight-send wichtig.
Die Home Easy Steckdosen funktionieren mit dem Protokoll „pollin“, dieses muss
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 😉