jason Herausforderung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Caddy
Beiträge: 117
Registriert: 16. Nov 2018 08:21

jason Herausforderung

Beitrag 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

Benutzeravatar
udo1toni
Beiträge: 13854
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: jason Herausforderung

Beitrag 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.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Caddy
Beiträge: 117
Registriert: 16. Nov 2018 08:21

Re: jason Herausforderung

Beitrag 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

Benutzeravatar
udo1toni
Beiträge: 13854
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: jason Herausforderung

Beitrag 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]"}
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Caddy
Beiträge: 117
Registriert: 16. Nov 2018 08:21

Re: jason Herausforderung

Beitrag 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

Benutzeravatar
udo1toni
Beiträge: 13854
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: jason Herausforderung

Beitrag von udo1toni »

Immer gerne :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten