Müllabfuhr - Benachrichtigung am Vortag via Sonos

Begonnen von DerJens, 16 August 2014, 00:47:09

Vorheriges Thema - Nächstes Thema

DerJens

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!

wuppermann

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

hollyghost

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

NickRivers

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
FHEM 5.8 auf Intel NUC / RasPi 2
1 x CUL868, 4 x FS20, 1 x KS300
2 x HMLAN, 1 x HM-SEC-SC-2, 1 x HM-Sen-MDIR-O-2, 1 x HM-WDS30-OT2-SM-2, 4 x HM-LC-SW1-FM, 1 x HM-OU-LED16, 8 x HM-SEC-SCo, 1 x HM-RC-SEC3-B, 1 x HM-PB-6-WM55, 1 x HM-TC-IT-WM-W-EU, 2 x HM-WDS40-TH-I-2, 5 x HM-CC-RT-DN, 1 x HM-SEC-SC-2

mattes1007

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

DerJens

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.

Puschel74

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
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

DerJens

Jahresupdate
Das Einspielen einer neuen CSV-Datei, die die Abfuhrtermine für 2015 beinhaltet, ist erfreulicherweise sehr einfach:

  • Datei beim Abfallentsorger herunterladen
  • Datei ins FHEM-Verzeichnis kopieren (s.o.), bei mir war wieder eine Behandlung mit convert nötig
  • Im FHEM Frontend auf den RemovalCalender gehen und unter DEF den Pfad zur aktuellen Datei angeben
  • set RemovalCalendar reload
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;

NickRivers

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
FHEM 5.8 auf Intel NUC / RasPi 2
1 x CUL868, 4 x FS20, 1 x KS300
2 x HMLAN, 1 x HM-SEC-SC-2, 1 x HM-Sen-MDIR-O-2, 1 x HM-WDS30-OT2-SM-2, 4 x HM-LC-SW1-FM, 1 x HM-OU-LED16, 8 x HM-SEC-SCo, 1 x HM-RC-SEC3-B, 1 x HM-PB-6-WM55, 1 x HM-TC-IT-WM-W-EU, 2 x HM-WDS40-TH-I-2, 5 x HM-CC-RT-DN, 1 x HM-SEC-SC-2

DerJens

#9
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 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

maseb

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
CUL mit EM 1000 S/IR und EM 1000 HSM

DerJens

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.

maseb

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
CUL mit EM 1000 S/IR und EM 1000 HSM

DerJens

#13
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.

maseb

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
CUL mit EM 1000 S/IR und EM 1000 HSM

DerJens

Ok, kleine Korrektur, versuch es mit $values[9]. Anpassen musst du natürlich auch wieder die Namen.

maseb

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
CUL mit EM 1000 S/IR und EM 1000 HSM

DerJens

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.

maseb

Das Modul hatte ich bereits nachinstalliert. Ist die aktuelle Version installiert.



CUL mit EM 1000 S/IR und EM 1000 HSM

DerJens

Hmmm, als Idee:

  • FHEM schon neu gestartet?
  • use Date::Calc; beim Kopieren nicht vergessen?

maseb

habe ich beides gemacht.

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

Grüße
Rudi
CUL mit EM 1000 S/IR und EM 1000 HSM

hollyghost

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

DerJens

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...

hollyghost

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

DerJens

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

torte

#25
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

raspklaus

#26
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

Vize

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

Vize

Guten Morgen,

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

Gruß
Andreas

DerJens

Schnellschuss: Änder mal das Format der .ics von Windows um in Linux (Zeilenumbruch)...

Vize

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

raspklaus

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


raspklaus

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

Vize

Hallo klaus,

kannst ja mal hier: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

GuidoS

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

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Kusselin