Seite 1 von 1

Verzweiflung

Verfasst: 29. Apr 2022 21:44
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

Re: Verzweiflung

Verfasst: 30. Apr 2022 07:56
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...