Verzweiflung

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
knight_GT
Beiträge: 1
Registriert: 29. Apr 2022 21:36
Answers: 0

Verzweiflung

Beitrag von knight_GT »

Seit mindestens 6 Stunden versuche ich mich an einer (dachte ich zumindest) einfachen Rule... Muss aber auch zugeben, das ich das erstem mal mit einer Textdatei als Rule arbeite..

Wie auch immer: Ich versuche mit einen Tagesvebrauch an Strom bzw die kWh zu berechnen. Anscheinend kann ich nicht auf die historischen Daten zugreifen oder mache da was falsch. In Grafana, Tabellenansicht, sehe ich, dass ausreichend Daten vorhanden sind. Influxdb ist auch als Standard definiert...

Zählerstand Mitternacht gibt den Wert "Null" raus.

Code: Alles auswählen

rule "Stromzaehler Verbrauch Tag"
when
Item shellyem3Stromzaehler192168077_KumulierterGesamtverbrauch received update
then
    logInfo("verbrauch","Zählerstand um Mitternacht: {}",shellyem3Stromzaehler192168077_KumulierterGesamtverbrauch.historicState(ZonedDateTime.now().with(LocalTime.MIDNIGHT)) as Number)
    //with(LocalTime.MIDNIGHT)) as Number)
    //(ZonedDateTime.now().with(LocalTime.MIDNIGHT)))   ZonedDateTime.now().with(LocalTime.MIDNIGHT)
    logInfo("verbrauch","Zählerstand aktuell       : {}",shellyem3Stromzaehler192168077_KumulierterGesamtverbrauch.state)
TagesverbrauchGesamt.postUpdate(shellyem3Stromzaehler192168077_KumulierterGesamtverbrauch.deltaSince(ZonedDateTime.now().with(LocalTime.MIDNIGHT)) as Number )
end

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

Re: Verzweiflung

Beitrag von udo1toni »

Herzlich willkommen im Forum!

Wenn Du Dir diese einfache Rule anschaust, fällt etwas sofort auf: Der Itemname ist extrem unglücklich.

Items sind komplett losgelöst von Hardware. Entsprechend sollte ein Itemname auch nicht auf eine bestimmte Hardware verweisen (shellyem3). KumulierterGesamtverbrauch ist in meinen Augen ein weißer Schimmel ;) Der Gesamtverbrauch ist per Definition immer kumuliert.
Stromzaehler ist auch unnötig lang. Und hast Du wirklich Zwanzig Millionen Zähler in Betrieb? Eigentlich wäre StromGesamtverbrauch doch vollkommen ausreichend, oder?
Und schon wäre der Rule Code wesentlich besser lesbar.

Der eigentliche Fehler (der sollte sich eigentlich ausschließlich auf das Logging auswirken...) liegt darin, dass Du .historicState() asngibst, es muss aber .historicState().state heißen. .historicState() liefert nämlich als Ergebnis ein historicItem, nicht den Status. Man kann auch auf andere Aspekte des Items zugreifen als lediglich auf den Status (gewöhnlich wären das .state und .getTimestamp).

Mein Vorschlag (zumindest zum Debuggen):

Code: Alles auswählen

rule "Stromzaehler Verbrauch Tag"
when
    Item StromGesamtverbrauch changed or
    Time cron "0 0 0 * * ?"
then
    val dMidnight = ZonedDateTime.now().with(LocalTime.MIDNIGHT)
    val Number nTotal = StromGesamtverbrauch.historicState(dMidnight).state as Number
    val Number nDelta = StromGesamtverbrauch.deltaSince(dMidnight) as Number

    logInfo("verbrauch","Zählerstand um Mitternacht: {}",nTotal)
    logInfo("verbrauch","Zählerstand aktuell       : {}",StromGsamtverbrauch.state)
    logInfo("verbrauch","Persistence Delta         : {}",nDelta)
    logInfo("verbrauch","errechnetes Delta         : {}",(StromGsamtverbrauch.state as number) - nTotal)

    TagesverbrauchGesamt.postUpdate(nDelta)
end
Der Trigger auf changed ist vollkommen ausreichend, Du musst nicht wieder und wieder zum gleichen Ergebnis kommen. Der Time cron Trigger ist nur dann relevant, wenn sich der Verbrauch extrem selten ändert (gewöhnlich würde ich bei Strommessungen eher hoch volatile Werte erwarten, die im Zweifel mehrfach pro Minute Änderung erfahren, dann wird man auch ein paar Sekunden "falsche" Tagessummenanzeige verkraften können...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten