Jedes mal, wenn ich wieder ein neues LED-Leuchtmittel kaufe kommt es mir so vor, als ob die die gerade kaputt gegangenen sind wieder nur einen Bruchteil der auf der Packung versprochenen Lebensdauer erreicht haben. Gerade habe ich wieder zwei Stück bei einer Drogeriekette gekauft. E27/1000lm, Preis pro Stück € 4,99. Auf der Verpackung werden diese Leuchtmittel mit mindestens 50.000 Schaltungen und 15.000 Betriebsstunden beworben. Andere Hersteller bzw. Einzelhändler bewerben ihre Leuchtmittel ähnlich. Von den beiden Leuchtmitteln die ich vor nicht mal einem Jahr bei einem großen Möbelhaus gekauft habe ist gerade auch wieder eine kaputt gegangen. Das ist nicht nur für den Verbraucher teuer sondern schadet auch der Umwelt. Aber vielleicht habe ich ja nur wieder schlechten Strom. ;-)

Mich interessierte nun wie viele Schaltungen und Betriebsstunden erreichen die LED-Leuchtmittel bei mir. Dafür habe ich für FHEM ein kurzes Script geschrieben, dass mir diese Werte in den einzelnen "Licht" Geräten zur Verfügung stellt. Und das voll automatisch und sofort wenn ich ein neues Licht Gerät einrichte.

Modellrechnungen wie lange solch ein LED-Leuchtmittel im heimischen Wohnzimmer wohl leuchtet gibt es zuhauf im Internet. Die meisten Beispiele gehen davon aus, dass das neue LED-Leuchtmittel  so um die 10 Jahre bis 15 Jahre halten wird. Aber sind wir doch mal ehrlich. Seit der Einführung der LED-Leuchtmittel kommt es mir so vor, als dass ich jeden Monat mindestens eine im Haus austauschen muss. Dazu kommt noch, dass man in den unterschiedlichen Zimmern meist zwei Leuchten mit den gleichen Leuchtmitteln bestückt hat. Geht eins kaputt muss man meistens zwei neue kaufen weil die Lichtfarbe nicht mit der verbliebenen übereinstimmt. Um nun mein Empfinden zu entkräften habe ich mir das unten stehendes Script geschrieben.

Das Script habe ich in ein Notify gepackt welches immer dann aktiv wird wenn ein Gerät mit dem Namen Licht* geschaltet wird. Es spielt keine Rolle von welchem Type das Gerät ist. Entscheidend ist nur das der Name des Gerätes mit "Licht" anfängt. Das Script sieht nach, ob die entsprechenden Readings vorhanden sind und legt diese ggf. neu an. Danach werden die Readings mit den entsprechenden Werten gefüllt bzw die Werte aktualisiert.

Da jedes Licht-Device bei mir andere Events oder sogar mehrfache Events erzeugt war es nicht so einfach möglich das Script einfach aufzurufen und die Werte zu aktualisieren. Seltsamerweise half auch ein event-min-interval hier nicht. Um die mehrfache Auslösung des Scriptes durch die auflaufenden Events der Geräte zu vermeiden habe ich das Reading "timestamp" eingeführt. Dieses Reading dient auch dazu die verstrichene Zeit seit der letzten Statusänderung zu messen. Daraus ergeben sich dann die "Betriebssekunden" die im Reading "operatingTime" gespeichert werden. Das Reading "cycle" zählt die Einschaltvorgänge des LED-Leuchtmittels. Die Ausschaltvorgänge werden nicht gezählt. Und als letztes noch das Reading "lastChange". Es enthält das Datum des letzten Leuchtmittel wechsel. Zum Zurücksetzen der Werte, zum Bespiel bei einem Leuchtmittel wechsel, reicht es aus das Reading "cycle" auf Null zu setzen.

Wie schon gesagt reagiert das Notify auf alle Geräte die mit Licht beginnen und die ein Event erzeugen mit dem Inhalt on, set_on, off, set_off oder toggle. Es werden automatisch alle erforderlichen Readings angelegt und sofort gefüllt. Ein weitere Konfiguration entfällt. 

Bevor ihr das Script bei euch ausprobiert, solltet ihr auf jeden Fall eine Sicherung eurer Installation machen oder ihr testet es besser noch auf einer Testumgebung. Das Script kann ganz einfach via Copy & Paste und "Raw definiton" in die bestehende Konfiguration eingefügt werden.

defmod NF_Schaltungen notify Licht.*:(on|set_on|off|set_off|toggle) {\
my $timestamp = time_str2num(ReadingsTimestamp($NAME,"state",0));;\
my $timestamp_old = ReadingsVal($NAME,"timestamp",0);;\
my $lastchange = time_str2num(ReadingsVal($NAME,"lastChange",""));;\
\
# Legt die Readings an falls es noch nicht vorhanden ist\
if(AttrVal($NAME,"userReadings","") !~ /timestamp/ ) {\
my $userReadings = AttrVal($NAME,"userReadings","");;\
if(length($userReadings) > 0) {\
fhem("attr ".$NAME." userReadings ".AttrVal($NAME,"userReadings","").",timestamp");;\
} else {\
fhem("attr ".$NAME." userReadings timestamp");;\
}\
}\
\
if(AttrVal($NAME,"userReadings","") !~ /operatingTime/) {\
my $userReadings = AttrVal($NAME,"userReadings","");;\
if(length($userReadings) > 0) {\
fhem("attr $NAME userReadings ".AttrVal($NAME,"userReadings","").",operatingTime");;\
} else {\
fhem("attr $NAME userReadings operatingTime");;\
}\
}\
\
if(AttrVal($NAME,"userReadings","") !~ /lastChange/) {\
my $userReadings = AttrVal($NAME,"userReadings","");;\
if(length($userReadings) > 0) {\
fhem("attr ".$NAME." userReadings ".AttrVal($NAME,"userReadings","").",lastChange");;\
} else {\
fhem("attr ".$NAME." userReadings lastChange");;\
}\
}\
\
if(AttrVal($NAME,"userReadings","") !~ /cycle/) {\
my $userReadings = AttrVal($NAME,"userReadings","");;\
if(length($userReadings) > 0) {\
fhem("attr ".$NAME." userReadings ".AttrVal($NAME,"userReadings","").",cycle");;\
} else {\
fhem("attr ".$NAME." userReadings lcycle");;\
}\
}\
\
if(($EVENT =~ /on/ or ($EVENT =~ /toggle/ and ReadingsVal($NAME,"state",0) eq "on") ) and $timestamp >= ($timestamp_old+2) ) {\
my $cycle = ReadingsVal($NAME,"cycle",0);;\
fhem("setreading ".$NAME." timestamp ".$timestamp);;\
if($cycle == 0) {\
fhem("setreading ".$NAME." cycle 1");;\
fhem("setreading ".$NAME." lastChange ". time());;\
} else {\
fhem("setreading ".$NAME." cycle ".($cycle+1));;\
}\
\
Log(4, "NF_Schaltungen: ". $NAME ."|".$EVENT."|".$TYPE);;\
} elsif(($EVENT =~ /off/ or ($EVENT =~ /toggle/ and ReadingsVal($NAME,"state",0) eq "off")) and $timestamp >= ($timestamp_old+2) ) {\
my $operatingTime = int(ReadingsVal($NAME,"operatingTime",0));;\
\
fhem("setreading ".$NAME." timestamp ".$timestamp);;\
my $diff = int($operatingTime + ($timestamp - $timestamp_old - 1));;\
if($diff > 0) {\
fhem("setreading ".$NAME." operatingTime " . $diff);;\
}\
Log(4, "NF_Schaltungen: ". $NAME ."|".$EVENT."|".$TYPE."|".($timestamp - $timestamp_old - 1));;\
} \
}

Jetzt noch alles in ein readingsGroup gepackt uns schon hat man den Überblick über alle Betriebsstunden seiner Beleuchtung.

defmod Licht_Monitor readingsGroup <Device>,<Schaltungen>,<Einschaltzeit>,<letzter Wechsel>\
NAME=Licht.*:cycle,operatingTime,lastChange
attr Licht_Monitor valueFormat {\
if ($READING eq "Uptime")\
{\
my $m = $VALUE;;\
return sprintf "0 000 00:%02d", $m if $m < 60;;\
my $h = $m / 60;;;; $m %= 60;;\
return sprintf "0 000 %02d:%02d", $h, $m if $h < 24;;\
my $d = $h / 24;;;; $h %= 24;;\
return sprintf "0 %03d %02d:%02d", $d, $h, $m if $d <365;;\
my $y = $d / 365;;;; $d %= 365;;\
return sprintf "%d %03d %02d:%02d", $y, $d, $h, $m;;\
}\
elsif ($READING eq "operatingTime")\
{\
if(abs($VALUE)<3600) {\
return 0;; \
} else {\
return int(abs($VALUE)/3600);;\
}\
}\
elsif ($READING eq "lastChange")\
{\
return POSIX::strftime("%d.%m.%Y", gmtime($VALUE));;\
}\
else\
{\
return ""\
}\
}

Mal sehen was für eine „Ausdauer“ die LED-Leuchtmittel so haben. Ich bin mal gespannt und werde in jeden Fall berichten.

Fröhliches zählen - lassen.

Kommentare powered by CComment