Seite 1 von 1
jason Herausforderung
Verfasst: 6. Apr 2019 11:29
von Caddy
Hallo zusammen,
der Sonoff (mit Tasmota) sendet den Leistungswert der letzten 5 Minuten nur alle 5 Minuten.
jede andere Leistungsänderung wird ohne den Path Period gesendet.
Wenn ich nun das ITEM
Code: Alles auswählen
Number Waschmaschine01_PowerAverage "Trockner 5-min Durchschnitt [%.0f Wh]" <energy> {mqtt="<[broker:tele/sonoff11/SENSOR:state:JSONPATH($.ENERGY.Period)]"}
nutze kommt es immer wenn Period nicht vorhanden ist zu einem parser Error im Log.
Wie kann ich den Path abfangen nur wenn er vorhanden ist ?
Normaels Beispiel MQTT
Code: Alles auswählen
10:14:52 MQT: tele/sonoff13/SENSOR = {"Time":"2019-04-06T10:14:52","ENERGY":{"TotalStartTime":"2019-02-26T08:23:21","Total":0.473,"Yesterday":0.000,"Today":0.323,"Period":10,"Power":13,"ApparentPower":41,"ReactivePower":39,"Factor":0.31,"Voltage":226,"Current":0.181}}
Alle 5 Minuten "richtig" Beispiel
Code: Alles auswählen
10:14:55 MQT: tele/sonoff13/SENSOR = {"Time":"2019-04-06T10:14:55","ENERGY":{"TotalStartTime":"2019-02-26T08:23:21","Total":0.473,"Yesterday":0.000,"Today":0.323, "Power":192,"ApparentPower":192,"ReactivePower":0,"Factor":1.00,"Voltage":226,"Current":0.850}}
Danke Caddy
Re: jason Herausforderung
Verfasst: 6. Apr 2019 11:55
von udo1toni
Das ist leider nicht direkt lösbar. Ein Workaround wäre, statt der direkten Verknüpfung das komplette JSON Objekt in einem String zu speichern. Anschließend kannst Du in einer Rule alle vorhandenen Elemente heraus parsen und in einzelne Items ablegen:
Code: Alles auswählen
rule "json parsen"
when
Item Waschmaschine01_JSON changed
then
val String myJson = Waschmaschine01_JSON.state.toString
if(myJson.contains("Period")) {
val Number Period = transform("JSONPATH","$.ENERGY.Period",myJson)
Waschmaschine01_PowerAverage.postUpdate(Period)
}
// weitere Wertübertragungen
end
Evtl. muss der Wert noch zusätzlich nach Float geparsed werden, damit openHAB den String als Zahl interpretieren kann.
Code: Alles auswählen
rule "json parsen"
when
Item Waschmaschine01_JSON changed
then
val String myJson = Waschmaschine01_JSON.state.toString
if(myJson.contains("Period")) {
val Number Period = Float::parseFloat(transform("JSONPATH","$.ENERGY.Period",myJson))
Waschmaschine01_PowerAverage.postUpdate(Period)
}
// weitere Wertübertragungen
end
Jedes Mal, wenn das JSON Objekt geändert wird, wird die Rule aufgerufen. Falls das Objekt das Wort Period enthält, wird der entsprechende Wert geparsed, sonst nicht.
Re: jason Herausforderung
Verfasst: 6. Apr 2019 22:10
von Caddy
Hallo Udo,
danke für die Idee. Leider bekomme ich einen Fehler den ich nicht deuten kann
bei diesem Code
Code: Alles auswählen
rule "json parsen"
when
Item Waschmaschine01_JSON changed
then
val String myJson = Waschmaschine01_JSON.state.toString
if(myJson.contains("Period")) {
val Number Period = Float::parseFloat(transform("JSONPATH","$.ENERGY.Period",myJson))
Waschmaschine01_PowerAverage.postUpdate(Period)
}
// weitere Wertübertragungen
end
bekomme ich diesen Fehler:
Code: Alles auswählen
2019-04-06 21:59:03.113 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'json parsen 1': For input string: "{TotalStartTime=2019-02-26T08:10:25, Total=4.64, Yesterday=0.373, Today=4.266, Period=0, Power=0, ApparentPower=0, ReactivePower=0, Factor=0.0, Voltage=0, Current=0.0}"
und bei diesem Code
Code: Alles auswählen
rule "json parsen"
when
Item Waschmaschine01_JSON changed
then
val String myJson = Waschmaschine01_JSON.state.toString
if(myJson.contains("Period")) {
val Number Period = transform("JSONPATH","$.ENERGY.Period",myJson)
Waschmaschine01_PowerAverage.postUpdate(Period)
}
// weitere Wertübertragungen
end
bekomme ich diesen Fehler
Code: Alles auswählen
2019-04-06 22:08:33.152 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'json parsen 1': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.actions.BusEvent.postUpdate(org.eclipse.smarthome.core.items.Item,java.lang.Number) on instance: null
Vielleicht hast du eine Idee ?
Gruß Caddy
Re: jason Herausforderung
Verfasst: 6. Apr 2019 22:42
von udo1toni
Na, dann brechen wir die Rule noch etwas weiter auf, um dem Fehler auf die Spur zu kommen:
Code: Alles auswählen
rule "json parsen"
when
Item Waschmaschine01_JSON changed
then
val String myJson = Waschmaschine01_JSON.state.toString
logInfo("jsonParse","JSON: {}",myJson)
if(myJson.contains("Period")) {
logInfo("jsonParse","JSON enthält das Wort Period -> parsen")
val sPeriod = transform("JSONPATH","$.ENERGY.Period",myJson)
logInfo("jsonParse","Period (String): {}",sPeriod)
val Number Period = Float::parseFloat(sPeriod)
logInfo("jsonParse","Period (Number): {}",Period)
Waschmaschine01_PowerAverage.postUpdate(Period)
}
// weitere Wertübertragungen
end
PS: Ich hab gerade gesehen, dass Du offensichtlich hier nicht das gleiche JSON Objekt zurück bekommst wie im ersten Posting. Da scheint irgendwas nicht zu stimmen. Der Channel muss das selbe Topic verwenden, es darf aber keine incomming value transformation definiert sein.
PPS: Ach, Du veerwendest ja MQTT1... default müsste das Schlüsselwort sein:
Code: Alles auswählen
Number Waschmaschine01_JSON "Trockner JSON" {mqtt="<[broker:tele/sonoff11/SENSOR:state:default]"}
Re: jason Herausforderung
Verfasst: 7. Apr 2019 12:50
von Caddy
Hallo Udo,
das state:default war es ... Danke Läuft ...
Ich werde das jetzt mal im Auge behalten und berichten.
Danke für die kompetente Unterstützung
Grüße Caddy
Re: jason Herausforderung
Verfasst: 7. Apr 2019 22:43
von udo1toni
Immer gerne
