Stromverbrauch Shelly Plug S

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Stromverbrauch Shelly Plug S

Beitrag von udo1toni »

Ja, aber... ;)
Für das Löschen der Zähler (bzw. das Setzen auf 0) reicht jeweils eine viel einfachere Rule:

Code: Alles auswählen

rule "Stromzaehler Reset Tag"
when
    Time cron "0 0 0 * * ?" // täglich 0:00:00 Uhr
then
    gLoad.members.filter[ f | f.name.contains("Tag")].forEach[i|i.postUpdate(0)]
end


rule "Stromzaehler Reset Woche"
when
    Time cron "0 0 0 ? * 1" // montags 0:00:00 Uhr
then
    gLoad.members.filter[ f | f.name.contains("Woche")].forEach[i|i.postUpdate(0)]
end


rule "Stromzaehler Reset Monat"
when
    Time cron "0 0 0 1 * ?" // Am Monatsersten 0:00:00 Uhr
then
    gLoad.members.filter[ f | f.name.contains("Monat")].forEach[i|i.postUpdate(0)]
end
Das die Namen der Items für Kosten und kWh jeweils das gleiche Wort enthalten und die Rule ohnehin alle Items dieser Namensgruppe zurücksetzt, kann sie das ohne große Umschweife in einem Rutsch erledigen.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Tomzk
Beiträge: 55
Registriert: 5. Nov 2019 11:04
Answers: 0

Re: Stromverbrauch Shelly Plug S

Beitrag von Tomzk »

Hallo Udo,

es hat sich jetzt herausgestellt, dass die Verbräuche relativ ungenau sind. Problem sind schwanken Verbraucher. Zum Beispiel wenn der Fernseher läuft, so schwankt der IST Verbrauch zwischen 150 Watt und 200 Watt. Da wir per Rule nur jede Minute die Summierung machen, nimmt er den derzeit vorliegenden Verbrauch.

Ich habe bei Shellys 2 Verbrauchs Topics
1. Load = Der aktuelle Verbrauch in Watt (Der derzeit Verwendete Topic mit der Gruppe gVerbrauch)
2. Energie = Zeigt die Verbrauchte Summe in Watt-Minuten zeit dem einstecken des Shellys. (Hier wird exakt aufsummiert auch wenn der Verbrauch schwankt)
Beide Topics updaten minütlich.

Meine Idee wäre jetzt um genauere Werte zu bekommen, die Differenz des Energie Topics zur vorherigen Minute zu Berechnen und diese aufzusummieren. Hierdurch hätten würden die Schwankungen keine rolle spielen. Die Differenz wäre auch wichtig, da die Gesamtsumme des Topics Energie bei Stromausfall oder neu einstecken des Shellys bei 0 startet, keine Probleme mit den Dummizählern zu bekommen.
Weiterer Vorteil der Differenz wäre, ich kann eine 2te Rule für Tasmota Geräte erstellen und das Topic Verbrauch Heute nutzen. Muss hier allerdings beachten, dass ein update des Topics nur alle 4 Minuten gesendet wird (anders Umrechnen).

Ein paar Beiträge weiter oben hattest du einen Vorschlag einer Rule mit Differenz gemacht. Hier ist mein Problem aktuell, dass diese Rule auf ein definiertes Item bezogen ist. Ich möchte aber meinen Namesspilt der letzten Rule beibehalten, um meherere Items der Gruppe gLoad entsprechend upzudaten.

Ich habe mal versucht hier die Rule zusammenzubasteln, bin mir aber sicher, dass diese Fehlerhaft ist.
Wo und Wie kann ich die Differenzberechnung einbauen, sodass nur die Differenz von aktuell zu letzter Minute aufsummiert wird?

Danke und Gruß
Tom

Code: Alles auswählen

rule "Test mit Differenz"
when
    Time cron "5 * * * * ?" // jede Minute in der 5. Sekunde

then

    gVerbrauch.members.forEach[i|

// nLoad gegen nDelta ersetzt und die Formel angepasst
        val Number nDelta = ((0) /60000)  // Die berechnung scheint mir falsch zu sein. An welcher stelle rechne ich nun von Watt in kWh um?

        val myItemTag = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("Tag")
        ].head // passendes Item

        val myItemWoche = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("Woche")
        ].head // passendes Item

        val myItemMonat = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("Monat")
        ].head // passendes Item

        val myItemKostenTag = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("KostenTag")
        ].head // passendes Item        

        val myItemKostenWoche = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("KostenWoche")
        ].head // passendes Item        

        val myItemKostenMonat = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("KostenMonat")
        ].head // passendes Item        

// Neu eingefügt
        if(i.deltaSince(now.minusMinutes(1)) instanceof Number) nDelta = i.deltaSince(now.minusMinutes(1)) as Number
        if(nDelta > 0) {

// nLoad gegen nDelta ersetzt
        myItemTag.postUpdate(nDelta + if(myItemTag.state instanceof Number) (myItemTag.state as Number) else 0)
        myItemWoche.postUpdate(nDelta + if(myItemWoche.state instanceof Number) (myItemWoche.state as Number) else 0)
        myItemMonat.postUpdate(nDelta + if(myItemMonat.state instanceof Number) (myItemMonat.state as Number) else 0)
        myItemKostenTag.postUpdate(nDelta * 0.3 + if(myItemKostenTag.state instanceof Number) (myItemKostenTag.state as Number) else 0)
        myItemKostenWoche.postUpdate(nDelta * 0.3 + if(myItemKostenWoche.state instanceof Number) (myItemKostenWoche.state as Number) else 0)
        myItemKostenMonat.postUpdate(nDelta * 0.3 + if(myItemKostenMonat.state instanceof Number) (myItemKostenMonat.state as Number) else 0)

    ]
end

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

Re: Stromverbrauch Shelly Plug S

Beitrag von udo1toni »

Ohne jetzt allzu genau hingeschaut zu haben...

Code: Alles auswählen

rule "Stromzaehler kWh"
when
    Time cron "5 * * * * ?" // jede Minute in der 5. Sekunde
then
    gVerbrauch.members.forEach[i|
        val myItemTag = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("Tag")
        ].head // passendes Item

        val myItemWoche = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("Woche")
        ].head // passendes Item

        val myItemMonat = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("Monat")
        ].head // passendes Item

        val myItemKosten = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("Kosten")
        ].head // passendes Item

        val myItemKostenTag = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("KostenTag")
        ].head // passendes Item

        val myItemKostenWoche = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("KostenWoche")
        ].head // passendes Item

        val myItemKostenMonat = gLoad.members.filter[ f |
            f.name.split("_").get(1) == i.name.split("_").get(1) &&
            f.name.contains("KostenMonat")
        ].head // passendes Item

        var Number nLoad = 0
        if(i.deltaSince(now.minusMinutes(1)) instanceof Number) nLoad = (i.deltaSince(now.minusMinutes(1)) as Number) / 60000
        if(nLoad > 0) {
            myItemTag.postUpdate(nLoad + if(myItemTag.state instanceof Number) (myItemTag.state as Number) else 0)
            myItemWoche.postUpdate(nLoad + if(myItemWoche.state instanceof Number) (myItemWoche.state as Number) else 0)
            myItemMonat.postUpdate(nLoad + if(myItemMonat.state instanceof Number) (myItemMonat.state as Number) else 0)
            myItemKosten.postUpdate(nLoad * 0.3 + if(myItemKosten.state instanceof Number) (myItemKosten.state as Number) else 0)
            myItemKostenTag.postUpdate(nLoad * 0.3 + if(myItemKostenTag.state instanceof Number) (myItemKostenTag.state as Number) else 0)
            myItemKostenWoche.postUpdate(nLoad * 0.3 + if(myItemKostenWoche.state instanceof Number) (myItemKostenWoche.state as Number) else 0)
            myItemKostenMonat.postUpdate(nLoad * 0.3 + if(myItemKostenMonat.state instanceof Number) (myItemKostenMonat.state as Number) else 0)
        }
    ]
end
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Tomzk
Beiträge: 55
Registriert: 5. Nov 2019 11:04
Answers: 0

Re: Stromverbrauch Shelly Plug S

Beitrag von Tomzk »

irgendetwas stimmt mit der Rule nicht,
innheralb 3 Minuten habe ich ein Verbrauch von 30 kWh.
Entweder wird hier falsch Berechnet oder es wird nicht die reine Differenz aufsummiert.

In VSC habe ich auch einen gelben Fehler bei der Zeile:
if(i.deltaSince(now.minusMinutes(1)) instanceof Number)
The expression of type DecimalType is already of type Number(org.eclipse.xtext.xbase.validation.IssueCodes.obsolete_instanceof)
Danke und Gruß
Tom

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

Re: Stromverbrauch Shelly Plug S

Beitrag von udo1toni »

Ah. Das ist allerdings kein Fehler, sondern allenfalls eine Warnung Hat aber den Vorteil, dass die Zeile entsprechend einfacher ausfallen kann:

Code: Alles auswählen

val Number nLoad = (i.deltaSince(now.minusMinutes(1)) as Number) / 60000
Bau vielleicht mal eine Logzeile ein:

Code: Alles auswählen

if(nLoad > 0) {
    logInfo("kWh","{} = {} ({}), nLoad = {}",i.name,i.state,i.historicState(now.minusMinutes(1)).state,nLoad)
    ...
in der Gruppe gVerbrauch müssen natürlich jeweils die Items mit den Verbrauchssummen sein, die Items müssen mit einem Service persitiert werden, der mindestens minütlich und bei Änderung den Status als Zahl speichert.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

CSF
Beiträge: 6
Registriert: 19. Apr 2020 08:58
Answers: 0

Re: Stromverbrauch Shelly Plug S

Beitrag von CSF »

Tomzk hat geschrieben: 5. Jan 2020 14:18 irgendetwas stimmt mit der Rule nicht,
innheralb 3 Minuten habe ich ein Verbrauch von 30 kWh.
Entweder wird hier falsch Berechnet oder es wird nicht die reine Differenz aufsummiert.

In VSC habe ich auch einen gelben Fehler bei der Zeile:
if(i.deltaSince(now.minusMinutes(1)) instanceof Number)
The expression of type DecimalType is already of type Number(org.eclipse.xtext.xbase.validation.IssueCodes.obsolete_instanceof)
Danke und Gruß
Tom
Hallo Tomzk,
ich möchte das Thema nochmals aufgreifen.

Bin noch eher am Anfang mit Openhab.
Jedoch konnte ich schon einige Dinge wie Wechselrichter, Shellys für Rollo, Grafana, InfluxDB etc. umsetzen.
Mich würde dein Thema hier nochmals interessieren.
Könntest du deine letzte Konfiguration nochmals zur Verfügung stellen?
Ich möchte auch die Werte in InfluxDB schreiben.
Was muss eigentlich bei deiner Konfiguration alles persistiert werden?

Danke im Voraus!

BG, CSF

Antworten