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.