NEWS
MQTT string Parsen
-
Hi.
Ich möchte Folgende Daten von meinem Wasserkocher Parsen:{"TuyaReceived":{"Data":"55AA030700086902000400000064E4","Cmnd":7,"CmndData":"6902000400000064","DpId":105,"DpIdType":2,"DpIdData":"00000064"}}
und zwar müsste das so laufen, wenn "DpId":105 erkannt wird, soll von "DpIdData":"00000064" der Wert (hier "00000064" = Temperatur in hex ) erkannt werden und von hex to dec konvertiert und danach in einen Userdatenpunkt "Wasserkocher Temperatur" eingetragen werden.
Das gleiche vom System her bräuchte ich noch für einige andere Daten.
zb:{"TuyaReceived":{"Data":"55AA030700056A040001017E","Cmnd":7,"CmndData":"6A04000101","DpId":106,"DpIdType":4,"DpIdData":"01"}}
"DpId":106,"DpIdType":4,"DpIdData":"01" = Wasserkocher entfernt
"DpId":106,"DpIdType":4,"DpIdData":"02" = Wasserkocher auf Basis
usw.Das bräuchte ich auch in einem Datenpunkt. Da reicht aber einfach der Wert 01/02/03 usw.
Es handelt sie hierbei um einen ProfiCook PC-WKS 1167, den ich mit Tasmota geflasht habe.
https://templates.blakadder.com/proficook_PC-WKS_1167.html -
@root_ sagte:
wenn "DpId":105 erkannt wird, soll von "DpIdData":"00000064" der Wert (hier "00000064" = Temperatur in hex ) erkannt werden und von hex to dec konvertiert und danach in einen Userdatenpunkt "Wasserkocher Temperatur" eingetragen werden.
let tuya = JSON.parse(json).TuyaReceived; let dpid = tuya.DpId; let val = parseInt(tuya.DpIdData, 16); if(dpid == 105) setState(Wasserkocher.Temperatur, val, true); if(dpid == 106) setState(Wasserkocher.Status, val, true);
-
Da ich in js ein noob bin muss ich noch mal nachfragen.
Der Datenpunkt den ich parsen möchte ist:mqtt.0.tele.Wasserkocher.RESULT
die Datenpunkte die geschrieben werden sollen heissen:
0_userdata.0.Kueche.Wasserkocher.105_Temp
0_userdata.0.Kueche.Wasserkocher.106_stateWie muss das script komplett aussehen? Bin sonst nur blockly user
-
@root_ sagte:
mqtt.0.tele.Wasserkocher.RESULT
die Datenpunkte die geschrieben werden sollen heissen:
0_userdata.0.Kueche.Wasserkocher.105_Temp
0_userdata.0.Kueche.Wasserkocher.106_stateon('mqtt.0.tele.Wasserkocher.RESULT', function(dp) { let tuya = JSON.parse(dp.state.val).TuyaReceived; let dpid = tuya.DpId; let val = parseInt(tuya.DpIdData, 16); if(dpid == 105) setState('0_userdata.0.Kueche.Wasserkocher.105_Temp', val, true); if(dpid == 106) setState('0_userdata.0.Kueche.Wasserkocher.106_state', val, true); });
-
Mega. Danke dir!
-
jetzt muss ich noch mal nerven.
Irgendwie hat sich der string geändert (evtl liegt an der Tasmota 8.1.0.10){"TuyaReceived":{"Data":"55AA030700056A040001017E","Cmnd":7,"CmndData":"6A04000101","DpId":106,"DpIdType":4,"DpIdData":"01"}} JETZT: {"TuyaReceived":{"Data":"55AA030700056A040001017E","Cmnd":7,"CmndData":"6A04000101","DpType4Id106":1,"106":{"DpId":106,"DpIdType":4,"DpIdData":"01"}}} {"TuyaReceived":{"Data":"55AA030700086902000400000064E4","Cmnd":7,"CmndData":"6902000400000064","DpId":105,"DpIdType":2,"DpIdData":"00000064"}} JETZT: {"TuyaReceived":{"Data":"55AA03070008690200040000001797","Cmnd":7,"CmndData":"6902000400000017","DpType2Id105":23,"105":{"DpId":105,"DpIdType":2,"DpIdData":"00000064"}}}
jetzt funktioniert das parsing nicht mehr
-
@root_ sagte:
jetzt funktioniert das parsing nicht mehr
on('mqtt.0.tele.Wasserkocher.RESULT', function(dp) { let tuya = JSON.parse(dp.state.val).TuyaReceived; if(tuya['105']) { let val = parseInt(tuya['105'].DpIdData, 16); setState('0_userdata.0.Kueche.Wasserkocher.105_Temp', val, true); } else if(tuya['106']) { let val = parseInt(tuya['106'].DpIdData); setState('0_userdata.0.Kueche.Wasserkocher.106_state', val, true); } });
-
Super. Jetzt funktioniert der Wasserkocher 1a cloudfrei mit ioBroker.
Vielen Dank für deine tolle und schnelle Hilfe!
-
@paul53
Hallo, darf ich Dich um Hilfe bitten: Ich baue gerade auf Basis von Tasmota an einer Strommessung habe folgenden String, soweit läuft schon alles wunderbar. Per MQTT erhalte ich folgenden String:{"Time":"2020-05-25T18:33:31","ENERGY":{"TotalStartTime":"2020-05-16T15:20:01","Total":14.129,"Yesterday":1.935,"Today":12.194,"Period":0,"Power":[100,301,145]," ":[102,324,231],"ReactivePower":[19,120,180],"Factor":[0.98,0.93,0.63],"Frequency":[50,50,50],"Voltage":[234,234,234],"Current":[0.436,1.386,0.986]}}
Dieser repräsentiert die Werte, die von der Messtelle erhalte:
Mit u.a. Beispiel schaffe ich es auch einiges zu Parsen und in eigene Datenpunkte zu speichern. Was ich nicht schaffe ist folgendes:
- ich bekomme nur ganzzahlige Werte, wie bekomme ich die Nachkommastellen (also z.B. für Energy_Today erhalte ich 8 statt 8,752)?
- Wie parse ich die Werte für die jeweilige Phasen, die heutige Abfrage (s.u.) liefert nur den ersten Wert? Also z.B. für Power erhalte ich nur 14, wie parse ich die 162 und die 142?
Wäre super, wenn Du mich unterstützen könntest.
-
on('mqtt.0.tele.pzem.SENSOR', function(dp) { let strom = JSON.parse(dp.state.val).ENERGY; if(strom['Total']) { let val = parseInt(strom['Total']); setState('0_userdata.0.Visualisierung.Strom.Energy_Total', val, true); } if(strom['Yesterday']) { let val = parseInt(strom['Yesterday']); setState('0_userdata.0.Visualisierung.Strom.Energy_Yesterday', val, true); } if(strom['Today']) { let val = parseInt(strom['Today']); setState('0_userdata.0.Visualisierung.Strom.Energy_Today', val, true); } if(strom['Period']) { let val = parseInt(strom['Period']); setState('0_userdata.0.Visualisierung.Strom.Period', val, true); } if(strom['Power']) { let val = parseInt(strom['Power']); setState('0_userdata.0.Visualisierung.Strom.Power', val, true); } if(strom['ApparentPower']) { let val = parseInt(strom['ApparentPower']); setState('0_userdata.0.Visualisierung.Strom.ApparentPower', val, true); } });
-
@manrum1 sagte:
ich bekomme nur ganzzahlige Werte
Lasse parseInt() weg, denn das Objekt enthält bereits Zahlen.
@manrum1 sagte in MQTT string Parsen:
Wie parse ich die Werte für die jeweilige Phasen,
Power und die folgenden Werte im Objekt sind Arrays (3 Phasen).
let val = strom['Power'][0]; // Phase 1
-
@paul53 said in MQTT string Parsen:
let val = strom['Power'][0]; // Phase 1
Hallo Paul, ich bin begeistert, danke für die schnelle Hilfe. Hab das Script noch nicht komplett, aber es funktioniert soweit. Was könnte ich noch optimieren?
on('mqtt.0.tele.pzem.SENSOR', function(dp) { let strom = JSON.parse(dp.state.val).ENERGY; if(strom['Total']) { let val = strom['Total']; setState('0_userdata.0.Visualisierung.Strom.Energy_Total', val, true); } if(strom['Yesterday']) { let val = strom['Yesterday']; setState('0_userdata.0.Visualisierung.Strom.Energy_Yesterday', val, true); } if(strom['Today']) { let val = strom['Today']; setState('0_userdata.0.Visualisierung.Strom.Energy_Today', val, true); } if(strom['Period']) { let val = strom['Period']; setState('0_userdata.0.Visualisierung.Strom.Period', val, true); } if(strom['Power']) { let val = strom['Power'][0]; setState('0_userdata.0.Visualisierung.Strom.Power_Ph1', val, true); } if(strom['Power']) { let val = strom['Power'][1]; setState('0_userdata.0.Visualisierung.Strom.Power_Ph2', val, true); } if(strom['Power']) { let val = strom['Power'][2]; setState('0_userdata.0.Visualisierung.Strom.Power_Ph3', val, true); } if(strom['ApparentPower']) { let val = strom['ApparentPower'][0]; setState('0_userdata.0.Visualisierung.Strom.ApparentPower_Ph1', val, true); } if(strom['ApparentPower']) { let val = strom['ApparentPower'][1]; setState('0_userdata.0.Visualisierung.Strom.ApparentPower_Ph2', val, true); } if(strom['ApparentPower']) { let val = strom['ApparentPower'][2]; setState('0_userdata.0.Visualisierung.Strom.ApparentPower_Ph3', val, true); } });
-
Hello,
i have a problem and can not sole it.
Maybe someone can help me.I have the following MQTT-String and like to parse alle Information of it.
{"StatusSNS":{"Time":"2022-08-22T01:03:00","ANALOG":{"A0":1024},"AM2301":{"Temperature":25.7,"Humidity":46.7,"DewPoint":13.4},"TempUnit":"C"}}
please can someone provide me a running JS-Script for IoBroker.
Thanks in advance and best regards
Maniac2002 -
const mqttStr = {"StatusSNS":{"Time":"2022-08-22T01:03:00","ANALOG":{"A0":1024},"AM2301":{"Temperature":25.7,"Humidity":46.7,"DewPoint":13.4},"TempUnit":"C"}}; const mqttObj = JSON.parse(mqttStr)
Now you can access the respective properties from the object. The following properties should exist:
mqttObj.StatusSNS - Object mqttObj.StatusSNS.Time - String mqttObj.StatusSNS.Analog - Object mqttObj.StatusSNS.Analog.A0 - number mqttObj.StatusSNS.AM2301 - Object mqttObj.StatusSNS.AM2301.Temperature - Number mqttObj.StatusSNS.AM2301.Humidity - Number mqttObj.StatusSNS.AM2301.DewPoint - Number mqttObj.StatusSNS.TempUnit - String
A.