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 sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
Nun versuche ich mittels Blockly das zu Parsen und neue Objekte "Strom.Bezug.Zaehlerstand" und "Strom.Bezug.Wirkleistung" anzulgen.
der Block schwebt frei im Raum.
Was willst du damit erreichen?
-
@homoran
Ja der schwebt da - das ist aber nicht der Fehler.
Mein Problem habe ich glaube ich gefunden.
Das Time bekomme ich rausgeparst - die anderen Werte nicht.Ich glaube das Problem ist das "verschachtelte" JSON...
-
@meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
das ist aber nicht der Fehler.
sicher?
@meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
Ich glaube das Problem ist das "verschachtelte" JSON...
möglich!
Bitte das json in code-tags posten damit keine Steuerzeichen verloren gehen
https://forum.iobroker.net/topic/51555/hinweise-für-gute-forenbeiträge/1kann das sein, dass dirt ein " zuviel drin ist?
probier mal ein 0.aktuelle......
-
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); });
-
@homoran
Ja, ich hab das so stehen lassen damit man meinen Lösungsansatz sieht.
Dass das genau so wie im Bild nicht gehen kann ist mir klarGerne
{"Time":"2023-12-10T14:30:04","":{"aktuelle_wirkleistung":1212,"zählerstand_tarif_1":12495.9,"zählerstand_tarif_2":0.0}}
-
@meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
Gerne
{"Time":"2023-12-10T14:30:04","":{"aktuelle_wirkleistung":1212,"zählerstand_tarif_1":12495.9,"zählerstand_tarif_2":0.0}}
siehste, da ist das letzte " nicht drin, dann müsste es mit
@homoran sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
probier mal ein 0.aktuelle......
klappen
-
@meckii sagte: {"Time":"2023-12-10T14:30:04","":{"aktuelle_wirkleistung":1212,"zählerstand_tarif_1":12495.9,"zählerstand_tarif_2":0.0}}
Das Problem ist der leere Bezeichner des Objektes. Man muss erst damit das Objekt erzeugen, um dann auf die Attribute zugreifen zu können.
-
@paul53 Da bekomme ich eine Fehlermeldung
Cannot parse "mqtt.0.tele.tasmota_729799.SEN"SyntaxError: Unexpected token m in JSON at position 0
-
-
@meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
@paul53 Da bekomme ich eine Fehlermeldung
Cannot parse "mqtt.0.tele.tasmota_729799.SEN"SyntaxError: Unexpected token m in JSON at position 0
und mit 0.aktuel....
EDIT!
Natürlich hat @Paul53 wieder recht!
anders geht's nicht
-
@homoran
Ok wenn ich es mache wie du - also das Objekt in einen Text kopieren - dann geht es.
Greife ich auf das Objekt direkt zu kommt eine Fehlermeldung...16:54:44.761 error javascript.0 (1473) script.js.Strom.Bezug.Messdaten: Cannot parse "mqtt.0.tele.tasmota_729799.SEN"SyntaxError: Unexpected token m in JSON at position 0 16:54:44.763 error javascript.0 (1473) script.js.Strom.Bezug.Messdaten: Cannot get zählerstand_tarif_2 of null
Gibt es einen vernünftigen Weg das originale Objekt wie es aus MQTT im ioBroker landet zu kopieren und hier einzufügen?
Edit:
Ich nehme alles zurück - der Depp saß vor dem Monitor.
Man sollte auf den Wert von ObjektID gehen und nicht auf die ObjektID..Vielen Dank an alle!
-
@meckii sagte: Greife ich auf das Objekt direkt zu kommt eine Fehlermeldung...
Wie erfolgt der Zugriff? Zeigen!
-
@paul53 sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
@meckii sagte: Greife ich auf das Objekt direkt zu kommt eine Fehlermeldung...
Wie erfolgt der Zugriff? Zeigen!
Ist erledigt.
Habs ein Beitrag weiter oben beschrieben - der Fehler saß vor dem Monitor -
Meine Lösung für die Nachwelt:
var Objekt, wirkleistung, tarif1, tarif2, serverid; createState('Strom.Bezug.Wirkleistung', 0, JSON.parse('{"type": "number", "unit": "W"}'), async () => { }); createState('Strom.Bezug.ZaehlerstandHT', 0, JSON.parse('{"type": "number", "unit": "kWh"}'), async () => { }); createState('Strom.Bezug.ZaehlerstandNT', 0, JSON.parse('{"type": "number", "unit": "kWh"}'), async () => { }); createState('Strom.Bezug.Server_ID', 0, async () => { }); on({ id: [].concat(['mqtt.0.tele.tasmota_123456.SENSOR']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; Objekt = getState('mqtt.0.tele.tasmota_123456.SENSOR').val; wirkleistung = getAttr(getAttr(Objekt, ''), 'aktuelle_wirkleistung'); tarif1 = getAttr(getAttr(Objekt, ''), 'zählerstand_tarif_1'); tarif2 = getAttr(getAttr(Objekt, ''), 'zählerstand_tarif_2'); serverid = getAttr(getAttr(Objekt, ''), 'Server_ID'); setState('javascript.0.Strom.Bezug.Wirkleistung' /* Strom.Bezug.Wirkleistung */, wirkleistung, true); setState('javascript.0.Strom.Bezug.ZaehlerstandHT' /* Strom.Bezug.ZaehlerstandHT */, tarif1, true); setState('javascript.0.Strom.Bezug.ZaehlerstandNT' /* Strom.Bezug.ZaehlerstandNT */, tarif2, true); setState('javascript.0.Strom.Bezug.Server_ID' /* Strom.Bezug.Server_ID */, serverid, true); });
-
@meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
Meine Lösung für die Nachwelt:
wo ist das Blockly dazu?
https://forum.iobroker.net/topic/51555/hinweise-für-gute-forenbeiträge/1@meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
der Fehler saß vor dem Monitor
ID statt Wert von?
immer alles zeigen, zeigen, zeigen!!
was du trotz Nachfrage nicht gemacht hast -
@homoran
Das reiche ich gerne nach.
War nur so dass ich zwei Kinder auf mir rumturnen hatte - jetzt sind sie im Bett
Mir war übrigens nicht klar, warum ich dann etwas zeigen sollte wo ich den Fehler schon gefunden hatte...
ICh gelobe besserung -
@homoran sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
ID statt Wert von?
immer alles zeigen, zeigen, zeigen!!
was du trotz Nachfrage nicht gemacht hastIch hatte versehentlich den oberen Block genommen statt den unteren.
-
@meckii sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
@paul53 Da bekomme ich eine Fehlermeldung
Cannot parse "mqtt.0.tele.tasmota_729799.SEN"SyntaxError: Unexpected token m in JSON at position 0
das sah nämlich nach der DP ID aus, deswegen schrieb @paul53 auch sofort
@paul53 sagte in Daten Objekt aus MQTT zerlegen und in eigene Objekte packen:
Blockly zeigen!
-