Rule zum Regenmenge messen täglich

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

goerdi
Beiträge: 110
Registriert: 21. Dez 2019 23:44
Answers: 0

Rule zum Regenmenge messen täglich

Beitrag von goerdi »

Hallo !

In meiner Wetterstation läuft ja die Regenmenge auf... der Zähler zählt bis 1000.0 (afaik) und springt dann um wieder auf 0.
Jetzt wollte ich das ganze per Rule um 23:59 in einem Item abspeichern.
beim speichern der Rule meckert er nicht... nur beim Ausführen....

Code: Alles auswählen

2020-02-26 23:59:04.076 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Save Data': An error occurred during the script execution: index=1, size=1
hier die Rule
RAIN_OLD ist das Item indem der Alte Wert gespeichert wird
RAIN_CHART ist das Item mit dem Einzelwert fuer das Chart
WS_COUNT_RAIN ist der Regenmengenzähler

Code: Alles auswählen

rule "Save Data"
when
    Time cron "0 59 23 ? * * *"
then
//  Regenmenge erfassen
 if (RAIN_OLD.state < WS_COUNT_RAIN.state) {
            RAIN_CHART.postUpdate((WS_COUNT_RAIN.state as Number + 1000) - RAIN_OLD.state as Number)
  }
  else {
    RAIN_CHART.postUpdate
           RAIN_CHART.postUpdate(WS_COUNT_RAIN.state as Number - RAIN_OLD.state as Number)
  }
end
Hab ich was übersehen in der Klammersetzung beim Rechnen ?

Gruss Gerd

bastler
Beiträge: 114
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Rule zum Regenmenge messen täglich

Beitrag von bastler »

ehrlich gesagt ich verstehe die funktion nicht, aber du hast in der zeile nach dem "else" ein "RAIN_CHART.postUpdate" stehen ohne weitere anweisungen, ist das absicht?

violine21
Beiträge: 590
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Rule zum Regenmenge messen täglich

Beitrag von violine21 »

Hallo,
wenn ich das richtig verstehe, willst Du auch Regenmengen größer 1000 erfassen?
Wenn ja, würde ich die Rule so gestalten:

Code: Alles auswählen

var Number Regenmenge_Tausender
rule "Regenmenge"
when
	Item Wetterstation1RAINCOUNTER changed
then

    // Number-Item anlegen "Regenmenge_gesamt"

    if (Wetterstation1RAINCOUNTER.state as Number != 1000)
        if (Regenmenge_Tausender == 0)
        	{Regenmenge_gesamt.postUpdate(Wetterstation1RAINCOUNTER.state as Number)}
        else
        	{Regenmenge_gesamt.postUpdate((Regenmenge_Tausender * 1000) + Wetterstation1RAINCOUNTER.state as Number)}         
        return;
    if (Wetterstation1RAINCOUNTER.state as Number == 1000)
        {Regenmenge_Tausender = (Regenmenge_Tausender + 1)}
        
end
Habs jetzt nicht getestet, da mein Wetterstation1RAINCOUNTER noch im Bereich unter 1000 ist.

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

Re: Rule zum Regenmenge messen täglich

Beitrag von udo1toni »

Die Rule ist fehlerhaft, schon wegen des doppelten postUpdate.
Vermutlich willst Du es eher so:

Code: Alles auswählen

rule "Save Rain Data"
when
    Time cron "59 59 23 ? * *"                                                      // täglich 23:59:59
then
    if(!(RAIN_OLD.state instanceof Number)) {                                       // Falls RAIN_OLD keine gültige Zahl enthält
        RAIN_OLD.postUpdate(0)                                                      // Item initialisieren
        logWarn("rain","RAIN_OLD mit 0 initialisiert!")                             // Meldung ausgeben
        Thread::sleep(300)                                                          // openHAB Bedenkzeit geben
    }
    if(!(WS_COUNT_RAIN.state instanceof Number)) {                                  // Falls WS_COUNT_RAIN keine gültige Zahl enthält
        logWarn("rain","WS_COUNT_RAIN ungültig! Abbruch!")                          // Meldung ausgeben
        return;                                                                     // und Rule abbrechen
    }
    var Number nRain = (WS_COUNT_RAIN.state as Number) - (RAIN_OLD.state as Number) // Differenz bestimmen
    if(nRain < 0)                                                                   // falls kleiner 0
        nRain = nRain + 1000                                                        // 1000 addieren
    RAIN_CHART.postUpdate(nRain)                                                    // RAIN_CHART aktualisieren
    RAIN_OLD.postUpdate(WS_COUNT_RAIN.state as Number)                              // zuletzt RAIN_OLD aktualisieren
end
Die beiden Prüfungen zu Beginn sind essenziell, da es zu einer Nullpointer Exception komt, falls einer der beiden Status keine gültige Zahl enthält.
Die vorgenommene Berechnung entspricht weitgehend Deiner Idee, ist aber wesentlich schlanker ;)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

goerdi
Beiträge: 110
Registriert: 21. Dez 2019 23:44
Answers: 0

Re: Rule zum Regenmenge messen täglich

Beitrag von goerdi »

hi !
Zur Ergänzung

Code: Alles auswählen

        logWarn("rain","WS_COUNT_RAIN ungültig! Abbruch!")     
das fehlte ne Klammer
:D

Gruss Gerd

floeg
Beiträge: 19
Registriert: 26. Feb 2020 17:44
Answers: 0

Re: Rule zum Regenmenge messen täglich

Beitrag von floeg »

Hallo,
ich habe eine HmIP-SWO-PL Wetterstation und möchte gerne in einem Frame meiner Seitemap die Regenmenge angezeigt haben
- für den laufenden Tag
- für gestern
- für die laufende Woche

Aktuell wird mir nur die Gesamtregenmenge angezeigt.

Anbei Screenshots aus meiner Sitemap und aus der Homematic Web UI.

Wie mache ich das am einfachsten?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Rule zum Regenmenge messen täglich

Beitrag von udo1toni »

Du brauchst für jeden der Werte ein eigenes Item. Du kannst in der Sitemap für jedes ITem ein eigenes Text Widget verwenden, oder alternativ ein viertes Item anlegen (vom Typ String) und bei Änderung mindestens eines der drei anderen Items den Status des String Items durch eine Rule setzen lassen, so dass der Status alle drei Werte enthält. z.B. so:
Anmerkung 2020-03-26 213125.png
In diesem Fall geht es natürlich darum, die Leistung der PV-Anlage anzuzeigen. Ist halt platzsparender als drei oder gar vier Items.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

floeg
Beiträge: 19
Registriert: 26. Feb 2020 17:44
Answers: 0

Re: Rule zum Regenmenge messen täglich

Beitrag von floeg »

Okay.
Wie erstelle ich in diesem Fall die Items und wie werden diese mit den erforderlichen Daten gespeist?

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

Re: Rule zum Regenmenge messen täglich

Beitrag von udo1toni »

Von Homematic hab ich keine Ahnung. Du musst halt die Daten einsammeln. Wenn die Messwerte direkt zur Verfügung stehen, musst Du sie nur über Items auslesen. Die Wochensumme wird so vermutlich nicht zur Verfügung stehen, es sei denn, der Reset des Zählers wird automatisch Montags um 0 Uhr durchgeführt (was kein Problem ist, wenn man den Reset per Item verfügbar macht).
Ansonsten musst Du das Tagesmaximum Nachts um 23:59:59 Uhr persistieren und dann per Rule den Wert berechnen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.2.2, LXC), mit openHABian eingerichtet

floeg
Beiträge: 19
Registriert: 26. Feb 2020 17:44
Answers: 0

Re: Rule zum Regenmenge messen täglich

Beitrag von floeg »

Jetzt habe ich mich nochmal daran probiert....
.... klappte aber leider nicht:

Ich beschränke mich jetzt erstmal darauf den Wert pro Tag (numberisch) angezeigt zu bekommen.
Die Datenspeicherung mache ich über rrd4j.
Damit kann ich mir die anderen Werte (Woche, Jahr) dann grafisch anzeigen lassen, was für mich vollkommen ausreichend ist.

Folgende Eingaben habe ich gemacht:

items:
Number Wetter_Regenmenge_1 "Regen heute [%.1f mm]" (gTest) //Dummy Item
Number:Length Wetter_Regenmenge
"Regenmenge gesamt"
<rain>
(DR_Garten, gTest)
{channel="homematic:HmIP-SWO-PL:XXX:1#RAIN_COUNTER"}


Regel:

rule "Regen pro Tag"

when
Item Wetter_Regenmenge received update
then
Wetter_Regenmenge_1.
postUpdate(Wetter_Regenmenge.deltaSince(now.withTimeAtStartOfDay))
end


rrdj.persist:

Strategies {
everyMinute : "0 * * * * ?"
default = everyChange
}
Items {
//* : strategy = everyChange
Wetter_Regenmenge_1 : strategy = everyUpdate, everyMinute, restoreOnStartup
}


Das Ergebnis (siehe Anlage):
Der Wert Wetter_Regenmenge zeigt 210,3 an
Der Wert Wetter_Regenmenge_1 zeigt 615753,3 mm an -> da kann also etwas nicht stimmen,

In der Log Datei bekomme ich zusätzlich:
2020-04-30 19:55:40.524 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Regen pro Tag': The argument 'state' must not be null. angezeigt.


Wo liegt mein Fehler?


Zusatzfrage:
Das gleiche Problem habe ich bei der Sonnenscheindauer auch.
Dazu kommt:
Die Ausgabe der Sonnenscheindauer erfolgt in Minuten. Wie kann ich das richtig in Stunden und Minuten über eine Regel umrechnen lassen?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Antworten