Abfallkalender auswerten

Begonnen von raspklaus, 17 Juni 2014, 17:45:34

Vorheriges Thema - Nächstes Thema

raspklaus

#15
Mein Kalender heisst Abfall.

Hast Du Dir meine erweiterte Version der Utils mal angesehen ?

Sollte die laufen ?

Aber warum mode.*abfallamtbautzende.* muss es nicht heissen mode.*Upcomming.*  ?

So sieht des Ganze in der FHEM.cfg aus:

define Abfall Calendar ical file ./Daten/Glattbach-2014.ics
attr Abfall alias Abfallkalender
attr Abfall room Haus

define BiomuellIn dummy
define GelbeTonneIn dummy
define RestmuellIn dummy
define PapierIn dummy
define AltholzIn dummy
define SchadstoffIn dummy
define GruenIn dummy

define nf.Muellkalender.Update notify Muellkalender:mode.*Upcoming.* {Muellkalender("$EVENT");;}



Spartacus

Hallo,
ich verfolge gerade diese Thread um auf Kalenderereignisse am nächsten tag zu reagieren.

Wenn morgen ein Ferientag ist, dann fahre heute abend die Rolläden später herunter....

Einen Countdown bis zum Start eines Ferientages kann man mit der Routine "Muelltermine" realisieren, mir fehlt aber im Moment eine Idee, wie ich das für den Ferienzeitraum realisieren kann, da "Muelltermine nur auf den Starttermin des jeweiligen Ereignisses triggert.


Wenn die Sommerferien von 07.07.2014-15.08.2014 sind, dann sollte am 06.07.2014 dasein Dummydevice "Ferien morgen" auf 1 stehen und erst am 15.08.2014 wieder auf "0" gehen, da am 16.08.2014 keine Ferien mehr sind.

Hat jemand ne Idee, wie ich das modifizieren müsste?
Sparatcus.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

raspklaus

Also ich habe so das Gefühl, dass die SUB Muelltermine bei mir überhaupt nicht aufgerufen wird. Durch was wird sie aktiviert ?

Kann da jemand weiterhelfen ?

Spartacus

#18
Hallo,
bei mir klappt das!

define Abfall_Update notify Abfall:modeUpcoming.* {Abfalltermine("$EVENT")}

und wenn ich dann den Kalender "Abfall" updatet, dann wird das notify ausgeführt. Bitte genau prüfen, dass die SUB-Routine in der Utils den korrekten Namen hat. Da war bei mir ein Schreibfehler drin und dann funzte das auch nicht.

Sicherheitshalber auch in fhem das util-Modul noch mal neu laden.
reload  99_myFhemUtils

Spartacus

NACHTRAG:
Heisst die SUB bei Dir nun Muellkalender oder Muelltermine?
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

raspklaus

Die Sub heisst Mülltermine. Und Du hast das Gleiche in der FHEM Konfig stehen wie ich ? Siehe vorletzter Beitrag hier.

Für Dein Schulferienproblem könnte Dir meine Auswertung vielleicht weiterhelfen

# Schulferien
# define Bayern_Ferien Calendar ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Bayern_" . $year . ".ics 21600
define Bayern_Ferien Calendar ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Bayern_2014.ics 21600
attr Bayern_Ferien alias Schulferien
define Bayern_Ferientag dummy
attr Bayern_Ferientag devStateIcon 0:FS20.off 1:FS20.on
define Bayern_Ferien.notify notify Bayern_Ferien { \ fhem "set Bayern_Ferientag " . (ReadingsVal("Bayern_Ferien", "modeStart", "") =~ "schulferien" ? 1: 0) }


raspklaus

Also hier nochmal wie es bei mir eingestellt ist:

Fhem.cfg

define Abfall Calendar ical file ./Daten/Glattbach-2014.ics
attr Abfall alias Abfallkalender
attr Abfall room Haus

define BiomuellIn dummy
define GelbeTonneIn dummy
define RestmuellIn dummy
define PapierIn dummy
define AltholzIn dummy
define SchadstoffIn dummy
define GruenIn dummy
define Abfall_Update notify Abfall:modeUpcoming.* {Abfalltermine("$EVENT")}


Utilsroutine:

package main;
use strict;
use warnings;
use POSIX;

sub
myUtilsm_Initialize($$)
{
my ($hash) = @_;
}
# M�lltermine auswerten
sub Abfalltermine ($)

{
  my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my $t  = time;
  my $dtBio = '';
  my $dtYellow = '';
  my $dtRest = '';
open(datei, ">text.txt");
  foreach my $uid (@uids) {
    my $Kalendertext = fhem("get Abfall summary $uid");
print "$Kalendertext \n";
    if ($Kalendertext =~ /Biom�ll/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtBio eq '' || ($eventDate < $dtBio && $eventDate > $t))
        {
          $dtBio = $eventDate;
          Log(3, $dtBio);
        }
    };
    if ($Kalendertext =~ /Gelber Sack/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtYellow eq '' || ($eventDate < $dtYellow && $eventDate > $t))
        {
          $dtYellow  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Restm�ll/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtRest eq '' || ($eventDate < $dtRest && $eventDate > $t))
        {
          $dtRest = $eventDate;
        }
    };
  };
  my $dayDiff = floor(($dtBio - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set BiomuellIn $dayDiff");
  }
  my $dayDiff = floor(($dtYellow - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set GelbeTonneIn $dayDiff");
  }
  my $dayDiff = floor(($dtRest - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set RestmuellIn $dayDiff");
  }
}


# Zusammensetzung der Variablen f�r den Ferienkalender
sub defineFerien($) {
  my ($year) = @_;
  my $url = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Bayern_$year.ics";
  CommandDefine(undef, "Bayern_Ferien Calendar ical url $url 21600");
  return;
}
# Weitere Subroutinen

1;



Spartacus

Hallo,
puuh! sorry, ich sehe den Fehler nicht! Aber hier der Code der definitiv funktioniert:

sub
Abfalltermine ($)
{
  my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my $t  = time;
  my $dtPapier = '';
  my $dtWertstoff = '';
  my $dtRest = '';
  my $dtPfadfinder = '';
  my $dtBeda = '';
   foreach my $uid (@uids) {
    my $Kalendertext = fhem("get Abfall summary $uid");
    if ($Kalendertext =~ /Papiertonne/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
        {
          $dtPapier = $eventDate;
          Log(3, $dtPapier);
        }
    };
if ($Kalendertext =~ /Wertstofftonne/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtWertstoff eq '' || ($eventDate < $dtWertstoff && $eventDate > $t))
        {
          $dtWertstoff  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Restmüll/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtRest eq '' || ($eventDate < $dtRest && $eventDate > $t))
        {
          $dtRest = $eventDate;
        }
    };
    if ($Kalendertext =~ /Pfadfinder/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtPfadfinder eq '' || ($eventDate < $dtPfadfinder && $eventDate > $t))
        {
          $dtPfadfinder  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Pater Beda/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtBeda eq '' || ($eventDate < $dtBeda && $eventDate > $t))
        {
          $dtBeda = $eventDate;
        }
    };   

   
  my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Papiertonne $dayDiff");
  }
  my $dayDiff = floor(($dtWertstoff - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Wertstofftonne $dayDiff");
  }
  my $dayDiff = floor(($dtRest - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Restmuell $dayDiff");
  }
    my $dayDiff = floor(($dtPfadfinder - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Pfadfinder $dayDiff");
  }
    my $dayDiff = floor(($dtBeda - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Pater_Beda $dayDiff");
  }
  }
}


fhem.cfg:
define Abfall Calendar ical url http://www.google.com/....basic.ics 600
attr Abfall room Kalender
define Papiertonne dummy
attr Papiertonne group Abfall Countdown
attr Papiertonne room Kalender
define Abfall_Update notify Abfall:modeUpcoming.* {Abfalltermine("$EVENT")}
attr Abfall_Update room Kalender
define Restmuell dummy
attr Restmuell group Abfall Countdown
attr Restmuell room Kalender
define Wertstofftonne dummy
attr Wertstofftonne group Abfall Countdown
attr Wertstofftonne room Kalender
define Pfadfinder dummy
attr Pfadfinder group Abfall Countdown
attr Pfadfinder room Kalender
define Pater_Beda dummy
attr Pater_Beda group Abfall Countdown
attr Pater_Beda room Kalender


zu dem Ferienkalender:
Du setzt das Kalenderjahr für die Schulferien auch mit der Routine in den Utils zusammen. Das Kalenderjahr wird aber nicht automatisch aktualisiert, oder? d.h. in 2015. musst Du doch wieder zu Fuß dran. Das mit der Routine würde funktionieren, wenn der Ferienkalender vorher gelöscht würde und dann über ein Ereignis zum Jahreswechsel neu angelegt wird. Wie hast Du das realisiert?

Die Routine zur Abfrage, ob Ferien sind funktioniert nur für den gleichen Tag. D.h. "Bayern_Ferientag" wird auf 1 gesetzt, wenn das Ereignis "schulferien" stattfindet. Ich brauche das aber einen tag zuvor. Also ähnlich dem Holiday Calendar wo man den Termin mit "yesterday" und "tomorrow" abfragen kann.

Das geht mit dem Abfallkalender auch nicht, da nur die Zeit bis zum Starttermin ausgewertet wird. es müsste dabei auch das Ende der Ferien berücksichtigt werden.

Spartacus.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

raspklaus

Der Ferienkalender liegt nicht lokal wie der Müllkalender.

Hier der Code für die Aktualisierung:

define makeFerien notify global:INITIALIZED {defineFerien($year)}



raspklaus

Die Routine dafür ist auch in den Utils am Ende

Spartacus

Hi,
Zitat von: raspklaus am 25 Juni 2014, 21:25:15
Die Routine dafür ist auch in den Utils am Ende
Schon klar! Habe ich bei mir ja genauso gemacht,
Aber:
Die Routine verändert das Kalenderjahr nicht automatisch!
gibt mal in den Eingabebereich von fhem Folgendes ein:
{defineFerien("2015")}
wenn Du dann in deinen Ferienkalender guckst steht da immer noch folgender Eintrag:
ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Nordrhein_Westfalen_2014.ics 21600
Das heisst: die 2014 bleibt.
Erst wenn Du den Kalender löscht, wird er mit dem o.a. Befehl für 2015 angelegt. Sinn macht die Utils-Routine mit dem $year doch nur, wenn das jedes Jahr automatisch angepasst wird. Denkbar wäre ein notify am 01.01. um 00:00:02, welches den alten Kalender löscht und dann den neuen anlegt. Ist aber nicht so elegant...

Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

raspklaus

Das Ganze greift doch erst am 1.1. denn dann ist auch das Systemdatum auf 2015

fh168

#26
Hallo,

bei mir funktioniert die Routine auch nicht, Fehlermeldung:

root@raspbmc:/opt/fhem# Subroutine myUtils_Initialize redefined at ./FHEM/99_myUtils.pm line 9.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_myUtils.pm line 87.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_myUtils.pm line 91.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_myUtils.pm line 95.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_myUtils.pm line 99.
Subroutine Abfalltermine redefined at ./FHEM/99_myUtils.pm line 17.
Subroutine kindledisplay redefined at ./FHEM/99_myUtils.pm line 111.
Subroutine Kalenderstart redefined at ./FHEM/99_myUtils.pm line 205.
Subroutine Kalenderende redefined at ./FHEM/99_myUtils.pm line 220.

Im Frontend kommen bei den einzelnen Mülltonnen nur drei Fragezeichen. Eine Abfrage mit get Abfall full all zeigt jedoch alle Termine an.
Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-

Spartacus

Zitat von: raspklaus am 25 Juni 2014, 22:21:31
Das Ganze greift doch erst am 1.1. denn dann ist auch das Systemdatum auf 2015
Hi,
verstehe ich nicht! Wodurch soll das denn getriggert werden? Durch das
global:INITIALIZED {defineFerien($year)}
wird doch die SUB beim Start von fhem ausgeführt und der Kalender mit $year (momentan 2014) angelegt. Die 2014 steht doch danach fest verdrahtet in der URL, oder? Wodurch soll das denn am 1.1.2015 angestoßen werden?

Das aktuelle Jahr wird beim Aufruf an die Funkion übergeben und in der Funktion wird dann die url gebaut. Mehr passiert da m.E. nicht.
sub defineFerien($) {
  my ($year) = @_;
  my $url = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Nordrhein_Westfalen_$year.ics";
  {fhem "define NRW_Ferien Calendar ical url $url 21600"};
  # CommandDefine(undef, "NRW_Ferien Calendar ical url $url 21600");
  {fhem "attr NRW_Ferien room Kalender"};
  return;
}

Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Spartacus

Zitat von: fh168 am 25 Juni 2014, 22:50:22
Hallo,

bei mir funktioniert die Routine auch nicht, Fehlermeldung:

root@raspbmc:/opt/fhem# Subroutine myUtils_Initialize redefined at ./FHEM/99_myUtils.pm line 9.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_myUtils.pm line 87.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_myUtils.pm line 91.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_myUtils.pm line 95.
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_myUtils.pm line 99.
Subroutine Abfalltermine redefined at ./FHEM/99_myUtils.pm line 17.
Subroutine kindledisplay redefined at ./FHEM/99_myUtils.pm line 111.
Subroutine Kalenderstart redefined at ./FHEM/99_myUtils.pm line 205.
Subroutine Kalenderende redefined at ./FHEM/99_myUtils.pm line 220.

Im Frontend kommen bei den einzelnen Mülltonnen nur drei Fragezeichen. Eine Abfrage mit get Abfall full all zeigt jedoch alle Termine an.

Hier mal meine komplette utils:
package main;
use strict;
use warnings;
use POSIX;
sub
myFhemUtils_Initialize($$)
{
my ($hash) = @_;
}
# Laufschrift
#
#
sub rgMarquee($)
{           
  my ($txt) = @_;
  return "<marquee scrollamount=2 width=\"150\">$txt</marquee>";
}

sub
test($)
{
  my ($str) = @_;
  my @a = $str = ~ m{\[([^\]]+)\]}g;
  return (@a);
}
sub defineFerien($) {
  my ($year) = @_;
  my $url = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Nordrhein_Westfalen_$year.ics";
  {fhem "define NRW_Ferien Calendar ical url $url 21600"};
  # CommandDefine(undef, "NRW_Ferien Calendar ical url $url 21600");
  {fhem "attr NRW_Ferien room Kalender"};
  return;
}
sub
Abfalltermine ($)
{
  my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my $t  = time;
  my $dtPapier = '';
  my $dtWertstoff = '';
  my $dtRest = '';
  my $dtPfadfinder = '';
  my $dtBeda = '';
   foreach my $uid (@uids) {
    my $Kalendertext = fhem("get Abfall summary $uid");
    if ($Kalendertext =~ /Papiertonne/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
        {
          $dtPapier = $eventDate;
          Log(3, $dtPapier);
        }
    };
if ($Kalendertext =~ /Wertstofftonne/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtWertstoff eq '' || ($eventDate < $dtWertstoff && $eventDate > $t))
        {
          $dtWertstoff  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Restmüll/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtRest eq '' || ($eventDate < $dtRest && $eventDate > $t))
        {
          $dtRest = $eventDate;
        }
    };
    if ($Kalendertext =~ /Pfadfinder/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtPfadfinder eq '' || ($eventDate < $dtPfadfinder && $eventDate > $t))
        {
          $dtPfadfinder  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Pater Beda/) {
        my $dt = fhem("get Abfall start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtBeda eq '' || ($eventDate < $dtBeda && $eventDate > $t))
        {
          $dtBeda = $eventDate;
        }
    };   

   
  my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Papiertonne $dayDiff");
  }
  my $dayDiff = floor(($dtWertstoff - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Wertstofftonne $dayDiff");
  }
  my $dayDiff = floor(($dtRest - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Restmuell $dayDiff");
  }
    my $dayDiff = floor(($dtPfadfinder - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Pfadfinder $dayDiff");
  }
    my $dayDiff = floor(($dtBeda - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Pater_Beda $dayDiff");
  }
  }
}
sub
Ferientermine ($)
{
  my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my $t  = time;
  my $dtWeihnachten = '';
  my $dtOstern = '';
  my $dtPfingsten = '';
  my $dtSommer = '';
  my $dtHerbst = '';

   foreach my $uid (@uids) {
    my $Kalendertext = fhem("get NRW_Ferien summary $uid");
    if ($Kalendertext =~ /Weihnachtsferien/) {
        my $dt = fhem("get NRW_Ferien start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtWeihnachten eq '' || ($eventDate < $dtWeihnachten && $eventDate > $t))
        {
          $dtWeihnachten = $eventDate;
          Log(3, $dtWeihnachten);
        }
};
if ($Kalendertext =~ /Osterferien/) {
        my $dt = fhem("get NRW_Ferien start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtOstern eq '' || ($eventDate < $dtOstern && $eventDate > $t))
        {
          $dtOstern = $eventDate;
          Log(3, $dtOstern);
        }
    };
if ($Kalendertext =~ /Pfingstferien/) {
        my $dt = fhem("get NRW_Ferien start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtPfingsten eq '' || ($eventDate < $dtPfingsten && $eventDate > $t))
        {
          $dtPfingsten = $eventDate;
          Log(3, $dtPfingsten);
        }
    };
if ($Kalendertext =~ /Sommerferien/) {
        my $dt = fhem("get NRW_Ferien start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtSommer eq '' || ($eventDate < $dtSommer && $eventDate > $t))
        {
          $dtSommer = $eventDate;
          Log(3, $dtSommer);
        }
    };
if ($Kalendertext =~ /Herbstferien/) {
        my $dt = fhem("get NRW_Ferien start $uid");
        my @SplitDt = split(/ /,$dt);
        my @SplitDate = split(/\./,$SplitDt[0]);
        my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
        if ($dtHerbst eq '' || ($eventDate < $dtHerbst && $eventDate > $t))
        {
          $dtHerbst = $eventDate;
          Log(3, $dtHerbst);
        }
    };
  my $dayDiff = floor(($dtWeihnachten - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Weihnachtsferien $dayDiff");
  }
  else {
    fhem("set Weihnachtsferien -1");
  }
  my $dayDiff = floor(($dtOstern - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Osterferien $dayDiff");
  }
  else {
    fhem("set Osterferien -1");
  }
  my $dayDiff = floor(($dtPfingsten - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Pfingstferien $dayDiff");
  }
  else {
    fhem("set Pfingstferien -1");
  }
  my $dayDiff = floor(($dtSommer - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Sommerferien $dayDiff");
  }
  else {
    fhem("set Sommerferien -1");
  }
  my $dayDiff = floor(($dtHerbst - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Herbstferien $dayDiff");
  }
  else {
    fhem("set Herbstferein -1");
  }
  }
}
1;


Das gleiche Prinzip funktioniert bei mir auch mit dem Ferienkalender. Den lasse ich als Countdown in fhem anzeigen...
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

fh168

Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-