Einzelnen Beitrag anzeigen
  #12  
Alt 11.01.2013, 20:05
mepi0011 mepi0011 ist offline
Benutzer
 
Registriert seit: 14.09.2012
Ort: Oberderdingen
Beiträge: 140
mepi0011 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat von Jan0815 Beitrag anzeigen
Kannst du mir auch sagen, wie ich dann die Auswertung machen kann, bzw. wie ich mir das anzeigen lasse?
Was ist, wenn ich den Rechner, auf dem OpenHAB läuft einmal neu starten muss, oder er wegen eines Stromausfalls einmal aus ist, läuft dann der Zähler nicht wieder bei 0 los?
Wenn ja, gibt es eine Möglichkeit, den aktuellen Stand der Variablen irgendwie weg zu schreiben und beim Neustart von OpenHAB als Startwert auszulesen?

Gruß Jan
Hallo Jan,

den Betriebsstundenzähler habe ich nun etwas weiter entwickelt und deine Anmerkungen von oben implementiert (mit etwas Hilfe von Thomas E.-E. -- Danke!). Dabei bin ich wie folgt vorgeganen:

Folgendes Item habe ich angelegt:

Code:
Group Test                                         "Timer Test"
Switch Licht_UG_Esszimmer_Decke                 "Licht Esszimmer Decke"                (Test)
Switch Licht_UG_Esszimmer_Tisch                 "Licht Esszimmer Tisch"                (Test)

Number Betriebsstundenzaehler_Esszimmer_Decke "Betriebsstundenzähler Decke [%d]"    (Test)  // kann aus der Gruppe Test entfallen bzw. ausgeblendet werden
Number Betriebsstundenzaehler_Esszimmer_Tisch "Betriebsstundenzähler Tisch [%d]"    (Test)   // kann aus der Gruppe Test entfallen bzw. ausgeblendet werden

String Betriebsstunden_Esszimmer_Decke                    "Betriebsstungen Licht Decke [%s]"            (Test)
String Betriebsstunden_Esszimmer_Tisch                    "Betriebsstungen Licht Tisch [%s]"            (Test)
Die benötigten Regeln sehen wie folgt aus:

Code:
import org.openhab.core.library.types.*

rule "Initialisiere Betriebsstundenzaehler"
when
    System started
then
    // sollte noch kein Default-Wert gesetzt sein, holen wir das hier einmalig 
    // nach ... danach sollte der Wert aus db4o kommen!
    if (Betriebsstundenzaehler_Esszimmer_Decke.state == Uninitialized) {
        Betriebsstundenzaehler_Esszimmer_Decke.postUpdate(0)
    }
    if (Betriebsstundenzaehler_Esszimmer_Tisch.state == Uninitialized) {
        Betriebsstundenzaehler_Esszimmer_Tisch.postUpdate(0)
    }
end
      
rule Betriebsstundenzaehler
when
  Time cron "0/1 * * * * ?" // Abfrage alle Sekunde oder "* 0/1 * * * ?" für Minuten 
then
  if (Licht_UG_Esszimmer_Decke.state == ON) {
      //var int Zaehler_Esszimmer2 = (Betriebsstundenzaehler_esszimmer.state as DecimalType).intValue
      var Number Zaehler = Betriebsstundenzaehler_Esszimmer_Decke.state as DecimalType
        Zaehler = Zaehler + 1 
      Betriebsstundenzaehler_Esszimmer_Decke.postUpdate(Zaehler)
  }
  if (Licht_UG_Esszimmer_Tisch.state == ON) {
      //var int Zaehler_Esszimmer2 = (Betriebsstundenzaehler_esszimmer.state as DecimalType).intValue
      var Number Zaehler = Betriebsstundenzaehler_Esszimmer_Tisch.state as DecimalType
        Zaehler = Zaehler + 1 
      Betriebsstundenzaehler_Esszimmer_Tisch.postUpdate(Zaehler)
  } 
end

rule Aktualisiere_Betriebsstunden_Anzeige
when
    Time cron "0 * * * * ?"  // Update nach einer Minute
then
    var String h
    var Number H
    var String m
    var Number M
    var String s
    var Number S
    /*berechne Stunden */
    S = Betriebsstundenzaehler_Esszimmer_Decke.state as DecimalType
    H = (S/3600).intValue
    h = H.toString
    S = S-H*3600        
    /* berechne Minuten */
    M = (S/60).intValue
    if (M <=9) m = "0" + M.toString
    else m = M.toString
    
    /* berechne sehunden */
    S = S-M*60
    if (S <=9) s = "0" + S.toString
    else s = S.toString  
    Betriebsstunden_Esszimmer_Decke.postUpdate(h+":"+m+":"+s)

    /* Tisch */
    /*berechne Stunden */
    S = Betriebsstundenzaehler_Esszimmer_Tisch.state as DecimalType
    H = (S/3600).intValue
    h = H.toString
    S = S-H*3600       
    /* berechne Minuten */
    M = (S/60).intValue
    if (M <=9) m = "0" + M.toString
    else m = M.toString
    
    /* berechne sehunden */
    S = S-M*60
    if (S <=9) s = "0" + S.toString
    else s = S.toString  
    Betriebsstunden_Esszimmer_Tisch.postUpdate(h+":"+m+":"+s)
end
Nun noch das persistence.db4o Binding in das Verzeichnis addons kopieren und die Datei db4o.persist im Verzeichnis configurations/persistence mit folgendem Inhalt anlegen, dadurch werden die Daten dauerhaft gespeichern.

Code:
// persistence strategies have a name and a definition and are referred to in the "Items" section
Strategies {
        everyHour : "0 0 * * * ?"
        everyDay  : "0 0 0 * * ?"

        // if no strategy is specified for an item entry below, the default list will be used
        default = everyChange
}

/* 
 * Each line in this section defines for which item(s) which strategy(ies) should be applied.
 * You can list single items, use "*" for all items or "groupitem*" for all members of a group
 * item (excl. the group item itself).
 */
Items {
        // persist all items once a day and on every change and restore them from the db at startup
        Betriebsstundenzaehler_Esszimmer_Decke : strategy = everyHour, everyDay, restoreOnStartup
        Betriebsstundenzaehler_Esszimmer_Tisch : strategy = everyHour, everyDay, restoreOnStartup
        
        // additionally, persist all temperature and weather values every hour
}
Bei einem Neustart werden die Daten wieder hergestellt, mit der Einschränkung dass bei einem Stromausfall evtl. die letzte Stunde fehlen könnte.

Sollte etwas unklar sein, dann einfach melden.

Gruß
mepi

PS: Die Regel zum umwandeln der Zahl in einen String geht bestimmt auch einfacher. Anregungen hierzu sind gerne willkommen.
Bei Google nach dem markiertem Wort suchen Bei Wikipedia nach dem markiertem Wort suchen Im Forum nach dem markiertem Wort suchen
Mit Zitat antworten