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 ;)
-
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 ;)
-
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 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.
-
@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}] -
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}]
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden
