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
Zeitmessung wie lange ein Item "ON" ist [OH 3]
-
- Beiträge: 9
- Registriert: 30. Sep 2022 11:09
- udo1toni
- Beiträge: 13982
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Zeitmessung wie lange ein Item "ON" ist [OH 3]
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):
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:
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
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
-
- Beiträge: 9
- Registriert: 30. Sep 2022 11:09
Re: Zeitmessung wie lange ein Item "ON" ist [OH 3]
Hallo,
vielen herzlichen Dank für den tollen Input! Leider bekomme ich eine Fehlermeldung:
Woran kann das liegen?
Grüße
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';
Grüße
- udo1toni
- Beiträge: 13982
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Zeitmessung wie lange ein Item "ON" ist [OH 3]
Probiere bitte mal ZonedDateTime.now.ofEpochSeconds.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 9
- Registriert: 30. Sep 2022 11:09
Re: Zeitmessung wie lange ein Item "ON" ist [OH 3]
Auch mit ZonedDateTime.now.ofEpochSeconds habe ich eine Fehlermeldung bekommen:
Ich habe jetzt now.toEpochSecond, also
verwendet, das scheint zu funktionieren.
Ich teste weiter, Danke!
Code: Alles auswählen
Script execution of rule with UID 'test-2' failed: 'ofEpochSeconds' is not a member of 'java.time.ZonedDateTime'
Code: Alles auswählen
lStart = now.toEpochSecond
Ich teste weiter, Danke!
- udo1toni
- Beiträge: 13982
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Zeitmessung wie lange ein Item "ON" ist [OH 3]
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