Zeitmessung wie lange ein Item "ON" ist [OH 3]

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Knightshift
Beiträge: 9
Registriert: 30. Sep 2022 11:09
Answers: 0

Zeitmessung wie lange ein Item "ON" ist [OH 3]

Beitrag von Knightshift »

Hallo,

ich möchte messen wie lange ein Item über den Tag verteilt den Zustand ON hat und, falls eine gewisse Dauer in Minuten nicht erreicht wurde, dieses ab einer bestimmten Uhrzeit für die verbleibende Restdauer einschalten.

Anwendungszweck: Poolpumpe, die überwiegend mit Solarüberschuss betrieben werden soll.

Die Poolpumpe (soll 8 h am Tag laufen) wird bereits automatisch eingeschaltet, wenn meine PV-Anlage Überschuss produziert und wieder abgeschaltet, falls der Überschuss nicht reicht. Sollte die Dauer der PV-Überschussproduktion nicht ausreichen (schlechtes Wetter), um die vollen 8 Stunden (480 Minuten) tägl. Betriebszeit zu erreichen, soll sie z.B. ab 16 Uhr für die noch fehlende Zeit laufen.

Da ich mit den "Zeiten" in OH 3 Leider etwas auf Kriegsfuß stehe, fehlt mir hier schon der Ansatz... kann mir jemand einen Denkanstoß geben?

Grüße

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

Re: Zeitmessung wie lange ein Item "ON" ist [OH 3]

Beitrag von udo1toni »

Dein Problem beginnt bereits weiter vorne (bevor es überhaupt um richtige Zeit geht - wobei die hier ohnehin keine große Rolle spielt).
Es gibt in openHAB keine einfache Möglichkeit, zu erfragen, wie lange ein Gerät innerhalb einer Zeitspanne eingeschaltet war.
Workaround (ich geh hier davon aus, dass der Verbraucher um Mitternacht immer ausgeschaltet ist, der Zeitpunkt für den "Nullpunkt" kann aber natürlich auch anders gewählt werden):

Code: Alles auswählen

var Long       lStart = 0                                    // Merker für Startzeit
var Integer  iSeconds = 0                                   // Zähler für Laufzeit
var Timer      tPumpe = null                                // Zeiger für Timer

rule "reset counter"
when
    Time cron "5 0 0 * * ?"                                 // täglich um 00:00:05 Uhr
then
    iSeconds = 0                                            // Rücksetzen des Tageszählers
end

rule "detect switching"
when
    Item Poolpumpe changed
then
    if(newState == ON) {                                    // Pumpe wurde eingeschaltet
        lStart = now.ofEpochSeconds                         // also Zeitpuunkt merken
    } else {                                                // Pumpe wurde ausgeschaltet
        iSeconds += (now.ofEpochSeconds - lStart).intValue  // also gemerkten Zeitpunkt von aktuellem Zeitpunkt abziehen und aufaddieren
    }
end

rule "start pump for remaining time"
when
    Time cron "3 0 16 * * ?"                                // täglich um 16:00:03 Uhr
then
    if(Poolpumpe.state == ON) {                             // falls Pumpe gerade läuft
        iSeconds += (now.ofEpochSeconds - lStart).intValue  // berechne aktuell bereits verstrichene Laufzeit
    }
    val Integer iRemain = 28800 - iSeconds                  // Abweichung vom Soll
    if(iSeconds < 60)                                       // Falls Soll bereits nahezu erfüllt
        return;                                             // tu nichts
    
    if(Poolpumpe.state != ON)                               // Falls Pumpe aus
        Poolpumpe.sendCommand(ON)                           // schalte Pumpe ein
    tPumpe = createTimer(now.plusSeconds(iSeconds),[|       // starte Ausschalttimer
        Poolpumpe.sendCommand(OFF)
        tPumpe = null
    ])
end
Ungetest.
Die erste Rule setzt kurz nach Mitternacht den Tageszähler auf 0.
Die zweite Rule merkt sich immer, wenn die Pumpe eingeschaltet wurde den Startzeitpunkt, wenn die Pumpe abgeschaltet wurde nutzt sie diese Information, um die Laufzeit der letzten ON-Phase in Sekunden zu errechnen und das Ergebnis im Zähler zu summieren.
Die dritte Rule prüft kurz nach 16 Uhr, zunächst, ob die Pumpe gerade läuft. Ist das der fall, so addiert sie die verstrrichene Zeit seit dem letzten Einschalten ein letztes Mal auf, bevor sie bestimmt, wie lange die Pumpe noch laufen muss.
Unterschreitet diese Zeit 60 Sekunden, so bricht die Rule hier ab (die Pumpe soll nicht weniger als eine Minute laufen).
Der nachfolgende Code wird also nur ausgeführt, wenn die verbleibende Rest-Soll-Laufzeit über 60 Sekunden liegt.
Zunächst wird die Pumpe eingeschaltet, falls sie noch nicht läuft.
Anschließend wird ein Timer gestartet, der die Pumpe nach Ablauf der Restlaufzeit abschaltet.

Es ist essenziell, dass andere Rules, die die Pumpe ebenfalls schalten, nach 16 Uhr nicht mehr aktiv eingreifen, falls der Timer gerade läuft. Das kann vor einem Ausschaltbefehl so geprüft werden:

Code: Alles auswählen

if(now.getHour > 15 && tPumpe !== null) // falls nach 16:00:00 (!) Uhr und Zeiger auf Timer initialisiert
    return; // brich die Rule ab.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Knightshift
Beiträge: 9
Registriert: 30. Sep 2022 11:09
Answers: 0

Re: Zeitmessung wie lange ein Item "ON" ist [OH 3]

Beitrag von Knightshift »

Hallo,

vielen herzlichen Dank für den tollen Input! Leider bekomme ich eine Fehlermeldung:

Code: Alles auswählen

[ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'test-2' failed: 'ofEpochSeconds' is not a member of 'java.time.ZonedDateTime'; 
Woran kann das liegen?

Grüße

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

Re: Zeitmessung wie lange ein Item "ON" ist [OH 3]

Beitrag von udo1toni »

Probiere bitte mal ZonedDateTime.now.ofEpochSeconds.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Knightshift
Beiträge: 9
Registriert: 30. Sep 2022 11:09
Answers: 0

Re: Zeitmessung wie lange ein Item "ON" ist [OH 3]

Beitrag von Knightshift »

Auch mit ZonedDateTime.now.ofEpochSeconds habe ich eine Fehlermeldung bekommen:

Code: Alles auswählen

Script execution of rule with UID 'test-2' failed: 'ofEpochSeconds' is not a member of 'java.time.ZonedDateTime'
Ich habe jetzt now.toEpochSecond, also

Code: Alles auswählen

lStart = now.toEpochSecond
verwendet, das scheint zu funktionieren.

Ich teste weiter, Danke!

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

Re: Zeitmessung wie lange ein Item "ON" ist [OH 3]

Beitrag von udo1toni »

Genau... getEpochSeconds müsste auch funktionieren... Ich nutze das halt momentan noch nicht aktiv, da kommt man schon mal durcheinander...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten