Poolsteuerung Umwälzzeit

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

EmptySoft
Beiträge: 247
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Poolsteuerung Umwälzzeit

Beitrag von EmptySoft »

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
von udo1toni » 6. Mai 2020 14:57
EmptySoft hat geschrieben: 4. Mai 2020 21:30 Zusatzfrage, ich würde die Sekunden benötigen, die heute vergangen sind (so wie now, aber ohne das Datum)
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?
Gehe zur vollständigen Antwort
BYe
Harald

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

Re: Poolsteuerung Umwälzzeit

Beitrag von udo1toni »

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:

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
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.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

EmptySoft
Beiträge: 247
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Poolsteuerung Umwälzzeit

Beitrag von EmptySoft »

Hi udo1toni.!

Super, vielen Dank für Deine sehr gute und ausführliche Antwort.

BYe
Harald
BYe
Harald

EmptySoft
Beiträge: 247
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Poolsteuerung Umwälzzeit

Beitrag von EmptySoft »

Einen kleinen Fehler habe ich noch (Rule vereinfacht und mit cron gestartet, damit ich zum testen nicht dauern die Pumpe einschalten muss)

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
Logile

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
1. Durchlauf: alles OK, lStart wird auf now gesetzt
2. Durchlauf, lStart hat einen Zeitstempel, aber wo kommt der null Error her?
BYe
Harald

EmptySoft
Beiträge: 247
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Poolsteuerung Umwälzzeit

Beitrag von EmptySoft »

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

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

Re: Poolsteuerung Umwälzzeit

Beitrag von udo1toni »

jepp, stimmt.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

EmptySoft
Beiträge: 247
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Poolsteuerung Umwälzzeit

Beitrag von EmptySoft »

Zusatzfrage, ich würde die Sekunden benötigen, die heute vergangen sind (so wie now, aber ohne das Datum)
BYe
Harald

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

Re: Poolsteuerung Umwälzzeit

Beitrag von udo1toni »

EmptySoft hat geschrieben: 4. Mai 2020 21:30 Zusatzfrage, ich würde die Sekunden benötigen, die heute vergangen sind (so wie now, aber ohne das Datum)
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

EmptySoft
Beiträge: 247
Registriert: 7. Jan 2020 14:45
Answers: 2
Kontaktdaten:

Re: Poolsteuerung Umwälzzeit

Beitrag von EmptySoft »

Danke, genau das habe ich gesucht.
BYe
Harald

Raini
Beiträge: 1
Registriert: 11. Jul 2021 15:40
Answers: 0

Re: Poolsteuerung Umwälzzeit

Beitrag von Raini »

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:
Ü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.
Könntest du mir hier noch ein paar Hinweise geben, wie das konkret aussehen würde in der Rule (OH 2.5)?

Danke
Raini

Antworten