Seite 1 von 2

Rule funktioniert nicht

Verfasst: 13. Jun 2023 19:35
von Johannes911
die Rule soll 1 Minute vor Mitternacht jeweils den aktuellen Tagesverbrauch aufaddieren

Code: Alles auswählen

rule "Daten_Verbrauch_Woche um 23:59 aufaddieren"
when
    Time cron "0 1 * * * ?" //00:00:00 Uhr  jede Minute für Test
//    Time cron "0 59 23 * * ?" //00:00:00 Uhr     
then
    Woche_WaMa_kWh_temp.postUpdate((Woche_WaMa_kWh_temp.state) + (today1.state))
end
führt zu folgender Fehlermeldung:
2023-06-13 17:01:01.466 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'täglich_Speichern-2' failed: An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.ObjectExtensions.operator_plus(java.lang.Object,java.lang.String) on instance: null in täglich_Speichern
jeweils Montag Morgen um 00:01 h soll dann Woche_WaMa_kWh_temp wieder auf 0 gesetzt werden durch

Code: Alles auswählen

    Woche_WaMa_kWh_temp.postUpdate(0) 
    
dumme Fragne am Rand:

die Rules werden in der Reihenfolge abgearbeitet wie sie in der bla.rules gelistet sind? Wäre wichtig um Werte erst wegzuschreiben und dann zu löschen bzw. auf 0 zu setzen.

ich würde lieber darauf triggern wenn im Tasmota der Tageswert wieder dort auf 0 gesetzt wird um dann den letzten Wert davor wegzuschreiben, aber das wäre Hose mit Gürtel und Hosenträger :)

Re: Rule funktioniert nicht

Verfasst: 13. Jun 2023 20:06
von PeterA
Hi,

könnte mal vielleicht auch mit ".sumsince" lösen ?

https://www.openhab.org/docs/configurat ... tence.html

rule (ungetestet aus meinem Setting hier wo ich eigentlich "deltasince" verwende)

Code: Alles auswählen

rule "Stromeinspeisung heute" 
when

Item emdata0_total_act_ret changed

then

Stromeinspeisung_heute_cal_ret.postUpdate(emdata0_total_act_ret.deltaSince(sumsince.withTimeAtStartOfDay) / 1000 as Number )

end
Das "emdata..." Item wird über rrd4j persistiert.

Re: Rule funktioniert nicht

Verfasst: 13. Jun 2023 21:55
von udo1toni
Wenn Du ohnehin ein Item hast, in dem der Maximalwert auftaucht (also in Tasmota), dann reicht es, um 0 Uhr mittels (dasItem.maximumSince(now.minusSeconds(1)).state as Number).floatValue den alten Wert zu holen.
Oder du nimmst

Code: Alles auswählen

rule "maximum vor null"
when
    Item meinNumberItem changed to 0
then
    val fMax = (previousState as Number).floatValue
end
das geht sogar ohne Persistence.

Re: Rule funktioniert nicht

Verfasst: 13. Jun 2023 23:56
von Johannes911
ohh - nein!
Ich habe nur das Tagesmaximum, das speichere ich ja weg und das klappt auch.
Was nicht klappt ist meine Wochenaddition der Tageswerte - ich vermute ich behandele die Variablen bei der Addition nciht richtig

Re: Rule funktioniert nicht

Verfasst: 14. Jun 2023 10:32
von Johannes911
Ich habe mal versucht den Vorschlag umzusetzen, bekomme allerdings eine Warnung:

Code: Alles auswählen

rule "maximum vor null"
when 
    Item today4 changed  to 0
then
    val Tag_IT_kWh (previousState as Number).floatValue
end    
2023-06-14 08:19:09.624 [INFO ] [el.core.internal.ModelRepositoryImpl] - Validation issues found in configuration model 'täglich_Speichern.rules', using it anyway:
Value must be initialized
Type cannot be derived
The value of the local variable Tag_IT_kWh is not used
was mache ich falsch? bzw. wie bekomme ich den Wert in mein Item: Tag_IT_kWh

Re: Rule funktioniert nicht

Verfasst: 14. Jun 2023 15:28
von udo1toni
Ah, nein, da fehlt natürlich noch eine Zeile (und bei Dir ein =)
fMAx wäre eine lokale Konstante, die den gesuchten Wert enthält. Den musst Du natürlich noch per postUpdate in ein Item speichern.

Was die Wochensumme betrifft, ist jetzt halt die Frage, welche Ausgangssituation vorliegt.
Ideal wäre ein Zähler, der einfach den Zählerstand liefert, streng monoton wachsend. Da Du aber einen Zähler nutzt, der um 0 Uhr auf 0 zurückgesetzt wird, musst Du diese Werte aufsummieren. Dazu kannst Du unterschiedliche Wege gehen, z.B. schreibst Du die Tagessumme exakt einmal täglich in ein persistiertes Item (zwingend weder mapdb noch rrd4j, es muss exakt ein Wert pro Tag geschrieben werden. Dann kannst Du mit sumSince(Wochenanfang) die Werte summieren lassen.

Re: Rule funktioniert nicht

Verfasst: 14. Jun 2023 16:09
von Johannes911
ok das = habe ich übersehen.
Ich stolpere halt immer wieder darüber wie man an den Wert eines Items kommt, in welcher Richtung die Gleichung aufgelöst wird, wann eine lokale Variable benötigt wird etc. ...

Ich hätte halt gern eine Wochensumme in einem Item, dass jeden Tag um den Wert des aktuellen Tages erhöht wird:

Wochensumme + Wert des Tages = Wochensumme (neu), genau einmal ausgeführt um Mitternacht (oder beim Wechsel des Tageszählers auf 0)

am nächsten Tag dann einfach wieder etwas aufaddieren, dann nach 7 Tagen den Wert in die Monatssumme schreiben danach auf 0 setzen und analog mit der Monatssumme genau so weiter verfahren

Wie wäre dann die Forderung nach nur einmal am Tag persistieren zu gewährleisten? Könnte man das mit einer zusätzlich gefüllten jdbc.persist erschlagen in der dann zu diesem Item nur : strategy = everyChange drinsteht? Oder schlägt dann irgend so ein default-Wert wieder zu, der zusätzliche Einträge in die mysql-Datenbank einträgt?

Wenn es tatsächlich notwendig wäre für Montag, Dienstag ...Sonntag je ein Item anzulegen könnte ich damit leben, aber das hieße auch ich müsse das Gleiche für jeden Monat machen

Fragen über Fragen, sorry

Re: Rule funktioniert nicht

Verfasst: 14. Jun 2023 20:00
von udo1toni
Tatsächlich kannst Du ohne Probleme über die .persist Datei auch exakt einmal am Tag persistieren, Es ist nur die Frage, ob das der smarteste Ansatz ist :)
Da Du den Tageswert abholst, schreibst Du diesen Wert ja schon täglich in ein Item, und zwar einmal am Tag (für den Vortag). Es sollte also kein Problem sein, dieses Item zu persistieren. Zum Bilden der Wochensumme musst Du dann etwas tricksen.
Ungetestet:

Code: Alles auswählen

rule "maximum vor null"
when 
    Item today4 changed  to 0
then
    Tag_IT_kWh.postUpdate((previousState as Number).floatValue)
    val dtMonday = now.with(LocalTime.MIDNIGHT).minusDays(now.getDayOfWeek.getValue).plusDays(1).plusSeconds(1)
    Thread.sleep(500)
    Woche_IT_kWh.postUpdate(Tag_IT_kWh.sumSince(dtMonday))
end
Das Item wird zurückgesetzt, woraufhin die Rule triggert und sich den letzten Status vor der 0 holt (also das Maximum des Zählers. Dieser Wert wird im Item Tag_IT_kWh gespeichert (logischerweise einmal am Tag).
Anschließend wartet die Rule einen kurzen Moment, um der Persistence Zeit zu geben, den neuen Wert wegzuschreiben.
Dann wird im Item Woche_IT_kWh die Summe der Werte seit Dienstag, 00:00:01 Uhr geschrieben.

Am Montag wird also die Wochensumme der Vorwoche angezeigt, am Dienstag der Wert des Vortages (also Montag), am Mittwoch die Summe von Montag und Dienstag usw.

Falls die Quelle irgendwann am Tag einen Reset macht, der Zähler also schon tagsüber genullt wird, wird die Wochensumme dennoch stimmen, die für den Tag jedoch leider nicht, da die ja direkt den Zählerstand übernimmt, der dann nicht stimmt. Persisitert wird aber jeweils das Maximum vor der Nullung, so dass dies mit aufsummiert wird.

Re: Rule funktioniert nicht

Verfasst: 14. Jun 2023 22:09
von Johannes911
zuerst einmal DANKE
ich hab' das mal so installiert und warte die nächsten Tage mal ab

Re: Rule funktioniert nicht

Verfasst: 14. Jun 2023 22:41
von Johannes911
gerade mal testhalber die Rule gestartet und gleich eine Fehlermeldung bekommen:
2023-06-14 20:32:00.644 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'täglich_Speichern-1' failed: cannot invoke method public abstract float java.lang.Number.floatValue() on null in täglich_Speichern
leider sind die Fehlermeldungen für mich nicht sinnvoll lesbar - und somit habe ich auch keinen Hinweis in welcher Zeile da was falsch läuft