Den digi­ta­len Bil­der­rah­men per Spra­che mit Ama­zon Ale­xa, MQTT und Node-RED steu­ern

-

In die­sem Arti­kel zei­ge ich euch, wie man einen digi­ta­len Bil­der­rah­men mit einem Ama­zon Echo per Sprach­steue­rung bedie­nen kann und zwar mit Node-RED und dem MQTT-Pro­­­to­­koll.

Node-RED ist ein Pro­gram­mier­werk­zeug, um Inter­net of Things (IoT) Hard­ware unter­ein­an­der zu ver­bin­den und gleich­zei­tig APIs und Online-Diens­­te ein­zu­bin­den.

Es ist eine Alter­na­ti­ve, bei der man nicht Home Assi­stant braucht, so wie ich es hier beschrie­ben habe.

Der Vor­teil liegt dar­in, dass Node-RED auf dem glei­chen Rasp­berry Pi wie der digi­ta­le Foto­rah­men lau­fen kann und somit kei­nen zwei­ten Rech­ner erfor­dert. Dar­über­hin­aus ist Node-RED sehr ein­fach auf­zu­set­zen und zu erwei­tern und braucht auch kein kos­ten­pflich­ti­ges Online-Abo wie, im Fal­le von Home Assi­stant, Nabu Casa.

Im Zusam­men­spiel mit der Ama­zon Ale­xa App erge­ben sich vie­le wei­te­re Mög­lich­kei­ten als nur die Sprach­steue­rung des Bil­der­rah­mens. In die­sem Arti­kel wer­de ich mich aber zunächst dar­auf beschrän­ken, den Moni­tor dei­nes Bil­der­rah­mens per Spra­che ein und aus zu schal­ten.

Ein paar Wor­te zu Node-RED

Node-RED ist ein Pro­gram­mier­werk­zeug was nach Art von Fluss­dia­gram­men auf­ge­baut ist. Es star­te­te zunächst als eine Art Hob­­by-Pro­­jekt für ein For­scher­team bei IBM in der Emer­ging Tech­no­lo­gy Ser­vices Abtei­lung.

Es soll­te anfangs die Dar­stel­lung der Abhän­gig­kei­ten bei MQTT-The­­men erleich­tern, ent­wi­ckel­te sich aber schnell zu einer all­ge­mei­nen Lösung zur Anbin­dung von Inter­net of Things-Har­d­­wa­re.

Im Bereich der Haus­au­to­ma­ti­sie­rung kommt es häu­fig zur Anwen­dung, es kann aber uni­ver­sell zur Steue­rung von Hard­ware aller Art ein­ge­setzt wer­den.

Und nach­dem man Node-RED 2013 als Open Source der All­ge­mein­heit zur Ver­fü­gung stell­te, ent­deck­ten immer mehr Ent­wick­ler das enor­me Poten­ti­al.

Es mutet fast wie Zau­be­rei an, wenn man mit Node-RED Ele­men­te ein­fach hin- und her schiebt und ver­bin­det. Die Lern­kur­ve ist sehr flach, nach einem You­Tube Tuto­ri­al hat man das Prin­zip ver­stan­den. Außer­dem geht Node-RED sehr beschei­den mit Hard­ware Res­sour­cen um.

All die­se Punk­te führ­ten dazu, dass sich sehr schnell eine welt­wei­te Fan-Gemein­­de fand, die stän­dig Zusatz­pro­gram­me schreibt, die die Ein­satz­mög­lich­kei­ten erwei­tern oder erleich­tern.

Node-RED auf dem Rasp­berry Pi instal­lie­ren

Getested mit Raspbian Buster July 2019
Hinweis: Der "vcgencmd display_power 0" Befehl scheint aktuell noch auf dem Raspberry Pi 4 nicht zu funktionieren. 
Er funktioniert aber problemlos mit allen anderen Raspberry Pi Modellen.
Ihr braucht mindestens ein Amazon Echo Gerät, das aus der (alten) Generation 1 und 2 stammt, damit die Geräte Auto Discovery funktioniert. Ausschließlich Geräte der 3. Generation im Netzwerk zu haben, funktioniert aktuell (noch) nicht.

Die Instal­la­ti­on funk­tio­niert mit allen Rasp­berry Pi-Model­­len, ein­schließ­lich des Pi Zero, 2, 3 und 4 und ist super ein­fach mit einem Skript der Node-RED Arbeits­grup­pe vor­zu­neh­men. Die­ses Skript kann übri­gens spä­ter auch ver­wen­det wer­den, um eine bestehen­de Instal­la­ti­on zu aktua­li­sie­ren, wenn ein neu­es Release ver­füg­bar ist.

Ver­bin­de dich über das Ter­mi­nal mit dei­nem Rasp­berry Pi. Bevor du neue Pro­gram­me instal­lierst, soll­test du immer dein Betriebs­sys­tem auf den neu­es­ten Stand brin­gen.

sudo apt update && sudo apt upgrade -y

Wenn das durch­ge­lau­fen ist, gibst du die­ses Skript ein:

bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)

Die Node-RED Instal­la­ti­ons­rou­ti­ne läuft voll­au­to­ma­tisch durch

Damit Node-RED beim Sys­tem­start auto­ma­tisch star­tet, braucht es die Ein­rich­tung als Sys­tem Ser­vice:

sudo systemctl enable nodered.service

Mache einen Neu­start.

Die ers­ten Schrit­te mit Node-RED

Um Node-RED auf­zu­ru­fen, öff­net ihr ein­fach einen Brow­ser auf einem Com­pu­ter, der sich im glei­chen Netz­werk befin­det und gebt als URL ein:

http://<ip-address-of-your-raspberry-pi>:1880

Also zum Bei­spiel:

http://192.168.132.49:1880

Wenn ihr direkt auf dem Rasp­berry Pi arbei­tet, dann ruft Chro­me auf und gebt ein:

http://localhost:1880

Dann soll­tet ihr den Edi­tor von Node-RED sehen:

Node-RED sagt hal­lo.

In der Stan­dard­in­stal­la­ti­on kann jeder in dei­nem loka­len Netz­werk auf den Node-RED Edi­tor zugrei­fen und Ände­run­gen vor­neh­men. Das mag zuhau­se zwar noch in Ord­nung gehen, aber siche­rer ist es, hier einen Rie­gel vor­zu­set­zen. Die Anlei­tung dafür fin­det ihr hier.

Die Grund­lo­gik von Node-RED ist die­se: Die Ele­men­te links sind die Nodes (Kno­ten­punkt). Die Ver­knüp­fung ver­schie­de­ner Nodes nennt man Sequence (Ablauf). Eine oder meh­re­re Sequen­ces in einem Tab ist ein Flow (Fluss).

Die Erwei­te­rung für die Ale­xa Sprach­steue­rung instal­lie­ren

Als ers­tes muss jetzt ein klei­nes Add-on instal­liert wer­den, damit unse­re Nodes als loka­le Gerä­te in der Ama­zon Ale­xa App auf­tau­chen.

Kli­cke dazu auf das Ham­bur­ger Menü rechts oben und wäh­le "Mana­ge palet­te".

Dann gehst du auf den "Install" Tab, suchst nach for "node-red-con­­trib-ale­­xa-local",

und klickst auf "Install".

Wei­te­re Infor­ma­tio­nen zu die­sem Modul fin­dest du hier.

Ein­rich­ten des MQTT Bro­kers

Die Kom­mu­ni­ka­ti­on zwi­schen Ale­xa und dem digi­ta­len Bil­der­rah­men basiert auf dem Messa­ging-Pro­­­to­­koll MQTT. Dies hat sich zum de-fac­­to Stan­dard für die Kom­mu­ni­ka­ti­on zwi­schen Inter­­net-of-Things-Har­d­­wa­re ent­wi­ckelt.

Die Begrif­fe, die man bei MQTT ken­nen muss, sind "topic, mes­sa­ge, publish, sub­scri­be und bro­ker".

"Topic" (The­ma) ist etwas bei dem man mit­re­den oder zumin­dest mit­hö­ren will. Mit "Publish" (ver­öf­fent­li­chen) gibt man einen Kom­men­tar zu einem The­ma ab und mit "Sub­scri­be" (abon­nie­ren) hört man zu. Den Inhalt der Nach­rich­ten nennt man "Messa­ges". Das Post­amt ist der "Bro­ker", der Mak­ler.

MQTT funk­tio­niert wie ein Post­amt. Men­schen (oder eben Gerä­te) ver­schi­cken Brie­fe, die zunächst im zen­tra­len Post­amt lan­den, bevor sie dann wei­ter ver­teilt wer­den.

Ein MQTT Bro­ker kann lokal instal­liert wer­den, man kann aber auch einen Online Ser­vice nut­zen.

Ich nut­ze ger­ne den Cloud­MQTT Dienst weil er eine WebSo­cket Benut­zer­schnitt­stel­le bie­tet, die bei der Feh­ler­su­che sehr hilf­reich sein kann. Die kos­ten­lo­se "Cute Cat" Opti­on reicht für unse­re Zwe­cke voll­kom­men aus.

Instal­la­ti­on von MQTT auf dem digi­ta­len Bil­der­rah­men

Jert­zt muss auch der Rah­men so kon­fi­gu­riert wer­den, dass er MQTT Nach­rich­ten emp­fan­gen kann.

Im Ter­mi­nal gibst du ein

sudo pip3 install paho-mqtt

Wir benö­ti­gen ein Python-Skript, das den Moni­tor des Bil­der­rah­mens ein- oder aus­schal­tet. Es hört stän­dig in das Topic "frame/red/display" rein und schrei­tet zur Tat, sobald er hier den Nach­rich­ten­in­halt "on" oder "off" bekommt.

Erstel­le also eine neue Datei und kopie­re den unten­ste­hen­den Inhalt kom­plett rein. Spei­che­re sie als "red_monitor_cloudmqtt.py" ab.

  1. #!/usr/bin/env python3
  2.  
  3. import paho.mqtt.client as mqtt
  4. import subprocess
  5.  
  6. def hdmi_on():
  7.     CONTROL = "vcgencmd"
  8.     CONTROL_BLANK = [CONTROL, "display_power", "1"]
  9.     subprocess.call(CONTROL_BLANK)
  10.  
  11. def hdmi_off():
  12.     CONTROL = "vcgencmd"
  13.     CONTROL_BLANK = [CONTROL, "display_power", "0"]
  14.     subprocess.call(CONTROL_BLANK)
  15.  
  16. def on_connect(client, userdata, flags, rc):
  17.   print("Connected to MQTT broker")
  18.  
  19. def on_message(client, userdata, msg):
  20.     print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
  21.     if msg.payload.decode() == "on":
  22.         hdmi_on()
  23.     elif msg.payload.decode() == "off":
  24.         hdmi_off()
  25.     else:
  26.         pass
  27.  
  28. client = mqtt.Client()
  29. client.username_pw_set( "User" , "Password" )
  30. client.connect( "m23.cloudmqtt.com", 17905, 60)
  31. client.subscribe( "frame/red/display" , qos=0)
  32. client.on_connect = on_connect
  33. client.on_message = on_message
  34. client.loop_forever()

In die­sem Skript fügst du jetzt noch dei­ne per­sön­li­chen Cloud­MQTT Para­me­ter in den Zei­len 29 und 30 ein. Die Infor­ma­tio­nen dazu fin­dest unter Details > Instan­ce Info. Der Port ist der nor­ma­le Port, nicht der SSL Port.

Cute as a cat

Es ist sinn­voll, das Skript nicht nur beim Boo­ten zu star­ten, son­dern auch auto­ma­tisch neu­zu­star­ten, soll­te es ein Pro­blem mit der Inter­net­ver­bin­dung geben.

Also erstellt du eine neue Datei mit:

sudo nano /lib/systemd/system/cloudmqtt.service

In den sich öff­nen­den Edi­tor, fügst du die­sen Text ein:

[Unit]
Description=Cloudmqtt Service
After=multi-user.target
[Service]
Type=idle
User=pi
ExecStart=/usr/bin/python3 /home/pi/red_monitor_cloudmqtt.py
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target

Spei­che­re ab und gehe aus dem Edi­tor raus. Dann gibst du im Ter­mi­nal ein:

sudo chmod 644 /lib/systemd/system/cloudmqtt.service
sudo systemctl daemon-reload
sudo systemctl enable cloudmqtt.service

Die Sequen­ces in Node-RED erstel­len

Wir erstel­len nun die bei­den Abfol­gen in Node-RED, die die MQTT-Nach­­­rich­­ten aus­lö­sen, die unse­ren Rasp­berry Pi anwei­sen, den Bild­schirm ein- oder aus­zu­schal­ten.

Gehe wie­der zum Brow­sert­ab mit dem Node-RED Edi­tor in dem du im URL-Feld ein­gibst:

http://<ip-address-of-your-raspberry-pi>:1880

Zie­he jetzt den Node "ale­xa local" in die lin­ke Hälf­te rein. Dann legst du den Node "mqtt out", den mit dem Laut­spre­cher­sym­bol, rechts dane­ben.

Ver­bin­de jetzt die bei­den Nodes mit einer Linie.

Dop­pel­kli­cke auf den "ale­xa local" Node und gib unter Name "TDPF-dis­­play-on" ein. Danach auf "Done".

Wie­der­um Dop­pel­klick auf den "mqtt out" Node. Hier gibst du die URL des Cloud­MQTT Ser­vers und dei­nen Port ein. Im "Secu­ri­ty" Tab trägst du dei­nen Benut­zer­na­men und Pass­wort ein.

Unter dem Ser­ver­ein­trag gibst du unter Topic ""frame/red/display" ein. Das ist qua­si der Kanal, auf dem die Steue­rungs­si­gna­le gesen­det wer­den. Als QoS (Qua­li­ty of Ser­vice) wählst du "0". Den Rest kannst du leer las­sen.

Jetzt erstellst du noch eine zwei­te Sequence für den zwei­ten Befehl. Das läuft anlog zu der ers­ten Sequence, nur als Namen im Ale­xa Node gibst du jetzt "TDPF-dis­­play-off" ein.

Aus Nodes ent­steht eine Sequence

Kli­cke auf "deploy" in der obe­ren rech­ten Ecke, um die Ände­run­gen live zu stel­len.

Eine Rou­ti­ne in der Ama­zon Ale­xa App erstel­len

Nimm dein Han­dy und öff­ne die Ama­zon Ale­xa App. Tip­pe auf das Ham­bur­ger-Menü in der lin­ken obe­ren Ecke.

Tip­pe auf "Gerät hin­zu­fü­gen", scrol­le nach unten, tip­pe auf "Sons­ti­ges" und "Gerä­te suchen". Alter­na­tiv kannst du auch "Ale­xa, ent­de­cke mei­ne Gerä­te" sagen.

Das dau­ert rund eine Minu­te.

Tip­pe auf "Gerä­te" in der unte­ren Rei­he und dann auf "Alle Gerä­te" in der obe­ren Rei­he. Dann auf "Gerät aus­wäh­len", um zu sehen, ob die Gerä­te (=die Node-RED Sequen­ces) gefun­den wur­den.

Tip­pe auf "Home" und wie­der auf das Ham­bur­ger-Menü, dann auf "Rou­ti­nen". Erstel­le eine neue Rou­ti­ne, indem du auf das Zei­chen "+" oben rechts tippst. Tip­pe auf "Wenn Fol­gen­des pas­siert" und dann auf "Sprach­be­fehl". Ver­voll­stän­di­ge den Satz wie z.B. "Ale­xa, Bil­der­rah­men an".

Füge hier eine Akti­on hin­zu, "Smart Home", "Gerät steu­ern", scrol­le durch die Lis­te und suche nach "TDPF-dis­­play-on". Wäh­le "An/Aus" und stel­le es auf "An". Tip­pe auf "Wei­ter" und "Spei­chern".

Genau das Glei­che machst du jetzt noch mit dem Gerät "TDPF-dis­­play-off". Aber dies­mal wählst du bei "An/Aus" "Aus".

War­te eine Minu­te, bis der Ama­zon-Ser­­ver aktua­li­siert wur­de, und tes­te dann die Rou­ti­nen, indem du auf das Wie­der­ga­be­sym­bol tippst und nach­schaust, ob der Bild­schirm ein- oder aus­ge­schal­tet wur­de.

Wenn das geklappt hat, dann pro­bierst du den Sprach­be­fehl aus.

Fazit

Auch wenn jetzt eini­ge Schrit­te not­wen­dig waren, ist das Set­up nicht beson­ders schwie­rig.

Und das war nur ein Bei­spiel, wie du Node-RED in Ver­bin­dung mit Ama­zon Ale­xa zur Sprach­steue­rung dei­nes Foto­rah­mens ein­set­zen kannst.

So kannst du z.B. Ale­xa eine Nach­richt spre­chen las­sen, sobald ein Befehl aus­ge­führt wur­de, oder ganz neue Befeh­le erstel­len. Du kannst es auch für Haus­au­to­ma­ti­ons­auf­ga­ben ver­wen­den, und zwar auf dem glei­chen Rasp­berry Pi, der sich hin­ter dei­nem digi­ta­len Bil­der­rah­men ver­birgt. Wenn du aller­dings ein Benut­zer­inter­face dazu möch­test, wür­de ich zur Kom­bi­na­ti­on von Home Assi­stant und Node-RED raten.

Die nächs­te Ver­si­on des Pi3D-Skripts wird für die Sprach­steue­rung mit dem MQTT-Pro­­­to­­koll aus­ge­legt sein. Es macht also viel Sinn, die­sen ein­fa­chen Ein-/Aus-Befehl aus­zu­pro­bie­ren, um auf die­sem Set­up auf­zu­bau­en.