Videaufzeichnungen über ein MQTT-Topic in Node-RED auslösen

Q: Sowohl über die WebUI als auch über die Smartphone-App kann ich eine Videoaufzeichnung auf der internen SD-Karte auslösen. Ist es möglich, diese Aufzeichnung mit einem Smarthome-System über die MQTT-Schnittstelle auszulösen?

A: Ja! Die Aufzeichnung wird über zwei MQTT-Topics gesteuert - eines, um eine 15s, 30s, 45s oder 60s-Aufzeichnung zu starten und das andere, um sie bei Bedarf vorzeitig zu beenden:

  • task/video/rec/start: payload message {"val":"15"},{"val":"30"},{"val":"45"},{"val":"60"}
  • task/video/rec/stop: payload message {"val":"1"}

Update: Natürlich brauchen Sie Node-Red nicht, um die MQTT API zu nutzen. Eine Anleitung, wie Sie die Videoaufzeichnung mit dem MQTT Explorer auslösen, finden Sie in unserem Forum. Dies kann mit jedem MQTT-Client erfolgen, der sich mit demselben MQTT-Broker wie Ihre Kamera verbinden kann.

Hier ist ein Beispiel für die Integration dieser Funktion in Node-RED. Der gesamte Node-RED Flow kann aus dem unten stehenden JSON-Code importiert werden:

Auto-Refreshing MQTT Topics in Node-RED

Auto-Refreshing MQTT Topics in Node-RED

Alternativ können Sie auch die geplante Aufzeichnung verwenden. Stellen Sie sicher, dass der Zeitplan aktiviert ist, die Aufzeichnung aber deaktiviert bleibt. Verwenden Sie nun den folgenden Befehl, um die Aufzeichnung bei Bedarf zu aktivieren 1 oder zu deaktivieren 0.

  • task/video/planrec/enable: payload message {"val":"1"}, {"val":"0"}

Die Aufnahme endet erst, wenn Sie sie deaktivieren - Sie müssen keine maximale Dauer angeben wie bei der manuellen Aufnahme oben. Allerdings wird die Aufnahme in mehrere Dateien aufgeteilt, wenn die maximale Länge überschritten wird. Sie können die Länge der Videodateien über die WebUI festlegen oder das folgende MQTT-Befehlstopic verwenden, um sie dynamisch festzulegen:

  • task/video/planrec/length: payload message up to {"val":"600"}

Auto-Refreshing MQTT Topics in Node-RED

Node-RED Flow

UPDATE: Ein erweitertes Beispiel kann von Github heruntergeladen werden:

Github Repository

Beachten Sie, dass das folgende Beispiel einen Kamera-MQTT-Broker mit der IP-Adresse 192.168.2.115 verwendet, dessen MQTT Client mit dem MQTT-Präfix und der Client-ID cameras/115/ konfiguriert ist. Bitte ersetzen Sie diese entsprechend Ihrer Konfiguration:

[
    {
        "id": "e38003f441ebe758",
        "type": "tab",
        "label": "Recording",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "8739c3f13d21f8c8",
        "type": "mqtt out",
        "z": "e38003f441ebe758",
        "name": "task/video/rec/start",
        "topic": "",
        "qos": "1",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "8c9bd856c466f9b0",
        "x": 350,
        "y": 40,
        "wires": []
    },
    {
        "id": "6f2456fbbab22c65",
        "type": "function",
        "z": "e38003f441ebe758",
        "name": "topic",
        "func": "const command = 'task/video/rec/start';\nconst prefix = 'cameras/115/';\n\nmsg.topic = prefix + command;\n\nreturn msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 190,
        "y": 40,
        "wires": [
            [
                "8739c3f13d21f8c8"
            ]
        ]
    },
    {
        "id": "030ecf3a64bd5f6c",
        "type": "mqtt out",
        "z": "e38003f441ebe758",
        "name": "task/video/rec/stop",
        "topic": "",
        "qos": "1",
        "retain": "false",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "8c9bd856c466f9b0",
        "x": 370,
        "y": 100,
        "wires": []
    },
    {
        "id": "0f73a30e35c79b4f",
        "type": "function",
        "z": "e38003f441ebe758",
        "name": "topic",
        "func": "const command = 'task/video/rec/stop';\nconst prefix = 'cameras/115/';\n\nmsg.topic = prefix + command;\n\nreturn msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 210,
        "y": 100,
        "wires": [
            [
                "030ecf3a64bd5f6c"
            ]
        ]
    },
    {
        "id": "c4edc7fd9949a938",
        "type": "ui_button",
        "z": "e38003f441ebe758",
        "name": "",
        "group": "a0240f14e128be2a",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Stop Rec ",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "className": "",
        "icon": "",
        "payload": "{\"val\":\"1\"}",
        "payloadType": "json",
        "topic": "payload",
        "topicType": "msg",
        "x": 80,
        "y": 100,
        "wires": [
            [
                "0f73a30e35c79b4f"
            ]
        ]
    },
    {
        "id": "29faba26eada713d",
        "type": "ui_button",
        "z": "e38003f441ebe758",
        "name": "",
        "group": "09317789e191eb54",
        "order": 0,
        "width": 0,
        "height": 0,
        "passthru": false,
        "label": "Rec ",
        "tooltip": "",
        "color": "",
        "bgcolor": "",
        "className": "",
        "icon": "",
        "payload": "{\"val\":\"15\"}",
        "payloadType": "json",
        "topic": "payload",
        "topicType": "msg",
        "x": 70,
        "y": 40,
        "wires": [
            [
                "6f2456fbbab22c65"
            ]
        ]
    },
    {
        "id": "8c9bd856c466f9b0",
        "type": "mqtt-broker",
        "name": "",
        "broker": "192.168.2.115",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "5",
        "keepalive": "60",
        "cleansession": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    },
    {
        "id": "a0240f14e128be2a",
        "type": "ui_group",
        "name": "Stop Recording",
        "tab": "8bc4b79cc7336533",
        "order": 4,
        "disp": true,
        "width": "6",
        "collapse": false,
        "className": ""
    },
    {
        "id": "09317789e191eb54",
        "type": "ui_group",
        "name": "Trigger Recording",
        "tab": "8bc4b79cc7336533",
        "order": 2,
        "disp": true,
        "width": "6",
        "collapse": false,
        "className": ""
    },
    {
        "id": "8bc4b79cc7336533",
        "type": "ui_tab",
        "name": "Video Recording",
        "icon": "dashboard",
        "disabled": false,
        "hidden": false
    }
]