Smarte Türkamera mit Node-Red und HDMI-CEC

Ich wollte mich schon lange mal mit Steuerungs-Software Node-Red beschäftigen. Nun habe ich den Einstieg geschafft und eine sehr nette Funktion für unsere Türsprechanlage mit Kamera gebaut.

Die Vernetzung unterschiedlicher Systeme und Funktionen übernimmt in unserem Haus die Smart Home Software Symcon. Nachdem ich mich vor 3 Jahren recht ausführlich mit OpenHAB beschäftigt, diese aber aus unterschiedlichsten Gründen verworfen habe, bin ich bei Symcon gelandet und noch immer überzeugt davon. Da ich am Fernseher in der Küche einen Raspberry Pi hängen habe, auf dem die ZigBee-Bridge mit dem ConBee II Stick läuft, aber auch die Wetterstation mit Weewx angebunden ist, hatte ich eine Idee, die mit Symcon nicht zu lösen war. Für den Philips TV mit Android gibt es nämlich keine Schnittstelle, die man von Symcon aus nutzen könnte. Philips selbst bringt noch nicht einmal eine funktionsfähige App zustande.

Wantec Türsprechanlage mit VoIP und Fritzbox Anbindung

Mein Vorhaben war, das Bild unserer Wantec IP-Sprechanlage auf den Fernseher in der Küche zu geben, sobald jemand an der Tür klingelt. Bislang nutzen wir nur unsere AVM Fritzfons, die das Kamerabild auch anzeigen können. Dazu muss der Fernseher automatisch eingeschaltet und auf HDMI umgeschaltet werden. Dann muss auf dem Raspi der Browser mit der URL der Türkamera geöffnet werden. Nach 2 Minuten soll der Fernseher wieder abschalten und der Browser schließen.

Türkamera auf dem Küchen-TV

Nun könnte man über einen Infrarot-Sender den Fernseher steuern, aber darüber bekommt man keine Rückmeldung, ob er an oder aus ist etc. Dann bin ich auf HDMI-CEC gestoßen. Mit diesem Protokoll kann man angeschlossene Geräte ganz einfach über HDMI steuern. Der Raspi unterstützt das, wenn man die CEC-Utilities installiert:

sudo apt install cec-utils

Mit diesem Befehl kann man nun nach angeschlossenen HDMI-Geräten suchen:

echo 'scan' | cec-client -s -d 1

Der Scan gibt bei meinem Philips TV das zurück:

opening a connection to the CEC adapter... requesting CEC bus information ... CEC bus information =================== device #0: TV address: 0.0.0.0 active source: no vendor: Unknown osd string: TV CEC version: 1.4 power status: standby language: ??? device #1: Recorder 1 address: 1.0.0.0 active source: no vendor: Pulse Eight osd string: CECTester CEC version: 1.4 power status: on language: eng currently active source: unknown (-1)

Im ersten Abschnitt ist die hervorgehobene Zeile wichtig. Sie zeigt die Device-Nummer der angeschlossenen Geräte an. In diesem Fall #0. Außerdem ist zu sehen, dass sich das Gerät im Standby befindet.

Das Device #1 ist der Raspberry. Mit diesem Befehl kann man nun den Fernseher vom Raspi aus einschalten:

echo 'on 0' | cec-client -s -d 1

„on 0“ bedeutet, dass das Device 0 angesprochen werden soll. Um das Gerät auszuschalten genügt:

echo 'standby 0' | cec-client -s -d 1

Um den aktuellen Zustand des Geräts abzurufen (an oder aus):

echo 'pow 0' | cec-client -s -d 1

Die Ausgabe dazu ist z. B.:

markus@wetterpi:/home/markus $ echo 'pow 0' | cec-client -s -d 1 opening a connection to the CEC adapter... power status: standby

Nun ist es schön, dass der Fernseher an- und ausgeschaltet werden kann, er muss aber auch auf den HDMI-Eingang, an dem der Raspi hängt, umschalten. Auch das geht mit den CEC-Utils:

echo 'as' | cec-client -s -d 1

„as“ bedeutet „active source“ und sagt dem TV, dass auf den HDMI-Port umgeschaltet werden, an dem der Raspi hängt.

Eine Liste aller HDMI-CEC Befehle, welche die CEC-Utils unterstützten bekommt man mit:

echo h | cec-client -s -d 1 opening a connection to the CEC adapter... ================================================================================ Available commands: [tx] {bytes} transfer bytes over the CEC line. [txn] {bytes} transfer bytes but dont wait for transmission ACK. [on] {address} power on the device with the given logical address. [standby] {address} put the device with the given address in standby mode. [la] {logical address} change the logical address of the CEC adapter. [p] {device} {port} change the HDMI port number of the CEC adapter. [pa] {physical address} change the physical address of the CEC adapter. [as] make the CEC adapter the active source. [is] mark the CEC adapter as inactive source. [osd] {addr} {string} set OSD message on the specified device. [ver] {addr} get the CEC version of the specified device. [ven] {addr} get the vendor ID of the specified device. [lang] {addr} get the menu language of the specified device. [pow] {addr} get the power status of the specified device. [name] {addr} get the OSD name of the specified device. [poll] {addr} poll the specified device. [lad] lists active devices on the bus [ad] {addr} checks whether the specified device is active. [at] {type} checks whether the specified device type is active. [sp] {addr} makes the specified physical address active. [spl] {addr} makes the specified logical address active. [volup] send a volume up command to the amp if present [voldown] send a volume down command to the amp if present [mute] send a mute/unmute command to the amp if present [self] show the list of addresses controlled by libCEC [scan] scan the CEC bus and display device info [mon] {1|0} enable or disable CEC bus monitoring. [log] {1 - 31} change the log level. see cectypes.h for values. [ping] send a ping command to the CEC adapter. [bl] to let the adapter enter the bootloader, to upgrade the flash rom. [r] reconnect to the CEC adapter. [h] or [help] show this help. [q] or [quit] to quit the CEC test client and switch off all connected CEC devices. ================================================================================

Das war schon einmal die halbe Miete. Ich kann also über HDMI den Fernseher komfortabel vom Raspberry Pi aus steuern. Nun wollte ich erst ein Python-Script basteln, das ich von Symcon aus hätte ansprechen können. Das Projekt schrie jedoch danach, einmal Node-Red auszuprobieren.

Node-Red die IoT-Automatisierungssoftware

Node-Red wurde von IBM entwickelt und liegt als Open-Source vor. Mit sog. „Flows“ kann man verschiedene Eingaben und Ausgaben verarbeiten, in dem man einfach Funktionsblöcke, oder „Nodes“ – daher der Name, miteinander verknüpft. Konfiguriert und gearbeitet wird dabei ganz komfortabel über den Webbrowser. Node-Red kann man lokal auf einem Linux-System wie dem Raspberry Pi installieren. Es gibt Docker-Container, es kann aber auch auf AWS, Azure oder der IBM Cloud laufen. Eine Installationsanleitung für Node-Red gibt es hier: https://nodered.org/docs/getting-started/raspberrypi

Node-Red mit meinem Türkamera-Flow im Browser

Nach der Installation zeigt sich Node-Red typischerweise unter http://localhost:1880 (sofern man keinen anderen Port eingestellt hat). Es sind schon eine ganze Reihe von Nodes dabei. Interessant wird es aber, wenn man über die „Palette“ weitere Nodes installiert und die gibt es für praktisch jede Anwendung. Sie lassen sich ganz einfach über den Browser durchsuchen und installieren.

Wenn es klingelt TV anschalten, Kamerabild zeigen, Telegram Nachricht mit Bild schicken.

Die Aufgabe war nun zu erkennen, dass die Klingeltaste an der Wantec IP-Sprechanlage gedrückt wurde. Bei der Wantec MONOLITH C IP/VoIP geht das glücklicherweise sehr einfach, denn man kann mit der Klingeltaste nicht nur ein Relais schalten, sondern auch einen eigenen HTTP-Request absetzen.

Wantec MONOLITH C IP/VoIP HTTP-Request
HTTP-Befehl im Backend der Wantec Sprechanlage einrichten

Mit dem HTTP-Befehl spreche ich die IP meines Raspberry Pi, mit dem Port auf dem Node-Red läuft an. Auf der Node-Red Seite benötigt man dann zuerst ein HTTP-Node, das den HTTP-Request annehmen kann.

Wenn die Anfrage eingeht, also der Klingeltaster gedrückt wurde, setze ich mit eines Change-Node den Payload der Anfrage auf „1“. Es folgt ein Switch-Node, der die nachfolgenden Nodes auslöst, sobald die Msg.Payload = 1 ist. Ein Inject-Node (im Bild „Ein Test“ oben links) simuliert die Türklingel, damit man bei der Erstellung des Flows nicht wirklich klingeln muss.

Der HTTP-Node nimmt den Request der Sprechanlage entgegen

Mit einer Exec-Node kann man Konsolenbefehle auf dem Raspberry ausführen. So wird zunächst der Fernseher per CEC-Utlis eingeschalten. (erst später habe ich entdeckt, dass es für Node-Red auch CEC-Nodes gibt).

EXEC-Node, die den HDMI-CEC Befehl zum Einschalten auslöst

Danach schalte ich mit 2 Sekunden Verzögerung den HDMI-Eingang mit dem Raspi als aktiven Eingang. Als Nächstes hole ich mir das Live-Bild der Türkamera und starte den Chromium-Browser. Auch das geht über einen EXEC-Node den folgenden Befehl ausführt:

DISPLAY=:0 chromium-browser http://user:passwort@192.168.178.99:8080/?action=stream

Damit habe ich das Kamerabild automatisch auf dem Fernsehgerät in der Küche. Natürlich soll der Fernseher auch wieder abschalten. Dazu wird ein Delay-Node mit 120 Sekunden Verzögerung vor zwei EXEC-Nodes geschaltet. Der erste Node schaltet den Fernseher über CEC-Befehl aus. Der zweite Node schließt den Browser, da sonst bei jedem weiteren Klingeln ein neuer Browser-Tab mit dem Live-Stream geöffnet werden würde.

Als kleines Gimmick verschickt Node-Red auch noch eine Nachricht mit Bild der Kamera per Telegram-Bot. Dazu hole ich das Standbild der Kamera mit einem HTTP-Node. Dieses muss jedoch erst einmal als Datei abgespeichert werden, bevor man es an eine Telegram-Nachricht anhängen kann. Dabei hilft der File-Node. Er holt sich das Bild von der Adresse der Wantec und speichert es als JPG auf dem Raspberry.

Der File-Node speichert das Kamerabild lokal ab
Der Telegram-Node, der das Bild und die Nachricht an uns sendet

Danach schickt der Telegram-Node eine Nachricht mit dem Bild an mich und Frau Nachbelichtet.

Ich bin verblüfft: Die Telegram-Nachricht kam an 🙂

Die Verbindung zu Symcon habe ich ganz einfach per MQTT gelöst. Symcon hat einen eigenen MQTT-Broker eingebaut und kann entsprechende MQTT-Topics direkt verarbeiten und auswerten. So erfährt Symcon auch, dass die Türklingel betätigt wurde und ich kann z. B. nachts gleich die Beleuchtung im Flur einschalten. Ebenso kann ich damit nun auch den Philips Fernseher in Symcon einbinden, in dem ich einfach die entsprechenden Kommandos per MQTT von Symcon an Node-Red und damit zum TV sende.

Fazit

Node-Red ist ein extrem mächtiges Werkzeug, das aber recht schnell Erfolgserlebnisse liefert. Es gibt eine riesige Menge an fertigen Flow, Nodes und Anleitungen unter https://flows.nodered.org/

Für das Smart Home ist es ein hervorragender Problemlöser, der die Möglichkeiten der vorhandenen Systeme enorm erweitert. KNX, Homematic, Loxone, ZigBee (Philips Hue, Ikea, Aqara etc.), Fritzbox, Amazon Alexa, Tasmota und vieles mehr wird direkt unterstützt. Mit dem Dashboard-Designer lassen sich attraktive Benutzeroberflächen gestalten.

Dienste wie E-Mail, FTP, SMB, Twitter oder Telegram lassen sich sehr schnell und komfortabel einbinden. Meine neue Webcam für das Fichtelgebirge werde ich auch mit Node-Red umsetzen. Tatsächlich muss man mit Node-Red auch nicht mehr selbst Code schreiben. Sollte aber eine spezielle Funktion gebraucht werden, kann man diese auch mit Javascript als eigenen Node erstellen. Eine Anleitung dazu gibt es auch https://nodered.org/docs/creating-nodes/node-js

Ich bin begeistert und bereue nur, dass ich mich nicht schon längst damit beschäftigt habe.

5 1 vote
Article Rating

Der kostenlose nachbelichtet-Newsletter für dich

Abonnieren
Benachrichtige mich bei
2 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments

Wow! Das ist mal richtig abgefahren und super erklärt! Danke!

Cool!