NEWS
JSON, Zigbee und ein undefined
-
Hallo zusammen,
ich habe mir direkt mal die neue Zigbee-Bridge von Sonoff bestellt und auf Tasmota geflashed. Zigbee2Tasmota auf dem Chip ist ebenfalls drauf - tut überwiegend auch, was es soll.
Da allerdings im Sonoff Adapter die kommenden Datenpunkte noch nicht richtig zerlegt werden, nutze ich einen anderen Port auf dem MQTT Adapter und bekomme auch die Werte rein. Nun beginnt, wie ich schon so oft gelesen habe, das
Spielchen mit den JSON Strings und ich bekomme es einfach nicht hin. Ich möchte einfach nur die eingehenden Werte in States schreiben. Bislang resultiert es in einem "setForeignState: undefined is not a valid state value" oder der Wert wird nicht geschrieben.Daher ein paar Fragen:
-
Muss ich den kompletten String zerlegen oder kann ich, wenn ich die entsprechenden States im Javascript Adapter angelegt habe, auch nur einen Teil des Strings übertragen? Bspw. liefert ein Aqara Vibration Sensor eine ganze Menge an Daten wie Winkel, Tilt oder Vibrate Mode - ich will aber fürs erste nur den "AqaraVibrationMode" in den State schreiben.
-
Ich habe die Javascript states als Rolle state und state state angelegt. Als "Art" habe ich gemischt hinterlegt. Kann es daran liegen?
MQTT JSON String:
{"ZbReceived":{"Vibration_Sensor":{"Device":"0xF87D","Name":"Vibration_Sensor","AqaraVibrationMode":"vibrate","Endpoint":1,"LinkQuality":134}}}
Das Script soll einfach nur beim Aktualisieren den Wert wegschreiben:
var json = "mqtt.0.tele.SmartHome.EG.sonoff.ZBBridge_D7F385.SENSOR"; var Modus = "javascript.0.Variablen.Messwerte.Zigbee.Modus"; on(json, function(dp) { var obj = JSON.parse(dp.state.val).ZbReceived; setState(Modus, parseFloat(obj.AqaraVibrationMode)); });
-
-
gelöscht
-
@mrzee sagte:
var obj = JSON.parse(dp.state.val).ZbReceived.Vibration_Sensor; setState(Modus, obj.AqaraVibrationMode, true);
-
@paul53
DANKE!!! Das hat mir den Tag gerettet!! -
@paul53
Kommando zurück... der State wird zwar gesetzt, aber ich bekomme immer noch verschiedene "Error" - liegt das daran, dass ich nur ein einziges Element aus dem String verwende?Error in callback: TypeError: Cannot read property 'AqaraVibrationMode' of undefined
-
@mrzee sagte:
liegt das daran, dass ich nur ein einziges Element aus dem String verwende?
Nein. Anscheinend ist die Struktur des Datenpunkt-Wertes nicht immer gleich. Um das zu testen, ergänze um eine Log-Ausgabe. Um den Error-Log zu vermeiden prüfe:
if(obj) setState(Modus, obj.AqaraVibrationMode, true); else log(dp.state.val, 'warn');
-
Wir nähern uns dem ganzen an - ich habe einen Fehler gemacht: Ich wollte keinen booleschen Wert, sondern wirklich die Übernahme des Wertes aus dem JSON String (vibrate, tilt, drop) - setze ich das "true" ein, sind die Fehler weg.
Aber ja, die Werte sind nicht immer gleich - in den gleichen Datenpunkt werden auch die Keep Alive Meldungen der Bridge geschrieben, da steht dann was völlig anderes in dem String.
-
@mrzee sagte:
die Werte sind nicht immer gleich - in den gleichen Datenpunkt werden auch die Keep Alive Meldungen der Bridge geschrieben, da steht dann was völlig anderes in dem String.
Ist der Anfang immer gleich ?
{"ZbReceived":{"Vibration_Sensor":{
-
@mrzee sagte:
wirklich die Übernahme des Wertes aus dem JSON String (vibrate, tilt, drop)
Das macht setState(Modus, obj.AqaraVibrationMode, true).
-
@mrzee sagte:
steht dann was völlig anderes in dem String.
Wenn ein beliebiger JSON-String enthalten sein kann, dann muss man alle Teile prüfen:
var obj = JSON.parse(dp.state.val); if (obj && obj.ZbReceived && obj.ZbReceived.Vibration_Sensor) setState(Modus, obj.ZbReceived.Vibration_Sensor.AqaraVibrationMode, true);
-
Danke dir, ich war die Tage unterwegs und bin noch nicht zum Testen gekommen. Ich hoffe, ich bekomme es die Tage hin.
-
@mrzee
wie ist denn hier dein Stand?
Ich bin ebenfalls seit geraumer Zeit mit der Tasmota ZbBridge unterwegs. Erstaunlich wie zuverlässig das mit der Sonoff Bridge funktioniert. Auch die Rechweite ist ziemlich gut.Leider habe ich das gleiche Problem:
Die Werte im Sonoff Adapter sind nicht zuverlässig und werden auch bei einem KeepAlive verändert ...Konntest Du mit der MQTT Methode etwas erreichen?
ich habe ziemlich nette Schalter gekauft (Aquara WXKG02LM) welche folgenden String per MQTT schicken:
{"ZbReceived":{"0x282B":{"Device":"0x282B","MultiInValue":1,"Endpoint":3,"LinkQuality":105}}}Multivalue: ob kurz (0), lang(1) oder double(2) gedrückt wurde
Endpoint: Schalter1 (1) , Schalter2 (2) oder beide (3)gibt es keine generelle Möglichkeit die MQTT Strings die rein kommen zu parsen?
-
Hallo, bin ebenfalls am zerlegen eines Json-String und bekomme es einfach nicht hin.
Hier mein String:
{"ZbReceived":{" Taster_allesaus":{"Device":"0x17EB","Name":" Taster_allesaus","0006!02":"","Power":2,"Endpoint":1,"LinkQuality":60}}}
Hier mein Code:
var json = "mqtt.0.Heurigen.zbbridge.tele.17EB.SENSOR"/*Mqtt_string vom tasmota zbbridge*/; var Taster = "0_userdata.0.Heurigen.zbbridge.Taster_allesaus"/*1 oder 2*/; on(json, function(dp) { var obj = JSON.parse(dp.state.val).ZbReceived.Taster_allesaus; setState(Taster, obj.Power); });
Hier noch die Fehlermeldung aus dem Log:
~~javascript.0 2021-02-13 19:37:15.766 error (1182) at processImmediate (internal/timers.js:461:21) javascript.0 2021-02-13 19:37:15.766 error (1182) at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:5384:37) javascript.0 2021-02-13 19:37:15.766 error (1182) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:472:25) javascript.0 2021-02-13 19:37:15.765 error (1182) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1055:38) javascript.0 2021-02-13 19:37:15.765 error (1182) at Object.<anonymous> (script.js.Heurigen_zbbridge.Taster_allesausv3:15:25) javascript.0 2021-02-13 19:37:15.764 error (1182) Error in callback: TypeError: Cannot read property 'Power' of undefined~~
Kann mir bitte jemand sagen wo der Fehler liegt?
Vielleicht hat auch jemand einen Link wie man an die Tasmota Zigbeebridge Befehle über den iobroker senden kann. Das ganze Thema scheint ja noch sehr jung zu sein.
Vielen Dank
-
@zweigelt99 sagte in JSON, Zigbee und ein undefined:
ved":{" Tast
Da ist ein Leerzeichen.
var obj = JSON.parse(dp.state.val).ZbReceived.[" Taster_allesaus"];
-
@fastfoot
Danke das wars. -
Habe jetzt ein Heizkörperthermostat in iobroker eingebunden. Daten kommen auch am Datenpunkt richtig an.
Allerdings kommt auch eine Fehlermeldung.javascript.0 2021-02-14 10:50:46.085 error (1186) script.js.Heurigen_zbbridge.Therm_Tisch3: setForeignState: undefined is not a valid state value javascript.0 2021-02-14 10:50:46.085 warn (1186) at processImmediate (internal/timers.js:461:21) javascript.0 2021-02-14 10:50:46.085 warn (1186) at Immediate._onImmediate (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:5384:37) javascript.0 2021-02-14 10:50:46.085 warn (1186) at Object.stateChange (/opt/iobroker/node_modules/iobroker.javascript/main.js:472:25) javascript.0 2021-02-14 10:50:46.084 warn (1186) at Object.callback (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1055:38) javascript.0 2021-02-14 10:50:46.084 warn (1186) at Object.<anonymous> (script.js.Heurigen_zbbridge.Therm_Tisch3:19:5) javascript.0 2021-02-14 10:50:46.084 warn (1186) at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1358:20) javascript.0 2021-02-14 10:50:46.083 warn (1186) You are assigning a undefined to the state "0_userdata.0.Heurigen.zbbridge.Thermostat.Tisch3_Ventilstellung" which expects a number. Please fix your code to use a number or change the state typ
Kann ich diese Ignorieren?
Code
var json = "mqtt.0.Heurigen.zbbridge.tele.796D.SENSOR"/*Mqtt_string vom tasmota zbbridge*/; var TempIst = "0_userdata.0.Heurigen.zbbridge.Thermostat.Tisch3_Ist"/*Datenpunkt von0.0_userdata*/; var TempSoll = "0_userdata.0.Heurigen.zbbridge.Thermostat.Tisch3_Soll"; var Motorstellung = "0_userdata.0.Heurigen.zbbridge.Thermostat.Tisch3_Ventilstellung"; on(json, function(dp) { var obj = JSON.parse(dp.state.val).ZbReceived.Therm_Tisch_3;/*Hier Name von ZigBee Gerät Eintregen*/ setState(TempIst, obj.LocalTemperature); setState(TempSoll, obj.OccupiedHeatingSetpoint); setState(Motorstellung, obj.PIHeatingDemand); });
-
@zweigelt99 sagte: You are assigning a undefined to the state "0_userdata.0.Heurigen.zbbridge.Thermostat.Tisch3_Ventilstellung" which expects a number.
obj.PIHeatingDemand existiert offenbar nicht.
-
Ok, offensichtlich schickt das Thermostat nicht immer die selbe Info, wie kann ich dann die Fehlemeldung vermeiden?
Weiter oben steht das Problem schon beschrieben aber irgendwie blicke ich nicht ganz durch.Die Fehlermeldung kommt bei allen 3 Datenpunkten.
{"ZbReceived":{"Therm_Tisch_3":{"Device":"0x796D","Name":"Therm_Tisch_3","OccupiedHeatingSetpoint":20,"Endpoint":1,"LinkQuality":26}}} {"ZbReceived":{"Therm_Tisch_3":{"Device":"0x796D","Name":"Therm_Tisch_3","CurrentTemperatureSetPoint":20.5,"Endpoint":1,"LinkQuality":31}}} {"ZbReceived":{"Therm_Tisch_3":{"Device":"0x796D","Name":"Therm_Tisch_3","PIHeatingDemand":0,"Endpoint":1,"LinkQuality":31}}}
-
@zweigelt99 sagte: wie kann ich dann die Fehlemeldung vermeiden?
if(obj.LocalTemperature) setState(TempIst, obj.LocalTemperature, true); if(obj.CurrentTemperatureSetpoint) setState(TempSoll, obj.CurrentTemperatureSetPoint, true); if(obj.PIHeatingDemand != undefined) setState(Motorstellung, obj.PIHeatingDemand, true);
-
Danke für die Hilfe, jetzt bin ich Fehlerfrei,