NEWS
[gelöst] Wärmepumpe anbinden - Daten aus JSON einlesen
-
Hallo Forumsgemeinde,
ich bin gerade dabei ein Skript zu schreiben, dass Daten meiner Wärmepumpe (Rotex HPSU 508) in ioBroker zur Verfügung stellt, scheitere aber an nicht ausreichenden JAVA-Programmierkenntnissen. Das Vorhaben basiert auf einem Python-Skript, das die CAN-Kommunikation mit der Wärempumpe herstellt und die empfangenen Botschaften in Form eines JSON-Objektes ausgeben kann.
Das Skript zur Abfrage der Werte 1x/minute selbst ist recht einfach:
// Werte aus Heizung abfragen schedule("* * * * *", function (werte, t_ext) { exec("python3 /usr/share/pyHPSU/bin/pyHPSU.py -d PYCAN -c t_ext -c flow_rate -o JSON", function (error, result) { console.log(result); }); });
und liefert als Ergebnis die Werte der abgefragten Parameter t_ext (3.00°C) und flow_rate (0.0 l/h):
`[{'timestamp': 1545227642.682554, 'name': 't_ext', 'resp': '3.00'}, {'timestamp': 1545227642.699435, 'name': 'flow_rate', 'resp': '0.0'}[/code]` mein Ansatz war nun das ausgegebene JSON Objekt (Variable result) mittels `~~[code]~~JSON.parse(result)[/code]` umzuwandeln und dann die einzelnen Werte mittels `~~[code]~~var t_ext=result[1].resp[/code]` zu extrahieren und in ioBroker nutzbar zu machen. Klappt aber alles nicht. Aufgrund von Fehlermeldungen denke ich mittlerweile, dass die '-Zeichen im json wohl eher " sein müssten, diverse versuche mit result.replace("\'","\"") waren aber auch nicht erfolgreich. Kann mir da jemand helfen? Ich durfte während der vielen erfolgslosen Stunden des Rumprobierens schon diverse böse Blicke meiner Frau einstecken und wäre für Hilfe wirklich sehr dankbar.
-
In der Log-Wiedergabe sehe ich eine öffnende eckige Klammer aber keine schließende.
Wenn es ein Array ist, dann für den Wert "3.00"
var t_ext = JSON.parse(result)[0].resp; // liefert Zeichenkette
-
Danke für die schnelle Antwort, ich hab das gerade ausprobiert. Es kommt wieder die Fehlermeldungen, die mir aus diversen Versuchen schon bekannt ist:
// Werte aus Heizung abfragen schedule("* * * * *", function (werte, t_ext) { exec("python3 /usr/share/pyHPSU/bin/pyHPSU.py -d PYCAN -c t_ext -c flow_rate -o JSON", function (error, result) { console.log(result); var t_ext = JSON.parse(result)[0].resp; console.log(t_ext); }); });
liefert
15:25:02.841 [info] javascript.0 script.js.common.HPSU_java: [{'resp': '2.70', 'timestamp': 1545229502.640406, 'name': 't_ext'}, {'resp': '0.0', 'timestamp': 1545229502.657885, 'name': 'flow_rate'}] 15:25:02.842 [error] javascript.0 SyntaxError: Unexpected token ' in JSON at position 2 at Object.parse (native) at script.js.common.HPSU_java:9:22 at ChildProcess.exithandler (child_process.js:190:7) at emitTwo (events.js:106:13) at ChildProcess.emit (events.js:191:7) at maybeClose (internal/child_process.js:920:16) at Process.ChildProcess._handle.onexit (internal/child_process.js:230:5)
Deshalb habe ich eine Weile den Anstaz verfolgt, die ' gegen " zu ersetzen, bin damit aber auch gescheitert.
-
probier mal :
`// Werte aus Heizung abfragen schedule("* * * * *", function (werte, t_ext) { exec("python3 /usr/share/pyHPSU/bin/pyHPSU.py -d PYCAN -c t_ext -c flow_rate -o JSON", function (error, result) { console.log(result); var i; for (i in result){ console.log(result[i].name }); });` [/i]
-
Deshalb habe ich eine Weile den Anstaz verfolgt, die ' gegen " zu ersetzen, bin damit aber auch gescheitert. `
Versuche es mal so:var json = result.replace(/\'/g,'\"'); var obj = JSON.parse(json); log(obj[0].resp);
-
Habs gerade ausprobiert….das liefert jede Menge undefiends (vermutlich für jede Stelle in result?)
17:25:02.639 [info] javascript.0 script.js.common.HPSU_java: undefined 17:25:02.639 [info] javascript.0 script.js.common.HPSU_java: undefined 17:25:02.639 [info] javascript.0 script.js.common.HPSU_java: undefined 17:25:02.640 [info] javascript.0 script.js.common.HPSU_java: undefined
-
Habs gerade ausprobiert….das liefert jede Menge undefiends (vermutlich für jede Stelle in result?) `
das beispiel von paul oder mir ? Wen das meine dan lasse mal .name weck also nur result
-
hier mal beispiel aus source code eines adapters welche ich gerade bauen
`const test_obj = [ { "Device": "discovergy.0.1024000034.Power_Total", "alias": "Device_1", "unit": "kWh", "days": 7, "weeks": 4, "quarters": 4, "months": 12, "years": 1 }, { "Device": "discovergy.0.1030002797.Power_Total", "alias": "Device_2", "unit": "kWh", "days": 7, "weeks": 4, "quarters": 4, "months": 12, "years": 1 } }]; for (const i in state_list){ console.info("Value i : " + state_list[i].device));` weis jetzt nicht ob der Javascript adapter const acceptiert, sonst aendern nach var[/i]
-
Danke paul, dein Vorschlag hat funktioniert:
Versuche es mal so:
var json = result.replace(/\'/g,'\"'); var obj = JSON.parse(json); log(obj[0].resp); ```` `
Ich werde nun versuchen, die Vairablen mit Datenpunkten zu verknüpfen…sollte ja nicht so schwierig sein :? . Vielen Dank für die schnelle und kompetente Unterstützung! Wenn ich fertig bin, stelle ich das Ergebnis hier zur Verfügung....im Forum hatten vor einger Zeit schonmal Leute nach einer Anbindung der Rotex HPSU gefragt, könnte also auch für andere interessant sein.
-
Vorschlag hat funktioniert: `
Dann markiere bitte das Thema im Betreff des ersten Beitrags als [gelöst]. -
Danke paul, dein Vorschlag hat funktioniert:
Ich werde nun versuchen, die Vairablen mit Datenpunkten zu verknüpfen…sollte ja nicht so schwierig sein :? . Vielen Dank für die schnelle und kompetente Unterstützung! Wenn ich fertig bin, stelle ich das Ergebnis hier zur Verfügung....im Forum hatten vor einger Zeit schonmal Leute nach einer Anbindung der Rotex HPSU gefragt, könnte also auch für andere interessant sein. `
Eine Anbindung der Rotex HPSU (nur zur Datendarstellung in iobroker) fehlt mir auch noch. Habe einen Raspi mit Canbus Interface und möchte darüber die Daten erfassen und für iobroker bereitstellen. Bin aber noch ganz am Anfang.