ABFALL: Unterschied zwischen den Versionen

Aus FHEMWiki
 
(33 dazwischenliegende Versionen von 9 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Infobox Modul
{{Infobox Modul
|ModPurpose=Legt ein Device an, das alle Termine aus einem [[Calendar]] in Readings übernimmt, welche speziell für das Thema Abfallkalender ausgelegt sind.
|ModPurpose=Filtern von (Abfall-)Terminen aus einem Calendar.
|ModType=d
|ModType=x
|ModFTopic=48237
|ModFTopic=48237
|ModForumArea=Codeschnipsel
|ModForumArea=Codeschnipsel
Zeile 8: Zeile 8:
}}
}}


[[ABFALL]] ist ein Hilfsmodul, das alle Termine aus einem bestehenden Kalender des Moduls [[Calendar]] in Readings übernimmt.  
[[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 [[Calendar]] Objekte übergeben 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 ==
== 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 myAbfall ABFALL AbfallGoogleCalender</code>
:<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 [[Calendar]] Instanz, welche im define angegeben wurde(n).
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 ===
=== 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-on-colors='["#000","#6EB54C"]' data-icons='["fa-trash-o","fa-trash-o"]'></div></pre>
<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>


=== externe Links auf Artikel mit dem Abfall Modul ===
=== Links ===
[https://forum.fhem.de/index.php/topic,50177.0.html Abfall Visualisierung mit Bilderrahmen]
* 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.

update add https://raw.githubusercontent.com/uniqueck/fhem-abfall/master/controls_fhemabfall.txt

Um es nur zu installieren, kann auch einfach nur das Command

update all https://raw.githubusercontent.com/uniqueck/fhem-abfall/master/controls_fhemabfall.txt

eingegeben werden.

Entwicklungsstrang

update add https://raw.githubusercontent.com/uniqueck/fhem-abfall/develop/controls_fhemabfall.txt

bzw.

update all https://raw.githubusercontent.com/uniqueck/fhem-abfall/develop/controls_fhemabfall.txt

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