INSTAR Deutschland GmbH

Node-RED und MQTT Einführung



Erstellen Sie Ihre ersten Flows

Sie finden den exportierten Sourcecode am Ende des Artikels - der JSON-Code enthält eine Zeile " msg.payload = 'http://192.168.1.116/param.cgi?cmd=pushhostalarm&-usr=admin&-pwd=instar'; Sie können die IP-Adresse und das Kamera-Login bereits mit den Login Informationen Ihrer persönlichen Kamera austauschen. Sie sehen auch, daß im Beispiel der CGI-Befehl "name":"/param.cgi?cmd=pushhostalarm" verwendet wird. Dieser Befehl löst auf INSTAR Full HD Kameras einen Alarm aus - er funktioniert nicht mit HD- oder VGA-Kameras! Sie können aber auch andere CGI-Befehle aus unserer Dokumentation für Full-HD, HD und VGA Kameramodelle verwenden.

[
  {
    "id": "b1aa3b11.229a98",
    "type": "function",
    "z": "13bcbd83.ab1fe2",
    "name": "Alarm",
    "func": "msg.payload = 'http://192.168.1.116/param.cgi?cmd=pushhostalarm&-usr=admin&-pwd=instar';\nreturn msg;",
    "outputs": 1,
    "noerr": 0,
    "x": 310,
    "y": 160,
    "wires": [
      [
        "a5ae1b98.91c1a8"
      ]
    ]
  }
]

Öffnen Sie den Import-Dialog, fügen Sie den Code ein und klicken Sie auf import:


Node-RED


MQTT

Sie sollten nun den folgenden Flow sehen können:


Node-RED


Links oben sehen Sie einen Knoten mit einem nach oben weisenden Symbol und dem Titel Alarm. Dies ist ein UI-Knoten, der zu unserem Dashboard gehört. Wenn Sie die Liste der verfügbaren Knoten auf der linken Seite nach unten scrollen, finden Sie diesen auch im Dashboard-Bereich - es ist ein einfacher Button. Er ist mit einem MQTT-Ausgangsknoten mit dem Titel Push Alarm verbunden. Wenn Sie auf den Button-Knoten doppelklicken, sehen Sie, dass er eine Payload von {" val ":" alarm "} trägt. Wenn Sie auf den MQTT-Knoten doppelklicken, wird Ihnen angezeigt, dass dieser Payload an localhost:1880 mit dem Topic ipcam/alarm/pushalarm gesendet (published) wird.

Für Informationen wie Sie einen MQTT Broker in Windows installieren - lesen Sie bitte unsere OpenHAB2 Einführung

Im Gegensatz zur HTTP REST-API, die für die Kommunikation mit Ihrer Kamera verwendet wird, basiert die MQTT-Kommunikation auf einem Modell publish und subscription. Node-RED arbeitet als MQTT-Broker, der JSON-Payloads empfängt, die veröffentlicht (published) werden, und stellt sicher, dass sie an jeden Client geliefert werden, der ein Abonnement dafür hat. Wenn Sie erneut auf den MQTT-Ausgabeknoten doppelklicken, sehen Sie ein QoS-Feld, das auf den Wert von 1 festgelegt ist. QoS steht für Quality of Service. Wenn sie auf 0 gesetzt ist, wird die veröffentlichte Nachricht einmal an verfügbare Clients gesendet, die in diesem Moment erreichbar sind. Der Wert 1 bedeutet, dass die Nachricht vom MQTT-Broker aufbewahrt wird und immer dann, wenn ein Client online geht, der diese noch nicht erhalten hat, sie erneut aussendet. Dabei wird sichergestellt, dass jeder Client über die Änderung benachrichtigt wird. Der Wert 2 garantiert, dass jede Nachricht nur einmal an jeden abonnierten Client gesendet wird - was für Zeitreihendaten nützlich, aber für unseren Anwendungsfall nicht notwendig ist.


Node-RED


  1. The client that is subscribed to our button is the flow below. You can see that it starts with a MQTT input node that is subscribed to ipcam/alarm/pushalarm. Whenever you click the button in the dashboard the value { "val" : "alarm"} is published and pushed to that flow.

  2. The next node is a function node that extract the value of val - in our case it is always alarm. But if you have picked another CGI command before, you might want to add several buttons that publish different values and that trigger different commands.

  3. In the next node - titled Push - those different values are sorted out. In our case we just have to listen to alarm and send it to exit 1.

  4. Connected to this output is another function node that is triggered and adds the camera ip, login and the CGI command to the payload

  5. Which is then set from msg.payload to msg.url

  6. To be consumed by a HTTP node that sends out the CGI command and receives the camera response.

  7. We have to turn the response into valid JSON - either { "alarm": "triggered" } or { "alarm": "Error" }

  8. And read it into a Javascript object

  9. To be consumed by another UI node. This UI element is a text field configured to display {{msg.payload.alarm}} - which is either triggered or Error if something went wrong along the way.

  10. Der Client, der die Meldung unseres Buttons abonniert hat, ist der folgende Flow. Sie können sehen, dass er mit einem MQTT-Eingangsknoten beginnt, der "ipcam/alarm/pushalarm" abonniert hat. Immer wenn Sie auf die Schaltfläche im Dashboard klicken, wird der Wert "{"val":"alarm"} veröffentlicht und an diesen Flow übergeben.

  11. Der nächste Knoten ist ein Funktionsknoten, der den Wert von val extrahiert - in unserem Fall ist es immer alarm. (Wenn Sie jedoch zuvor einen anderen CGI-Befehl ausgewählt haben, möchten Sie möglicherweise mehrere Schaltflächen hinzufügen, die verschiedene Werte veröffentlichen und unterschiedliche Befehle auslösen.)

  12. Im nächsten Knoten - betitelt Push - werden diese verschiedenen Werte aussortiert. In unserem Fall müssen wir nur auf alarm hören und damit dann denn exit 1 wählen. (Wenn Sie einen anderen CGI Befehl gewählt haben, bei dem Sie über mehrere Buttons unterschiedliche Werten setzen, können Sie diese Meldungen hier auseinander fädeln.)

  13. Am Ausgang ist ein weiterer Funktionsknoten, der den Payload auf die Kamera-IP, das Login und den gewünschten CGI-Befehl setzt.

  14. Im fünften Schritt setzen wir "msg.payload" dann auf "msg.url".

  15. Was dann von einem HTTP-Knoten verwendet, der den CGI-Befehl an Ihre Kamera sendet und die Aantwort empfängt.

  16. Wir müssen die Antwort in gültiges JSON umwandeln - entweder {" alarm ":" ausgelöst "} oder {" alarm ":" Fehler "}.

  17. Und lese dieses in ein Javascript-Objekt.

  18. Um von einem anderen UI-Knoten konsumiert zu werden. Dieses UI-Element ist ein Textfeld, das für die Anzeige von {{msg.payload.alarm}} `konfiguriert ist - was entweder triggered oder Error ist, je nachdem ob die Kamera Ihnen eine Erfolgsmeldung gibt oder einen Fehler geworfen hat.

Aktivieren Sie Ihren Flow

Klicken Sie auf die große rote Schaltfläche "Deploy" oben rechts und öffnen Sie http://localhost:1880/dashboard (die URL wurde in einem früheren Schritt festgelegt) und Sie sehen die folgende Oberfläche:


Node-RED


Klicken Sie auf den Alarm Button und wenn alles richtig war, sollten Sie eine triggered neben Alarm Push sehen. Sie können auch das System Log Ihrer Kamera überprüfen, um zu schauen, ob der Alarm tatsächlich ausgelöst wurde (der Alarm wird als Audioalarm angezeigt):


Node-RED


Exportierter Sourcecode

Kopieren Sie den kompletten folgenden Code Block und importieren Sie ihn in Ihren Node-RED Flow:

[{"id":"cdec87d0.5ff618","type":"mqtt in","z":"13bcbd83.ab1fe2","name":"Push Alarm","topic":"ipcam/alarm/pushalarm","qos":"1","broker":"47feb3e4.56f11c","x":80,"y":220,"wires":[["8838d57.9ce2228"]]},{"id":"8838d57.9ce2228","type":"function","z":"13bcbd83.ab1fe2","name":"process value","func":"msg.payload = JSON.parse(msg.payload).val;\nreturn msg;","outputs":1,"noerr":0,"x":130,"y":160,"wires":[["3d3ea3f8.d96a9c"]]},{"id":"3d3ea3f8.d96a9c","type":"switch","z":"13bcbd83.ab1fe2","name":"Push","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"alarm","vt":"str"}],"checkall":"false","repair":false,"outputs":1,"x":250,"y":220,"wires":[["b1aa3b11.229a98"]]},{"id":"b1aa3b11.229a98","type":"function","z":"13bcbd83.ab1fe2","name":"Alarm","func":"msg.payload = 'http://192.168.1.116/param.cgi?cmd=pushhostalarm&-usr=admin&-pwd=instar';\nreturn msg;","outputs":1,"noerr":0,"x":310,"y":160,"wires":[["a5ae1b98.91c1a8"]]},{"id":"994abd71.13054","type":"string","z":"13bcbd83.ab1fe2","name":"toJSON","methods":[{"name":"replaceAll","params":[{"type":"str","value":"[Succeed]set ok."},{"type":"str","value":"{ \"alarm\": \"triggered\" }"}]},{"name":"replaceAll","params":[{"type":"str","value":"[Error]Param error."},{"type":"str","value":"{ \"alarm\": \"Error\" }"}]}],"prop":"payload","propout":"payload","object":"msg","objectout":"msg","x":570,"y":220,"wires":[["d3e3b6d2.67bf78"]]},{"id":"d3e3b6d2.67bf78","type":"json","z":"13bcbd83.ab1fe2","name":"","property":"payload","action":"","pretty":false,"x":660,"y":160,"wires":[["c8b27f25.d85df"]]},{"id":"c8b27f25.d85df","type":"ui_text","z":"13bcbd83.ab1fe2","group":"c0689660.4e98c8","order":2,"width":0,"height":0,"name":"UI Alarm","label":"Alarm Push","format":"{{msg.payload.alarm}}","layout":"row-spread","x":660,"y":100,"wires":[]},{"id":"a5ae1b98.91c1a8","type":"change","z":"13bcbd83.ab1fe2","name":"Set URL","rules":[{"t":"set","p":"url","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":410,"y":220,"wires":[["ea5d1e02.b9b4"]]},{"id":"ea5d1e02.b9b4","type":"http request","z":"13bcbd83.ab1fe2","name":"pushhostalarm","method":"GET","ret":"txt","url":"","tls":"","x":485,"y":160,"wires":[["994abd71.13054"]]},{"id":"2dceef9b.7eebe","type":"mqtt out","z":"13bcbd83.ab1fe2","name":"Push Alarm","topic":"ipcam/alarm/pushalarm","qos":"1","retain":"","broker":"47feb3e4.56f11c","x":200,"y":80,"wires":[]},{"id":"4d2f09f7.2491b8","type":"ui_button","z":"13bcbd83.ab1fe2","name":"Alarm","group":"c0689660.4e98c8","order":0,"width":0,"height":0,"passthru":false,"label":"Trigger Alarm!","color":"#ffffff","bgcolor":"#f3100b","icon":"fa-bell","payload":"{ \"val\" : \"alarm\"}","payloadType":"json","topic":"pushalarm","x":70,"y":80,"wires":[["2dceef9b.7eebe"]]},{"id":"47feb3e4.56f11c","type":"mqtt-broker","z":"","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"c0689660.4e98c8","type":"ui_group","z":"","name":"Wiki Tutorial","tab":"7a3391b6.03a81","disp":true,"width":"6","collapse":false},{"id":"7a3391b6.03a81","type":"ui_tab","z":"","name":"Wiki Tutorial","icon":"dashboard"}]