NEWS
MQTT Full HD Kamera für ioBroker
-
Bezüglich der Sonderzeichen müsste ich auch noch mal nachfragen. Da Sollten eigentlich die gleichen Beschränkungen drinnen sein, wie auch beim Kamera-Login - und da ist das
&
ja erlaubt. Mal schauen.Das ioBroker Log ist beim Setup hier "sauber":
Bei dir schaut es so aus, als würde der MQTT Adpater ständig die Verbindung zur Kamera verlieren. Ist das Livebild der Kamera auch mit eingebunden? Wird das durchgehend angezeigt? Oder hat man da auch Unterbrechungen in der ioBroker Vis ?
Wie schaut das MQTT Log auf der Kamera aus?
http://192.168.188.15/tmpfs/mqtt-log
Kann man die Kamera denn steuern? Oder gibt es überhaupt keine Verbindung?
Und zur Alarmmeldung - ich glaube das hatte ich oben schon erwähnt. In dieser Ausbaustufe der MQTT API sind erstmal nur die GET und SET Befehle der HTTP API drinnen. Systemzustände - also alles was die Kamera auch in ihr System Logbuch schreibt - wird es mit der nächsten Version geben.
-
@mpolinowski
Die Signalanzeige der MQTT-Instanz geht im Wechsel Orange/grün im MillisekundentaktIch habe das Kamerabild von zwei IN-9008 eingebunden wie folgt:
Das wird alle 0,5sec jeweils aktualisiert.
Da ich ein Support Ticket erstellt hatte weis ich bereits das einige Sachen in der nächsten FW behoben wurden, ich warte nur noch auf Zusendung des Downloadlinks.
@mpolinowski sagte in MQTT Full HD Kamera für ioBroker:
Wie schaut das MQTT Log auf der Kamera aus?
http://192.168.188.15/tmpfs/mqtt-logDie Website ist nicht erreichbar
192.168.188.15 hat die Verbindung abgelehnt.
Auf Google nach tmpfs mqtt log suchen
ERR_CONNECTION_REFUSEDEDIT: ich benutze Google CHROME(aktuellen)
auch wenn ich die Credentials mitgebe. Zusätzlich bin ich im gleichen Browser in der Kamera eingelogt als admin. Also sollte das eigentlich kein Problem sein.
@mpolinowski sagte in MQTT Full HD Kamera für ioBroker:
Kann man die Kamera denn steuern? Oder gibt es überhaupt keine Verbindung?
Kann ich nicht sagen, da ich wissenstechnisch noch am Anfang stehe und mich erst das reinfusseln muss.
Habe die Instanz vorerst gestoppt. Aktuell warte ich erst mal auf die aktualisierte Beta FW und starte die Instanz dann neu.
-
Wenn das Log nicht vorhanden ist, dann ist bei Firmware Update was schief gelaufen. Kommt man den generell noch auf das tmpfs Verzeichnis?
Wenn ja, dann wäre vermutlich der MQTT Dienst gar nicht erst gestartet - denn das ist gleich der erste Log Eintrag:
Findet man in der WebUI das Netzwerk/MQTT Menü?
Ich denke ich würde da noch einmal die Firmware drüber bügeln und schauen dass es durchläuft. Ggf. auch die Firmware Datei noch mal runterladen - sicherstellen, dass die Datei beim ersten Download nicht unvollständig angekommen ist.
-
Hallo zusammen,
hätte auch noch eine Frage zur Vorgehensweise. Die mqtt-beta hatte ich per Email bekommen, das aufspielen hat (so scheint es zumindest) funktioniert. In der Kamera habe ich die Einstellungen vorgenommen. Im ioBroker habe ich den mqtt-Adapter auf client/subscriber stehen, der Adapter ist grün und im ioBroker log steht "connected to ..." und "all states published".
Müssten dann unter den Objekten nicht die ganzen states der Kamera erscheinen ? Bei mir kommt da nix an. Woran könnte das liegen ?
Ach ja: @mpolinowski Danke für den tollen Support hier und auch im homee-Forum
-
@Förster Hallo,
die Kamera pushed alle Status Topics sobald sie sich verbunden hat. D.h. die müsste man sofort sehen.
Ich hatte allerdings in der Übersicht im ioBroker auch schon mal das Problem, das nichts reinzukommen schien.
Ich persönlich nutze MQTT.fx - damit kann man auch all die Befehls-Topics in den Objekt Baum bekommen, wie auch in der ioBroker Anleitung beschrieben.
Sollten die Topics, die man über MQTT.fx aktualisiert, auch nicht auftauchen, am besten die MQTT Adapter Einstellungen noch mal überprüfen. Also vor allem, dass das Abo auf
instar/#
gesetzt wird und die Maske aufmqtt0.*
. -
Hmm. Schein richtig zu sein: instar/# und mqtt.0.*
Wäre es möglich, hier mal einen Screenshot von den Adapter-Einstellungen reinzustellen ? oben ist ja der Screenshot von "Verbindung". Ich meine den von "mqtt-Einstellungen". Da kann man ja noch einige Einstellungen vornehmen.Ansonsten habe ich mal "Teste Verbindung zum Server" geprüft. Da kommt dieses:
mqtt.0 2020-02-02 16:32:31.498 error (29272) uncaughtException: Error: Connection refused: Not authorized mqtt.0 2020-02-02 16:32:31.493 error at addChunk (_stream_readable.js:288:12) mqtt.0 2020-02-02 16:32:31.493 error at Socket.emit (events.js:198:13) mqtt.0 2020-02-02 16:32:31.493 error at Socket.ondata (_stream_readable.js:710:20) mqtt.0 2020-02-02 16:32:31.493 error at Writable.write (/opt/iobroker/node_modules/readable-stream/lib/_stream_writable.js:334:11) mqtt.0 2020-02-02 16:32:31.493 error at writeOrBuffer (/opt/iobroker/node_modules/readable-stream/lib/_stream_writable.js:417:5) mqtt.0 2020-02-02 16:32:31.493 error at doWrite (/opt/iobroker/node_modules/readable-stream/lib/_stream_writable.js:428:64) mqtt.0 2020-02-02 16:32:31.493 error at Writable.writable._write (/opt/iobroker/node_modules/mqtt/lib/client.js:302:5) mqtt.0 2020-02-02 16:32:31.493 error at work (/opt/iobroker/node_modules/mqtt/lib/client.js:292:12) mqtt.0 2020-02-02 16:32:31.493 error at MqttClient._handlePacket (/opt/iobroker/node_modules/mqtt/lib/client.js:350:12) mqtt.0 2020-02-02 16:32:31.493 error at MqttClient._handleConnack (/opt/iobroker/node_modules/mqtt/lib/client.js:920:15) mqtt.0 2020-02-02 16:32:31.493 error (29272) Error: Connection refused: Not authorized mqtt.0 2020-02-02 16:32:31.492 error (29272) uncaught exception: Connection refused: Not authorized
-
Das hatte ich auch schon beobachtet. Wenn man die Test Funktion nutzt crashed der Adapter. Vielleicht hat jemand hier eine Ahnung was es damit auf sich hat? Sobald ich den Apter neustarte verbindet er sich aber wieder und legt, wie gewünscht, das Abo für
instar/#
an:mqtt.0 2020-02-03 00:00:31.672 info (776) Subscribe on: "instar/#" mqtt.0 2020-02-03 00:00:31.671 info (776) Connected to 192.168.2.116 mqtt.0 2020-02-03 00:00:31.637 info (776) Try to connect to mqtt://admin:*******************@192.168.2.116:1883?clientId=iobroker mqtt.0 2020-02-03 00:00:31.558 info (776) starting. Version 2.0.4 in /opt/iobroker/node_modules/iobroker.mqtt, node: v10.18.1 host.13be02914684 2020-02-03 00:00:30.723 info instance system.adapter.mqtt.0 started with pid 776 host.13be02914684 2020-02-03 00:00:12.952 info Restart adapter system.adapter.mqtt.0 because enabled host.13be02914684 2020-02-03 00:00:12.951 info instance system.adapter.mqtt.0 terminated with code 0 (NO_ERROR) host.13be02914684 2020-02-03 00:00:12.951 error Caught by controller[0]: at addChunk (_stream_readable.js:288:12) code: 5 } host.13be02914684 2020-02-03 00:00:12.951 error Caught by controller[0]: at Socket.emit (events.js:198:13) host.13be02914684 2020-02-03 00:00:12.951 error Caught by controller[0]: at Socket.ondata (_stream_readable.js:710:20) host.13be02914684 2020-02-03 00:00:12.951 error Caught by controller[0]: at Writable.write (/opt/iobroker/node_modules/readable-stream/lib/_stream_writable.js:334:11) host.13be02914684 2020-02-03 00:00:12.951 error Caught by controller[0]: at writeOrBuffer (/opt/iobroker/node_modules/readable-stream/lib/_stream_writable.js:417:5) host.13be02914684 2020-02-03 00:00:12.951 error Caught by controller[0]: at doWrite (/opt/iobroker/node_modules/readable-stream/lib/_stream_writable.js:428:64) host.13be02914684 2020-02-03 00:00:12.951 error Caught by controller[0]: at Writable.writable._write (/opt/iobroker/node_modules/mqtt/lib/client.js:302:5) host.13be02914684 2020-02-03 00:00:12.951 error Caught by controller[0]: at work (/opt/iobroker/node_modules/mqtt/lib/client.js:292:12) host.13be02914684 2020-02-03 00:00:12.951 error Caught by controller[0]: at MqttClient._handlePacket (/opt/iobroker/node_modules/mqtt/lib/client.js:350:12) host.13be02914684 2020-02-03 00:00:12.951 error Caught by controller[0]: at MqttClient._handleConnack (/opt/iobroker/node_modules/mqtt/lib/client.js:920:15) host.13be02914684 2020-02-03 00:00:12.951 error Caught by controller[0]: { Error: Connection refused: Not authorized mqtt.0 2020-02-03 00:00:12.446 info (440) Terminated (NO_ERROR): Without reason mqtt.0 2020-02-03 00:00:12.445 info (440) terminating mqtt.0 2020-02-03 00:00:11.945 info (440) Disconnected from 192.168.2.116: undefined mqtt.0 2020-02-03 00:00:11.944 error (440) uncaughtException: Error: Connection refused: Not authorized mqtt.0 2020-02-03 00:00:11.943 error (440) Error: Connection refused: Not authorized at MqttClient._handleConnack (/opt/iobroker/node_modules/mqtt/lib/client.js:920:15) at MqttClient._handlePacket (/opt/iobroker/node_modules/mqtt mqtt.0 2020-02-03 00:00:11.943 error (440) uncaught exception: Connection refused: Not authorized
Das hindert also nicht die Funktion an sich.
Ich würde wirklich vorschlagen mal ein Debug Tool (Mqtt.fx, MQTT Explorer, usw.) zu installieren und mal zu schauen was da für Meldungen durchs MQTT Netz gehen. Und beim ioBroker Objekt Baum ab und zu mal auf "Baum neu erstellen" klicken - damit hatte ich auch schon mal Probleme... die Topics ware bereits da, ich konnte sie nur nicht sehen.
p.S. Screenshots hochladen geht mit dem Upload File Dialog oben in der Zeile mit den Text-Formatierungstools.
-
-
Bekanntgeben eigener Zustände beim Verbinden ist gefährlich. Das sollte man auf jeden Fall rausnehmen. Sobald man Befehls-Topics im Objektbaum hat, werden die beim Verbinden publiziert und man wird mit Updates zuge-spammed. Aber solange man noch nichts hinzugefügt hat, spielt es natürlich keine Rolle.
Ich sehe, dass Sie Node-RED als Adapter installiert haben. Das läßt sich genauso zum Debuggen verwenden wie MQTT.fx. Können Sie dort den INSTAR MQTT Broker hinzufügen? Kann man Befehle senden? Ein Wildcard Abo
#
in einem MQTT Eingangsknoten + Debug Node sollte Ihnen auch alle Status Updates der Kamera zeigen. Diese sind aufretained
gesetzt, werden also sofort beim Verbinden publiziert. -
Okay, danke für den Hinweis. Den Haken habe ich rausgenommen.
Ich würde das mit dem Debuggen über mqtt gern versuchen, bin da aber totaler Anfänger... ist so etwas gemeint ?
Da bekomme ich tatsächlich im Debug die ganzen Status!! Hurra!!
Nachtrag: und im ioBroker Objektbaum sind die Stats jetzt auch vorhanden
-
Jetzt würde ich das mit dem "raw" noch verstehen wollen. Im Vis-Editor habe ich den Button eingefügt und mit dem Objekt verlinkt. Aber woher kommt das raw ? Soweit ich es verstanden habe, kann ich die Kamera ja nur dann schalten, wenn ich den raw-Wert verändere, oder ?
-
@Förster Richtig.
Ich würde da weiterhin MQTT.fx oder MQTT Explorer empfehlen (in der Anleitung beschrieben), aber man bekommt das auch mit Node-RED hin:
Hier ist der benötigte Flow:
[{"id":"5aa0bd1c.0e4d64","type":"mqtt in","z":"cf5a544a.c32598","name":"status/alarm/area3/enable","topic":"instar/10D1DC2171FE/status/alarm/area3/enable","qos":"1","datatype":"auto","broker":"feae1d82.617d2","x":210,"y":80,"wires":[["ac4a5273.b5994"]]},{"id":"ac4a5273.b5994","type":"debug","z":"cf5a544a.c32598","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":230,"y":123,"wires":[]},{"id":"34dd783b.7454e8","type":"mqtt out","z":"cf5a544a.c32598","name":"alarm/area3/enable/raw","topic":"instar/10D1DC2171FE/alarm/area3/enable/raw","qos":"1","retain":"","broker":"feae1d82.617d2","x":270,"y":220,"wires":[]},{"id":"444eda9.fbd4524","type":"inject","z":"cf5a544a.c32598","name":"","topic":"","payload":"1","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":175,"y":178,"wires":[["34dd783b.7454e8"]]},{"id":"feae1d82.617d2","type":"mqtt-broker","z":"","name":"116Black","broker":"192.168.2.116","port":"8883","tls":"64ba55e0.2d728c","clientid":"","usetls":true,"compatmode":true,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"64ba55e0.2d728c","type":"tls-config","z":"","name":"8015Black","cert":"","key":"","ca":"","certname":"8015pcert.pem","keyname":"","caname":"","servername":"","verifyservercert":true}]
Ich habe da die MQTT ID bereits auf
10D1DC2171FE
angepasst. Sollte also sofort funktionieren. In Node-RED oben rechts in der Ecke das Menü öffnen und Import auswählen. Danach den JSON Code oben reinkopieren und bestätigen, die Node Sequenz plazieren und Deploy drücken. (Nicht vergessen bei den MQTT Nodes noch den MQTT Broker auswählen!)Wenn man jetzt auf den blauen Inject Node klickt wird eine
1
als Payload an das MQTT Topicinstar/10D1DC2171FE/alarm/area3/enable/raw
geschickt. Entsprechend sollte in der Kamera danach der dritte Alarmbereich aktiv sein. Wenn man im Inject Node den Payload auf0
ändert und den Vorgang wiederholt, wird der Bereich wieder deaktiviert.Im ioBroker Objekt Baum sollte dann auch das RAW Topic zu finden sein.
Anmerkung: Ich habe es gerade wieder erlebt, dass ioBroker die Änderung im Objektbaum nicht angezeigt hat. Nach einem Neustart von ioBroker lief dann wieder alles. Vermutlich hätte ein Neuladen des MQTT Adapters auch schon ausgereicht. Mir wurde bereits gesagt, dass man eventuell besser den reinen MQTT Client Adapter nutzen sollte, da dieser stabiler läuft. Hat da jemand hier im Forum Erfahrung mit?
Man kann jetzt im Node-RED Flow nach und nach die MQTT Topics reinkopieren und absenden, die man im ioBroker nutzen möchte.
-
Bei allen Full HD Kameramodellen kann man mit der aktuellen Firmware jetzt das Alarmserver Intervall per CGI Befehl einstellen. Der Standard-Wert ist 60s:
/param.cgi?cmd=setmdalarm&-aname=server2&-switch=on&-interval=60
Eine Reduktion ist bis auf eine Sekunde runter möglich - wir empfehlen jedoch es auf min. 10-15s zu belassen (wenn auf der Smarthome-Seite nicht anders benötigt). Um das Intervall zwischen Alarmauslösungen bei einer Kamera mit der IP 192.168.178.102 und dem HTTP Port 80 auf 15s zu stellen, lautet der Befehl beispielsweise:
http:// 192.168.178.102:80/param.cgi?cmd=setmdalarm&-aname=server2&-switch=on&-interval=15
Der Alarmserver wird verwendet um ioBroker zu informieren, wenn eine Bewegung von der Kamera erkannt wurde:
https://wiki.instar.de/Frequently_Asked_Question/ioBroker_and_INSTAR_Alarmserver/
-
@mpolinowski Super, vielen Dank für den tollen Support an dieser Stelle, hat funktioniert.
Werde mit den Einstellungen noch ein bisschen rumspielen und probieren, was damit alles möglich ist. Mein Ziel ist es, den Status der Kamera (Alarmserver an/aus) in VIS zu visualisieren bzw. auf die Schaltung durch meine Zentrale (homee) zu reagieren. Mit den Hinweisen sollte das klappen
-
ruhig posten sobald die Lösung steht - das interessiert bestimmt auch andere
Sollten noch Probleme auftreten, helfe ich gerne.
-
Der INSTAR MQTT Dienst ist jetzt regulär über das System/Update Menü erhältlich und es wurden noch einige Verbesserungen/Bugfixes hinzugefügt:
- Weitere MQTT Topics hinzugefügt (z.B. zur schrittweise (one-step) Steuerung der Kamera)
- Benutzer Logins sind nicht mehr per MQTT auslesbar
- Alle Sonderzeichen, die auch beim Kameralogin erlaubt sind, können jetzt auch fürs MQTT verwendet werden
- Die hinterlegten Ports für den MQTT Dienst wurden auf die Standards 1883/8883 angepasst
- In der Beta wurde bei Topics nicht zwischen “local” und “all” unterschieden. Ersters spricht jetzt nur noch die Kamera an, auf der der Broker läuft und letzteres alle Kameras im MQTT Netzwerk
- Die Verwendung von eigenen SSL Zertifikaten für den MQTT Dienst wurde vereinfacht. Wir haben bereits eine Anleitung für selbst-signierte Certs online, für CA Certs (Let’s Encrypt) folgt in Kürze.
-
Ich bin von einigen ioBroker Nutzern bzgl. Fälle in denen der ioBroker MQTT Adapter Kameraeinstellungen überschreibt, wie es aussieht, wenn man den ioBroker Adapter nicht als Client, sondern als MQTT Broker verwenden möchte. Und genrelle Anfragen dazu, wie man am besten das passenden Befehl, Status und RAW MQTT Topic für eine Anwendung finden kann.
Zu all diesen Themen gibt es jetzt kurze FAQ's im INSTAR Wiki.
-
Das letzte MQTT Update beinhaltet zwei ioBroker relevante Bug Fixes und man kann es direkt über die Weboberfläche der Kamera herunterladen:
1.) Beim Auflösen von eingehenden CGI Befehlen (zum Beispiel beim Benutzen der Kamera über die WebUI) in MQTT Status Updates, wurde eine DNS Anfrage für "localhost" an den DNS Server des Netzwerkes gesendet. Dieses Problem behoben. 2.) Der MQTT Adapter im ioBroker lässt sich so konfigurieren, dass dieser nach einem Neustart die Konfiguration der Kamera mit leeren "Strings" überschreibt. Da der ioBroker nur mit RAW Topics arbeitet, haben wir das Senden von "leeren" Updates auf RAW Topics unterbunden. Siehe auch Fehlerbeschreibung im Wiki, 3.) Wenn man ein Variable der Konfiguration auf einen leeren "String" setzen muss, ist dies über die regulären Befehl Topics im JSON Format möglich: {"val":""}. Der Fehler, dass hierbei die Variable auf den Wert "$val" gesetzt wurde, wurde behoben. 4.) Beim gleichzeitigen Versenden einer größeren Anzahl an CGI Befehle zur Kamera, konnte es vorkommen, dass die entsprechenden MQTT Status Updates nicht richtig aufgelöst wurden. Aufgefallen war dies bei der Verwendung von HTTP Schaltern in der Homebridge (Homekit). Dieses Problem wurde behoben. 5.) Die verfügbaren MQTT Topics wurden erweitert und die Dokumentation verbessert. z.B. ist es jetzt möglich einen Scan zwischen 2, vorher in der WebUI festgelegten, Positionen zu starten (features/ptz/preset) oder eine, ebenfalls zuvor festgelegte, Tour anzustoßen (features/ptz/scan). 6.) Die üblichen kleinen Bugfixes und Verbesserungen...
Es wird in Kürze dann ein Update geben, mit dem man Alarmereignisse per MQTT abgreifen kann.
-
MQTT Alarmserver
Mit dem aktuellsten Update kann man jetzt auch Alarmereignisse per MQTT im ioBroker nutzen. Hier gibt es eine Anleitung wie man dies mit dem Node-RED Adapter umsetzen kann.
Mit Blockly kann man es so machen:
Wenn das MQTT Status Topic
alarm/triggered
aktualisiert wird, dann mache was. Das Beispiel bezieht sich auf eine Kamera mit der MQTT ID10D1DC21F5DB
- das muß man dann auf die ID der eigenen Kamera anpassen.Die Werte die über das Topic reinkommen sind
{"val":"1"}
bis{"val":"10"}
und stehen für den Auslöser des Alarms:- Alarmbereich Bereich 1 ausgelöst: 1
- Alarmbereich Bereich 2 ausgelöst: 2
- Alarmbereich Bereich 3 ausgelöst: 3
- Alarmbereich Bereich 4 ausgelöst: 4
- Alarmeingang / PIR ausgelöst: 5
- Audioalarm ausgelöst: 6
- Bewegungserkennung & PIR wurde ausgelöst (Bereich 1): 7
- Bewegungserkennung & PIR wurde ausgelöst (Bereich 2): 8
- Bewegungserkennung & PIR wurde ausgelöst (Bereich 3): 9
- Bewegungserkennung & PIR wurde ausgelöst (Bereich 4): 10
In dem Beispiel Skript habe ich Alarmbereich 1 auf der linken und Bereich 4 auf der rechten Seite des Bildes in der Kamera eingezogen:
Wenn ich jetzt ein
{"val":"1"}
auf demalarm/triggered
Topic erhalte bedeutet das, dass eine Bewegung auf der linken Seite erkannt wurde - ich muß die Kamera also nach links Steuern um das Objekt zu zentrieren. Und bei einem {"val":"4"} schwenke ich die Kamera einen Schritt nach rechts.Das funktioniert mit dem Topic:
/features/ptz/movestep/raw
und dem Payloadleft
oderright
Zusätzlich hatte ich noch eine Aktion für ein
{"val": "6"}
eingerichtet - dies ist der Audioalarm, der aber auch mit dem Topicalarm/pushalarm
ausgelöst werden kann und somit für Automatisierungen im ioBroker genutzt werden kann. Die 8 gespeicherten Positionen kann man mit dem folgenden Topic anfahren lassen:features/ptz/presets/raw
mit Payload0
-7
Die Auslösung des Audioalarms würde gemäß des Beispielskripts dann dazu führen, dass die Kamera die Preset Position 3 anfährt.
-
XML Export für das Blockly Skript oben - bitte beachten, dass die hier verwendete Kamera die MQTT ID
10D1DC21F5DB
hat - hier muß man entsprechend die ID der eigenen Kamera eintragen:<xml xmlns="http://www.w3.org/1999/xhtml"> <block type="on_ext" id="5:E8z%?$kF2:_228=Fsl" x="-62" y="-112"> <mutation items="1"></mutation> <field name="CONDITION">ne</field> <field name="ACK_CONDITION"></field> <value name="OID0"> <shadow type="field_oid" id="7K},E#*On`zsq^jhPQ9v"> <field name="oid">mqtt.0.instar.10D1DC21F5DB.status.alarm.triggered</field> </shadow> </value> <statement name="STATEMENT"> <block type="controls_if" id="2%z$7WDJUl-dSz+miU(-"> <value name="IF0"> <block type="logic_compare" id="9]pjLD{[W^26TPYM6liS"> <field name="OP">EQ</field> <value name="A"> <block type="on_source" id="-?/H,NwcYjPh~{p`fc`~"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="text" id="hKDWmg?WzR9@$Wo4RHj5"> <field name="TEXT">{"val":"1"}</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="g@M?e*b1_8ezO{_(PUcP"> <mutation delay_input="false"></mutation> <field name="OID">mqtt.0.instar.10D1DC21F5DB.features.ptz.movestep.raw</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="u2H{{k$7nO+({(J4,2,C"> <field name="TEXT">left</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="}uq*%|F/Nt=*`rn`|hV4"> <value name="IF0"> <block type="logic_compare" id="|x2u0AR*aTmVC=lfROzF"> <field name="OP">EQ</field> <value name="A"> <block type="on_source" id="In|(S^y0YVoVN#Y^[.5m"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="text" id="uC/+7LgdO]A`UdHW*sHC"> <field name="TEXT">{"val":"4"}</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="K58]j^_|1M4|}D2aF?{u"> <mutation delay_input="false"></mutation> <field name="OID">mqtt.0.instar.10D1DC21F5DB.features.ptz.movestep.raw</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="13|%(`^fM,_w499|gkt-"> <field name="TEXT">right</field> </block> </value> </block> </statement> <next> <block type="controls_if" id="JhXZ,A)R?fQ}!et!,!/7"> <value name="IF0"> <block type="logic_compare" id="560g5G|oV?rEcXER(oOD"> <field name="OP">EQ</field> <value name="A"> <block type="on_source" id="9[A80k}o*RpbflDD2h/:"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="text" id="._5?cn:Mi%DWgz;OL}v4"> <field name="TEXT">{"val":"6"}</field> </block> </value> </block> </value> <statement name="DO0"> <block type="control" id="]KIbdkEE?:DEhmZ`)wE="> <mutation delay_input="false"></mutation> <field name="OID">mqtt.0.instar.10D1DC21F5DB.features.ptz.preset.raw</field> <field name="WITH_DELAY">FALSE</field> <value name="VALUE"> <block type="text" id="1HbkwoM-U/]J2go|iNoe"> <field name="TEXT">2</field> </block> </value> </block> </statement> </block> </next> </block> </next> </block> </statement> </block> </xml>