Shelly Verbrauchswerte Speichern

Geflasht oder ungeflasht ...

Moderator: seppy

Rob69
Beiträge: 18
Registriert: 26. Feb 2021 07:38

Shelly Verbrauchswerte Speichern

Beitrag von Rob69 »

Hallo,

Mein Problem ist das meine Shelly 1PM oder 2.5 immer wieder ihre Verbrauchswerte verlieren, welches manchmal täglich oder erst nach mehren Wochen!
Nun meine Frage wie kann ich diese Daten speichern, entweder über ein virtuelles Item oder hab ihr irgendwelche anderen Vorschläge?

Desgleichen habe ich eine Regel welche irgendwie nicht greift!

Virtuell Item:

Code: Alles auswählen

  //// Waschmaschine_Waeschetrockner
 Number Waschmaschine_Kosten                    "Stromkosten Waschmaschine [%.2f €]"
 Number Waeschetrockner_Kosten                  "Stromkosten Waeschetrockner [%.2f €]"
 Number Playstation_Kosten                          "Stromkosten Playstation [%.2f €]"
und die Rules dazu:

Code: Alles auswählen

rule "Waschmaschine Energiekosten"

when
    Item Waschmaschine_MeterTotalKWH received update
then
    Waschmaschine_Kosten.postUpdate(Waschmaschine_MeterTotalKWH.state as DecimalType * 0,3)
end

rule "Waeschetrockner Energiekosten"

when
    Item Waeschetrockner_MeterTotalKWH received update
then
    Waeschetrockner_Kosten.postUpdate(Waeschetrockner_MeterTotalKWH.state as DecimalType * 0,3)
end

rule "Playstation Energiekosten"

when
    Item Playstation_MeterTotalKWH received update
then
    Playstation_Kosten.postUpdate(Playstation_MeterTotalKWH.state as DecimalType * 0,3)
end
Mein System ist openhab 2.5

lt: Logfiles haben die Regeln keine Fehler


Gruß Rob

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

Re: Shelly Verbrauchswerte Speichern

Beitrag von udo1toni »

Also, zunächst einmal möchte ich Dich bitten, zukünftig Code auch als Code zu markieren. das erhöht die Lesbarkeit und man bekommt noch weitere Vorteile wie z.B. dass man den Code einfach komplett kopieren kann.

Deine Rules haben mehrere Fehler. Der wichtigste: Der Dezimaltrenner wird durch den Punkt dargestellt, nicht durch ein Komma.

Ansonsten wäre es sinnvoll, die Items in Gruppen zu organisieren, z.B. zwei Gruppen für die ankommenden Items und die Kosten-Items:

Code: Alles auswählen

Group gMeterTotalKWH
Group gKosten
Die Items werden diesen Gruppen zugeordnet. Anschließend reicht eine Rule, die sich nun um alle Items kümmert:

Code: Alles auswählen

rule "Energiekosten"
when
    Member of gMeterTotalKWH changed                                      // Wenn sich einer der Werte ändert
then
    if(!(triggeringItem.state instanceof Number))                         // Falls keine Zahl geliefert wird
        return;                                                           // abbrechen

    val Number nKwh = (triggeringItem.state as Number).floatValue         // Wert speichern
    gKosten.members.filter[i|                                             // Aus der Liste der Items dasjenige heraussuchen
        i.name.split("_").get(0) == triggeringItem.name.split("_").get(0) // bei dem der 1. Namensteil übereinstimmt
    ].head.postUpdate(nKwh * 0.3)                                         // und errechneten Wert schreiben
end
Die Rule ist unwesentlich länger, was allerdings vor allem der Tatsache geschuldet ist, dass die wichtigste Fehlerquelle abgefangen wird, nämlich dass ein Item die Rule triggert, welches keine gültige Zahl im Status hat (dieses Problem besteht bei Deinen Rules ebenfalls)
Ansonsten sieht der Aufruf kompliziert aus, ist es aber eigentlich gar nicht. Dein Vorteil: Die Namen der Items folgen schon einem Schema, welches es ermöglicht, vom Namen des einen Items auf den Namen des anderen Items zu schließen.
Es gibt keinerlei Anforderungen an die Gruppen, außer, dass in der einen Gruppe nur die Items liegen, welche die Werte empfangen und in der anderen Gruppe die Items liegen, welche die umgerechneten Werte aufnehmen. Die Gruppe muss z.B. nicht vom Typ Number sein, es geht nur darum, die Items zu gruppieren.
openHAB2.5.12 in einem Debian-Container (Proxmox, LXC)

Benutzeravatar
KellerK1nd
Beiträge: 245
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Re: Shelly Verbrauchswerte Speichern

Beitrag von KellerK1nd »

Mein Problem ist das meine Shelly 1PM oder 2.5 immer wieder ihre Verbrauchswerte verlieren, welches manchmal täglich oder erst nach mehren Wochen!
Nun meine Frage wie kann ich diese Daten speichern, entweder über ein virtuelles Item oder hab ihr irgendwelche anderen Vorschläge?
Das ging mir auch auf den Knarz bei den Dingern, darum bin ich dazu übergegangen nur das Delta zu speichern, somit war es mir egal ob der seine internen Werte zurück gesetzt hat.

Code: Alles auswählen

rule "Shelly 11 Gesamtverbrauch umrechnen"
when
    Item Shelly11Energy changed
then
    var currentkwh = (Shelly11Energy.state as Number).floatValue() / 60000		// aktueller Wert vom Shelly umgerechnet in kwh
    var previouskwh = (Shelly11Energy.previousState.state as Number).floatValue() / 60000		//vorhergehender Wert des Shelly umgerechnet in kwh

    if((currentkwh - previouskwh) > 0){		//Wenn das Delta größer 0 ist
        Shelly11EnergykWh.postUpdate(Shelly11EnergykWh.state as Number + (currentkwh - previouskwh))		//Gesamtverbrauch aus dem Delta in Item schreiben
    }
    else if((currentkwh - previouskwh) < 0){		//Wenn das Delta kleiner 0 ist (nach einem Reset des Shellies)
        Shelly11EnergykWh.postUpdate(Shelly11EnergykWh.state as Number + currentkwh)		//Gesamtverbauch nur des aktuellen Wertes nach einem Reset schreiben
    }
end
Es wird immer nur die Veränderung des Shellies gespeichert, nie der interne Wert, allerdings muss man sich den internen Wert wenigstens einmal holen. Aber das müßtest du ja schon haben. Die zweite if Bedingung ist nur für den Fall eines Resets, da ja das Delta kleiner null sein wird.
Betriebssystem: Proxmox 6.4-9
openHAB Container: debian10.3 LXC
openHAB Version: 3.1
Hardware: Lenovo ThinkCentre M720q
Smarthome-Equipment:
- Rasperrymatic
- deConz (inkl. HUE)
- Shellys
- Mosquitto
- AVM Fritz!Box

Rob69
Beiträge: 18
Registriert: 26. Feb 2021 07:38

Re: Shelly Verbrauchswerte Speichern

Beitrag von Rob69 »

Hallo Kellerkind,

ich habe die Rule von dir an meine Bedürfnisse angepasst!

Bekomme aber im Logviewer folgenden Eintrag:

2021-06-30 17:52:21.373 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Poolpumpe Gesamtverbrauch umrechnen': Could not cast NULL to java.lang.Number; line 65, column 36, length 31

Woran kann das liegen Vielleicht weil ich noch Openhab 2.5 habe!

Gruß Rob.

Bin am Verzweifeln wie kann ich einen Code erstellen, um meine rules dort einzufügen :| :|

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

Re: Shelly Verbrauchswerte Speichern

Beitrag von udo1toni »

Zeige doch mal bitte Deine Rule. Welche Zeile steht in Zeile 65?
openHAB2.5.12 in einem Debian-Container (Proxmox, LXC)

Benutzeravatar
KellerK1nd
Beiträge: 245
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Re: Shelly Verbrauchswerte Speichern

Beitrag von KellerK1nd »

Ich würde jetzt auch nur vermuten, dass dein Item, in welches du den Wert schreiben willst, uninitialisiert ist, das steht jetzt auf NULL und NULL ist keine Zahl, ergo kann er den neuen Wert nicht schreiben. Du musst den Wert einmalig mit einem Wert füllen, am ehesten den wie dein aktueller Verbrauchswert ist. Sonst so wie Udo gesagt hat.
Betriebssystem: Proxmox 6.4-9
openHAB Container: debian10.3 LXC
openHAB Version: 3.1
Hardware: Lenovo ThinkCentre M720q
Smarthome-Equipment:
- Rasperrymatic
- deConz (inkl. HUE)
- Shellys
- Mosquitto
- AVM Fritz!Box

Rob69
Beiträge: 18
Registriert: 26. Feb 2021 07:38

Re: Shelly Verbrauchswerte Speichern

Beitrag von Rob69 »

Hallo,

Wie kann ich denn den Wert füllen!

Rules:

44: rule "Poolpumpe Gesamtverbrauch umrechnen"
45:when
46:Item Garten_Steckdose1CurrentWatts changed
47:then
48:var currentkwh = (Garten_Steckdose1CurrentWatts.state as Number).floatValue() / 60000
49:var previouskwh = (Garten_Steckdose1CurrentWatts.previousState.state as Number).floatValue() / 60000
50:
51: if((currentkwh - previouskwh) > 0){ //Wenn das Delta größer 0 ist
52: PoolpumpeEnergy.postUpdate(PoolpumpeEnergy.state as Number + (currentkwh - previouskwh))
53: }
54:else if((currentkwh - previouskwh) < 0){
55:PoolpumpeEnergy.postUpdate(PoolpumpeEnergy.state as Number + currentkwh)
56: }
57:end

Garten_Steckdose1CurrentWatts = Shelly Item
PoolpumpeEnergy = Virtuelles Item

Fehlercode:

2021-07-01 19:28:24.539 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Poolpumpe Gesamtverbrauch umrechnen': Could not cast NULL to java.lang.Number; line 52, column 36, length 31


Gruß Rob

Benutzeravatar
KellerK1nd
Beiträge: 245
Registriert: 17. Jun 2019 16:45
Answers: 1
Wohnort: Griesheim

Re: Shelly Verbrauchswerte Speichern

Beitrag von KellerK1nd »

Inititial so:

Code: Alles auswählen

rule "Shelly 11 Gesamtverbrauch umrechnen"
when
    Item Shelly11Energy changed
then
    var currentkwh = (Shelly11Energy.state as Number).floatValue() / 60000
    var previuoskwh = (Shelly11Energy.previousState.state as Number).floatValue() / 60000

    if(!(Shelly11EnergykWh.state instanceof Number)){
        Shelly11EnergykWh.postUpdate(0)
    }
    if((currentkwh - previuoskwh) > 0){
        Shelly11EnergykWh.postUpdate(Shelly11EnergykWh.state as Number + (currentkwh - previuoskwh))
    }
    else if((currentkwh - previuoskwh) < 0){
        Shelly11EnergykWh.postUpdate(Shelly11EnergykWh.state as Number + currentkwh)
    }
end
Die Zeile:

Code: Alles auswählen

    if(!(Shelly11EnergykWh.state instanceof Number)){
        Shelly11EnergykWh.postUpdate(0)
    }
würde ich aber nachdem es geklappt hat wieder löschen. Sonst würde es im dümmsten Fall deinen Wert später wieder löschen. Eventuell weiß Udo eine bessere Methode, meine Methode ist wahrscheinlich eher "schmutzig", bzw. ändere sie in:

Code: Alles auswählen

    if(!(Shelly11EnergykWh.state instanceof Number)){
        logWarn("Shelly11", "liefert keinen gültigen Zahlrenwert.")
        return;
    }
Betriebssystem: Proxmox 6.4-9
openHAB Container: debian10.3 LXC
openHAB Version: 3.1
Hardware: Lenovo ThinkCentre M720q
Smarthome-Equipment:
- Rasperrymatic
- deConz (inkl. HUE)
- Shellys
- Mosquitto
- AVM Fritz!Box

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

Re: Shelly Verbrauchswerte Speichern

Beitrag von udo1toni »

erster Tipp: Klammere den Ausdruck PoolpumpeEnergy.state as Number, das Casting wird nicht zuverlässig vor der Addition ausgeführt.
zweiter Tipp: Vielleicht ist PoolpumpeEnergy ein UoM Item, dann müsste der Wert explizit nach Float oder Integer gewandelt werden.
dritter Tipp: Dann gibt es abeer immer noch diverse Stellen, an denen es knallen kann, weil ein Wert eventuell gar nicht geliefert wird.
Besser abfangen:

Code: Alles auswählen

rule "Poolpumpe Gesamtverbrauch umrechnen"
when
    Item Garten_Steckdose1CurrentWatts changed
then
    var Number currentkwh = 0
    if(Garten_Steckdose1CurrentWatts.state instanceof Number)
        currentkwh = (Garten_Steckdose1CurrentWatts.state as Number).floatValue / 60000
    var Number previouskwh = 0
    if(Garten_Steckdose1CurrentWatts.previousState.state instanceof Number)
        previouskwh = (Garten_Steckdose1CurrentWatts.previousState.state as Number).floatValue / 60000
    var Number energy = 0
    if(PoolpumpeEnergy.state instanceof Number)
        energy = (PoolpumpeEnergy.state as Number).floatValue
    energy = energy + currentkwh
    if((currentkwh - previouskwh) > 0)  //Wenn das Delta größer 0 ist
        energy = energy - previouskwh

    PoolpumpeEnergy.postUpdate(energy)
end
Alternativ kannst Du die Rule auch abbrechen, falls einer der Werte nicht zur Verfügung steht.
Die Rule triggert auf changed, somit steht die implizite Variable previousState zur Verfügung, Du kannst also sogar auf die Persistence verzichten:

Code: Alles auswählen

rule "Poolpumpe Gesamtverbrauch umrechnen"
when
    Item Garten_Steckdose1CurrentWatts changed
then
    val Number currentkwh = if(Garten_Steckdose1CurrentWatts.state instanceof Number)
        (Garten_Steckdose1CurrentWatts.state as Number).floatValue / 60000
    else
        0
    val Number previouskwh = if(previousState instanceof Number)
        (previousState as Number).floatValue / 60000
    else
        0
    var Number energy = if(PoolpumpeEnergy.state instanceof Number)
        (PoolpumpeEnergy.state as Number).floatValue
    else
        0
    energy = energy + currentkwh
    if((currentkwh - previouskwh) > 0)  //Wenn das Delta größer 0 ist
        energy = energy - previouskwh

    PoolpumpeEnergy.postUpdate(energy)
end
Im zweiten Beispiel habe ich außerdem den ternären Operator verwendet, dadurch kann man die ersten beiden Variablen als lokale Konstante definieren. Das ist aber Geschmacksache ;)
openHAB2.5.12 in einem Debian-Container (Proxmox, LXC)

Rob69
Beiträge: 18
Registriert: 26. Feb 2021 07:38

Re: Shelly Verbrauchswerte Speichern

Beitrag von Rob69 »

Einen Dank

Udo und Kellerkind ihr seit einfach klasse!!!!!! :D

Antworten