NEWS
MQTT js zerlegen mit switsch
-
Guten abend.
ich habe hier mehrere Xioami Temp. sensoren die Messwerte bekomme ich per TASMOTA MQTT als Json
{"Time":"2022-12-04T13:44:13","ATCf44b8f":{"mac":"a4c138f44b8f","Temperature":19.9,"Humidity":51,"DewPoint":9.5,"Btn":1,"Battery":68,"RSSI":-42},"ATC589a51":{"mac":"a4c138589a51","Temperature":19.6,"Humidity":51.8,"DewPoint":9.4,"Btn":1,"Battery":70,"RSSI":-60},"TempUnit":"C"}
jetzt wollte ich die in influxdb und grafana auswerten ,
angefangen habe ich mit blocky script bin dann aber bei node red hängen geblieben
[ { "id": "7510054243d77b6d", "type": "switch", "z": "6f4022ddbb229204", "name": "", "property": "payload", "propertyType": "msg", "rules": [ { "t": "eq", "v": "payload.ATCf44b8f.mac.\"a4c138f44b8f\"", "vt": "str" }, { "t": "eq", "v": "a4c138589a51", "vt": "str" }, { "t": "eq", "v": "A4:C1:38:E3:C7:94", "vt": "str" }, { "t": "eq", "v": "A4:C1:38:CB:5C:EA ", "vt": "str" }, { "t": "eq", "v": "A4:C1:38:A6:00:5B", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 5, "x": 610, "y": 500, "wires": [ [ "ed08fe87332abba7", "6e7fcdeaa794a00a" ], [], [], [], [] ] }, { "id": "ed08fe87332abba7", "type": "function", "z": "6f4022ddbb229204", "name": "temp", "func": "msg.topic = \"Haus/Wohnzimmer/Temp.\"\nmsg.payload = msg.payload[\".ATCf44b8f.Temperature\"]\nreturn msg;\n\n\n", "outputs": 1, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 830, "y": 460, "wires": [ [ "13e50b962ea4b4ec", "ced978bbcfb66860", "f2ebf39d6ec29ac0" ] ] }, { "id": "13e50b962ea4b4ec", "type": "debug", "z": "6f4022ddbb229204", "name": "debug 18", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 1060, "y": 460, "wires": [] }, { "id": "47e53c63b917864e", "type": "inject", "z": "6f4022ddbb229204", "name": "", "props": [ { "p": "payload" } ], "repeat": "", "crontab": "", "once": false, "onceDelay": 0.1, "topic": "", "payload": "{\"Time\":\"2022-12-04T13:44:13\",\"ATCf44b8f\":{\"mac\":\"a4c138f44b8f\",\"Temperature\":19.9,\"Humidity\":51,\"DewPoint\":9.5,\"Btn\":1,\"Battery\":68,\"RSSI\":-42},\"ATC589a51\":{\"mac\":\"a4c138589a51\",\"Temperature\":19.6,\"Humidity\":51.8,\"DewPoint\":9.4,\"Btn\":1,\"Battery\":70,\"RSSI\":-60},\"TempUnit\":\"C\"}", "payloadType": "str", "x": 170, "y": 520, "wires": [ [ "a5a4c266b13a0cca" ] ] }, { "id": "a43792495de3a27b", "type": "debug", "z": "6f4022ddbb229204", "name": "debug 19", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 380, "y": 400, "wires": [] }, { "id": "a5a4c266b13a0cca", "type": "json", "z": "6f4022ddbb229204", "name": "", "property": "payload", "action": "", "pretty": true, "x": 390, "y": 520, "wires": [ [ "7510054243d77b6d", "a43792495de3a27b" ] ] }, { "id": "6e7fcdeaa794a00a", "type": "debug", "z": "6f4022ddbb229204", "name": "debug 20", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "statusVal": "", "statusType": "auto", "x": 800, "y": 380, "wires": [] }, { "id": "ced978bbcfb66860", "type": "influxdb out", "z": "6f4022ddbb229204", "influxdb": "eac63cf27267f4a5", "name": "", "measurement": "test_xioami", "precision": "", "retentionPolicy": "", "database": "database", "precisionV18FluxV20": "ms", "retentionPolicyV18Flux": "", "org": "Weiss", "bucket": "iobroker", "x": 1240, "y": 520, "wires": [] }, { "id": "f2ebf39d6ec29ac0", "type": "mqtt out", "z": "6f4022ddbb229204", "name": "", "topic": "Haus/", "qos": "2", "retain": "", "respTopic": "", "contentType": "", "userProps": "", "correl": "", "expiry": "", "broker": "33eaf0503bac882f", "x": 1050, "y": 560, "wires": [] }, { "id": "eac63cf27267f4a5", "type": "influxdb", "hostname": "127.0.0.1", "port": "8086", "protocol": "http", "database": "database", "name": "", "usetls": false, "tls": "", "influxdbVersion": "2.0", "url": "https://eu-central-1-1.aws.cloud2.influxdata.com/", "rejectUnauthorized": false }, { "id": "33eaf0503bac882f", "type": "mqtt-broker", "name": "mqtt-server", "broker": "192.168.178.20", "port": "1883", "clientid": "node_red", "autoConnect": true, "usetls": false, "protocolVersion": "4", "keepalive": "60", "cleansession": true, "birthTopic": "nodered ", "birthQos": "0", "birthPayload": "nodered online", "birthMsg": {}, "closeTopic": "", "closeQos": "0", "closePayload": "", "closeMsg": {}, "willTopic": "nodered", "willQos": "0", "willPayload": "nodered offlline", "willMsg": {}, "userProps": "", "sessionExpiry": "" } ]
auch da gehst nicht weiter ich hänge bei der switsch node fest die da Js nach mac adressen filtern sollte da die sensoren in 3 gleichen String senden alle nach einnader
Für Ideen wäre ich dankbar
-
@jörg-w Ich verwende den Sonoff Adapter. Da ist das alles schon zerlegt.
-
@jörg-w Ist zwar ein komischer EingabeString. Aber Du musst den String in einzelne Objekte zerlegen:
Wenn Du einzelne Datenpunkte aus Deinen JSONs haben willst, dann schau Dir mal meinen Flow an:
https://forum.iobroker.net/topic/43856/json-oder-javascript-objekt-in-iobroker-datenpunkte-zerlegen
Andere Adapter braucht es dafür nicht. Im Gegenteil, wenn Du auch noch andere MQTT-Kommunikation nutzen willst, stört der nur.
-
Hier noch eine einfachere Lösung mit JSONATA - (da muss ich aber auch immer erst probieren).
Damit spart man sich den switch und selectiert nur die Objekte, die eine mac Adresse haben:Dein Objekt
{"Time":"2022-12-04T13:44:13","ATCf44b8f":{"mac":"a4c138f44b8f","Temperature":19.9,"Humidity":51,"DewPoint":9.5,"Btn":1,"Battery":68,"RSSI":-42},"ATC589a51":{"mac":"a4c138589a51","Temperature":19.6,"Humidity":51.8,"DewPoint":9.4,"Btn":1,"Battery":70,"RSSI":-60},"TempUnit":"C"}
wird mit folgendem JSONATA ein Array mit Objekten (die einen Textschlüssel mit Eigenschaft "mac" - geht nur bei Typ Text - bei Zahlen benötigt man numerische Vergleiche) reduziert.
payload.*[mac]
will man im Übrigen auf Eigenschaften mit Zahlen als Wert selektieren, benötigt man die $exists() Funktion
*[$exists(Temperature)]
selektiert alle Objekte, die eine Eigenschaft Temperature enthalten.
das Ergebnisarray kann dann einfach mit einer split Node in einzelne Nachrichten aufgeteilt werden:
[{"mac":"a4c138f44b8f","Temperature":19.9,"Humidity":51,"DewPoint":9.5,"Btn":1,"Battery":68,"RSSI":-42},{"mac":"a4c138589a51","Temperature":19.6,"Humidity":51.8,"DewPoint":9.4,"Btn":1,"Battery":70,"RSSI":-60}]
-