FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: DerJens am 16 August 2014, 00:47:09

Titel: Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 16 August 2014, 00:47:09
Hallo,

als stiller Leser habe ich viele Infos aus diesem Forum gezogen und damit meine Hausautomatisierung weiterentwickeln und ausbauen können. Dafür bin ich sehr dankbar und möchte daher diesem Forum einen kleinen aber wie ich finde sehr nützlichen Anwendungsfall mitsamt Lösung in FHEM zurückgeben. Dieser Anwendungsfall ist natürlich nicht neu und ich habe auch schon einige ähnliche Lösungen hier gesehen.

Worum geht es?
Wenn am kommenden Tag die Müllabfuhr auf dem Plan steht, müssen die Mülltonnen an die Straße gestellt werden. Das erledigt man in der Regel am Abend davor, denn die Jungs kommen manchmal schon sehr zeitig. Da werden dann noch die Mülltonnen im Haus geleert (wenn noch Platz in der Großen ist) oder die Biotonne mit Kompost oder gemähtem Gras vollgeschaufelt. Damit man das, wenn es noch hell ist, ohne Stress in Ruhe machen kann, habe ich mir eine FHEM Erinnerung gebaut, die mich am Vortag vor der Leerung bzw. Abholung erinnert.

Was wird benutzt?
Mein System besteht derzeit aus einem aktuellen FHEM auf einem Raspberry Pi, einigen verteilten Sonos Play 1 und einem TCM310, der sich mit unterschiedlichen Funksensoren und -aktoren von Eltako unterhält.

Das Konzept
Bei uns werden an verschiedenen Tagen verschiedene Tonnen geleert oder Säcke abgeholt. Es gibt eine schwarze, eine grüne und eine braune Tonne sowie gelbe Säcke. Ein Abfuhrplan wird vom lokalen Dienstleister bereitgestellt und hängt im Flur. Damit ich da nicht immer draufschauen muss, möchte ich eine Ansage zu einem wählbaren Zeitpunkt über mein Sonossystem, wenn eine Abfuhr am nächsten Tag ansteht. Den Abfuhrplan gibt es schon mal in elektronischer Form im Kalenderformat .ics auf der Anbieterseite - praktisch, den Plan abtippen hab ich schon mal gespart.

Vorarbeiten
Der Kalender gilt für's ganze Jahr und hat alle Abfuhrtermine für meine Straße erfasst, aufgeteilt nach Abfuhrkategorie. Den habe ich geladen und ins FHEM Verzeichnis gelegt. Wie ich leider feststellen musste, waren die ganztägigen Termine nicht konform gespeichert: Es gab ein DTSTART aber kein DTEND im VEVENT. Das führt zu Problemen beim Import ins Kalendermodul von FHEM. Kann man schnell auf dem Raspberry Pi mit einem Script lösen:
#!/usr/bin/awk -f
{
print $0;
if (index($0, "DTSTART") > 0)
{
sub(/DTSTART/, "DTEND", $0)
print $0;
}
}

Dieses kleine awk-Script dupliziert die DTSTART Zeile und ersetzt DTSTART mit DTEND. (Abspeichern, chmod +x, ./convert OriginalDatei.ics > Abfuhrkalender2014.ics)

Jetzt kann in FHEM ein Kalender angelegt werden. Ich habe mir einen extra Raum angelegt, um alles übersichtlich zu sammeln.
define RemovalCalendar Calendar ical file ./www/abfuhrkalender2014.ics
attr RemovalCalendar room GarbageRemoval


Die Mülltonnen
Ich habe mir zunächst die Objekte virtuell angelegt, die ich an die Straße bringen muss. Wer andere/weitere Farben benötigt kann hier entsprechend anpassen/erweitern.
define RemovalBlack dummy
attr RemovalBlack room GarbageRemoval
attr RemovalBlack setList on off

Das hier ist ein Beispiel für die schwarze Tonne, die ich als Dummy angelegt habe. Später soll ein hübsches Bildchen signalisieren, welche Tonne(n) denn rausgestellt werden muss/müssen, daher habe ich als Status on/off gewählt. Ein weiterer Vorteil davon ist, dass man den Status in der Weboberfläche via Klick schalten kann.

Kalender abfragen
Jetzt muss im Kalender geschaut werden, ob für morgen eine Abfuhr ansteht. Manuell kann das mit get RemovalCalendar text all 4 getestet werden. Dieser Befehl sollte die nächsten 4 Abfuhren anzeigen, vergangene Einträge werden hier nicht angezeigt. Warum 4? Weil morgen maximal alle 4 Kategorien abgeholt werden könnten. Das Ergebnis schaut dann ungefähr so aus:
16.08.14 00:00 Biotonne
18.08.14 00:00 Biotonne
25.08.14 00:00 Biotonne
27.08.14 00:00 Restmülltonne

Ich habe die Kalenderdatei noch um einen Eintrag für morgen für die Biotonne ergänzt, damit ich einen Testfall habe.

Den gesamten Code zur Abfrage des Kalenders habe ich in ein notify gepackt. Der Vorteil ist (wie ich hier gelernt habe), das man dies mit trigger <NotifyName> auslösen kann - sehr praktisch für Testfälle.
define RemovalCheck notify RemovalCheck
attr RemovalCheck room GarbageRemoval


Das notify bekommt dann folgendes Eigenleben:
RemovalCheck {
my $RemovalBlack = "off";
my $RemovalBrown = "off";
my $RemovalGreen = "off";
my $RemovalYellow = "off";

my $rcal= fhem("get RemovalCalendar text all 4",1);
my @@events = split ("\n", $rcal);
my $tomorrow = strftime "%%d.%%m.%%y", localtime(time + 86400);

foreach my $event (@@events)
{
my @@values = split(" ", $event);

if ($values[0] eq $tomorrow)
{
  if ($values[2] eq "Restmülltonne") {$RemovalBlack = "on"}
  elsif ($values[2] eq "Biotonne") {$RemovalBrown = "on"}
  elsif ($values[2] eq "Papiertonne") {$RemovalGreen = "on"}
  elsif ($values[2] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");
fhem("set RemovalBrown $RemovalBrown");
fhem("set RemovalGreen $RemovalGreen");
fhem("set RemovalYellow $RemovalYellow");
return;
}


Schnell erklärt: Ich lege meine 4 Abfuhren an und initialisiere sie als nicht relevant für morgen (off). Dann schaue ich in den Kalender und hole mir die nächsten 4 Einträge. Diese kommen zumindest mit dieser Einstellung in einer Zeichenkette zurück, die allerdings aus mehreren Zeilen bestehen kann die durch einen Zeilenumbruch getrennt sind. Die zerteile ich am Zeilenumbruch und speichere das Ergebnis in einem Array. Mit einem Einzeiler wird das Datum des morgigen Tags berechnet. Jetzt schaue ich, ob es einen Eintrag für eine Abfuhr mit dem Datum von morgen gibt. Falls ja, setze ich die entsprechende Variable (on). Dieses notify wird dann 1x in der Nacht ausgeführt und schreibt mir das Ergebnis der Abfuhr für Morgen in den Dummy.

Das kann man schon ausprobieren, in dem man einfach trigger RemovalCheck ausführt. In meinem Beispiel steht dann der dummy der Biotonne auf "on", die anderen auf "off".

Sonos vorbereiten
Mein Sonossystem ist in FHEM eingebunden und ich habe eine Freigabe eingerichtet, von der ich mit der Durchsagefunktion des Sonosmoduls vorher erstellte Nachrichten abspielen kann. Ich habe mich hier bei Apple bedient und "Anna" gebeten, mir Systemmeldungen einzusprechen:

say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die braune Tonne gelehrt und die gelben Säcke abgehohlt." -o RemovalBrownYellow.mp4
say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die grüne Tonne gelehrt und die gelben Säcke abgehohlt." -o RemovalGreenYellow.mp4
say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die braune und die grüne Tonne gelehrt." -o RemovalBrownGreen.mp4
say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die schwarze Tonne gelehrt und die gelben Säcke abgehohlt." -o RemovalBlackYellow.mp4
say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die schwarze und die grüne Tonne gelehrt." -o RemovalBlackGreen.mp4
say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die schwarze und die braune Tonne gelehrt." -o RemovalBlackBrown.mp4
say "Achtung, eine Erinnerung. Morgen werden [[emph +]] die gelben Säcke abgehohlt." -o RemovalYellow.mp4
say "Achtung, eine Erinnerung. Morgen wird [[slnc 10]] [[emph +]] die grüne Tonne gelehrt." -o RemovalGreen.mp4
say "Achtung, eine Erinnerung. Morgen wird [[slnc 10]] [[emph +]] die schwarze Tonne gelehrt."
say "Achtung, eine Erinnerung. Morgen wird [[slnc 10]] [[emph +]] die braune Tonne gelehrt." -o RemovalBrown.mp4

Achja, das sind keine Rechtschreibfehler sondern Korrekturen für die Aussprache. Kann jeder individuell anpassen und soll hier nur als Beispiel dienen. Bei uns wird überwiegend nur eine Abfuhr am Tag durchgeführt, es kann jedoch vorkommen, dass zwei Abfuhren taggleich vorgesehen sind. Dafür muss man dann Sprachnachrichten für jede Kombination einsprechen lassen.

Sprachausgabe
Jetzt fehlt nur noch die Steuerung der Sprachnachrichten, ebenfalls in einem notify gespeichert:

define Removal4Sonos notify Removal4Sonos
attr Removal4Sonos room GarbageRemoval


Removal4Sonos {
my $message = "Removal";;
if (ReadingsVal("RemovalBlack", "state", "") eq "on") {$message .= "Black"};;
if (ReadingsVal("RemovalBrown", "state", "") eq "on") {$message .= "Brown"};;
if (ReadingsVal("RemovalGreen", "state", "") eq "on") {$message .= "Green"};;
if (ReadingsVal("RemovalYellow", "state", "") eq "on") {$message .= "Yellow"};;
if ($message ne "Removal")
{fhem("set Sonos_Wohnzimmer_EG PlayURITemp \\\\rpi1\\SonosSpeak\\$message.mp3 35")}
}

Auch hier ist der Code schnell erklärt: Der Dateiname von der Sprachdatei, die abgespielt werden muss, baut sich aus "Removal" und den Farben der Abfuhren zusammen. Ist ein dummy aktiv (on), dann wird die Farbe in den Dateinamen aufgenommen. Abschließend wird ein Play 1 angewiesen, die Datei, die auf den zusammengebauten Dateinamen passt, abzuspielen. Steht keine Abfuhr an wird auch keine Meldung ausgegeben. Das kann man schön testen, in den man ein Dummy auf "on" setzt und das notify triggert.

and finally...
Was noch fehlt sind zwei at Definitionen: Einmal muss bei Tageswechsel kurz der Abfuhrstatus aktualisiert werden und einmal (oder mehrmals, wie es beliebt) muss die Sprachausgabe angeschubst werden. Mir schwebt da 19 Uhr und 21 Uhr vor, das erste zum Erinnern, das zweite falls es vergessen wurde.

Vielleicht gefällt es ja dem einen oder anderen. Über Rückmeldungen, Anregungen oder Verbesserungen würde ich mich natürlich freuen. Bin mal gespannt, wie so der WAF ist...

Liebe Grüße
DerJens

Dieser Anwendungsfall und der darin verwendete Code sind natürlich experimentell, können Fehler enthalten und sollten daher vor einem Einsatz auf einem Produktivsystem gründlich geprüft werden!
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: wuppermann am 30 August 2014, 22:40:20
Hallo DerJens
habe Deinen Code fast 1:1 übernehmen können und dabei auch wieder etwas gelernt.
Ich finde die Idee cool und.....auch wenn es hier schon ähnliches gibt.....bin ich froh, dass Du sie ins Forum gestellt hast.
Bisher habe ich nur mit trigger getestet, aber ich bin schon auf das Gesicht meiner Frau am Montag, 2000 Uhr gespannt, wenn unser Sonos_Kueche uns an die Mülltonnen erinnert.

wuppermann
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: hollyghost am 02 Oktober 2014, 14:44:48
Hallo DerJens,
ich versuche mich gerade an deinem 'Müllbenachrichtigung'.
Allerdings hänge ich an deinen Notify's fest.

define RemovalCheck notify RemovalCheck

Mir (und meinem fhem) scheint es, als ob hier was fehlt. Das notify ist ja als

define <name> notify <Suchmuster> <command>

definiert.
Wenn ich dein Beispiel eingebe, erscheint als Suchmuster (RegExp) das 'Eigenleben' deines notify.
Hast du das irgendwie als Sub in die myUtils ausgelagert?
Das notify würde bei mir in der cfg so aussehen - leider läuft sie nicht:

#Notify zum Setzen des Tonnen Status
#
define RemovalCheck notify RemovalCheck{
my $RemovalBlack = "off";;
my $RemovalBlue = "off";;
my $RemovalGreen = "off";;
my $RemovalYellow = "off";;
my $RemovalWhite = "off";;
my $RemovalSkull = "off";;
my $RemovalWaste = "off";;

my $rcal= fhem("get RemovalCalendar text all 4");;
my @@events = split ("\n", $rcal);;
my $tomorrow = strftime "%%d.%%m.%%y", localtime(time + 86400);;

foreach my $event (@@events)
{
my @@values = split(" ", $event);;

if ($values[0] eq $tomorrow)
{
  if ($values[2] eq "Rest|LVP") {$RemovalBlack = "on";;$RemovalYellow = "on"}
  elsif ($values[2] eq "Bio|Pap|Glas") {$RemovalGreen = "on";;$RemovalBlue = "on";;$RemovalWhite = "on"}
  elsif ($values[2] eq "Schadstoffsammlung") {$RemovalSkull = "on"}
  elsif ($values[2] eq "Sperrm") {$RemovalWaste = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");;
fhem("set RemovalBlue $RemovalBlue");;
fhem("set RemovalGreen $RemovalGreen");;
fhem("set RemovalYellow $RemovalYellow");;
fhem("set RemovalWhite $RemovalWhite");;
fhem("set RemovalSkull $RemovalSkull");;
fhem("set RemovalWaste $RemovalWaste");;
print 1;;
}
attr RemovalCheck room Abfall

Vielleicht habe ich deine Erklärung zum 'Eigenleben' auch falsch verstanden?
Gruß
Holger
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: NickRivers am 05 Oktober 2014, 12:09:17
Schönes Beispiel danke dafür an Jens :-D

Bei mir funktionierte es anfänglich nicht aber dank Nachinstallation folgendes Paketes funzte auch endlich das Olle "strftime".

apt-get install libtime-modules-perl
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: mattes1007 am 15 Oktober 2014, 20:49:38
Zitat von: hollyghost am 02 Oktober 2014, 14:44:48
Hallo DerJens,
ich versuche mich gerade an deinem 'Müllbenachrichtigung'.
Allerdings hänge ich an deinen Notify's fest.
Vielleicht habe ich deine Erklärung zum 'Eigenleben' auch falsch verstanden?
Gruß
Holger

Bei mir gings leider auch nicht. Nach langem hin und her, hier meine Lösung:

eine 99_myUtils.pm angelegt
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}

sub
RemovalCheck()
{
my $RemovalBlack = "off";;
my $RemovalGreen = "off";;
my $RemovalBlue = "off";;
my $RemovalYellow = "off";;

my $rcal= fhem("get RemovalCalendar text all 4");;
my @@events = split ("\n", $rcal);;
my $tomorrow = strftime "%%d.%%m.%%y", localtime(time + 86400);;

foreach my $event (@@events)
{
my @@values = split(" ", $event);;

if ($values[0] eq $tomorrow)
{
  if ($values[2] eq "Restabfall") {$RemovalBlack = "on"}
  elsif ($values[2] eq "Bioabfall") {$RemovalGreen = "on"}
  elsif ($values[2] eq "Altpapier") {$RemovalBlue = "on"}
  elsif ($values[2] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");;
fhem("set RemovalGreen $RemovalGreen");;
fhem("set RemovalBlue $RemovalBlue");;
fhem("set RemovalYellow $RemovalYellow");;
print 1;;
}
1;


und hier noch die fhem.cfg

define RemovalBlack dummy
attr RemovalBlack room Muellabfuhr
attr RemovalBlack setList on off

define RemovalBlue dummy
attr RemovalBlue room Muellabfuhr
attr RemovalBlue setList on off

define RemovalGreen dummy
attr RemovalGreen room Muellabfuhr
attr RemovalGreen setList on off

define RemovalYellow dummy
attr RemovalYellow room Muellabfuhr
attr RemovalYellow setList on off

define RemovalCheck_a at +*24:00:00 trigger RemovalCheck_trigger
attr RemovalCheck_a room Muellabfuhr

define RemovalCheck_trigger dummy
attr RemovalCheck_trigger room Muellabfuhr

define RemovalCheck_n notify RemovalCheck_trigger { RemovalCheck() }
attr RemovalCheck_n room Muellabfuhr


Keine Ahnung, ob das nach den Regeln der Kunst ist aber es funktioniert.

Gruß mattes
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 19 Oktober 2014, 14:51:46
Ups, hab gar nicht mitbekommen, dass sich hier was tut!  :)

Das notify habe ich via FHEM Webinterface angelegt. Es gibt da sicher viele Wege, mein Weg ist, zunächst ein leeres Notify zu definieren und im Anschluss dann das Eigenleben hinzuzufügen. Mit define RemovalCheck notify RemovalCheck 1 ist das Notify angelegt und kann schon mal einem Raum zugeordnet werden. Die "1" hat keine Funktion und ist nur ein Platzhalter. Dann wähle ich "DEF" im Webinterface und füge Eigenleben ein, die "1" wird dann durch den o.g. Code ersetzt.

Nach einigen Wochen Produktivbetrieb kann ich Erfolg verkünden. Das Modul hilft zumindest in unserem Haus ungemein und die Akzeptanz ist höher als erwartet.
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: Puschel74 am 19 Oktober 2014, 15:10:40
Hallo,

da in (meinem) notifys immer mehr Code dazu kommt lege ich jedes notify mit
define RemovalCheck notify RemovalCheck {
an.
Die { wird idR sowieso benötigt  ;)

Grüße
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 30 Dezember 2014, 13:40:06
Jahresupdate
Das Einspielen einer neuen CSV-Datei, die die Abfuhrtermine für 2015 beinhaltet, ist erfreulicherweise sehr einfach:
Das war's schon.  8)

Codeoptimierungen
Mir war am Ende des Jahres aufgefallen, dass es zu Warnmeldungen kommen kann, wenn der RemovalCalendar keine Abfuhrtermine mehr liefert. Im Logfile habe ich dann Folgendes stehen:
PERL WARNING: Use of uninitialized value $rcal in split at (eval 162764) line 8.
Ich habe daher im RemovalCheck die folgende Anpassung vorgenommen:
my $rcal = "";
$rcal = fhem("get RemovalCalendar text all 4");

Damit ist $rcal nicht mehr undefiniert falls die Kalenderabfrage kein Ergebnis zurückliefert.

Eine weitere kleine Anpassung habe ich auch am Ende der Funktion vorgenommen, um den Logeintrag RemovalCheck return value: 1 zu unterdrücken:
fhem("set RemovalYellow $RemovalYellow");
return;
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: NickRivers am 03 Januar 2015, 14:04:44
Vielen Dank für den Code :-D

Habe ihn nach eigenen Bedüfnissen angepasst ;-) Die Termine muss ich mir allerdings selbst anlegen. Wichtig dabei ist wohl, dass Serientermine nicht funktionieren, es braucht einen "Einzeleintrag", also einfach copy/paste ;-) Beim Export der *.ics aus Google muss die Konvertierung erfolgen, beim Export der *.ics aus Thunderbird bzw. Lightning gings auch ohne.

Gruß
Tom
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 20 Januar 2015, 10:01:39
Update
Mir hat noch eine Anzeige gefehlt, an der ich die verbleibenden Tage bis zur nächsten Abfuhr ablesen kann. Meine o.a. Lösung kann da recht schnell erweitert werden.

Dummy erweitern
Dem jeweiligen Abfuhr-Dummy (z.B. RemovalBlack) habe ich ein UserReading verpasst, welches im RemovalCalendar nach dem nächsten Abfuhrtermin schaut und die Zeitdifferenz bis dahin in Tagen berechnet.
inDays { use Date::Calc; my @today = (localtime)[5,4,3]; $today[0] += 1900; $today[1]++; my $rcal = fhem("get RemovalCalendar full all 8"); my @events = split ("\n", $rcal); foreach my $event (@events) {my @values = split(" ", $event); if ($values[6] eq "Restmülltonne") { my @d2 = (substr($values[3],6,4), substr($values[3],3,2), substr($values[3],0,2)); return Delta_Days(@today, @d2 );}}}
Für bessere Kompatibilität:
inDays { use Date::Calc qw(Delta_Days); my @today = (localtime)[5,4,3]; $today[0] += 1900; $today[1]++; my $rcal = fhem("get RemovalCalendar full modeUpcoming 8",1); my @events = split ("\n", $rcal); foreach my $event (@events) {my @values = split(" ", $event); if ($values[6] eq "Restmülltonne") { my @d2 = (substr($values[3],6,4), substr($values[3],3,2), substr($values[3],0,2)); return Delta_Days(@today, @d2 );}}}
Geändert:
- use Date::Calc; -> use Date::Calc qw(Delta_Days);
- get RemovalCalendar full all 8 -> get RemovalCalendar full modeUpcoming 8

Ich bin mir nict mehr ganz sicher, aber ich glaube, dass ich für Date::Cals ein Modul mit sudo apt-get install libdate-calc-perl nachinstallieren musste. Zunächst wird in @today der heutige Tag gespeichert. Die zwei benötigten Anpassungen habe ich von hier: http://perlmeme.org/faqs/datetime/comparing_dates.html (http://perlmeme.org/faqs/datetime/comparing_dates.html) aus dem Beispiel Date::Calc. In $rcal wird eine Liste der kommenden 8 Ereignisse aus dem Kalender gelesen. Die Anzahl muss ggf. angepasst werden. In @events wird dann Zeile für Zeile abgelegt, die ich dann in der foreach-Schleife durchlaufe. Passt der Name aus dem Kalendereintrag auf die gesuchte Abfuhr, berechne ich die verbleibenden Tage und gebe diese zurück. Das Ergebnis steht dann im UserReading inDays, allerdings erst, wenn der Dummy das nächste Mal aktualisiert wird (manuell triggern mit set RemovalBlack off).
Dieses UserReading wird dann an der Stelle if ($values[6] eq "Restmülltonne") angepasst und in die anderen Tonnen kopiert.

Kosmetik für den Floorplan
Ich habe für die Anzeige im Floorplan jeweils einen Proxy für den Wert inDays angelegt, den ich bedarfsgerecht formatieren kann. Hier entsteht jetzt "HEUTE", "MORGEN" oder "x Tage".
define RemovalBlackPrxy4InDays readingsProxy RemovalBlack:inDays
attr RemovalBlackPrxy4InDays valueFn {if ($VALUE eq "1") {return "MORGEN";}; if ($VALUE eq "0") {return "HEUTE";}; return $VALUE." Tage";}

Ein kleiner Ausschnitt vom Ergebnis habe ich als Bild angehängt.

Liebe Grüße
DerJens
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: maseb am 21 Januar 2015, 10:45:58
Hallo DerJens,
das ist eine tolle Sache mit den Abfuhrterminen.

Ich habe deinen Code 1:1 übernommen, nur die Bezeicnungen der Tonnen angepasst.
Leider findet das notify RemovalCheck keine aktuellen Termine aus dem RemovalCalender.

Mit get RemovalCalender text all 4 kommen 4 Einträge

22.01.15 06:00 Abfuhrtermin Papiertonne am 22.01.2015
23.01.15 06:00 Abfuhrtermin Biotonne am 23.01.2015
26.01.15 06:00 Abfuhrtermin Gelbe Tonne am 26.01.2015
27.01.15 06:00 Abfuhrtermin Restmüll - 2-wöchentlich am 27.01.2015 

trigger ich aber das notify schaltet  er die Tonnen auf off, setzt aber keine aktuellenTermine wieder auf on

Kann das an meiner *ics liegen?
Dass diese einen anderen Aufbau hat als deine?

Hast du einen Tipp für mich.

Grüße
Rudi
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 21 Januar 2015, 11:03:31
Hallo Rudi,

der Aufruf von get RemovalCalendar text all 4 liefert bei mir:
21.01.15 00:00 Gelber Sack
26.01.15 00:00 Papiertonne
02.02.15 00:00 Biotonne
11.02.15 00:00 Restmülltonne


Wenn du meine Ausgabe mit deiner Ausgabe vergleichst, kannst du sehen, dass sich durch das zusätzliche Wort "Abfuhrtermin" der Index für den Namen der Abfuhr um 1 verändert hat und nicht mehr auf Position 2 sondern 3 steht (bei dir: 0=Datum, 1=Zeit, 2="Abfuhrtermin", 3=Name, usw.).

Versuch mal, in diesem Block
if ($values[0] eq $tomorrow)
{
  if ($values[2] eq "Restabfall") {$RemovalBlack = "on"}
  elsif ($values[2] eq "Bioabfall") {$RemovalGreen = "on"}
  elsif ($values[2] eq "Altpapier") {$RemovalBlue = "on"}
  elsif ($values[2] eq "Gelber") {$RemovalYellow = "on"}
}

den Index bei $values[2] auf $values[3] zu ändern. Anpassen musst du natürlich auch noch die Namen, also in deinem Fall Papiertonne, Biotonne, Gelbe und Restmüll.

Das sollte es schon gewesen sein, du kannst ja kurz Rückmeldung geben, ob es funktioniert hat.
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: maseb am 21 Januar 2015, 12:30:10
Hallo DerJens,

danke für die Antwort.
Das notify tut es jetzt.

Wo es noch hängt sind die readings.
Die sollten ja auch angepasst werden?

Nur wo?

Grüße
Rudi
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 21 Januar 2015, 12:50:45
Hallo,

das ist richtig, versuch es mal hier
inDays { use Date::Calc; ... if ($values[6] eq "Restmülltonne") ...
und ändere $values[6] in $values[7] ab.

Wenn das nicht funktioniert, zeig mir doch mal die Ausgabe von
get RemovalCalendar full all 8,
dann sehen wir weiter.
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: maseb am 21 Januar 2015, 13:08:49
Hallo,
hat leider nichts gebracht.

Die Ausgabe von get RemovalCalender full all 8

7e44d76f40ca5e676cc03b6b8e071599     new    alarm 21.01.2015 06:00:00 22.01.2015 06:00:00-22.01.2015 17:00:00 Abfuhrtermin Papiertonne am 22.01.2015 Holzhausen
a25f9281f0f15295d6a081ec67b93d4d     new upcoming 22.01.2015 06:00:00 23.01.2015 06:00:00-23.01.2015 17:00:00 Abfuhrtermin Biotonne am 23.01.2015 Holzhausen
a609058cf07ad398c13d8a4e6031257e     new upcoming 25.01.2015 06:00:00 26.01.2015 06:00:00-26.01.2015 17:00:00 Abfuhrtermin Gelbe Tonne am 26.01.2015 Holzhausen
dd578cfc21167e6020d2790e0a8bebb4     new upcoming 26.01.2015 06:00:00 27.01.2015 06:00:00-27.01.2015 17:00:00 Abfuhrtermin Restmüll - 2-wöchentlich am 27.01.2015 Holzhausen
29875f74abf81fc8f97ac47f808a5dd5     new upcoming 26.01.2015 06:00:00 27.01.2015 06:00:00-27.01.2015 17:00:00 Abfuhrtermin Restmüll - 2+4-wöchentlich (R1) am 27.01.2015 Holzhausen
6d2e08a8a41a830dbd0e277dd4de3619     new upcoming 05.02.2015 06:00:00 06.02.2015 06:00:00-06.02.2015 17:00:00 Abfuhrtermin Biotonne am 06.02.2015 Holzhausen
445f52113eb1822b9e27915b87cbc00e     new upcoming 06.02.2015 06:00:00 07.02.2015 06:00:00-07.02.2015 17:00:00 Abfuhrtermin Sondermüll am 07.02.2015 Holzhausen
abbf62db6135a8a1782e6dc285cde608     new upcoming 09.02.2015 06:00:00 10.02.2015 06:00:00-10.02.2015 17:00:00 Abfuhrtermin Restmüll - 2+4-wöchentlich (R2) am 10.02.2015 Holzhausen

Grüße
Rudi
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 21 Januar 2015, 13:16:19
Ok, kleine Korrektur, versuch es mit $values[9]. Anpassen musst du natürlich auch wieder die Namen.
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: maseb am 21 Januar 2015, 16:46:27
Hallo,

es tut sich etwas.
Im userReading der Tonnen, RemovalBlue kommt es zu einer Fehlermeldung

Error evaluating RemovalBlue userReading inDays: Undefined subroutine &main::Delta_Days called at (eval 4699) line 1.

Grüße
Rudi
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 21 Januar 2015, 16:58:19
Zitat von: DerJens am 20 Januar 2015, 10:01:39
Ich bin mir nict mehr ganz sicher, aber ich glaube, dass ich für Date::Calc ein Modul mit sudo apt-get install libdate-calc-perl nachinstallieren musste.
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: maseb am 21 Januar 2015, 17:04:12
Das Modul hatte ich bereits nachinstalliert. Ist die aktuelle Version installiert.



Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 21 Januar 2015, 17:08:51
Hmmm, als Idee:
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: maseb am 21 Januar 2015, 17:30:54
habe ich beides gemacht.

Danke für alles, vielleicht ergibt sich noch etwas wenn man es sacken lässt.

Grüße
Rudi
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: hollyghost am 27 Januar 2015, 18:20:34
Hallo Rudi,
ich hänge gerade an der gleichen Stelle:
Error evaluating RemovalBlue userReading inDays: Undefined subroutine &main::Delta_Days called at (eval 9068) line 1

libdate-calc-perl habe ich nachinstalliert (zuvor hat FHEM gemotzt, dass er Date::Calc nicht kennt  ;) )

Bist du irgendwie weitergekommen?

Aus irgendeinem Grund scheint er Delta_Days nicht zufinden

Perl ist bei mir in der Version <5.14.2> installiert

perl -MDate::Calc -le'print $Date::Calc::VERSION' liefert  <6.3>

Ich bin für jeden Tip dankbar  :D

Grüße
Holger
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 27 Januar 2015, 20:09:05
Es tut mir sehr leid, dass ich hier gerade nicht helfen kann. Ich habe noch mal in meiner History geschaut und habe noch diesen Eintrag entdeckt:
sudo apt-get install libdatetime-perl
Ich MEINE mich zu erinnern, dass dies ein Modul für eine andere Zeitfunktion war, die ich zuvor benutzt habe...
Titel: Antw: Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: hollyghost am 27 Januar 2015, 23:57:05
Hi Jens -
Ich habe das empfohlene Modul nachinstalliert - hat allerdings erst mal nichts geändert.
Mit dem perl modul Date::Calc kommt es wohl auch außerhalb von FHEM ab und an zu Problemen -
ein Lösungsvorschlag hat mir bei meinem aktuellen Problem auch geholfen.

Wenn ich dein
use Date::Calc;
abändere in
use Date::Calc qw(Delta_Days);
läuft das Reading bei mir.

Prima - nun komm ich deiner Lösung wieder ein Stückchen näher - tolle Arbeit.

Jetzt muss ich mich mal um ein TTS Programm für Linux oder Windows kümmern, da ich die von dir verwendete Anna leider nicht verwenden kann.

Grüße
Holger
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 28 Januar 2015, 13:19:12
Hallo Holger,

vielen Dank für deine Mithilfe. Ich habe meinen Beitrag entsprechend angepasst und zudem eine kleine Optimierung von mir gleich mit eingepflegt.

Liebe Grüße
DerJens
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: torte am 27 April 2015, 07:34:18
Hallo,

bei mir hat die Anzeige von "Heute" im Dummy nicht getan. Meiner Meinung nach lag  es daran das vom Kalender nur im "modeUpcoming"
die zukünftigen Termine anzeigt werden. Habe das dann mal so hier gelöst:

inDays { use Date::Calc qw(Delta_Days); my @today = (localtime)[5,4,3]; $today[0] += 1900; $today[1]++;my $rcal = fhem("get Kalender full all 8",1); my @events = split ("\n", $rcal); foreach my $event (@events) {my @values = split(" ", $event);my @d2 = (substr($values[3],6,4), substr($values[3],3,2), substr($values[3],0,2)); if (($values[6] =~ /Hausmüll/) && ( Delta_Days(@today, @d2 ) >= 0)) { return Delta_Days(@today, @d2 ); }}}

Musste das If dann noch um ein "and" erweitern:

if (($values[6] =~ /Hausmüll/) && ( Delta_Days(@today, @d2 ) >= 0)
(Wenn Text Hausmüll enthält und der unterschied größer gleich 0 ist)

weil er sonst in den minus bereich  mit den Tagen wandert. Bin noch FHEM Anfänger weiß nicht ganz
ob man das nicht auch hätte einfacher eleganter lösen können.

Grüße
Torsten
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: raspklaus am 22 Juli 2015, 11:44:19
Hallo Zusammen

Habe mich hier mal eingeklinkt da ich nun auch Sonos benutze. Die Lösung klingt gut, aber leider habe ich schon am Anfang Probleme:

Ich kann die Dummys nicht zu Leben erwecken

Hier die config:

define RemovalCalendar Calendar ical file ./Daten/Glattbach-2015.ics
attr RemovalCalendar room Kalender

define RemovalBlack dummy
attr RemovalBlack room Kalender
attr RemovalBlack setList on off

define RemovalBlue dummy
attr RemovalBlue room Kalender
attr RemovalBlue setList on off

define RemovalYellow dummy
attr RemovalYellow room Kalender
attr RemovalYellow setList on off

define RemovalBrown dummy
attr RemovalBrown room Kalender
attr RemovalBrown setList on off


define RemovalCheck notify RemovalCheck {\
my $RemovalBlack = "off";;\
my $RemovalBlue = "off";;\
my $RemovalBrown = "off";;\
my $RemovalYellow = "off";;\
\
my $rcal= fhem("get RemovalCalendar text all 4",1);;\
my @@events = split ("\n", $rcal);;\
my $tomorrow = strftime "%%d.%%m.%%y", localtime(time + 86400);;\
\
foreach my $event (@@events)\
{\
my @@values = split(" ", $event);;\
\
if ($values[0] eq $tomorrow)\
{\
  if ($values[3] eq "Restmülltonne") {$RemovalBlack = "on"}\
  elsif ($values[3] eq "Papiertonne") {$RemovalBlue = "on"}\
  elsif ($values[3] eq "Biomüllabfuhr") {$RemovalBrown = "on"}\
  elsif ($values[3] eq "Gelber") {$RemovalYellow = "on"}\
}\
}\
fhem("set RemovalBlack $RemovalBlack");;\
fhem("set RemovalBrown $RemovalBlue");;\
fhem("set RemovalBlue $RemovalBrown");;\
fhem("set RemovalYellow $RemovalYellow");;\
return;;\
}


Das Reading ist an meine ICAL Datei angepassst. get text all 4 ergibt bei mir:

22.07.15 06:00 Abfuhrtermin Biomüllabfuhr am 28.07.2015
23.07.15 06:00 Abfuhrtermin Restmüll am 27.07.2015
04.08.15 06:00 Abfuhrtermin Biomüllabfuhr am 04.08.2015
07.08.15 06:00 Abfuhrtermin Papiertonne am 07.08.2015


Im Log kommt der folgende Eintrag:

2015.07.22 11:29:47 1: PERL WARNING: "my" variable $rcal masks earlier declaration in same scope at (eval 29) line 8.
2015.07.22 11:29:47 3: eval: {
my $RemovalBlack = "off";
my $RemovalBlue = "off";
my $RemovalBrown = "off";
my $RemovalYellow = "off";
my $rcal = "";

my $rcal= fhem("get RemovalCalendar text all 4",1);
my @events = split ("\n", $rcal);
my $tomorrow = strftime "%d.%m.%y", localtime(time + 86400);

foreach my $event (@events)
{
my @values = split(" ", $event);

if ($values[0] eq $tomorrow)
{
  if ($values[3] eq "Restmülltonne") {$RemovalBlack = "on"}
  elsif ($values[3] eq "Papiertonne") {$RemovalBlue = "on"}
  elsif ($values[3] eq "Biomüllabfuhr") {$RemovalBrown = "on"}
  elsif ($values[3] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");
fhem("set RemovalBrown $RemovalBlue");
fhem("set RemovalBlue $RemovalBrown");
fhem("set RemovalYellow $RemovalYellow");
return;
}


und die Dummys werden nicht angepasst.

Ich hänge da fest und komme nicht recht weiter
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: Vize am 23 Juli 2015, 20:54:01
Hallo zusammen,

ich habe mich auch mal an einem Müllkalender nach dieser Methode versucht und bleibe schon ziemlich am Anfang hängen...

Als erstes habe ich mir den Kalender als ics.-Datei von der Gemeinde mit den restlichen Leerungsdaten für dieses Jahr heruntergeladen und nach ./www kopiert.
Dann über define muellkalender Calendar ical file ./www/muellkalender1.ics in FHEMangelegt.
Siehe muellkalender1-1.jpg

Wenn ich nun get muellkalender text all 4 absetze, erhalte ich nur den allerletzten Leerungstermin aus der Datei.
Siehe muellkalender1-2.jpg

Ich hab dann mal analog zum ersten post mir eine neue Datei mit einem Auszug erstellt (muellkalender2.ics) und für die Termine händisch je ein DTEND eingefügt.
Dann den alten muellkalender gelöscht und den neuen mit dieser Datei in FHEM angelegt.
Siehe muellkalender2-1.jpg.

Auch hier erhalte ich nach get muellkalender text all 4 nur den letzten Termin des Auszuges.
Siehe muellkalender2-2.jpg.

Was mache ich hier falsch?

Danke schonmal für jegliche Hilfe!

Gruß
Andreas
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: Vize am 25 Juli 2015, 10:14:23
Guten Morgen,

hat denn niemand eine Idee? Ich bin für jeden Tipp dankbar...

Gruß
Andreas
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: DerJens am 25 Juli 2015, 20:37:53
Schnellschuss: Änder mal das Format der .ics von Windows um in Linux (Zeilenumbruch)...
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: Vize am 26 Juli 2015, 13:13:59
Moin,

bin mittlerweile selber auf die Lösung gekommen:
Die Kalenderdatei (.ics) muss für jeden Termin eine UID haben. Hatte meine von unserem Entsorger nicht...
Diese kann auch selber angelegt werden, also z.B. UID:1 bis UID:n.
Dazu noch das hier bereits angesprochene DTEND und schon klappt es...
Ein Termin in meinem Kalender sieht dann komplett z.B. so aus:
BEGIN:VEVENT
UID:7
SUMMARY:Restabfall
DTSTART;TZID=Europe/Berlin:20150819T060000
DTEND;TZID=Europe/Berlin:20150819T100000
END:VEVENT


Gruß
Andreas
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: raspklaus am 27 Juli 2015, 13:46:40
Habe eines meiner Probleme auch gelöst. Durch Copy and Paste wurden am Zeilenende zusätzliche Zeichen eingefügt. Nun arbeitet die Readingsgroup.

Nun meine zweite Frage:say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die braune Tonne gelehrt und die gelben Säcke abgehohlt." -o RemovalBrownYellow.mp4
say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die grüne Tonne gelehrt und die gelben Säcke abgehohlt." -o RemovalGreenYellow.mp4
say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die braune und die grüne Tonne gelehrt." -o RemovalBrownGreen.mp4
say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die schwarze Tonne gelehrt und die gelben Säcke abgehohlt." -o RemovalBlackYellow.mp4
say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die schwarze und die grüne Tonne gelehrt." -o RemovalBlackGreen.mp4
say "Achtung, eine Erinnerung. Morgen werden [[slnc 10]] [[emph +]] die schwarze und die braune Tonne gelehrt." -o RemovalBlackBrown.mp4
say "Achtung, eine Erinnerung. Morgen werden [[emph +]] die gelben Säcke abgehohlt." -o RemovalYellow.mp4
say "Achtung, eine Erinnerung. Morgen wird [[slnc 10]] [[emph +]] die grüne Tonne gelehrt." -o RemovalGreen.mp4
say "Achtung, eine Erinnerung. Morgen wird [[slnc 10]] [[emph +]] die schwarze Tonne gelehrt."
say "Achtung, eine Erinnerung. Morgen wird [[slnc 10]] [[emph +]] die braune Tonne gelehrt." -o RemovalBrown.mp4


Warum say, bei Sonos gibt es kein Say sondern nur Speak

Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: raspklaus am 27 Juli 2015, 14:07:34
Ich habe doch noch ein Problem mit dem Reading. Wenn ich alle Mülltonen in Webinterface anschalte und trigger RemovalCheck durchführe lässt er die für morgen anstehende Tonne auf on und schaltet die anderen auf off.

Setze ich die Tonne auf off schaltet er nach einen Trigger die anstehende Tonne nicht auf on
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: Vize am 27 Juli 2015, 18:29:00
Hallo klaus,

kannst ja mal hier:http://forum.fhem.de/index.php/topic,39486.0.html (http://forum.fhem.de/index.php/topic,39486.0.html) reinschauen, da hab ich meine (vereinfachte) Version ohne on/off usw. vorgestellt.
Da brauche ich nur einen dummy...vielleicht kannst du darauf aufbauen?

Gruß
Andreas
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: GuidoS am 04 Januar 2019, 12:43:51
Hi zusammen,

meine Benachrichtigung mit Sonos funktioniert so :
*19:59 {if ((Value("abfall_Biomuell") eq "Morgen") or
(Value("abfall_GelberSack") eq "Morgen") or
(Value("abfall_Papiermuell") eq "Morgen") or
(Value("abfall_Restmuell") eq "Morgen")) {fhem("set Sonos_Bad Speak 50 de Achtung Achtung Die Mülltonnen müssen raus gestellt werden")}}

nun würde ich gern noch die jeweileige Tonne (also Bio / Rest usw.) mit ausgeben.


Mit der folgenden Def . erhalte ich einen Fehler :
*19:59 {if ((Value("abfall_Biomuell") eq "Morgen")){fhem("set Sonos_Bad Speak 50 de Biomüll muss raus gestellt werden")}
elseif ((Value("abfall_GelberSack") eq "Morgen")){ fhem("set Sonos_Bad Speak 50 de GelberSack muss raus gestellt werden")}
elseif ((Value("abfall_Papiermuell") eq "Morgen")){fhem("set Sonos_Bad Speak 50 de Papiermüll muss raus gestellt werden")}
elseif ((Value("abfall_Restmuell") eq "Morgen")){fhem("set Sonos_Bad Speak 50 de Restmüll muss raus gestellt werden")}
else {fhem("set Sonos_Bad Speak 50 de Achtung Achtung Die Mülltonnen müssen raus gestellt werden")}}

Was ist an meiner elseif Abfrage falsch ?

VG
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: Otto123 am 04 Januar 2019, 12:50:06
Hi,

http://perldoc.perl.org/functions/elseif.html

Gruß Otto
Titel: Antw:Müllabfuhr - Benachrichtigung am Vortag via Sonos
Beitrag von: Kusselin am 25 Januar 2019, 14:19:28
geht das ganze auch mit Alexa?