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.