Poolsteuerung Umwälzzeit
-
- Beiträge: 247
- Registriert: 7. Jan 2020 14:45
- Kontaktdaten:
Poolsteuerung Umwälzzeit
Hi.!
Wenn es das Thema schon gibt, Sorry, weiß nicht nach was ich suchen soll.
Ich möchte die Laufzeit meiner Poolpumpe ermitteln. Als Steuergerät habe ich einen Shell1pm der die Pumpe schaltet. Der Shelly ist als Thing angelegt, der Switch als Item (persistent in MySQL) und wird über eine Rule ein und ausgeschaltet. Jetzt würde ich gerne wissen, wie lange war er am aktuellen Tag eingeschaltet.
Muss ich die Ein und Ausschaltzeitpunkte auslesen und rechen, oder gibt es eine "bessere" Lösung
Wenn es das Thema schon gibt, Sorry, weiß nicht nach was ich suchen soll.
Ich möchte die Laufzeit meiner Poolpumpe ermitteln. Als Steuergerät habe ich einen Shell1pm der die Pumpe schaltet. Der Shelly ist als Thing angelegt, der Switch als Item (persistent in MySQL) und wird über eine Rule ein und ausgeschaltet. Jetzt würde ich gerne wissen, wie lange war er am aktuellen Tag eingeschaltet.
Muss ich die Ein und Ausschaltzeitpunkte auslesen und rechen, oder gibt es eine "bessere" Lösung
Die seit 0:00:00 Uhr vergangenen Sekunden könnten evtl. als now.getSecondOfDay zur Verfügung stehen. Falls das nicht geht, sollte zumindest now.getMinuteOfDay * 60 + now.getSecond gehen.
Ist es das, was Du suchst?
BYe
Harald
Harald
- udo1toni
- Beiträge: 15269
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Poolsteuerung Umwälzzeit
Soweit ich weiß, hat der Shelly keinen eingebauten Betriebsstundenzähler. In einer Rule kannst Du das aber leicht nachbilden. Ein Number Item zum Zählen. Das Item solltest Du persistieren, am besten zum Einen in mapdb (um beim Neustart den letzten Stand zu laden) und zum Anderen in einer Datenbank wie MySQL, influxDB oder zur Not rrd4j. Zur Not deshalb, weil rrd4j 1. nur maximal ein Jahr Daten vorhält und 2. mit der Zeit ungenauer wird indem es Mittelwerte auf vorherigen Messwerten generiert. Da die Betriebsstunden aber monoton wachsen, wäre das nicht so gut...
Nehmen wir an, der Zähler heißt Pool_BS (BetriebsStunden) und der Pumpenzustand steht in Pool_Power (ON/OFF, nicht die Leistung), dann wäre meine Idee für die Rule folgende:
Zum Start der Pumpe wird der Einschaltzeitpunkt erfasst, beim Ausschalten wird dieser vom aktuellen Zeitpunkt abgezogen. now liefert die Anzahl Millisekunden seit 1.1.1970, 00:00:00.000 Uhr, also ist dieser Wert in Millisekunden. Wir teilen durch 1000 und erhalten die aktuelle Einschaltzeit in Sekunden. Dieser Wert wird zum Item Pool_BS addiert. Falls das Item keine gültige Zahl beinhaltet, nimmt die Rule 0 als Ausgangswert an.
Pool_BS enthält nun also die Betriebsstunden in Sekunden. Mit einer JS Transformation kanst Du Dir den Wert in Stunden, Minuten, Sekunden oder wahlweise auch in Tagen anzeigen lassen. Sinn, den Wert in Sekunden zu speichern, ist, dass die Zahl immer ein Integer bleibt. das Number Item arbeitet mit Float, was zu Ungenauigkeiten führt, die sich im Laufe der Zeit vielleicht aufsummieren könnten.
Zur Umrechnung von Minuten in Stunden und Minuten hab ich erst vorgestern ein JavaScript gepostet, was man recht einfach für die Anforderung erweitern kann. Siehe viewtopic.php?p=18712#p18712
Es gibt natürlich Nachteile bei dieser Methode, z.B. kann man die echten Betriebsstunden nur im ausgeschalteten Zustand ablesen, da die aktuelle Einschaltphase nicht berücksichtigt wird. openHAB muss natürlich laufen.
Dafür ist der Code aber sehr einfach. Die Rule läuft nur einmalig beim Ein- bzw. Ausschalten, statt z.B. alle paar Sekunden einen fixenWert zu addieren, was viel (unnötige) Last erzeugt
Man könnte das Item Pool_Power ebenfalls persistieren und sich beim Ausschalten den Zeitstempel des letzten Einschaltens holen, dann kann man auf die globale Variable lStart verzichten. Der Zeitstempel ist aber DateTimeType, während now Joda DateTime ist, das heißt, man muss dann hin und her konvertieren, das ist kein Spaß.
Über die Persistenz kann man das Delta für beliebige Zeiträume errechnen lassen, solange das Ende des Zeitraums "jetzt" lautet, Du kannst also z.B. Laufzeit heute, Laufzeit diese Woche, Laufzeit diesen Monat, Laufzeit seit 1. April und so weiter per Rule einfach in anderen Items speichern um sie anzuzeigen.
Die Rule schaut nach dem Zustand der Pumpe. Auch wenn es verlockend ist, den Code in die Einschalt- und Ausschaltrules zu implementieren, gehört der Code in eine eigene Rule, denn so werden auch manuelle Schaltzeiten erfasst.
Nehmen wir an, der Zähler heißt Pool_BS (BetriebsStunden) und der Pumpenzustand steht in Pool_Power (ON/OFF, nicht die Leistung), dann wäre meine Idee für die Rule folgende:
Code: Alles auswählen
// globale Variablen immer zu Beginn der Datei...
var long lStart = null
rule "Betriebsstunden erfassen"
when
Item Pool_Power changed
then
if(previousState == NULL) {
// vermutlich Neustart...
return;
}
if(Pool_Power.state == ON) {
lStart = now
} else {
val long lDur = now - lStart // Millisekunden
val Number nState = if(!(Pool_BS.state instanceof Number)) 0 else (Pool_BS.state as Number) + lDur/1000
Pool_BS.postUpdate(nState.intValue)
}
end
Pool_BS enthält nun also die Betriebsstunden in Sekunden. Mit einer JS Transformation kanst Du Dir den Wert in Stunden, Minuten, Sekunden oder wahlweise auch in Tagen anzeigen lassen. Sinn, den Wert in Sekunden zu speichern, ist, dass die Zahl immer ein Integer bleibt. das Number Item arbeitet mit Float, was zu Ungenauigkeiten führt, die sich im Laufe der Zeit vielleicht aufsummieren könnten.
Zur Umrechnung von Minuten in Stunden und Minuten hab ich erst vorgestern ein JavaScript gepostet, was man recht einfach für die Anforderung erweitern kann. Siehe viewtopic.php?p=18712#p18712
Es gibt natürlich Nachteile bei dieser Methode, z.B. kann man die echten Betriebsstunden nur im ausgeschalteten Zustand ablesen, da die aktuelle Einschaltphase nicht berücksichtigt wird. openHAB muss natürlich laufen.
Dafür ist der Code aber sehr einfach. Die Rule läuft nur einmalig beim Ein- bzw. Ausschalten, statt z.B. alle paar Sekunden einen fixenWert zu addieren, was viel (unnötige) Last erzeugt
Man könnte das Item Pool_Power ebenfalls persistieren und sich beim Ausschalten den Zeitstempel des letzten Einschaltens holen, dann kann man auf die globale Variable lStart verzichten. Der Zeitstempel ist aber DateTimeType, während now Joda DateTime ist, das heißt, man muss dann hin und her konvertieren, das ist kein Spaß.
Über die Persistenz kann man das Delta für beliebige Zeiträume errechnen lassen, solange das Ende des Zeitraums "jetzt" lautet, Du kannst also z.B. Laufzeit heute, Laufzeit diese Woche, Laufzeit diesen Monat, Laufzeit seit 1. April und so weiter per Rule einfach in anderen Items speichern um sie anzuzeigen.
Die Rule schaut nach dem Zustand der Pumpe. Auch wenn es verlockend ist, den Code in die Einschalt- und Ausschaltrules zu implementieren, gehört der Code in eine eigene Rule, denn so werden auch manuelle Schaltzeiten erfasst.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
-
- Beiträge: 247
- Registriert: 7. Jan 2020 14:45
- Kontaktdaten:
Re: Poolsteuerung Umwälzzeit
Hi udo1toni.!
Super, vielen Dank für Deine sehr gute und ausführliche Antwort.
BYe
Harald
Super, vielen Dank für Deine sehr gute und ausführliche Antwort.
BYe
Harald
BYe
Harald
Harald
-
- Beiträge: 247
- Registriert: 7. Jan 2020 14:45
- Kontaktdaten:
Re: Poolsteuerung Umwälzzeit
Einen kleinen Fehler habe ich noch (Rule vereinfacht und mit cron gestartet, damit ich zum testen nicht dauern die Pumpe einschalten muss)
Logile
1. Durchlauf: alles OK, lStart wird auf now gesetzt
2. Durchlauf, lStart hat einen Zeitstempel, aber wo kommt der null Error her?
Code: Alles auswählen
var long lStart = null
rule "Betriebsstunden"
when
Time cron "*/10 * * * * ?"
then
logInfo("BS.rules","-Laufzeit, lStart: " + lStart + ", PoolPumpe.state: " + PoolPumpe.state)
if(lStart == null)
{
logInfo("BS.rules"," lStart=null -> set to now")
lStart = now
}
logInfo("BS.rules"," lStart: " + lStart)
end
Code: Alles auswählen
2020-05-03 20:23:32.661 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'Betriebsstunden.rules'
2020-05-03 20:23:40.035 [INFO ] [ipse.smarthome.model.script.BS.rules] - -Laufzeit, lStart: null, PoolPumpe.state: OFF
2020-05-03 20:23:40.036 [INFO ] [ipse.smarthome.model.script.BS.rules] - lStart=null -> set to now
2020-05-03 20:23:40.036 [INFO ] [ipse.smarthome.model.script.BS.rules] - lStart: 2020-05-03T20:23:40.036Z
2020-05-03 20:23:50.000 [INFO ] [ipse.smarthome.model.script.BS.rules] - -Laufzeit, lStart: 2020-05-03T20:23:40.036Z, PoolPumpe.state: OFF
2020-05-03 20:23:50.001 [ERROR] [ntime.internal.engine.ExecuteRuleJob] - Error during the execution of rule 'Betriebsstunden': An error occurred during the script execution: Could not invoke method: org.eclipse.smarthome.model.script.lib.NumberExtensions.operator_equals(java.lang.Number,java.lang.Number) on instance: null
2. Durchlauf, lStart hat einen Zeitstempel, aber wo kommt der null Error her?
BYe
Harald
Harald
-
- Beiträge: 247
- Registriert: 7. Jan 2020 14:45
- Kontaktdaten:
Re: Poolsteuerung Umwälzzeit
Habs gefunden, in die Rule gehört nicht lStart = now sondern lStart = now.millis
Code: Alles auswählen
var long lStart = null
rule "Betriebsstunden"
when
Time cron "*/10 * * * * ?"
then
logInfo("BS.rules","-Laufzeit, lStart: " + lStart + ", PoolPumpe.state: " + PoolPumpe.state)
if(lStart == null)
{
logInfo("BS.rules"," lStart=null -> set to now")
lStart = now.millis
}
logInfo("BS.rules"," lStart: " + lStart)
end
BYe
Harald
Harald
- udo1toni
- Beiträge: 15269
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Poolsteuerung Umwälzzeit
jepp, stimmt.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
-
- Beiträge: 247
- Registriert: 7. Jan 2020 14:45
- Kontaktdaten:
Re: Poolsteuerung Umwälzzeit
Zusatzfrage, ich würde die Sekunden benötigen, die heute vergangen sind (so wie now, aber ohne das Datum)
BYe
Harald
Harald
- udo1toni
- Beiträge: 15269
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Poolsteuerung Umwälzzeit
Die seit 0:00:00 Uhr vergangenen Sekunden könnten evtl. als now.getSecondOfDay zur Verfügung stehen. Falls das nicht geht, sollte zumindest now.getMinuteOfDay * 60 + now.getSecond gehen.
Ist es das, was Du suchst?
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
-
- Beiträge: 247
- Registriert: 7. Jan 2020 14:45
- Kontaktdaten:
-
- Beiträge: 1
- Registriert: 11. Jul 2021 15:40
Re: Poolsteuerung Umwälzzeit
Hi udo1toni!
Ich bin noch nicht ganz so fit mit openHAB...
Ich würde gerne die gesamte bisherige Einschaltzeit meiner Poolpumpe am heutigen Tag wissen.
Also wenn sie z.B. von 3-4 und von 10-12 gelaufen ist (also 3h), hätte ich gerne das Ergebnis 180Min.
Du schreibts dazu in einem deiner früheren Postings:
Danke
Raini
Ich bin noch nicht ganz so fit mit openHAB...
Ich würde gerne die gesamte bisherige Einschaltzeit meiner Poolpumpe am heutigen Tag wissen.
Also wenn sie z.B. von 3-4 und von 10-12 gelaufen ist (also 3h), hätte ich gerne das Ergebnis 180Min.
Du schreibts dazu in einem deiner früheren Postings:
Könntest du mir hier noch ein paar Hinweise geben, wie das konkret aussehen würde in der Rule (OH 2.5)?Über die Persistenz kann man das Delta für beliebige Zeiträume errechnen lassen, solange das Ende des Zeitraums "jetzt" lautet, Du kannst also z.B. Laufzeit heute, Laufzeit diese Woche, Laufzeit diesen Monat, Laufzeit seit 1. April und so weiter per Rule einfach in anderen Items speichern um sie anzuzeigen.
Danke
Raini