ABFALL

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
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
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-on-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 "abf.abfall" genannt ist:

attr myABFALL userReadings ftui_datum {ReadingsVal("myABFALL","now_text","") eq "" ? datumHeuteMorgen(ReadingsVal("myABFALL","next_datum","")) : "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-on-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