The 100 best digital picture frames on amazon
The 100 best digital picture frames on amazon
The 100 best digital picture frames on amazon
The 100 best digital picture frames on amazon

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.