Betriebsstundenzähler
-
- Beiträge: 49
- Registriert: 8. Jan 2016 10:47
Re: Betriebsstundenzähler
In meiner mysql Datenbank habe ich folgende Einträge
Time | Value
2016-01-23 20:30:38 | 0
2016-01-23 20:33:48 | 0
usw.
Den Fehler erhalte ich immer dann wenn ich die Seite öfnen möchte auf dem das Item ist kommentiere ich das Item aus erhalte ich beim öffnen der Seite keine Fehlermeldung und die Seite öffnet sich.
Gruß
Torsten
Time | Value
2016-01-23 20:30:38 | 0
2016-01-23 20:33:48 | 0
usw.
Den Fehler erhalte ich immer dann wenn ich die Seite öfnen möchte auf dem das Item ist kommentiere ich das Item aus erhalte ich beim öffnen der Seite keine Fehlermeldung und die Seite öffnet sich.
Gruß
Torsten
- seppy
- Beiträge: 738
- Registriert: 24. Sep 2015 20:25
- Wohnort: Bonn
Re: Betriebsstundenzähler
Wie sieht denn Deine Itemdefinition aus?
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren
- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung
- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung
- seppy
- Beiträge: 738
- Registriert: 24. Sep 2015 20:25
- Wohnort: Bonn
Re: Betriebsstundenzähler
Hallo Zusammen,
hier noch eine überarbeitete Variante:
Hier auf erfolgt die Speicherung auf Millisekundenbasis, da sonst beim Umrechnen auf Std. bzw. Minuten zu viel verloren geht!
Grüße,
Seppy
hier noch eine überarbeitete Variante:
Code: Alles auswählen
var long last_change = now.millis
rule "Betriebsdauerzähler"
when
Item DevSchalter changed
then
var Number sum = 0
var Number ontime = 0
if (previousState == OFF){
last_change = now.millis
logInfo("Homebox.DEV", "Schalter ON: " + last_change)
logInfo("Homebox.DEV", "Aktueller Zählerstand: " + Betriebsdauer.state)
} else if (previousState == ON) {
if (Betriebsdauer.state == Uninitialized){
logInfo("Homebox.DEV", "Betriebsdauer nicht initialisiert")
Betriebsdauer.postUpdate(0)
}
ontime = (now.millis - last_change)
sum = ((Betriebsdauer.state as DecimalType).longValue) + ontime
logInfo("Homebox.DEV", "Gerät angeschaltet: " + last_change)
logInfo("Homebox.DEV", "Gerät abgeschaltet: " + now.millis)
Betriebsdauer.postUpdate(sum)
Betriebsdauer.persist
logInfo("Homebox.DEV", "Laufzeit Gerät Abschaltzeitpunkt in Millisekunden - Anschaltzeitpunkt in Millisekunden = Laufzeit: " + ontime.toString )
logInfo("Homebox.DEV", "Betriebszeit (Std.) gesamt: " + (sum/60000))
}
end
Grüße,
Seppy
Homematic und HomematicIP über Raspberrymatic (RaspPi 4 4GB) mit 2x HMLAN. Steuerung und Visualisierung durch OpenHAB2 auf RaspPi in Hutschienengehäuse im Sicherungskasten. Rund 100 Aktoren/Sensoren
- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung
- Abgesichert durch APC USV
- Bewässerungssteuerung mit Hunter Magnetventilen (HM-LC-Sw4-DR)
- Beleuchtungssteuerung Innen und Aussen (HM-LC-Sw4-DR + HM-LC-SW1-FM + HMW-IO-12-SW7-DR)
- Rolladensteuerung mit Beschattungsautomatik über Temperaturdifferenzsensor (HM-LC-Bl1PBU-FM)
- Wetter und Unwetterinformationen von wunderground
- Benachrichtigung der Bewohner via Pushover
- Multimediawand und Dreambox Steuerung (HM-LC-SW1-FM)
- Heizungssteuerung mit Komfort und Energiesparfunktionen (HM-CC-RT-DN + HM-Sec-SC-2 + HMIP-eTRV-2)
- Werkstatt Kompressorsteuerung (HMW-IO-12-SW7-DR)
- Weihnachtsbeleuchtung außen
- Präsenzerkennung über Geolocation (iCloud Binding), iBeacon und WLAN (Unifi Binding)
- Philips HUE & Tasmota Devices (Tuya) Einbindung
-
- Beiträge: 8
- Registriert: 2. Dez 2019 12:09
Re: Betriebsstundenzähler
Hallo 
das Thema ist schon alt aber ich wüsste gern wie die ITEM Definition dafür aussieht
Wäre sehr dankbar für eine Antwort
Grüße

das Thema ist schon alt aber ich wüsste gern wie die ITEM Definition dafür aussieht

Wäre sehr dankbar für eine Antwort
Grüße
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Betriebsstundenzähler
Ist ja eigentlich weiter oben mit drin 
Aber Vorsicht! Die Rules sind 4 Jahre alt, mit einer aktuellen Version von openHAB (OH2.5.4) wird der Code ohne Änderungen nicht sauber laufen.
Mein Vorschlag:
Die Betriebsdauer wird hier in Sekunden gespeichert.
Da Sekunden schnell unübersichtlich werden, wird die Ausgabe per JS formatiert. Der JS Transformation Service muss installiert sein.
Die Items:
und das notwendige JavaScript Script:
secToHMS.js:
Die Betriebsdauer Anzeige wird erst beim Abschalten aktualisiert. Sollte der Zählerstand beim Abschalten nicht initialisiert sein, so startet der Zähler bei 0. Sollte der Schalter beim Start von openHAB bereits eingeschaltet sein, so wird der Einlesezeitpunkt der rules als Einschaltzeitpunkt angenommen.
Sollte man mehrere Zähler benötigen, so müssen auch mehrere Variablen für den Startzeitpunkt definiert werden. Dann sollte man das Konzept überdenken.

Aber Vorsicht! Die Rules sind 4 Jahre alt, mit einer aktuellen Version von openHAB (OH2.5.4) wird der Code ohne Änderungen nicht sauber laufen.
Mein Vorschlag:
Code: Alles auswählen
// globale Variablen zu Beginn der Datei definieren!
var long dtStart = now.millis
rule "Betriebsdauer"
when
Item MySwitch changed // Überwachter Schalter
then
if (newState == ON){ // Schalter ein
dtStart = now.millis // Zeitpunkt retten
} else if (newState == OFF) { // Schalter aus
var Integer iSum = 0 // Variable initialisieren
if (MySwitchBZ.state instanceof Number) // Falls Zähler initialisiert
iSum = MySwitchBZ.state as Number // Zählerstand übernehmen
else // ansonsten
logWarn("oc.myswitch", "Betriebsdauer für MySwitch wird initialisiert!") // Meldung ausgeben
iSum = iSum + ((now.millis - dtStart + 500) / 1000).intValue // Einschaltdauer addieren
MySwitchBZ.postUpdate(iSum) // und speichern
}
end
Da Sekunden schnell unübersichtlich werden, wird die Ausgabe per JS formatiert. Der JS Transformation Service muss installiert sein.
Die Items:
Code: Alles auswählen
Switch MySwitch "Mein Schalter [%s]" {...}
Number MySwitchBZ "Betriebsdauer [JS(secToHMS.js):%s]" // Item persistieren (everyChange, restoreOnStartup, mapDB reicht)
secToHMS.js:
Code: Alles auswählen
(function(seconds){
var retval = "";
var hours = Math.floor(seconds / 3600)
seconds = seconds % 3600
var minutes = Math.floor(seconds / 60)
seconds = seconds % 60
retval = retval + hours + "h";
if (minutes < 10)
retval = retval + "0";
retval = retval + minutes+"m";
if (seconds < 10)
retval = retval + "0";
retval = retval + seconds+"s";
return retval;
})(input)
Sollte man mehrere Zähler benötigen, so müssen auch mehrere Variablen für den Startzeitpunkt definiert werden. Dann sollte man das Konzept überdenken.

openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
-
- Beiträge: 8
- Registriert: 2. Dez 2019 12:09
Re: Betriebsstundenzähler
Hallo Udo,
vielen Dank für die schnelle und ausführliche Antwort. Habe das so übernommen und für meine Zwecke angepasst.
Allerdings bekomme ich bei ausschalten folgenden Fehler:
meine Rule sieht so aus:
Dein mySwitchBZ habe ich durch Sandfilterpumpe_Betriebsdauer ersetzt.
Was mache ich noch verkehrt? In meiner Seitmap werden 0h00m00s angezeigt.
Grüße
Michael
vielen Dank für die schnelle und ausführliche Antwort. Habe das so übernommen und für meine Zwecke angepasst.
Allerdings bekomme ich bei ausschalten folgenden Fehler:
Code: Alles auswählen
2020-05-14 08:32:51.761 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Betriebsdauer': An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_plus(int,int) on instance: null
Code: Alles auswählen
// globale Variablen zu Beginn der Datei definieren!
var long dtStart = now.millis
rule "Betriebsdauer"
when
Item Sandfilter_Power changed // Überwachter Schalter
then
if (newState == ON){ // Schalter ein
dtStart = now.millis // Zeitpunkt retten
} else if (newState == OFF) { // Schalter aus
var Integer iSum = 0 // Variable initialisieren
if (Sandfilterpumpe_Betriebsdauer.state instanceof Number) // Falls Zähler initialisiert
iSum = Sandfilterpumpe_Betriebsdauer.state as Number // Zählerstand übernehmen
else // ansonsten
logWarn("oc.myswitch", "Betriebsdauer für MySwitch wird initialisiert!") // Meldung ausgeben
iSum = iSum + ((now.millis - dtStart + 500) / 1000).intValue // Einschaltdauer addieren
Sandfilterpumpe_Betriebsdauer.postUpdate(iSum) // und speichern
}
end
Code: Alles auswählen
Strategies {
everyMinute : "0 * * * * ?"
everyHour : "0 0 * * * ?"
everyDay : "0 0 0 * * ?"
}
Items {
Sandfilterpumpe_Betriebsdauer : strategy = everyChange, restoreOnStartup
Poolheizung_Betriebsdauer : strategy = everyChange, restoreOnStartup
Sandfilter_Power : strategy = everyChange, restoreOnStartup
Heizung_Power : strategy = everyChange, restoreOnStartup
}
Grüße
Michael
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Betriebsstundenzähler
Ach, vermutlich muss die Betriebsdauer auch explizit nach int gewandelt werden:
Code: Alles auswählen
iSum = (Sandfilterpumpe_Betriebsdauer.state as Number).intValue
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet
-
- Beiträge: 8
- Registriert: 2. Dez 2019 12:09
Re: Betriebsstundenzähler
Hi,
super!!! Funktioniert wunderbar!
VIELEN DANK!!!!
super!!! Funktioniert wunderbar!
VIELEN DANK!!!!

-
- Beiträge: 8
- Registriert: 2. Dez 2019 12:09
Re: Betriebsstundenzähler
Hallo Udo,
ich habe noch eine Frage. Wenn ich die Betriebsstunden nicht vom bloßen einschalten abhängig machen will sondern vom Verbrauche reicht es dann wennn ich:
als Bedingung nehme?
ich habe noch eine Frage. Wenn ich die Betriebsstunden nicht vom bloßen einschalten abhängig machen will sondern vom Verbrauche reicht es dann wennn ich:
Code: Alles auswählen
when
Item Sandfilter_Power changed // Verbrauch der Pumpe
then
if (newState => 10){ // Verbrauch > 10w
dtStart = now.millis // Zeitpunkt retten
} else if (newState =< 10) { // Verbrauch <10 w
- udo1toni
- Beiträge: 15265
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Betriebsstundenzähler
Wie soll denn das gehen?
Entweder, das Gerät hat im ausgeschalteten Zustand keinen Verbrauch (also 0), oder es hat einen Verbrauch, dann müsste diese Zeit aber auch als Betriebszeit mit zählen.
Eine Unterscheidung nach Verbrauch ist auch recht kritisch, da der Verbrauch durchaus um den Schwellwert herum schwanken kann.
Mindestens solltest Du also eine Hysterese vorsehen. Z.B. beginne mit dem Zählen, wenn der Verbrauch höher als 12 ist, beende den Zählvorgang, wenn der Verbrauch unter 10 sinkt.
Die Werte müssen natürlich zum angeschlossenen Gerät passen, und der Verbrauch des Geräts darf während des Betriebs nie unter die Abschaltschwelle sinken.
Z.B. bei einer Waschmaschine ist der Energiebedarf höchst variabel und hängt auch noch stark vom genutzten Programm ab, das ist also keinesfalls trivial.
Mindestens musst Du dann über einen längeren Zeitraum Daten sammeln und auswerten, um die Rule einigermaßen schussfest zu bekommen.
Entweder, das Gerät hat im ausgeschalteten Zustand keinen Verbrauch (also 0), oder es hat einen Verbrauch, dann müsste diese Zeit aber auch als Betriebszeit mit zählen.
Eine Unterscheidung nach Verbrauch ist auch recht kritisch, da der Verbrauch durchaus um den Schwellwert herum schwanken kann.
Mindestens solltest Du also eine Hysterese vorsehen. Z.B. beginne mit dem Zählen, wenn der Verbrauch höher als 12 ist, beende den Zählvorgang, wenn der Verbrauch unter 10 sinkt.
Die Werte müssen natürlich zum angeschlossenen Gerät passen, und der Verbrauch des Geräts darf während des Betriebs nie unter die Abschaltschwelle sinken.
Z.B. bei einer Waschmaschine ist der Energiebedarf höchst variabel und hängt auch noch stark vom genutzten Programm ab, das ist also keinesfalls trivial.
Mindestens musst Du dann über einen längeren Zeitraum Daten sammeln und auswerten, um die Rule einigermaßen schussfest zu bekommen.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet