Seite 1 von 1

2 fast gleiche rules.. eine geht die andere nicht...

Verfasst: 21. Apr 2023 13:31
von goerdi
Hi !

Ich hab folgende items

Code: Alles auswählen

Number Solar_Power_ac "Einspeiseleistung [ %.0f W]" <solarplant> (gSV,gSVp) { channel="mqtt:topic:home:solarview:solar_power_ac" }
Number Solar_Power_max "Einspeiseleistung Max Heute [ %.0f W]" <solarplant> (gSV,gSVp)
Number Solar_Power_max_max "Einspeiseleistung Max Max [ %.0f W]" <solarplant> (gSV,gSVp)

Number Solar_bkw_ac   "Einspeiseleistung [ %.0f W]" <solarplant> (gSV,gSVp) { channel="mqtt:topic:home:solarview_bkw:solar_bkw_ac" }
Number Solar_bkw_max "Einspeiseleistung Max Heute [ %.0f W]" <solarplant> (gSV,gSVp)
Number Solar_bkw_max_max "Einspeiseleistung Max Max [ %.0f W]" <solarplant> (gSV,gSVp)
Dazu die passende rule

Code: Alles auswählen

ule "save PV max"
when
    Item Solar_Power_ac changed
then
   if  (Solar_Power_ac.state > Solar_Power_max.state)
       Solar_Power_max.postUpdate(Solar_Power_ac.state as Number)
   else if  (Solar_Power_ac.state > Solar_Power_max_max.state)
       Solar_Power_max_max.postUpdate(Solar_Power_ac.state as Number)
end

rule "save BKW max"
when
    Item Solar_bkw_ac changed
then
   if  (Solar_bkw_ac.state > Solar_bkw_max.state)
       Solar_bkw_max.postUpdate(Solar_bkw_ac.state as Number)
   else if  (Solar_bkw_ac.state > Solar_bkw_max_max.state)
       Solar_bkw_max_max.postUpdate(Solar_bkw_ac.state as Number)
end
die erste Rule funktioniert bei der zweiten krieg ich ne Fehlermeldung

Code: Alles auswählen

2023-04-21 13:30:16.856 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'solarview-6' failed: An error occurred during the script execution: Could not invoke method: org.openhab.core.model.script.lib.NumberExtensions.operator_greaterThan(org.openhab.core.types.Type,java.lang.Number) on instance: null in solarview
die max und max_max items werden sonst nirgends beschrieben oder sonst was...

Gruss Gerd

Re: 2 fast gleiche rules.. eine geht die andere nicht...

Verfasst: 21. Apr 2023 15:17
von KellerK1nd
Ich arbeite mittlerweile viel über Variablen. Hier mal mein Vorschlag für deine erste Regel, die kannst du analog auf die zweite Regel anwenden, du musst nur die Variablen bearbeiten und die Zielitems.

Code: Alles auswählen

rule "save PV max"
when
    Item Solar_Power_ac changed
then
    if(!(Solar_Power_ac.state instanceof Number)){                                                                                  //Prüfen ob Solar_Power_ac eine gültige Zahl ist, allenfals wird die Regel abgebrochen
        logWarn("rule save PV max", "Item liefert keinen gültigen Zahlenwert (Rückgabewert: {}).", Solar_Power_ac.state)
        return;
    }

    var Number PowerAktuell = Solar_Power_ac.state as Number                                                                        //Aktuelle Leistung
    var Number PowerMaxDay = if(Solar_Power_max.state instanceof Number) (Solar_Power_max.state as Number).floatValue else 0        //Tagesmax Leistung, Item wird auf 0 gesetzt falls uninitialisiert ist oder keinen gültigen Zahlenwert besitzt
    var Number PowerMax = if(Solar_Power_max_max.state instanceof Number) (Solar_Power_max_max.state as Number).floatValue else 0    //Alltime Maxleistung, Item wird auf 0 gesetzt falls uninitialisiert ist oder keinen gültigen Zahlenwert besitzt

   if (PowerAktuell > PowerMaxDay) Solar_Power_max.postUpdate(PowerAktuell)
   if (PowerAktuell > PowerMax) Solar_Power_max_max.postUpdate(PowerAktuell)
end
Ich gehe davon aus, dass das Item Number Solar_Power_max täglich genullt wird?

Re: 2 fast gleiche rules.. eine geht die andere nicht...

Verfasst: 21. Apr 2023 15:24
von goerdi
Ja die werden taeglich genullt

Re: 2 fast gleiche rules.. eine geht die andere nicht...

Verfasst: 21. Apr 2023 15:34
von PeterA
OH Yeah!

Dafür liebe ich dieses Forum!!!

Für solche Dinge habe ich bisher immer mit der rrd4j Persistenz gearbeitet:

Code: Alles auswählen

rule "Update Gesamtleistung values"
when
    Item OpenDTU1_inv1_pow
    Time cron "0 0 0 * * ?"
    //System started
then
    postUpdate(OpenDTU1_inv1_pow_Max, OpenDTU1_inv1_pow.maximumSince(now.withTimeAtStartOfDay).state)
end
Funktioniert auch.
Bis auf den aktuellen Leistungswert.
Der schwankt ja sehr stark und dann bekomme ich nicht immer genau den passenden Wert aus der DB zurück.
Jetzt habt ihr mir eine andere Lösung aufgezeigt!

MERCI!

Gruß
Peter