NEWS
[gelöst] Werte einzeln aus JSON extrahieren für Anfänger
-
Hallo,
ich habe leider noch nie so richtig mit Json gearbeitet bzw. das was ich bisher hatte habe ich immer mit Hilfe herausarbeiten können.
Auch jetzt habe ich ein Problem das ich irgendwie lösen möchte, jedoch keinen richtigen Ansatz dafür finde.
Ich bekomme aus meiner Heizung über den MQTT Adapter die Anlagenwerte als JSON String.
Die sehen so aus:
{"wWSelTemp":"60","wWActivated":"on","wWCurTmp":"61.0","wWHeat":"off","curFlowTemp":"40.4","retTemp":"40.4","burnGas":"on","heatPmp":"on","fanWork":"on","ignWork":"on","wWCirc":"off","selBurnPow":"100","curBurnPow":"0","sysPress":"1.0","boilTemp":"40.9","pumpMod":"55"}
Jetzt möchte ich die gerne zerlegen und einzelne Datenpunkte erstellen die ich dann in VIS darstellen kann.
Leider habe ich keine Ahnung wie ich das Umsetzen könnte.
Ich habe zwar verstanden das ich das irgendwie mit "parse" machen kann, aber das war auch schon alles was mir dazu vorgekommen ist.
Ich habe mal ein "Gerüst" erstellt, aber komme nicht weiter:
var json = "mqtt.0.home.boiler.boiler_data"/*BoilerDaten*/; var Vorl = "javascript.0.Heizung.Vorlauf"/*Vorlauf*/; var Rueckl = "javascript.0.Heizung.Ruecklauf"/*Ruecklauf*/; var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/; var WWsoll = "javascript.0.Heizung.WarmwasserSoll"/*Warmwasser Soll*/; var Druck = "javascript.0.Heizung.Systemdruck"/*Systemdruck*/; var WWAn = "javascript.0.Heizung.WarmwasserAn"/*Warmwasser aktiv*/; obj = JSON.parse(json); var Vorl = obj.curFlowTemp; var Rueckl = obj.retTemp; var WWIst = obj.wWCurTmp; var WWsoll = obj.wWSelTemp; var Druck = obj.sysPress; var WWAn = obj.wWActivated; setState(Vorl,curFlowTemp); setState(Rueckl,retTemp); setState(WWIst,wWCurTmp); setState(WWsoll,wWSelTemp); setState(Druck,sysPress); setState(WWAn,wWActivated);
Gibt es vielleicht jemanden der mir hier behilflich sein kann?
-
var json = "mqtt.0.home.boiler.boiler_data"/*BoilerDaten*/; var Vorl = "javascript.0.Heizung.Vorlauf"/*Vorlauf*/; var Rueckl = "javascript.0.Heizung.Ruecklauf"/*Ruecklauf*/; var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/; var WWsoll = "javascript.0.Heizung.WarmwasserSoll"/*Warmwasser Soll*/; var Druck = "javascript.0.Heizung.Systemdruck"/*Systemdruck*/; var WWAn = "javascript.0.Heizung.WarmwasserAn"/*Warmwasser aktiv*/; var obj = JSON.parse(getState(json).val); setState(Vorl, parseFloat(obj.curFlowTemp)); setState(Rueckl, parseFloat(obj.retTemp)); setState(WWIst, parseFloat(obj.wWCurTmp)); setState(WWsoll, parseFloat(obj.wWSelTemp)); setState(Druck, parseFloat(obj.sysPress)); setState(WWAn, obj.wWActivated);
So werden die Werte nur einmal bei Skriptstart gesetzt, denn es fehlt ein Trigger.
-
Ich habe das jetzt mal so versucht:
on({id: 'mqtt.0.home.boiler.boiler_data', change: "any"}, function (obj) { var json = "mqtt.0.home.boiler.boiler_data"/*BoilerDaten*/; var Vorl = "javascript.0.Heizung.Vorlauf"/*Vorlauf*/; var Rueckl = "javascript.0.Heizung.Ruecklauf"/*Ruecklauf*/; var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/; var WWsoll = "javascript.0.Heizung.WarmwasserSoll"/*Warmwasser Soll*/; var Druck = "javascript.0.Heizung.Systemdruck"/*Systemdruck*/; var WWAn = "javascript.0.Heizung.WarmwasserAn"/*Warmwasser aktiv*/; try {obj = JSON.parse(getState('mqtt.0.home.boiler.boiler_data').val); } catch (e) { console.error('Cannot parse: ' + getState('mqtt.0.home.boiler.boiler_data').val); return; } Vorl = obj.curFlowTemp; Rueckl = obj.retTemp; WWIst = obj.wWCurTmp; WWsoll = obj.wWSelTemp; Druck = obj.sysPress; WWAn = obj.wWActivated; setState(Vorl,curFlowTemp); setState(Rueckl,retTemp); setState(WWIst,wWCurTmp); setState(WWsoll,wWSelTemp); setState(Druck,sysPress); setState(WWAn,wWActivated); });
Aber es werden weder beim ersten och beim zweiten script die Werte gesetzt.
Ich habe aber auch keinen Fehler im Log.
-
Sorry,
ich bin betriebsblind.
Ich danke für dein Script.
Beim Versuch habe ich jetzt einen Fehler erhalten:
javascript.0 2018-10-17 23:39:50.942 error at ContextifyScript.Script.runInContext (vm.js:59:29) javascript.0 2018-10-17 23:39:50.942 error at script.js.Heizung.Versuch5:14:13 javascript.0 2018-10-17 23:39:50.942 error ReferenceError: WWIst is not defined javascript.0 2018-10-17 23:39:50.942 error ^ javascript.0 2018-10-17 23:39:50.942 error setState(WWIst, parseFloat(obj.wWCurTmp)); javascript.0 2018-10-17 23:39:50.942 error script.js.Heizung.Versuch5: script.js.Heizung.Versuch5:14
-
Beim Versuch habe ich jetzt einen Fehler erhalten:
javascript.0 2018-10-17 23:39:50.942 error setState(WWIst, parseFloat(obj.wWCurTmp)); ```` `
Grund: Groß-/Kleinschreibung:
var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/;
-
Jaa,
DAAAAANKE!
Ich habe das jetzt ohne Fehler am laufen und es scheinen auch die Daten geschreiben zu werden.
Habe ich den Trigger richtig gesetzt?
Es soll nur bei einer Änderung aktualisiert werden:
on({id: 'mqtt.0.home.boiler.boiler_data', change: "any"}, function (obj) { var json = "mqtt.0.home.boiler.boiler_data"/*BoilerDaten*/; var Vorl = "javascript.0.Heizung.Vorlauf"/*Vorlauf*/; var Rueckl = "javascript.0.Heizung.Ruecklauf"/*Ruecklauf*/; var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/; var WWsoll = "javascript.0.Heizung.WarmwasserSoll"/*Warmwasser Soll*/; var Druck = "javascript.0.Heizung.Systemdruck"/*Systemdruck*/; var WWAn = "javascript.0.Heizung.WarmwasserAn"/*Warmwasser aktiv*/; var obj1 = JSON.parse(getState(json).val); setState(Vorl, parseFloat(obj.curFlowTemp)); setState(Rueckl, parseFloat(obj.retTemp)); setState(WWist, parseFloat(obj.wWCurTmp)); setState(WWsoll, parseFloat(obj.wWSelTemp)); setState(Druck, parseFloat(obj.sysPress)); setState(WWAn, obj.wWActivated); });
Die Daten kommen sonst im 10 Sekunden Takt.
-
Die IDs besser außerhalb des Triggers definieren und auf Änderung triggern:
var json = "mqtt.0.home.boiler.boiler_data"/*BoilerDaten*/; var Vorl = "javascript.0.Heizung.Vorlauf"/*Vorlauf*/; var Rueckl = "javascript.0.Heizung.Ruecklauf"/*Ruecklauf*/; var WWist = "javascript.0.Heizung.WarmwasserIst"/*Warmwasser Ist*/; var WWsoll = "javascript.0.Heizung.WarmwasserSoll"/*Warmwasser Soll*/; var Druck = "javascript.0.Heizung.Systemdruck"/*Systemdruck*/; var WWAn = "javascript.0.Heizung.WarmwasserAn"/*Warmwasser aktiv*/; on(json, function(dp) { var obj = JSON.parse(dp.state.val); setState(Vorl, parseFloat(obj.curFlowTemp)); setState(Rueckl, parseFloat(obj.retTemp)); setState(WWist, parseFloat(obj.wWCurTmp)); setState(WWsoll, parseFloat(obj.wWSelTemp)); setState(Druck, parseFloat(obj.sysPress)); setState(WWAn, obj.wWActivated); });
-
Danke schön.
Das funktioniert perfekt und ich bin wirklich glücklich das Forum hier zu haben mit solchen Spitzenleuten.
-
Ich habe das gleiche Problem hier.
Das ist der Datenpunkt
mqtt.1.tele.Sonoff.SENSOR
Das steht im Datenpunkt
{"Time":"2024-08-28T12:49:04","BME280":{"Temperature":26.1,"Humidity":48.1,"DewPoint":14.2,"Pressure":1011.2},"PressureUnit":"hPa","TempUnit":"C"}
Das ist mein Skript
on({id: 'mqtt.1.tele.Sonoff.SENSOR', change: "any"}, function (obj) { var json = "mqtt.1.tele.Sonoff.SENSOR"/*Werbefenster*/; var Temperature = "javascript.0.Werbekasten.Temperatur"/*Temperatur*/; var Humidity = "javascript.0.Werbekasten.Luftfeuchte"/*Luftfeuchte*/; var DewPoint = "javascript.0.Werbekasten.Taupunkt"/*Taupunkt*/; var Pressure = "javascript.0.Werbekasten.Luftdruck"/*Luftdruck*/; on(json, function(dp) { var obj = JSON.parse(dp.state.val); setState(Temperature, parseFloat(obj.Temperature)); setState(Humidity, parseFloat(obj.Humidity)); setState(DewPoint, parseFloat(obj.DewPoint)); setState(Pressure, parseFloat(obj.Pressure)); });
Als Fehlermeldung kommt das
28.8.2024, 13:54:09.343 [info ]: javascript.0 (23058) Stopping script script.js.common.Werbekasten 28.8.2024, 13:54:09.387 [info ]: javascript.0 (23058) Start JavaScript script.js.common.Werbekasten (Javascript/js) 28.8.2024, 13:54:09.387 [error]: javascript.0 (23058) script.js.common.Werbekasten compile failed: at script.js.common.Werbekasten:21
Die Fehlermeldung sagt mir nicht viel. Datenpunkte werden auch nicht gefüllt.
Was mache ich da falsch?
Danke
-
@beowolf sagte in [gelöst] Werte einzeln aus JSON extrahieren für Anfänger:
Die Fehlermeldung sagt mir nicht viel.
Die sagt in diesem Fall aus, dass Du offene Klammern hast welche nicht geschlossen werden (die erste Zeile ist Quatsch).
@beowolf sagte in [gelöst] Werte einzeln aus JSON extrahieren für Anfänger:
Was mache ich da falsch?
Du hast eine Eben im Objekt vergessen. So formatiert sieht man es besser:
{ "Time": "2024-08-28T12:49:04", "BME280": { "Temperature": 26.1, "Humidity": 48.1, "DewPoint": 14.2, "Pressure": 1011.2 }, "PressureUnit": "hPa", "TempUnit": "C" }
So. parseFloat brauchst Du nicht (ist ja kein String und alles schon im richtigen Format).
const jsonObjId = 'mqtt.1.tele.Sonoff.SENSOR'; const temperatureObjId = 'javascript.0.Werbekasten.Temperatur'; const humidityObjId = 'javascript.0.Werbekasten.Luftfeuchte'; const dewPointObjId = 'javascript.0.Werbekasten.Taupunkt'; const pressureObjId = 'javascript.0.Werbekasten.Luftdruck'; on({ id: jsonObjId, change: 'ne' }, (dp) => { const obj = JSON.parse(dp.state.val); setState(temperatureObjId, obj.BME280.Temperature); setState(humidityObjId, obj.BME280.Humidity); setState(dewPointObjId, obj.BME280.DewPoint); setState(Pressure, obj.BME280.Pressure); });
-
@beowolf sagte: Das ist mein Skript
Zeile 1 ist zu viel. "BME280" fehlt. Wandlung nach Zahl ist nicht nötig.
const idJson = "mqtt.1.tele.Sonoff.SENSOR"/*Werbefenster*/; const idTemperature = "javascript.0.Werbekasten.Temperatur"/*Temperatur*/; const idHumidity = "javascript.0.Werbekasten.Luftfeuchte"/*Luftfeuchte*/; const idDewPoint = "javascript.0.Werbekasten.Taupunkt"/*Taupunkt*/; const idPressure = "javascript.0.Werbekasten.Luftdruck"/*Luftdruck*/; on(idJson, function(dp) { const obj = JSON.parse(dp.state.val).BME280; setState(idTemperature, obj.Temperature, true); setState(idHumidity, obj.Humidity, true); setState(idDewPoint, obj.DewPoint, true); setState(idPressure, obj.Pressure, true); });
Eigene Datenpunkte erstelle besser unter "0_userdata.0" (gab es 2018 noch nicht).
-
Vielen Dank jetzt sind die Werte da.
Das mit "0_userdata.0" mache ich noch. Ich wollte nicht so viel verändern.