Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Dauer zwischen zwei Ereignissen ermitteln

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    - √ - Dauer zwischen zwei Ereignissen ermitteln

    Hallo zusammen,

    ich habe openhab auf einem raspi laufen (Version 1.2).
    Zur Erfassung ob mein Ölbrenner der Heizung läuft oder ausgeschaltet ist habe ich ein Switch-Item definiert und logge die Ereignisse (ON/OFF) mit.

    Jetzt möchte ich die Zeiträume zwischen diesen beiden Ereignisse, also die Dauer der ON-Phase ermitteln und in einer externe mysql-Datenbank, die sich auf einem anderen Rechner im Netzwerk befindet, abspeichern.

    Würde das z.B. über eine rule gehen?

    Hat hierzu jemand einen Lösungsansatz, ein Beispiel oder einen Tipp, wo ich zu diesem Problem etwas nachlesen kann?

    Ich bin für alle Anregungen dankbar :-)

    #2
    Schau mal hier im Forum, da gibt es irgendwo einen Thread zur Ermittlung der Betriebsstunden. Ansonsten kann ich meine Lösung dazu heute Abend mal posten!

    Kommentar


      #3
      Ja, genau das Thema Betriebsstunden habe ich gesucht (Thema Stromverbrauch bzw. Laufzeit der Lampen mitschreiben).
      Ich habe es so umgesetzt und es funktioniert.
      Vielen Dank.

      Wenn ich jetz noch so einen Hinweis bekommen, wie ich das Ergebnis in eine externe Datenbank übertrage, wäre ich glücklich.

      Gruß
      rainer

      Kommentar


        #4
        Da sollten Dir die Persistence Dienste weiterhelfen!

        Kommentar


          #5
          Hier noch mal der Vollständigkeit halber einer meiner Regeln die Ereignisgesteuert arbeiten:

          Code:
          rule "Aktualisiere Betriebsstunden Licht_Gaeste_Decke_Schalten"
          when
              Item Licht_Gaeste_Decke_Schalten changed
          then
           	if (Licht_Gaeste_Decke_Schalten.state == ON) {
                  Licht_Gaeste_Decke_OnTime = java::util::Calendar::getInstance(TimeZone::getTimeZone("Europe/Berlin"))  
            	} else if (Licht_Gaeste_Decke_Schalten.state == OFF && previousState == ON) {
                  var Calendar CurTime   	= java::util::Calendar::getInstance(TimeZone::getTimeZone("Europe/Berlin")) 
                  var Number Diff    		=  (CurTime.getTimeInMillis() - Licht_Gaeste_Decke_OnTime.getTimeInMillis()) / 1000
                  var Number Prev    		= 0
          
                  if (Licht_Gaeste_Decke_Zaehler.state instanceof DecimalType) {
                  	Prev = Licht_Gaeste_Decke_Zaehler.state as DecimalType
                  }
                  var Number Zaehler = Prev + Diff
          
                  Licht_Gaeste_Decke_Zaehler.postUpdate(Zaehler)
                  
                  var Number h = (Zaehler/3600).intValue
          		var Number m = ((Zaehler-h*3600)/60).intValue
                 	var Number s = ((Zaehler-h*3600 - m*60)).intValue
          		var String TimeString = h + ":" 
          		if (m < 10) {TimeString = TimeString + "0" + m.toString + ":"} else {TimeString = TimeString + m.toString + ":"}
          		if (s < 10) {TimeString = TimeString + "0" + s.toString}       else {TimeString = TimeString + s.toString} 
                 	
          		Licht_Gaeste_Decke_Betriebsstunden.postUpdate(TimeString)
          		
                  logInfo("operating hours rules", "Updated operating counter for Licht_Gaeste_Decke_Schalten: " + Zaehler + " Prev: " + Prev)
          	}
          end
          Initialisierung:

          rule "Initialisiere Betriebsstundenzaehler"
          when
          System started
          then
          logInfo("operating hours rules", "Initialized Counters")

          gOperatingHours?.members.forEach(counter|
          if (counter.state == Uninitialized) {postUpdate(counter, 0)
          //logInfo("operating hours rules", "Initialized (Uninitialized): " + counter.toString())
          }
          )

          gOperatingHours?.members.forEach(counter|
          if ( !(counter.state instanceof DecimalType)) {postUpdate(counter, 0)
          //logInfo("operating hours rules", "Initialized (Instance): " + counter.toString())
          }
          )

          Licht_Gaeste_Decke_OnTime = java::util::Calendar::getInstance(TimeZone::getTim eZone("Europe/Berlin"))
          db4o.persist:

          gOperatingHours*: strategy = everyDay, restoreOnStartup
          gOperatingHoursFormated*: strategy = everyDay, restoreOnStartup

          Und die Items:
          Code:
          Number Licht_Gaeste_Decke_Zaehler    "Gäste Decke [%d]"    (gOperatingHours)  
          String Licht_Gaeste_Decke_Betriebsstunden    "Gäste Decke [%s]"    (gOperatingHoursFormated)
          Den String nutze ich nur zur formatierten Anzeige im GUI

          Kommentar


            #6
            Hallo,

            ich interessiere mich auch für das Thema Betriebsstunden.

            Ich frage mich, wie ich verhindern kann, dass ich pro Item Code erzeugen muss.

            In der Umsetzung gibt es die Initalisierung als Rule in der alle Elemente einer Gruppe angesprochen werden:
            --> gOperatingHours?.members.forEach

            Dann gibt es scheinbar pro Item eine Rule in der die Betriebsstunden gezählt werden:
            --> rule "Aktualisiere Betriebsstunden Licht_Gaeste_Decke_Schalten"

            Lässt sich das nicht in eine Regel für alle Items der Gruppe umschreiben?

            Mir fehlt hier der Durchblick in der Syntax ...

            Sascha,

            Kommentar

            Lädt...
            X