Hallo zusammen,
ich habe (nachdem ich trotz eMail-Reminder kürzlich mal wieder vergessen hatte die Mülltonne rauszustellen), mich mal an einem Müll-Script versucht (Ich entschuldige mich jetzt schon für den gleich folgenden Spaghetti-Code
).
Die Idee war folgende:
Es gibt bei uns vier verschiedene Arten von Müll (Restmüll, Papier, Bio und gelber Sack (Wertstoff)). Die Termine habe ich in vier separate Dateien abgelegt (wäre wahrscheinlich auch eleganter in einer csv-Datei gegangen, aber mit den separaten Dateien war es für mich am einfachsten). Ich habe diese unter /etc/userfiles/abfall/*.csv abgelegt (aufgrund mangelnder Linux-Kenntnisse weiß ich nicht, ob das Verzeichnis optimal ist, aber kann ja nach Belieben geändert werden). In diesen vier Dateien sind die Termine für die Abholungen eingetragen (Wichtig: müssen im Format TT.MM.JJJJ sein).
Am einfachsten (für nicht-Linuxianer) lassen sich die Dateien meiner Meinung nach mit WinSCP :: Download kopieren.
Da das Script nicht überprüft, ob Termine in der Vergangenheit sind, sollten nur kommende Termine eingetragen werden.
Da ich auf der Visu nicht allzuviel Platz für vier Abholtermine verschwenden wollte, und es bei uns auch recht selten vorkommt, dass verschiedene Tonnen am selben Tag geholt werden, habe ich den Zustand der einzelnen Tonnen addiert. Somit ergibt sich ein Gesamtwert, der auch an die Visu übergeben wird (z.B. hat Restmüll 1 und Biomüll 4, wenn also beide am nächsten Tag geholt werden, wird eine 5 übergeben).
An der Visu kann der jeweils eingeblendete Abholtermin bestätigt werden. Je nachdem ob es noch weitere gibt, werden dann diese zum Bestätigen eingeblendet oder das Feld bleibt leer.
Zu guter letzt habe ich noch zur visuellen Darstellung im Haus RGB-LED´s angesteuert, die, wenn Müll am nächsten Tag geholt wird, entsprechend die Farbe ändern (in dem Script werden sie von standard hellblau auf pink geändert).
Hier mal der Code:
Ich habe es so geschrieben, dass das Lesen und Schreiben der Dateien nur einmal je Abholzyklus stattfindet um die Ausführungszeit des Scriptes möglichst kurz zu halten.
Es wird für die Berechnung des nächsten Tages noch das Paket libdate-calc-perl benötigt. Dies kann mittels apt-get install libdate-calc-perl an der Konsole installiert werden.
Die GA 1/2/150 ist der Präsenzmelder, der die LED´s ein/ausschaltet.
4/3/99 und 4/3/100 sind "unechte" GA´s die nur für die "Kommunikation" mit der Visu notwendig sind.
1/2/120, 130 und 140 sind die einzelnen RGB-Farben der LED´s.
Zu guter letzt wären noch die Einstellungen an der Visu (CometVisu). Diese habe ich in der visu_config.xml wie folgt gelöst:
Unter <Mappings> habe ich folgendes hinzugefügt:
Und dann noch die eigentliche Darstellung im Page-Bereich:
Im Anhang habe ich noch zwei Bilder der Visu.
Ich denke, dass man die Lösung in den seltensten Fällen 1:1 übernehmen kann, aber ich dachte, ich stelle es mal zur Verfügung, evtl. dient es ja auch als kleine Inspiration für ähnliche Vorhaben.
Über Verbesserungsvorschläge und Feedback würde ich mich natürlich auch freuen.
Viele Grüße
Christian
ich habe (nachdem ich trotz eMail-Reminder kürzlich mal wieder vergessen hatte die Mülltonne rauszustellen), mich mal an einem Müll-Script versucht (Ich entschuldige mich jetzt schon für den gleich folgenden Spaghetti-Code

Die Idee war folgende:
Es gibt bei uns vier verschiedene Arten von Müll (Restmüll, Papier, Bio und gelber Sack (Wertstoff)). Die Termine habe ich in vier separate Dateien abgelegt (wäre wahrscheinlich auch eleganter in einer csv-Datei gegangen, aber mit den separaten Dateien war es für mich am einfachsten). Ich habe diese unter /etc/userfiles/abfall/*.csv abgelegt (aufgrund mangelnder Linux-Kenntnisse weiß ich nicht, ob das Verzeichnis optimal ist, aber kann ja nach Belieben geändert werden). In diesen vier Dateien sind die Termine für die Abholungen eingetragen (Wichtig: müssen im Format TT.MM.JJJJ sein).
Am einfachsten (für nicht-Linuxianer) lassen sich die Dateien meiner Meinung nach mit WinSCP :: Download kopieren.
Da das Script nicht überprüft, ob Termine in der Vergangenheit sind, sollten nur kommende Termine eingetragen werden.
Da ich auf der Visu nicht allzuviel Platz für vier Abholtermine verschwenden wollte, und es bei uns auch recht selten vorkommt, dass verschiedene Tonnen am selben Tag geholt werden, habe ich den Zustand der einzelnen Tonnen addiert. Somit ergibt sich ein Gesamtwert, der auch an die Visu übergeben wird (z.B. hat Restmüll 1 und Biomüll 4, wenn also beide am nächsten Tag geholt werden, wird eine 5 übergeben).
An der Visu kann der jeweils eingeblendete Abholtermin bestätigt werden. Je nachdem ob es noch weitere gibt, werden dann diese zum Bestätigen eingeblendet oder das Feld bleibt leer.
Zu guter letzt habe ich noch zur visuellen Darstellung im Haus RGB-LED´s angesteuert, die, wenn Müll am nächsten Tag geholt wird, entsprechend die Farbe ändern (in dem Script werden sie von standard hellblau auf pink geändert).
Hier mal der Code:
Code:
$plugin_info{$plugname.'_cycle'} = 900; $plugin_subscribe{"4/3/99"}{$plugname} = 1; $plugin_subscribe{"1/2/150"}{$plugname} = 1; use Date::Calc qw(:all); ### Formatieren des Datums my ($Jahr, $Monat, $Tag) = Today(); my ($mJahr,$mMonat,$mTag) = Add_Delta_Days(Today(),1); $Tag = ($Tag < 10) ? "0".$Tag : $Tag; $Monat = ($Monat < 10) ? "0".$Monat : $Monat; $mTag = ($mTag < 10) ? "0".$mTag : $mTag; $mMonat = ($mMonat < 10) ? "0".$mMonat : $mMonat; my $heute = $Tag . "." . $Monat . "." . $Jahr; my $morgen = $mTag . "." . $mMonat . "." . $mJahr; my $muellwert = 0; my $multiplier = 1; ### Hier werden die vier Dateien ausgelesen und bei Bedarf die entsprechende Variable aktualisiert ### Die Dateien müssen genauso heißen (rest.csv, papier.csv etc.): my @muellarten = ("rest","papier","bio","wertstoff"); foreach my $muell(@muellarten){ if (($plugin_info{"next_".$muell} eq "") or ($plugin_info{"next_".$muell} eq $heute)) { $plugin_info{"confirm_".$muell} = 0; open(File,'</etc/userfiles/abfall/'.$muell.'.csv'); my @muellfile = <File>; $plugin_info{"next_".$muell} = trim(shift(@muellfile)); close(File); open(File,'>/etc/userfiles/abfall/'.$muell.'.csv'); foreach my $line(@muellfile){ print File $line; }; close(File); } if (($plugin_info{"next_".$muell} eq $morgen) and ($plugin_info{"confirm_".$muell} != 1)){ $muellwert+= $multiplier; } $multiplier*=2; } ### Hier wird die Bestätigung der Visu abgefangen und verarbeitet if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq "4/3/99") { SELECT:{ if ($muellwert >= 8){&confirm_muell("wertstoff",8); last SELECT; } if ($muellwert >= 4){&confirm_muell("bio",4); last SELECT; } if ($muellwert >= 2){&confirm_muell("papier",2); last SELECT; } if ($muellwert == 1){&confirm_muell("rest",1); last SELECT; } } #Hier wird überprüft, ob das Licht eingeschaltet ist, und falls ja werden die Farben auf "Standard" geändert if (($muellwert == 0) and (knx_read("1/2/120",1) eq "100.0")){ &set_farbe(80,100,100); } } knx_write("4/3/100",$muellwert,5.010); if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq "1/2/150" and $msg{'data'} eq "01") { if ($muellwert >0) { # and ((Now())[0] >=18)) { Hier wäre es möglich, erst ab 18.00 Uhr die Farbe zu ändern. &set_farbe(100,0,80); } else { &set_farbe(80,100,100); } } sub confirm_muell { $plugin_info{"confirm_".$_[0]} = 1; $muellwert-=$_[1]; } sub set_farbe { knx_write("1/2/120",$_[0]); knx_write("1/2/130",$_[1]); knx_write("1/2/140",$_[2]); } return $muellwert;
Es wird für die Berechnung des nächsten Tages noch das Paket libdate-calc-perl benötigt. Dies kann mittels apt-get install libdate-calc-perl an der Konsole installiert werden.
Die GA 1/2/150 ist der Präsenzmelder, der die LED´s ein/ausschaltet.
4/3/99 und 4/3/100 sind "unechte" GA´s die nur für die "Kommunikation" mit der Visu notwendig sind.
1/2/120, 130 und 140 sind die einzelnen RGB-Farben der LED´s.
Zu guter letzt wären noch die Einstellungen an der Visu (CometVisu). Diese habe ich in der visu_config.xml wie folgt gelöst:
Unter <Mappings> habe ich folgendes hinzugefügt:
Code:
<mapping name="Muell"> <entry value="0"> </entry> <entry value="1">Restmüll morgen</entry> <entry range_min="2" range_max="3">Papiermüll morgen</entry> <entry range_min="4" range_max="7">Biomüll morgen</entry> <entry range_min="8" range_max="15">Gelber Sack morgen</entry> </mapping> <mapping name="Muell_confirm"> <entry value="99">Bestätigen</entry> </mapping>
Code:
<info mapping="Muell"> <label>Müll:</label> <address transform="" readonly="false" variant="">4/3/100</address> </info> <trigger value="99" mapping="Muell_confirm" styling="RedGreen" align="left"> <label> </label> <address transform="" readonly="false" variant="">4/3/99</address> </trigger>
Ich denke, dass man die Lösung in den seltensten Fällen 1:1 übernehmen kann, aber ich dachte, ich stelle es mal zur Verfügung, evtl. dient es ja auch als kleine Inspiration für ähnliche Vorhaben.
Über Verbesserungsvorschläge und Feedback würde ich mich natürlich auch freuen.
Viele Grüße
Christian
Kommentar