KategorieScripte

Den Fernseher per CEC überwachen

Mein Ziel: Den Fernseher per CEC überwachen. Derzeit wird nur der Schaltzustand protokolliert. Bisher recht stabil und zuverlässig. Benötigt wird ein CEC-fähiges Gerät, wie z.B. einen Raspberry Pi oder einen Pulse Eight CEC-Adapter. Das funktioniert bei mir sogar obwohl mein Raspberry Pi an einem HDMI-Receiver (Onkyo TX-NR626) angeschlossen ist, zusammen mit erwähntem Fernseher.

Wie kann man den Fernseher per CEC überwachen?

Dazu habe ich ein Script geschrieben welches cec-lib nutzt. Die Befehle sind recht übersichtlich und in der Hilfe (cec-client -h) aufgelistet.

Das Script

Neue Version! https://github.com/PacGyver/ha-scripts/blob/master/tv_power.sh

#!/bin/bash
#/usr/bin/screen -dmS tvpower_cec /opt/scripts/cec/tv_power.sh
OUTPUT="/var/state/tvpower"
SLEEP=5
DEVICE=0
STATE=""

(while true; do sleep $SLEEP ; echo "pow $DEVICE"; done) | cec-client -d 8 -p 1 -b 5 -t p | grep power --line-buffered | while read x ; do 
 STATE=`echo $x | awk '{split($0,a,":");print a[2]}' | sed 's/ //'`
 if [ $STATE == "on" -o $STATE == "standby" ] && [ ! "$STATE" == "$PREV_STATE" ]
 then
 echo $STATE | tee $OUTPUT
 PREV_STATE=$STATE
 fi
done

Mit dem Befehl „pow 0“ wird der Zustand des ersten Gerätes abgefragt. Welches Gerät welche ID hat kann man mit cec-client prüfen.

Das Scrip läuft derzeit in einer Screen-Session

/usr/bin/screen -dmS tvpower_cec /opt/scripts/cec/tv_power.sh

OpenRemote

Command

or-command - Fernseher per CEC überwachen

Command Konfiguration in OpenRemote

Sensor

or-sensor - Fernseher per CEC überwachen

Sensor-Konfiguration in OpenRemote

 

Tellstick: Intertechno (und andere) Funkschalter abfragen [tdstatus]

Der Tellstick

An meinem Raspberrypi ist per USB ein „Tellstick Duo“ angeschlossen. Dieser steuert einige Intertechno (ITLR-3500) und Brennenstuhl  Zwischenstecker. Zusätzlich verfüge ich über drei Temperatursensoren der Firma Oregon.

Ich nutze dieses Script um den Status  auszulesen. Genutzt habe ich dazu eine Vorlage welche im Quelltext verlinkt ist. Notwendig war ein eigenes Script aus zwei Gründen:

  • Das Hersteller-Tool „tdtool“ reagiert teilweise empfindlich wenn der Status zu oft abgefragt wird und der ganze Dienst stürzt ab. Das führt dazu, dass sich auch nichts mehr schalten lässt. Daher lese ich für die Funkschalter die Datei „/var/state/telldus-core.conf“ aus und parse diese.
  • Die Ausgabereihenfolge der Temperatursensoren scheint willkürlich zu sein. Ggf. hängt es davon ab welcher Sensor zuerst erkannt wird. Das bereitet mir Schwierigkeiten bei der weiteren Verwendung der Werte.

Abgesehen wollte ich eine einfache Möglichkeit haben die Werte in Openremote weiter zu verarbeiten. Da ich damals noch große Schwierigkeiten mit regulären Ausdrücken hatte ist das Ausgabeformat dafür optimiert.

Verwendung

Aufgerufen wird es entweder ohne Parameter (Status der Zwischenstecker) oder mit dem Parameter „-s“ für die Temperatursensoren. Das Script ist nicht schön und beinhaltet noch einige auskommentierte Zeilen die inzwischen überflüssig sind.

Ausgabe

Ausgabe von „tdstatus“. Der Status der einzelnen Schalter einfach hintereinander geschrieben.

off off off off off off off

Ausgabe von „tdstatus -s“. Jede Zeile beinhaltet einen Sensor, Sensor-ID=Wert.

11=6.3° 
145=6.5° 
163=24.2° 
227=19.6° 

Einbindung in OpenRemote

Zwischenstecker

Es wird ein Command angelegt, in meinem Fall „Tellstick Status“. Typ „Shell Execution Protocoll“.

Path: Pfad zur Datei

Polling interval: ich habe 1s gewählt

RegularExpression:

.*(on|off)\s(on|off)\s(on|off)\s(on|off)\s(on|off)\s(on|off)\s(on|off).*

Diese Zeile muss natürlich angepasst werden. Sie beginnt und endet jeweils mit „.*“ und die einzelnen „(on|off)“ werden jeweils durch ein „\s“ getrennt.

Bedeutet: Egal was vorher steht (.*) oder folgt (.*), es wird nach einem „on“ oder „off“ gesucht, die einzelnen Werte sind jeweils durch ein Leerzeichen getrennt. In meinem Beispiel erhält man sieben Werte.

Sensor names:

Ecke;Deckenfluter;Balkon;LSchlafzimmer1;LSchlafzimmer2;LWohnzimmer-Fenster;Z2PowerSupply

In dieser Reihenfolge werden die Sensoren gefüllt.

Anschließend muss man natürlich noch Sensoren mit den gleichen Namen wie den „Sensor names“ anlegen. Als command wählt man jeweils das gleiche Command, bei mir „Tellstick Status“.

Das hat einen Vorteil: Mit nur einer Abfrage werden alle Sensoren gefüllt. Die Sache hat einen Haken: sollte sich die Reihenfolge oder Anzahl ändern stimmt das Ergebnis nicht mehr oder kann nicht geparst werden.

 

Temperatursensoren

Man geht bei der Anlage analog zu den Zwischensteckern vor. Lediglich der „command parameter“ muss um „-s“ (ohne Anführungszeichen) ergänzt werden. Als „polling intervall“ reicht mir „5m“ (= 5 Minuten, auch ohne Anführungszeichen).

RegularExpression:

(?i)(?s).*145=(\d*.\d*).*163=(\d*.\d*).*227=(\d*.\d*).*

145, 163 und 227 sind die Werte die mir „tdstatus -s“ ausgibt. Hintergrund: Ein Nachbar scheint einen ähnlichen Sensor zu haben der manchmal dazwischen auftaucht. Da die IDs absteigend sortiert werden und die regular expression Werte dazwischen ignoriert funktioniert das so ziemlich gut. Nachteil: fällt ein Sensor aus (Batterie leer) wird kein Wert gefüllt. Dann muss man sich auf die Suche nach dem fehlenden Sensor machen.

Sensor names:

Balkon;Wohnzimmer;Schlafzimmer

Auch hier in der Reihenfolge wie die IDs in der regular expression aufgeführt sind.

Das Script

#!/bin/bash
#http://www.pro-linux.de/t_system/basescript.html
# Skript: skript.sh
# Zweck: Basis für eigene Skripte, enthaelt bereits
# einige Skript-Standardelemente (usage-Funktion,
# Optionen parsen mittels getopts, vordefinierte
# Variablen...)

# Globale Variablen
SCRIPTNAME=$(basename $0 .sh)

EXIT_SUCCESS=0
EXIT_FAILURE=1
EXIT_ERROR=2
EXIT_BUG=10

# Variablen für Optionsschalter hier mit Default-Werten vorbelegen
VERBOSE=n
OPTFILE=""

# Funktionen
function usage {
 echo "Usage: $SCRIPTNAME [-s] device" >&2
 [[ $# -eq 1 ]] && exit $1 || exit $EXIT_FAILURE
}

# Die Option -h für Hilfe sollte immer vorhanden sein, die Optionen
# -v und -o sind als Beispiele gedacht. -o hat ein Optionsargument;
# man beachte das auf "o" folgende ":".
while getopts ':o:vhs' OPTION ; do
 case $OPTION in
 s) SENSOR=y
 ;;
 v) VERBOSE=y
 ;;
 h) usage $EXIT_SUCCESS
 ;;
 \?) echo "Unbekannte Option \"-$OPTARG\"." >&2
 usage $EXIT_ERROR
 ;;
 *) echo "Dies kann eigentlich gar nicht passiert sein...">&2
 usage $EXIT_BUG
 ;;
 esac
done
# Verbrauchte Argumente überspringen
shift $(( OPTIND - 1 ))

# Eventuelle Tests auf min./max. Anzahl Argumente hier
#if (( $# < 1 )) ; then
# echo "Mindestens ein Argument beim Aufruf übergeben." >&2
# usage $EXIT_ERROR
#fi

#Kein Arg angegeben, alle ausgeben
if (( $# < 1 )) ; then
 if [[ $SENSOR = y ]] ; then
# tdtool -l | grep -e "temperaturehumidity" | awk '{printf tolower($4)" "}' | sed -e 's/'°'/''/g' 
# tdtool -l | grep -e "temperaturehumidity" -e "1A2D" | awk '{printf ($3)"="($4)" "}'
 tdtool -l | grep -e "temperaturehumidity" -e "1A2D" | awk '{print ($3)"="($4)" "}'| sort

 else
 #tdtool -l | grep -e "ON" -e "OFF" | awk '{printf tolower($3)" "}'
 cat /var/state/telldus-core.conf | grep "state " | awk '{printf ($3)" "}' | sed -e 's/'2'/'off'/g' -e 's/'1'/'on'/g'
 fi
echo -e
fi

#echo On Off Off
# Schleife über alle Argumente
for ARG ; do
 if [[ $VERBOSE = y ]] ; then
 echo -n "Argument: "
 fi
 tdtool -l | grep -i $ARG | awk '{print tolower($3)}'
#echo off
#echo on
done

exit $EXIT_SUCCESS

© 2018 Hobbykritiker

Theme von Anders Norén↑ ↑