Seite 1 von 3

Betriebsstundenzähler

Verfasst: 18. Jan 2016 14:22
von toto1975
Hallo in die Runde,

ich hoffe der Post ist hier richtig ansonsten bitte einfach verschieben ;-)

Ich möchte gerne einen Betriebsstundenzähler in OpenHAB integrieren. Mit meiner MySQL Persistence lasse ich mir z.B. die Schalter Ereignisse mit ON und OFF in die MySQL Datenbank eintragen. Diese Datensätze sind ebenfalls mit dem jeweiligen TimeStamp versehen.
Also:
2016-01-18 06:30 | OFF
2016-01-18 07:35 | ON
2016-01-18 07:45 | OFF
2016-01-18 07:50 | ON
2016-01-18 07:55 | OFF

Ist es möglich mir anzeigen zulassen wie lange der Schalter auf ON steht bzw. die Summe der Minuten die der Schalter auf ON insgesamt steht? Als Ergebnis wäre es schön wenn man die 15 Minuten an ein Item übergeben könnte.

Als Idee habe ich mir auch überlegt eine Rule zu erstellen die jede Sekunde(!!) durchgeführt wird wenn der Schalter auf ON steht. Der Wert der Variable wird nun um plus 1 erhöht. Habe hier allerdings bedenken um die Systemleistung und wie ich die Daten speichern kann dafür habe ich auch noch keine Idee.

Man könnte damit z.B. Anzeigen wie lange Energiespar-Lampen schon leben und welche Einsparung man damit erzielt hat. Wie lange die Kinder schon vorm Fernseher sitzen und so weiter.

Wie würdet ihr dies lösen bzw. habt ihr so etwas schon umgesetzt?

Viele Grüße
Torsten

Re: Betriebsstundenzähler

Verfasst: 19. Jan 2016 20:38
von seppy
Hi,

ich hab gesehen, Du hast Dich schon etwas länger damit beschäftigt. Spontan habe ich eine Idee, die ich aber erstmal testen will.
Ich melde mich dazu wieder.

Grüße,
Seppy

Re: Betriebsstundenzähler

Verfasst: 21. Jan 2016 18:17
von toto1975
Hallo Seppy,

ja das ist richtig... ich bin schon länger auf der Suche nach einer Lösung ;-)

Freut mich zu hören das du zumindest eine Idee hast

Viele Grüße
Torsten

Re: Betriebsstundenzähler

Verfasst: 22. Jan 2016 08:47
von seppy
Hallo Zusammen,

also so würde ich das versuchen. Teste doch mal ob das funktioniert.

Items:

Code: Alles auswählen

//Schalter für das Gerät dessen Betriebszeit gemessen werden soll
Switch DevSchalter
//Die Betriebsdauer (Wichtig: Dieses Item muss persistiert werden!!)
Number Betriebsdauer
Rule:

Code: Alles auswählen

rule "Betriebsdauerzähler"
when
	Item DevSchalter changed
then
	var int tmp = 0
	var int tmp2 = 0
	if (previousState == OFF){
		logInfo("Homebox.DEV", "Schalter ON: " + DevSchalter.lastUpdate.time)
		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)
		}
		tmp = (Betriebsdauer.state as DecimalType).intValue
		tmp2 = (now.millis - DevSchalter.lastUpdate.time).intValue
		logInfo("Homebox.DEV", "Aktueller Zählerstand: " + tmp)
		logInfo("Homebox.DEV", "Gerät angeschaltet: " + DevSchalter.lastUpdate.time)
		logInfo("Homebox.DEV", "Gerät abgeschaltet: " + now.millis)		
		Betriebsdauer.postUpdate(tmp + tmp2/1000)
		Betriebsdauer.persist
		logInfo("Homebox.DEV", "Laufzeit Gerät Abschaltzeitpunkt in Millisekunden - Anschaltzeitpunkt in Sekunden = Laufzeit: " + (tmp2/1000) )
		logInfo("Homebox.DEV", "Betriebszeit gesamt: " + Betriebsdauer.state)
	}
end
Bin gespannt auf dein Feedback.

Grüße,
Seppy

Re: Betriebsstundenzähler

Verfasst: 23. Jan 2016 21:03
von toto1975
Hallo Seppy,

vielen Dank für Deine Idee, leider bekomme ich aber vier Fehlermeldungen:

Code: Alles auswählen

2016-01-23 20:37:02.142 [INFO ] [enhab.model.script.Homebox.DEV] - Betriebsdauer nicht initialisiert
2016-01-23 20:37:02.516 [WARN ] [.o.c.p.e.PersistenceExtensions] - There is no queryable persistence service registered with the name 'rrd4j'
2016-01-23 20:37:02.522 [ERROR] [o.o.c.s.ScriptExecutionThread ] - Error during the execution of rule 'Betriebsdauerzähler': cannot invoke method public long java.util.Date.getTime() on $
2016-01-23 20:37:02.852 [WARN ] [e.jetty.servlet.ServletHandler] - /openhab.app
java.lang.StringIndexOutOfBoundsException: String index out of range: -11
meine Rule:

Code: Alles auswählen

import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*

rule "Betriebsdauerzähler"
when
   Item Licht_Flur_unten changed
then
   var int tmp = 0
   var int tmp2 = 0
   if (previousState == OFF){
      logInfo("Homebox.DEV", "Schalter ON: " + Licht_Flur_unten.lastUpdate.time)
      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)
      }
      tmp = (Betriebsdauer.state as DecimalType).intValue
      tmp2 = (now.millis - Licht_Flur_unten.lastUpdate.time).intValue
      logInfo("Homebox.DEV", "Aktueller Zählerstand: " + tmp)
      logInfo("Homebox.DEV", "Gerät angeschaltet: " + Licht_Flur_unten.lastUpdate.time)
      logInfo("Homebox.DEV", "Gerät abgeschaltet: " + now.millis)      
      Betriebsdauer.postUpdate(tmp + tmp2/1000)
      Betriebsdauer.persist
      logInfo("Homebox.DEV", "Laufzeit Gerät Abschaltzeitpunkt in Millisekunden - Anschaltzeitpunkt in Sekunden = Laufzeit: " + (tmp2/1000) )
      logInfo("Homebox.DEV", "Betriebszeit gesamt: " + Betriebsdauer.state)
   }
end
Hier habe ich wohl noch einen Import nicht vorgenommen aber welcher? Im Designer bekomme ich jedoch keine Fehler angezeigt.

Betriebsdauer habe ich in meiner mysql.persist so hinterlegt

Code: Alles auswählen

Betriebsdauer : strategy =everyChange
Warum sucht er Daten in 'rrd4j'? Ich habe doch nur eine mysql.persist
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.

Ich glaube ich habe da etwas grundlegendes falsch gemacht :(

Kannst du mir da noch weiterhelfen?

Gruß
Torsten

Re: Betriebsstundenzähler

Verfasst: 24. Jan 2016 09:27
von seppy
Hi Toto1975,

ich bin mir nicht sicher, versuch mal

Code: Alles auswählen

Betriebsdauer.persist
zu enfernen, evtl. funktioniert das nur mit rrd4j als Persistence Service.
Die erste Meldung ist kein Fehler, sondern nur die korrekte Info, dass das Item Betriebsdauer noch nie initialisiert wurde.

Grüße,
Seppy

Re: Betriebsstundenzähler

Verfasst: 24. Jan 2016 12:36
von toto1975
Hallo Seppy,

ich glaube der Fehler liegt darin das ich

Code: Alles auswählen

Betriebsdauer.persist
nirgends stehen habe sondern nur

Code: Alles auswählen

Betriebsdauer : strategy =everyChange
in meiner mysql.persist

Sorry ich bin noch totaler Anfänger aber wo sollte der Eintrag Betriebsdauer.persist hin?

Gruß
Torsten

Re: Betriebsstundenzähler

Verfasst: 24. Jan 2016 18:08
von seppy
Ne in der Regel die ich gepostet habe, steht das "Betriebsdauer.persist" drin. Nimm das dort mal raus!

Re: Betriebsstundenzähler

Verfasst: 24. Jan 2016 22:03
von toto1975
Okay das habe ich raus genommen.... jetzt habe ich nur noch einen Fehler

Code: Alles auswählen

2016-01-24 21:57:56.502 [WARN ] [e.jetty.servlet.ServletHandler] - /openhab.app
java.lang.StringIndexOutOfBoundsException: String index out of range: -11
        at java.lang.String.substring(Unknown Source) ~[na:1.7.0_79]
Leider habe ich bei Google nichts passendes gefunden

Re: Betriebsstundenzähler

Verfasst: 25. Jan 2016 10:55
von seppy
Ich bin mir nicht sicher, ob die Meldung überhaupt etwas mit der Regel zu tun hat, da wir die Methode "substring" nicht nutzen.
Werden denn Werte in die Datenbank geschrieben?

Grüße,
Seppy