NEWS
MQTT -> {Value: XX} im Wert
-
Hallo zusammen,
jetzt brauche ich leider doch euer Hilfe bei folgendem Problem:
Von meiner Heizung bekomme ich über ein Community Projekt (p4d -> Horchi) die Daten über MQTT nach IoBroker geliefert.
Leider ist wohl irgendwo etwas falsch(?) konfiguriert, da die Werte zwar richtig angelegt werden aber im Feld "Wert" folgendes angelegt wird {"value": 61.5}. Das "value" erscheint leider in allen Feldern.Jetzt dachte ich mir, ich schicke mir die komplette JSON über MQTT und Parse hier einfach die Werte richtig. Leider ist das relativ neu für mich und ich komme nicht weiter.
Folgende Daten habe ich:
{"Heizung": {"Kesseltemperatur_0x0": {"value": 58.0}, "Status": {"value": "Heizen"}, "Abgastemperatur_0x1": {"value": 168.0}, "Betriebsmodus": {"value": "Automatik"}, "Boardtemperatur_0x2": {"value": 31.5}, "Uhrzeit": {"value": "Montag, 15. Feb. 2021 16:16:08"}, "Restsauerstoffgehalt_0x3": {"value": 9.1}, "Aussentemperatur_0x4": {"value": -0.5}, "Saugzugdrehzahl_0x7": {"value": 1954.0}, "Fuehler1_0x8": {"value": 79.0}, "LuftgeschwindigkeitinderAnsaugoeffnung_0xc": {"value": 1.41}, "Kesselstellgroesse_0x12": {"value": 100.0}, "Vorlauf-Isttemperatur_0x15": {"value": 56.0}, "Vorlauf-Solltemperatur_0x16": {"value": 53.0}, "Ansauglufttemperatur_0x60": {"value": 17.0}, "StromaufnahmederAustragschnecke_0x61": {"value": 0.01}, "FuellstandimPelletsbehaelter_0x71": {"value": 95.31}, "Einschub_0x74": {"value": 65.0}, "Sauerstoffregler_0x75": {"value": 65.0}, "Puffertemperaturoben_0x76": {"value": 52.5}, "PuffertemperaturMitte_0x77": {"value": 40.5}, "Puffertemperaturunten_0x78": {"value": 37.5}, "PufferpumpenAnsteuerung_0x8c": {"value": 52.0}, "Stromaufnahme24VDCPelletsmodul_0xa3": {"value": 0.274}, "BreitbandsondeHeizstrom_0xf3": {"value": 1.095}, "BreitbandsondeHeizungsSpannung_0xf4": {"value": 9.032}, "BreitbandsondeInnenwiderstand_0xf7": {"value": 299.0}, "Resetierbarerkg-Zaehler_0x111": {"value": 10.0}, "Resetierbarert-Zaehler_0x112": {"value": 4.0}}}
Nach einigen lesen hier im Forum hab ich mal testweise so angefangen aber leider komme ich damit schon nicht weiter:
var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state"; // Datenpunkt-ID mit JSON-String var test = "javascript.0.testp4"; // Test DB function werteAuslesen(jsonStr) { var myJson = JSON.parse(jsonStr); var test = Heizung.Kesseltemperatur_0x0.value; } on({id:idJson,change:'ne'}, function (obj) { werteAuslesen(obj.state.val); });
Das funktioniert aber schon nicht, weil:
(2300) Error in callback: SyntaxError: Unexpected token in JSON at position 1366Stimm hier evtl. die JSON schon nicht? 1366 ist ja eine } der "Heizung"?
Kann mir hier evtl. jmd. weiterhelfen?
Danke und Grüße,
Seeandfeel
-
function werteAuslesen(jsonStr) { var obj = JSON.parse(jsonStr).Heizung; var test = obj.Kesseltemperatur_0x0.value; log('Kesseltemperatur: ' + test); }
-
@paul53
Vielen Dank für die schnelle Hilfe!Funktioniert aber leider noch nicht, ich bekomme vom mqtt Adapter und direkt gleich darauf folgende Fehler:
javascript.0 2021-02-15 19:08:03.080 error (2300) at processImmediate (internal/timers.js:439:21) javascript.0 2021-02-15 19:08:03.080 error (2300) at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:5384:37) javascript.0 2021-02-15 19:08:03.079 error (2300) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:472:25) javascript.0 2021-02-15 19:08:03.079 error (2300) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1055:38) javascript.0 2021-02-15 19:08:03.079 error (2300) at Object.<anonymous> (script.js.Parse.Parse_P4:11:5) javascript.0 2021-02-15 19:08:03.079 error (2300) at werteAuslesen (script.js.Parse.Parse_P4:5:20) javascript.0 2021-02-15 19:08:03.078 error (2300) at JSON.parse (<anonymous>:null:null) javascript.0 2021-02-15 19:08:03.077 error (2300) Error in callback: SyntaxError: Unexpected token in JSON at position 1366 mqtt.0 2021-02-15 19:08:03.070 error (29487) Client [] Cannot parse {"Heizung": {"Kesseltemperatur_0x0": {"value": 65.5}, "Status": {"value": "Betriebsbereit"}, "Abgastemperatur_0x1": {"value": 64.0}, "Betriebsmodus": {"value": "Automati
Ich verstehe "Unexpected token in JSON at position 1366" nicht. Die Klammern passen doch?
-
@seeandfeel sagte: Die Klammern passen doch?
Ja, wenn sie so kommen, wie im ersten Beitrag gezeigt. Prüfe es per log(obj.state.val).
-
Die Daten hab ich 3x verglichen, sollten eigentlich gleich sein.
Falls das so stimmt:
var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state"; // Datenpunkt-ID mit JSON-String var test = "javascript.0.testp4"; function werteAuslesen(jsonStr) { var obj = JSON.parse(jsonStr).Heizung; var test = obj.Kesseltemperatur_0x0.value; log(obj.state.val); } on({id:idJson,change:'ne'}, function (obj) { werteAuslesen(obj.state.val); });
Ergibt jetzt:
(2300) Error in callback: SyntaxError: Unexpected token in JSON at position 1368
-> nicht 67 sondern die Klammer bei 68. Ich verstehs nicht. -
@seeandfeel sagte: Falls das so stimmt:
Nein, so:
var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state"; // Datenpunkt-ID mit JSON-String var test = "javascript.0.testp4"; function werteAuslesen(jsonStr) { var obj = JSON.parse(jsonStr).Heizung; var test = obj.Kesseltemperatur_0x0.value; } on({id:idJson,change:'ne'}, function (obj) { log(obj.state.val); werteAuslesen(obj.state.val); });
So liefert das Log den kompletten JSON-String.
@seeandfeel sagte in MQTT -> {Value: XX} im Wert:
Unexpected token in JSON at position 1368
Das ist das Ende des JSON. Kann da noch ein nicht sichtbares Sonderzeichen / Leerzeichen sein? Um das zu erkennen, füge im Log am Ende noch ein sichtbares Zeichen an:
log(obj.state.val + 'x');
Versuche mal
werteAuslesen(obj.state.val.trim());
-
@paul53 sagte in MQTT -> {Value: XX} im Wert:
werteAuslesen(obj.state.val.trim());
Das mit dem "x" hat etwas weitergeholfen.. - im Debug hab ich ein Leerzeichen gesehen.
Wenn ich mir dann das MQTT Adapter Debug ansehe, findet sich folgendes:
Client [] Cannot parse {"Heizung": {"Kesseltemperatur_0x0": {"value": 71.0}, "Status": {"value": "Heizen"}, "Abgastemperatur_0x1": {"value": 187.0}, "Betriebsmodus": {"value": "Automatik"}, "Boardtemperatur_0x2": {"value": 38.0}, "Uhrzeit": {"value": "Dienstag, 16. Feb. 2021 11:06:33"}, "Restsauerstoffgehalt_0x3": {"value": 8.4}, "Aussentemperatur_0x4": {"value": 2.0}, "Saugzugdrehzahl_0x7": {"value": 1929.0}, "Fuehler1_0x8": {"value": 90.5}, "LuftgeschwindigkeitinderAnsaugoeffnung_0xc": {"value": 1.19}, "Kesselstellgroesse_0x12": {"value": 98.0}, "Vorlauf-Isttemperatur_0x15": {"value": 51.0}, "Vorlauf-Solltemperatur_0x16": {"value": 50.0}, "Ansauglufttemperatur_0x60": {"value": 33.0}, "StromaufnahmederAustragschnecke_0x61": {"value": 0.01}, "FuellstandimPelletsbehaelter_0x71": {"value": 82.64}, "Einschub_0x74": {"value": 59.0}, "Sauerstoffregler_0x75": {"value": 61.0}, "Puffertemperaturoben_0x76": {"value": 64.5}, "PuffertemperaturMitte_0x77": {"value": 60.0}, "Puffertemperaturunten_0x78": {"value": 51.5}, "PufferpumpenAnsteuerung_0x8c": {"value": 74.0}, "Stromaufnahme24VDCPelletsmodul_0xa3": {"value": 0.28}, "BreitbandsondeHeizstrom_0xf3": {"value": 1.085}, "BreitbandsondeHeizungsSpannung_0xf4": {"value": 9.047}, "BreitbandsondeInnenwiderstand_0xf7": {"value": 298.0}, "Resetierbarerkg-Zaehler_0x111": {"value": 50.0}, "Resetierbarert-Zaehler_0x112": {"value": 4.0}}}�
2 Einträge später macht Iobroker daraus {"value": 4.0}}}� -> {"value": 4.0}}}\u0000" .
Ich hab das mal an den Entwickler weitergegeben, mal sehen ob er was findet.
Gibt es dazu evtl. einen Workaround? -
@seeandfeel sagte: Gibt es dazu evtl. einen Workaround?
Hast Du es mal mit .trim() versucht?
werteAuslesen(obj.state.val.trim());
-
Hatte ich auch probiert:
on({id:idJson,change:'ne'}, function (obj) { log(obj.state.val); werteAuslesen(obj.state.val.trim()); });
Ergibt:
javascript.0 2021-02-16 11:52:38.276 error (2300) at Object.<anonymous> (script.js.Parse.Parse_P4:11:5) javascript.0 2021-02-16 11:52:38.276 error (2300) at werteAuslesen (script.js.Parse.Parse_P4:5:20) javascript.0 2021-02-16 11:52:38.275 error (2300) at JSON.parse (<anonymous>:null:null) javascript.0 2021-02-16 11:52:38.274 error (2300) Error in callback: SyntaxError: Unexpected token in JSON at position 1366
Ich hab jetzt gerade mal probiert (wohin? ) sowas einzubauen:
json.replaceAll("\\u0000", "")
oder gibt wohl auch ein:
str.replace
Aber ich habe ehrlich gesagt wenig Ahnung von JAVA .
-
var x = obj.state.val; x=x.replace('�','');
-
Auch dir gleich mal Danke @Gargano :
Um nichts falsch zu machen, hab das ganze jetzt so:
var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state"; // Datenpunkt-ID mit JSON-String var test = "javascript.0.testp4"; function werteAuslesen(jsonStr) { var x = obj.state.val; x=x.replace('�',''); var obj = JSON.parse(jsonStr).Heizung; var test = obj.Kesseltemperatur_0x0.value; } on({id:idJson,change:'ne'}, function (obj) { log(obj.state.val); werteAuslesen(obj.state.val); });
Json Parse Fehler "zum Ende" ist weg. Dafür jetzt:
javascript.0 2021-02-16 12:09:38.847 error (2300) at Object.<anonymous> (script.js.Parse.Parse_P4:14:5) javascript.0 2021-02-16 12:09:38.846 error (2300) at werteAuslesen (script.js.Parse.Parse_P4:6:17) javascript.0 2021-02-16 12:09:38.846 error (2300) Error in callback: TypeError: Cannot read property 'state' of undefined
Oh man..
-
@paul53 sagte: Workaround?
Verkürze mal den String um das letzte Zeichen:
var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state"; // Datenpunkt-ID mit JSON-String var test = "javascript.0.testp4"; function werteAuslesen(jsonStr) { var obj = JSON.parse(jsonStr).Heizung; var test = obj.Kesseltemperatur_0x0.value; log('Kesseltemperatur: ' + test + ' °C'); } on({id:idJson, change:'ne'}, function (obj) { let str = obj.state.val; let json = str.substr(0, str.length - 1); werteAuslesen(json); });
-
@seeandfeel sagte: Um nichts falsch zu machen, hab das ganze jetzt so:
So ist es falsch. Richtig:
var idJson = "mqtt.0.p4d2mqtt.sensor.P4.state"; // Datenpunkt-ID mit JSON-String var test = "javascript.0.testp4"; function werteAuslesen(jsonStr) { var obj = JSON.parse(jsonStr).Heizung; var test = obj.Kesseltemperatur_0x0.value; } on({id:idJson,change:'ne'}, function (obj) { var json = obj.state.val.replace('�',''); werteAuslesen(json); });
-
-
@seeandfeel
Mit welcher Methode funktioniert es jetzt? Verkürzen oder Ersetzen? -
@seeandfeel Paul war schneller, war grad Mittag essen.
Zur Erklärung dieses Zeichens am Ende. Es handelt sich wohl hier um das String Ende Zeichen welches in C den Wert (hex) 0x0 hat. Fälschlicherweide wird wohl die Länge des Strings beim MQTT senden falsch berechnet und dieses Zeichen mitgesendet. -
Oh, entschuldigt.. - vor lauter Freude die Lösung vergessen.
Funktioniert hat es jetzt mit:
let json = str.substr(0, str.length - 1);
Ersetzen hatte ich noch gar nicht probiert gehabt. Das hatte ich ganz übersehen.
Das "var json = obj.state.val.replace('�','');" läuft auf:
(2300) Error in callback: SyntaxError: Unexpected token in JSON at position 1364
Vielen Dank auch für die Erklärung @Gargano ! Ich wollte nicht fragen bzw. euch noch mehr "belästigen" .
Eigentlich versuchs ich ja echt selber zu lösen.. - aber bei JAVA setzt es (noch) bei mir aus. -
@seeandfeel Hi, könntest du mir das ganze Script schicken?
lg