Seite 1 von 1

Upgrade 4.3.3 - AverageSince funktioniert nicht mehr

Verfasst: 3. Mär 2025 19:49
von oschwabe
Hallo zusammen,
seit dem Update auf 4.3.3 funktioniert die Berechnung des Mittelwertes nicht mehr.

ich will in das Item "pvPower_erzeugung_5" (number) den Durchschnittswert des Items pvPower (number) letzten 5 Minuten schreiben.

Code: Alles auswählen

pvPower_erzeugung_5.postUpdate(pvPower.averageSince(now.minusMinutes(5), "rrd4j"))
und bekomme folgende Fehlermeldung:
[ERROR] [.handler.AbstractScriptModuleHandler] - Script execution of rule with UID 'pvanlage' failed: The argument 'state' must not be null. in pvanlage.
mit der Fehlermeldung kann ich nicht viel anfangen.

hat sich in 4.3.3 etwas verändert oder warum plötzlich der Fehler?

Re: Upgrade 4.3.3 - AverageSince funktioniert nicht mehr

Verfasst: 3. Mär 2025 22:37
von nw378
The argument 'state' must not be null. in pvanlage.
Klingt eher, als ob (noch) keine Daten vorliegen. Persistence läuft? Update nach Sonnenuntergang gemacht?

Re: Upgrade 4.3.3 - AverageSince funktioniert nicht mehr

Verfasst: 4. Mär 2025 00:09
von oschwabe
so wie ich das sehe tritt der Fehler auf, wenn der Wert auf 0 (nicht NULL) geht. In meinem Fall wenn die Sonne untergegangen ist.
Als Workaround habe ich jetzt eine IF Abfrage herum gebaut welche das Kommando nur ausführt wenn Wert nicht 0.
wie gesagt - die Rule lief bis zu dem Update auf 4.3.3 am Sonntag 3.3.25.

Re: Upgrade 4.3.3 - AverageSince funktioniert nicht mehr

Verfasst: 4. Mär 2025 03:13
von udo1toni
Nein, die Fehlermeldung ist hier eindeutig.
null ist übrigens etwas anders als NULL (und etwas völlig anderes als 0)
Du kannst vor dem postUpdate() eine Zeile in openhab.log ausgeben lassen:

Code: Alles auswählen

val nowMinus5 = now.minusMinutes(5)
val avgSince = pvPower.averageSince(nowMinus5,"rrd4j")
logInfo("pvPower","Durchschnitt ab {}  ist {}",nowMinus5,avgSince)
if(avgSince !== null)
    pvPower_Erzeugung_5.postUpdate(avgSince)

Re: Upgrade 4.3.3 - AverageSince funktioniert nicht mehr

Verfasst: 5. Mär 2025 19:00
von oschwabe
das ist jetzt der Code mit den Veränderungen von Udo.

Code: Alles auswählen

	
	val nowMinus5 = now.minusMinutes(5)
	val avgSince = pvPower.averageSince(nowMinus5,"rrd4j")
	logInfo("pvPower","Durchschnitt ab {}  ist {}",nowMinus5,avgSince)
	//if (pvPower.state != 0)
	//{
	logInfo("PVInfo", "PVInfo Durschnitt 5 berechnen - HomePower: " + homePower_W.state + "W GridPower: " + gridPower_W.state + "W PV-Power: " + pvPower_W.state + "  BatteryPower: " + batteryPower_W.state)
	pvPower_erzeugung_5.postUpdate(pvPower.averageSince(now.minusMinutes(5), "rrd4j"))
	//}
Für mich sieht das so aus, dass solange der berechnete Durschnitt einen Wert größer 0 hat kommt kein Fehler auch wenn Wert des Items pvPower bereits 0 ist.

Code: Alles auswählen

2025-03-05 18:19:24.891 [INFO ] [.model.script.pvPower] - Durchschnitt ab 2025-03-05T18:14:24.889680579+01:00[Europe/Berlin]  ist 0.1503671111111111
2025-03-05 18:19:24.892 [INFO ] [org.openhab.core.model.script.PVInfo] - PVInfo Durschnitt 5 berechnen - HomePower: 2565W GridPower: -24W PV-Power: 0 W  BatteryPower: 2607
erst wenn der berechnete Durchschnitt den Wert 0 wird, taucht der Fehler im LOG auf.

Code: Alles auswählen

2025-03-05 18:29:55.142 [INFO ] [.model.script.pvPower] - Durchschnitt ab 2025-03-05T18:24:55.140490490+01:00[Europe/Berlin]  ist 0
2025-03-05 18:29:55.143 [INFO ] [org.openhab.core.model.script.PVInfo] - PVInfo Durschnitt 5 berechnen - HomePower: 2817W GridPower: 65W PV-Power: 0 W  BatteryPower: 2677
2025-03-05 18:29:55.144 [ERROR] [.handler.AbstractScriptModuleHandler] - Script execution of rule with UID 'pvanlage_wallbox_evcc-1' failed: The argument 'state' must not be null. in pvanlage_wallbox_evcc
Das ist aber erst seit dem Upgrade auf 4.3.3 so - Problem in Openhab oder gab es eine "Verbesserung"?

Re: Upgrade 4.3.3 - AverageSince funktioniert nicht mehr

Verfasst: 6. Mär 2025 12:34
von udo1toni
Warum verwendest Du nicht die Variable beim postUpdate? Das erneute Abfragen der Datenbank führt fast zwingend zu einem anderen Ergebnis.
Bitte nicht einfach Code abändern, es hat schon einen Grund, warum ich in meinem Code eine Variable nutze.

Ganz korrekt wäre der Code so:

Code: Alles auswählen

val nowMinus5 = now.minusMinutes(5)
val avgSince = pvPower.averageSince(nowMinus5,"rrd4j")
logInfo("pvPower","Durchschnitt ab {}  ist {}",nowMinus5,avgSince)
if(avgSince instanceof Number)
    pvPower_Erzeugung_5.postUpdate(avgSince)
Es geht hier darum, dass sichergestellt ist, dass ein gültiger Zahlenwert geliefert wird. Das ist aber nur für die Variable sichergestellt, nicht für eine erneute Abfrage der Datenbank.