ABFALL: Unterschied zwischen den Versionen
(Link auf einen FHEM Forum Artikel hinzugefügt) |
F Klee (Diskussion | Beiträge) |
||
(36 dazwischenliegende Versionen von 9 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{Infobox Modul | {{Infobox Modul | ||
|ModPurpose= | |ModPurpose=Filtern von (Abfall-)Terminen aus einem Calendar. | ||
|ModType= | |ModType=x | ||
|ModFTopic=48237 | |ModFTopic=48237 | ||
|ModForumArea=Codeschnipsel | |ModForumArea=Codeschnipsel | ||
Zeile 8: | Zeile 8: | ||
}} | }} | ||
[[ABFALL]] ist ein Hilfsmodul, das | [[ABFALL]] ist ein (inoffizielles, nicht Bestandteil der Distribution) Hilfsmodul, das bestimmte Termine aus einem bestehenden Kalender des Moduls [[Calendar]] in Readings übernimmt. | ||
== Voraussetzungen == | == Voraussetzungen == | ||
Es muss ein [[Calendar]]-Objekt definiert sein. Der dabei benutzte Name muss in der Definition des ABFALL-Objekts spezifiziert werden. | Es muss ein [[Calendar]]-Objekt definiert sein. Der dabei benutzte Name muss in der Definition des ABFALL-Objekts spezifiziert werden. | ||
Es können auch mehrere | Es können auch mehrere Calendar Objekte übergeben werden. | ||
Sonderzeichen aus dem Namen der Termine werden entfernt, um die Namen der generierten Readings FHEM-tauglich zu machen, für die Werte der Readings bleiben diese allerdings erhalten. | |||
== Anwendung == | == Anwendung == | ||
=== Installation === | |||
Mit folgendem Befehl kann das Modul direkt in den Standard FHEM Update Prozess eingeklinkt werden. | |||
:<code>update add https://raw.githubusercontent.com/uniqueck/fhem-abfall/master/controls_fhemabfall.txt</code> | |||
Um es nur zu installieren, kann auch einfach nur das Command | |||
:<code>update all https://raw.githubusercontent.com/uniqueck/fhem-abfall/master/controls_fhemabfall.txt</code> | |||
eingegeben werden. | |||
=== Entwicklungsstrang === | |||
:<code>update add https://raw.githubusercontent.com/uniqueck/fhem-abfall/develop/controls_fhemabfall.txt</code> | |||
bzw. | |||
:<code>update all https://raw.githubusercontent.com/uniqueck/fhem-abfall/develop/controls_fhemabfall.txt</code> | |||
=== Define === | === Define === | ||
:<code>define <Name> ABFALL <calendarname>,<calendarname2>,...</code> | :<code>define <Name> ABFALL <calendarname>,<calendarname2>,...</code> | ||
Zeile 23: | Zeile 37: | ||
Beispiel: | Beispiel: | ||
:<code>define | :<code>define AbfallGoogleCalender Calendar ical url https://......</code> | ||
:<code>define myABFALL ABFALL AbfallGoogleCalender</code> | |||
=== Werte aktualisieren === | === Werte aktualisieren === | ||
Die Werte aktualisieren sich abhängig vom notify der entsprechenden | Die Werte aktualisieren sich abhängig vom [[notify]] der entsprechenden Calendar Instanz, welche im define angegeben wurde(n). | ||
=== Weitere Attribute === | === Weitere Attribute === | ||
{| class="wikitable" | |||
!Attribut | |||
!Werteliste | |||
!Beschreibung | |||
!Default Wert | |||
|- | |||
!align="right" |calendarname_praefix | |||
|0 und 1 | |||
|soll der Kalendername als praefix dem Reading vorangestellt werden, sollte bei nur einem Kalender auf 0 gesetzt werden | |||
|1 - praefix wird vorangestellt, sofern mehrere Kalender angegeben wurden, ansonsten 0 - praefix wird nicht vorangestellt | |||
|- | |||
!align="right" |abfall_clear_reading_regex | |||
| | |||
|regex zum Entfernen von Anteilen aus dem Termin, dieser wird vor dem Entfernen von Sonderzeichen aus den Namen der Termine angewandt. | |||
| | |||
|- | |||
!align="right" |disable | |||
|0 und 1 | |||
|deaktiviert das Modul | |||
|0 | |||
|- | |||
!align="right" |weekday_mapping | |||
| | |||
|Mapping, wie die Readings der Tage angezeigt werden sollen, zum Beispiel So Mo Di Mi Do Fr Sa | |||
|Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag | |||
|- | |||
!align="right" |delimiter_text_reading | |||
| | |||
|Wenn zwei Abholungen an ein und demselben Tag existieren, wird dieses Trennzeichen genutzt, um die beiden (oder mehrere) Werte zu einem Text zu verbinden. Nur relevant für die Readings next_text und now_text | |||
|und | |||
|- | |||
!align="right" |delimiter_reading | |||
| | |||
|wie attribute delimiter_text_reading, allerdings nur für die readings next und now | |||
| | |||
|- | |||
!align="right" |filter | |||
| | |||
|regex zum Filtern der Namen der Termine aus den Kalendern, so dass nur solche genutzt werden, welche diesem Filter entsprechen | |||
| | |||
|- | |||
|} | |||
== Anwendungsbeispiel(e) == | == Anwendungsbeispiel(e) == | ||
[ | === Einbindung ins Tablet UI === | ||
<pre><div data-device="myABFALL" data-type="symbol" class="bigger warn wider" | |||
data-get="next" data-get-warn=".*(\d+).*" | |||
data-get-on='["Restmuell_.*","Wertstoff_.*"]' | |||
data-colors='["#000","#6EB54C"]' | |||
data-icons='["fa-trash-o","fa-trash-o"]'></div></pre> | |||
=== Einbindung ins Tablet UI, erweitert === | |||
Fallen die Leerungen zweier verschiedener Tonnen nicht auf den selben Tag, reicht es normalerweise, nur ein Symbol auf der Oberfläche zu platzieren und dieses dann dynamisch zu befüllen. In folgendem Beispiel werden folgende Anforderungen umgesetzt: | |||
* Anzeige unterschiedlicher Symbole bzw. Farben für Papiertonne, Restmülltonne, Biotonne und gelbe Säcke | |||
* Anzeige der verbleibenden Tage bis zur Leerung als "Warn"-Marker in Rot, aber nur, wenn die Leerung innerhalb der nächsten 2 Tage ist | |||
* Blinken des Symbols, wenn die nächste Leerung morgen ansteht | |||
* Rotation des Symbols, wenn die nächste Leerung noch am selben Tag ansteht. Nach einer bestimmten Uhrzeit (z.B. 9 Uhr morgens) soll dann auf die nächste Tonne geschaltet werden | |||
* Anzeige des Datums bzw. von "heute" oder "morgen" unter dem Symbol als Label | |||
Zur Datumsanzeige wird eine kleine Hilfsfunktion in die 99_myUtils eingebaut. | |||
<syntaxhighlight lang="perl"> | |||
sub datumHeuteMorgen($){ | |||
my $compareDate = shift; | |||
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); | |||
$year += 1900; $mon += 1; | |||
my $heute = sprintf('%02d.%02d.%04d', $mday, $mon, $year); | |||
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time+86400); | |||
$year += 1900; $mon += 1; | |||
my $morgen = sprintf('%02d.%02d.%04d', $mday, $mon, $year); | |||
return "heute" if $compareDate eq $heute; | |||
return "morgen" if $compareDate eq $morgen; | |||
return $compareDate; | |||
} | |||
</syntaxhighlight> | |||
Diese Funktion wird in den userReadings des Abfall-Moduls verwendet. Das Abfallmodul erzeugt eine Gruppe von Readings mit dem Namen now_*, wenn die Leerung am selben Tag ansteht, bzw. genau dann, wenn der Termin im zu Grunde liegenden Kalender gerade aktiv ist. In diesem Beispiel liegt dem Kalender-Modul ein Google-Kalender zu Grunde, bei dem die Termine immer von 0 Uhr bis 9 Uhr morgens eingetragen sind. Dadurch wird erreicht, dass die Anzeige nach 9 Uhr weiterspringt, weil dann die now-Readings verschwinden. | |||
Folgende userReadings werden zum Abfallmodul hinzugefügt, welches in diesem Beispiel "myABFALL" genannt ist: | |||
<syntaxhighlight lang="perl"> | |||
attr myABFALL userReadings ftui_datum {ReadingsVal("myABFALL","now_text","") eq "" ? datumHeuteMorgen(ReadingsVal("myABFALL","next_date","")) : "heute";},ftui_next {ReadingsVal("myABFALL","now_text","") eq "" ? ReadingsVal("myABFALL","next","") : ReadingsVal("myABFALL","now","")."_0";;} | |||
</syntaxhighlight> | |||
Das Reading "ftui_next" bildet die Grundlage für das Symbol in TabletUI, das Reading "ftui_datum" wird für das Label genutzt. | |||
Somit lässt sich ganze in FTUI wie folgt darstellen: | |||
<syntaxhighlight lang="html"> | |||
<div data-device="myABFALL" | |||
data-type="symbol" | |||
data-get="ftui_next" | |||
data-get-on='["Biotonne_0$","Biotonne_1$","Biotonne_.*","GelberSack_0$","GelberSack_1$","GelberSack_.*","Papiertonne_0$","Papiertonne_1$","Papiertonne_.*","Restmuelltonne_0$","Restmuelltonne_1$","Restmuelltonne_.*"]' | |||
data-get-warn=".*([0|1|2]).*" | |||
data-colors='["#8B4513","#8B4513","#8B4513","#f4e946","#f4e946","#f4e946","#2d9e1c","#2d9e1c","#2d9e1c","#696969","#696969","#696969"]' | |||
class="large warn" | |||
data-icons='["fa-trash-o fa-spin","fa-trash-o blink","fa-trash-o","fs-bag fa-spin","fs-bag blink","fs-bag","fs-dustbin fa-spin","fs-dustbin blink","fs-dustbin","fa-trash fa-spin","fa-trash blink","fa-trash"]' | |||
/> | |||
<div data-device="myABFALL" data-get="ftui_datum" data-type="label"/> | |||
</syntaxhighlight> | |||
Für Jede Tonne werden hier drei Zustände unterschieden und einzeln in "data-get-on", "data-on-colors" und "data-icons" zugeordnet. Daher haben diese Listen jeweils 12 Einträge. | |||
=== Benachrichtigung === | |||
==== DOIF ==== | |||
====== TelegramBot Beispiel ====== | |||
<pre>[myABFALL:next_days] == 1) ( set fhemBot message 'Morgen wird [myABFALL:next_text] abgeholt') | |||
[myABFALL:now_text] ne "") ( set fhemBot message 'Heute wird [myABFALL:now_text] abgeholt')</pre> | |||
====== Pushbullet Beispiel ====== | |||
Die morgigen Leerungen per Push um 19:30 mittels [[Pushbullet]]: | |||
<code>define dAbfallmorgen doif ([19:30] and [myABFALL:next_days] == 1) ( msg |Morgen wird [myABFALL:next_text] abgeholt) | |||
attr dAbfallmorgen do always</code> | |||
Die heutigen Leerungen per Push um 07:00 mittels Pushbullet: | |||
<code>define dAbfallheute doif ([07:00] and [myABFALL:now_text] ne "") ( msg |Heute wird [myABFALL:now_text] abgeholt) | |||
attr dAbfallheute do always</code> | |||
=== Links === | |||
* Forenthema {{Link2Forum|Topic=50177|LinkText=Abfall Visualisierung mit Bilderrahmen}} |
Aktuelle Version vom 23. März 2024, 16:35 Uhr
ABFALL | |
---|---|
Zweck / Funktion | |
Filtern von (Abfall-)Terminen aus einem Calendar. | |
Allgemein | |
Typ | Inoffiziell |
Details | |
Dokumentation | Thema |
Support (Forum) | Codeschnipsel |
Modulname | 57_ABFALL.pm |
Ersteller | Constantin / uniqueck |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
ABFALL ist ein (inoffizielles, nicht Bestandteil der Distribution) Hilfsmodul, das bestimmte Termine aus einem bestehenden Kalender des Moduls Calendar in Readings übernimmt.
Voraussetzungen
Es muss ein Calendar-Objekt definiert sein. Der dabei benutzte Name muss in der Definition des ABFALL-Objekts spezifiziert werden. Es können auch mehrere Calendar Objekte übergeben werden.
Sonderzeichen aus dem Namen der Termine werden entfernt, um die Namen der generierten Readings FHEM-tauglich zu machen, für die Werte der Readings bleiben diese allerdings erhalten.
Anwendung
Installation
Mit folgendem Befehl kann das Modul direkt in den Standard FHEM Update Prozess eingeklinkt werden.
Um es nur zu installieren, kann auch einfach nur das Command
eingegeben werden.
Entwicklungsstrang
bzw.
Define
define <Name> ABFALL <calendarname>,<calendarname2>,...
Erläuterung der Parameter im define:
- <calendarname>
- Name des Calendar Kalenders
Beispiel:
define AbfallGoogleCalender Calendar ical url https://......
define myABFALL ABFALL AbfallGoogleCalender
Werte aktualisieren
Die Werte aktualisieren sich abhängig vom notify der entsprechenden Calendar Instanz, welche im define angegeben wurde(n).
Weitere Attribute
Attribut | Werteliste | Beschreibung | Default Wert |
---|---|---|---|
calendarname_praefix | 0 und 1 | soll der Kalendername als praefix dem Reading vorangestellt werden, sollte bei nur einem Kalender auf 0 gesetzt werden | 1 - praefix wird vorangestellt, sofern mehrere Kalender angegeben wurden, ansonsten 0 - praefix wird nicht vorangestellt |
abfall_clear_reading_regex | regex zum Entfernen von Anteilen aus dem Termin, dieser wird vor dem Entfernen von Sonderzeichen aus den Namen der Termine angewandt. | ||
disable | 0 und 1 | deaktiviert das Modul | 0 |
weekday_mapping | Mapping, wie die Readings der Tage angezeigt werden sollen, zum Beispiel So Mo Di Mi Do Fr Sa | Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag | |
delimiter_text_reading | Wenn zwei Abholungen an ein und demselben Tag existieren, wird dieses Trennzeichen genutzt, um die beiden (oder mehrere) Werte zu einem Text zu verbinden. Nur relevant für die Readings next_text und now_text | und | |
delimiter_reading | wie attribute delimiter_text_reading, allerdings nur für die readings next und now | ||
filter | regex zum Filtern der Namen der Termine aus den Kalendern, so dass nur solche genutzt werden, welche diesem Filter entsprechen |
Anwendungsbeispiel(e)
Einbindung ins Tablet UI
<div data-device="myABFALL" data-type="symbol" class="bigger warn wider" data-get="next" data-get-warn=".*(\d+).*" data-get-on='["Restmuell_.*","Wertstoff_.*"]' data-colors='["#000","#6EB54C"]' data-icons='["fa-trash-o","fa-trash-o"]'></div>
Einbindung ins Tablet UI, erweitert
Fallen die Leerungen zweier verschiedener Tonnen nicht auf den selben Tag, reicht es normalerweise, nur ein Symbol auf der Oberfläche zu platzieren und dieses dann dynamisch zu befüllen. In folgendem Beispiel werden folgende Anforderungen umgesetzt:
- Anzeige unterschiedlicher Symbole bzw. Farben für Papiertonne, Restmülltonne, Biotonne und gelbe Säcke
- Anzeige der verbleibenden Tage bis zur Leerung als "Warn"-Marker in Rot, aber nur, wenn die Leerung innerhalb der nächsten 2 Tage ist
- Blinken des Symbols, wenn die nächste Leerung morgen ansteht
- Rotation des Symbols, wenn die nächste Leerung noch am selben Tag ansteht. Nach einer bestimmten Uhrzeit (z.B. 9 Uhr morgens) soll dann auf die nächste Tonne geschaltet werden
- Anzeige des Datums bzw. von "heute" oder "morgen" unter dem Symbol als Label
Zur Datumsanzeige wird eine kleine Hilfsfunktion in die 99_myUtils eingebaut.
sub datumHeuteMorgen($){
my $compareDate = shift;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900; $mon += 1;
my $heute = sprintf('%02d.%02d.%04d', $mday, $mon, $year);
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time+86400);
$year += 1900; $mon += 1;
my $morgen = sprintf('%02d.%02d.%04d', $mday, $mon, $year);
return "heute" if $compareDate eq $heute;
return "morgen" if $compareDate eq $morgen;
return $compareDate;
}
Diese Funktion wird in den userReadings des Abfall-Moduls verwendet. Das Abfallmodul erzeugt eine Gruppe von Readings mit dem Namen now_*, wenn die Leerung am selben Tag ansteht, bzw. genau dann, wenn der Termin im zu Grunde liegenden Kalender gerade aktiv ist. In diesem Beispiel liegt dem Kalender-Modul ein Google-Kalender zu Grunde, bei dem die Termine immer von 0 Uhr bis 9 Uhr morgens eingetragen sind. Dadurch wird erreicht, dass die Anzeige nach 9 Uhr weiterspringt, weil dann die now-Readings verschwinden.
Folgende userReadings werden zum Abfallmodul hinzugefügt, welches in diesem Beispiel "myABFALL" genannt ist:
attr myABFALL userReadings ftui_datum {ReadingsVal("myABFALL","now_text","") eq "" ? datumHeuteMorgen(ReadingsVal("myABFALL","next_date","")) : "heute";},ftui_next {ReadingsVal("myABFALL","now_text","") eq "" ? ReadingsVal("myABFALL","next","") : ReadingsVal("myABFALL","now","")."_0";;}
Das Reading "ftui_next" bildet die Grundlage für das Symbol in TabletUI, das Reading "ftui_datum" wird für das Label genutzt.
Somit lässt sich ganze in FTUI wie folgt darstellen:
<div data-device="myABFALL"
data-type="symbol"
data-get="ftui_next"
data-get-on='["Biotonne_0$","Biotonne_1$","Biotonne_.*","GelberSack_0$","GelberSack_1$","GelberSack_.*","Papiertonne_0$","Papiertonne_1$","Papiertonne_.*","Restmuelltonne_0$","Restmuelltonne_1$","Restmuelltonne_.*"]'
data-get-warn=".*([0|1|2]).*"
data-colors='["#8B4513","#8B4513","#8B4513","#f4e946","#f4e946","#f4e946","#2d9e1c","#2d9e1c","#2d9e1c","#696969","#696969","#696969"]'
class="large warn"
data-icons='["fa-trash-o fa-spin","fa-trash-o blink","fa-trash-o","fs-bag fa-spin","fs-bag blink","fs-bag","fs-dustbin fa-spin","fs-dustbin blink","fs-dustbin","fa-trash fa-spin","fa-trash blink","fa-trash"]'
/>
<div data-device="myABFALL" data-get="ftui_datum" data-type="label"/>
Für Jede Tonne werden hier drei Zustände unterschieden und einzeln in "data-get-on", "data-on-colors" und "data-icons" zugeordnet. Daher haben diese Listen jeweils 12 Einträge.
Benachrichtigung
DOIF
TelegramBot Beispiel
[myABFALL:next_days] == 1) ( set fhemBot message 'Morgen wird [myABFALL:next_text] abgeholt') [myABFALL:now_text] ne "") ( set fhemBot message 'Heute wird [myABFALL:now_text] abgeholt')
Pushbullet Beispiel
Die morgigen Leerungen per Push um 19:30 mittels Pushbullet:
define dAbfallmorgen doif ([19:30] and [myABFALL:next_days] == 1) ( msg |Morgen wird [myABFALL:next_text] abgeholt)
attr dAbfallmorgen do always
Die heutigen Leerungen per Push um 07:00 mittels Pushbullet:
define dAbfallheute doif ([07:00] and [myABFALL:now_text] ne "") ( msg |Heute wird [myABFALL:now_text] abgeholt)
attr dAbfallheute do always
Links
- Forenthema Abfall Visualisierung mit Bilderrahmen