Zitat von Jan0815
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.