NEWS
Daten Objekt aus MQTT zerlegen und in eigene Objekte packen
-
Hallo,
ich versuche gerade die Daten von meinem Stromzähler mittels einem Tasmota IR-Auslesekopf und MQTT in ioBroker zu bekommen.Was bis jetzt funktioniert:
Tasmota sendet Wirkleistung und Zählerstand an MQTT.
Die Daten bekomme ich mittels MQTT Adapter in ioBroker.Es wird ein Objekt "mqtt.0.tele.tasmota_729799.SENSOR" angelegt.
Der inhalt ist wie folgt:
{"Time":"2023-12-10T13:53:24","":{"aktuelle_wirkleistung":98,"zählerstand_tarif_1":12495.8,"zählerstand_tarif_2":0.0"}}Nun versuche ich mittels Blockly das zu Parsen und neue Objekte "Strom.Bezug.Zaehlerstand" und "Strom.Bezug.Wirkleistung" anzulgen.
Lleider bekomme ich das nicht vernünftig zerlegt.
Kann mit bitte jemand helfen?
@Meckii
Das geht auch ohne Blockly:Einfach einen neuen Alias für dein Quellobjekt (“mqtt.0.tele.tasmota_729799.SENSOR") anlegen und dann im Alias eine Konvertierungsfunktion beim Lesen verwenden:
JSON.parse(val).aktuelle_wirkleistung
In deinem Beispiel ist nur der Attributname des verschachtelten JSON-Objekts merkwürdigerweise leer. Das sollte eigentlich nicht sein, daher wird das so wie von mir angegeben vermutlich nicht direkt funktionieren. Du musst zunächst in deiner Tasmota-Konfiguration dafür sorgen, dass hier ein Attributname vergeben wird (z.B. „Energie“). Dann kannst du den Wert mittels
JSON.parse(val).Energie.aktuelle_wirkleistung
extrahieren.
Viele Grüße, Stefan
-
@Meckii
Das geht auch ohne Blockly:Einfach einen neuen Alias für dein Quellobjekt (“mqtt.0.tele.tasmota_729799.SENSOR") anlegen und dann im Alias eine Konvertierungsfunktion beim Lesen verwenden:
JSON.parse(val).aktuelle_wirkleistung
In deinem Beispiel ist nur der Attributname des verschachtelten JSON-Objekts merkwürdigerweise leer. Das sollte eigentlich nicht sein, daher wird das so wie von mir angegeben vermutlich nicht direkt funktionieren. Du musst zunächst in deiner Tasmota-Konfiguration dafür sorgen, dass hier ein Attributname vergeben wird (z.B. „Energie“). Dann kannst du den Wert mittels
JSON.parse(val).Energie.aktuelle_wirkleistung
extrahieren.
Viele Grüße, Stefan
-
@Meckii
Das geht auch ohne Blockly:Einfach einen neuen Alias für dein Quellobjekt (“mqtt.0.tele.tasmota_729799.SENSOR") anlegen und dann im Alias eine Konvertierungsfunktion beim Lesen verwenden:
JSON.parse(val).aktuelle_wirkleistung
In deinem Beispiel ist nur der Attributname des verschachtelten JSON-Objekts merkwürdigerweise leer. Das sollte eigentlich nicht sein, daher wird das so wie von mir angegeben vermutlich nicht direkt funktionieren. Du musst zunächst in deiner Tasmota-Konfiguration dafür sorgen, dass hier ein Attributname vergeben wird (z.B. „Energie“). Dann kannst du den Wert mittels
JSON.parse(val).Energie.aktuelle_wirkleistung
extrahieren.
Viele Grüße, Stefan
@cpu6502 sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
@Meckii
Das geht auch ohne Blockly:Ja oder mit meinem Node-red Flow, der zerlegt jedes JSON in einzelne Datenpunkte.
-
Ich mach das mit diesem Skript:
// where the mqtt messages arrive const mqttDatenpunktObjectId = 'mqtt.0.tele.bitshake_smartmeter.SENSOR'; // where the states should appear const userDataFolder = '0_userdata.0.stromzaehler'; // ############## end user config // receive on(mqttDatenpunktObjectId, (obj) => { const jsonString = obj.state.val; const jsonData = JSON.parse(jsonString); function createObjectsRecursively(parent, data) { for (const key in data) { const obj = data[key]; const stateName = `${parent}.${key}`; if (typeof obj === 'object') { createObjectsRecursively(stateName, obj); } else { let value = obj; // Check if the state already exists. If it does, just update the value. // If it does not exist create the states. if (!existsState(stateName)) { // If the state does not exist, create it and set the value createState(stateName, value, { name: key, type: typeof value, role: "value", read: true, write: true }); log(`Created state ${stateName}`); } else { setState(stateName, value, true); } } } } createObjectsRecursively(userDataFolder, jsonData); });@thomas-braun Hallo und danke für dieses Skript, Datenpunkte angepasst und es läuft
Gruß Dirk