Nochmal Müllkalender - Plötzlich auftretende Probleme Fehler im Calendermodul

Begonnen von raspklaus, 20 Mai 2015, 10:52:19

Vorheriges Thema - Nächstes Thema

raspklaus

Hallo zusammen,

nachdem mein Müllkalender nun fast ein Jahr problemlos lief treten nun aufeinmal seit dem letzten Update unerklärliche Probleme auf. Der Kalender wird zwar anscheinend gelesen aber der State der Dummys wird nicht mehr aktuallisiert

Hier die myUtils:

##############################################
# $Id: 99_myUtils.pm 5555 2014-08-27 14:13:59Z klaushuyke $
package main;
use strict;
use warnings;
use POSIX;
use Time::Local;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}

sub
Abfalltermine ($)
{
  my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my $t  = time;
  my $dtPapier = '';
  my $dtGelberSack = '';
  my $dtRest = '';
  my $dtBio = '';
  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 =~ /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 ($dtGelberSack eq '' || ($eventDate < $dtGelberSack && $eventDate > $t))
        {
          $dtGelberSack  = $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 =~ /Bio/) {
        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;
        }
    };
    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(($dtGelberSack - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set GelberSack $dayDiff");
  }
  my $dayDiff = floor(($dtRest - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Restmuell $dayDiff");
  }
    my $dayDiff = floor(($dtBio - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Bio $dayDiff");
  }
    my $dayDiff = floor(($dtBeda - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Pater_Beda $dayDiff");
  }
  }
}

#### Log-abriss vermeiden
# called by
# define addLog notify addLog {addLog("ez_Aussensensor","state");addLog("ez_FHT","actuator");\
#               addLog("MunichWeather","humidity");addLog("MunichWeather","pressure");\
#               addLog("MunichWeather","temperature");addLog("MunichWeather","wind_chill");}
# define a_midnight1 at *23:59 trigger addLog
# define a_midnight2 at *00:01 trigger addLog
sub
addLog($$) {
  my ($logdevice, $reading) = @_; # device and reading to be used
  my $logentry = ReadingsVal($logdevice,$reading,"addLog: invalid reading");
  if ($reading =~ m,state,i) {
    fhem "trigger $logdevice $logentry   << addLog";
  } else {
    fhem "trigger $logdevice $reading: $logentry   << addLog";
  }
}

sub BM_MotionHandling($$){
my($device, $event) = @_;
return if($attr{$device}{subType} ne "motionDetector");

my $ResetAT = $device."_Reset";
if($event eq "motion") {
   # Bewegung erkannt, erstelle AT um Status wieder zurückzusetzen
         if (defined($defs{$ResetAT})) {
           fhem "modify ".$ResetAT." +00:05:00 {BM_MotionHandling(\"$device\", \"scanning\")}";
         } else {
         fhem "define ".$ResetAT." at +00:05:00 {BM_MotionHandling(\"$device\", \"scanning\")}";
         }
} elsif($event eq "scanning") {
   # Status des Devices wieder zurücksetzen
   readingsSingleUpdate($defs{$device}, "state", $event, 1);
}
}
# Weitere Subroutinen


1;


Die Config:

# Müllkalender
define Abfall Calendar ical file ./Daten/Glattbach-2015.ics
attr Abfall room Kalender
define Papiertonne dummy
attr Papiertonne devStateIcon {my $w=ReadingsVal("$name","state",100);;if($w==1){'.*:PapierIn.0'}else{if($w==2){'.*:PapierIn.1'}else{'.*:NoMuell'}}}
attr Papiertonne group Abfall Kalender
attr Papiertonne room Kalender
attr Papiertonne verbose 5
define Restmuell dummy
attr Restmuell devStateIcon {my $w=ReadingsVal("$name","state",100);;if($w==1){'.*:RestmuellIn.0'}else{if($w==2){'.*:RestmuellIn.1'}else{'.*:NoMuell'}}}
attr Restmuell group Abfall Kalender
attr Restmuell room Kalender
attr Restmuell verbose 5
define GelberSack dummy
attr GelberSack alias Gelber Sack
attr GelberSack devStateIcon {my $w=ReadingsVal("$name","state",100);;if($w==1){'.*:GelberSackIn.0'}else{if($w==2){'.*:GelberSackIn.1'}else{'.*:NoMuell'}}}
attr GelberSack group Abfall Kalender
attr GelberSack room Kalender
attr GelberSack verbose 5
define Bio dummy
attr Bio alias Biotonne
attr Bio devStateIcon {my $w=ReadingsVal("$name","state",100);;if($w==1){'.*:BiomuellIn.0'}else{if($w==2){'.*:BiomuellIn.1'}else{'.*:NoMuell'}}}
attr Bio group Abfall Kalender
attr Bio room Kalender
attr Bio verbose 5
# define Abfall_Update notify Abfall:modeUpcoming.* {Abfalltermine("$EVENT")}
define Abfall_Update notify Abfall:modeAlarmOrStart.* {Abfalltermine("$EVENT")}


Im Log taucht nur die folgende Warnung auf:

2015.05.20 10:37:33 1: PERL WARNING: Use of uninitialized value $Ereignisteil1 in split at ./FHEM/99_MyUtils.pm line 20.

Der Dummy Restmüll hat seit dem 17.05. den State 1 und wird auch bei einem Restart nicht aktuallisiert

Gunther

Auch wenn es hier keine Antwort gab, hänge ich mich mal an.

Bei mir gibt es ebenfalls Probleme:
2016.02.27 00:00:00 1: PERL WARNING: Use of uninitialized value $Ereignisteil1 in split at ./FHEM/99_myUtilsMuell.pm line 26.

Kennt Ihr das und gibt es dafür eine Lösung?

Meine 99_myUtilsMuell.pm:
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.

package main;

use strict;
use warnings;
use POSIX;
use Time::Local;

sub
myUtils_Initialize($$)
{
  my ($hash) = @_;
}

sub
Abfalltermine ($)
{
  my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my $t  = time;
  my $dtPapier = '';
  my $dtWertstofftonne = '';
  my $dtRest = '';
  my $dtBiomuell = '';
   foreach my $uid (@uids) {
    my $Kalendertext = fhem("get Abfall summary $uid");
    if ($Kalendertext =~ /Altpapier/) {
        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 =~ /Gelbe/) {
        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 ($dtWertstofftonne eq '' || ($eventDate < $dtWertstofftonne && $eventDate > $t))
        {
          $dtWertstofftonne  = $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 =~ /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 ($dtBiomuell eq '' || ($eventDate < $dtBiomuell && $eventDate > $t))
        {
          $dtBiomuell  = $eventDate;
        }
    };
   
   
  my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Papiertonne $dayDiff");
  }
  my $dayDiff = floor(($dtWertstofftonne - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Gelbetonne $dayDiff");
  }
  my $dayDiff = floor(($dtRest - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Restmuell $dayDiff");
  }
    my $dayDiff = floor(($dtBiomuell - $t) / 60 / 60 / 24 + 1);
  if ($dayDiff >= 0) {
    fhem("set Biomuell $dayDiff");
  }
  }
}


In FHEM:
define Abfall Calendar ical url https://www.google.com/calendar/ical/p8h901b9lmfdut8d81vaqmnb28%40group.calendar.google.com/public/basic.ics 600
attr Abfall room Kalender

define Abfall_Update notify Abfall:(modeUpcoming|modeAlarmOrStart).* {Abfalltermine("$EVENT")}
attr Abfall_Update room Kalender


define Papiertonne dummy
attr Papiertonne event-on-change-reading state
attr Papiertonne group Abfall
attr Papiertonne room Kalender

define Restmuell dummy
attr Restmuell event-on-change-reading state
attr Restmuell group Abfall
attr Restmuell room Kalender

define Gelbetonne dummy
attr Gelbetonne event-on-change-reading state
attr Gelbetonne group Abfall
attr Gelbetonne room Kalender

define Biomuell dummy
attr Biomuell event-on-change-reading state
attr Biomuell group Abfall
attr Biomuell room Kalender

define Muellalert dummy
attr Muellalert event-on-change-reading state
attr Muellalert room Kalender

define at_Muellalert at *06:00:00 {if(Value("Papiertonne") eq "1" || Value("Restmuell") eq "1" || Value("Gelbetonne") eq "1" || Value("Biomuell") eq "1") {fhem("set Muellalert on")} else { fhem("set Muellalert off")}}
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

chris1284

das problem ist
define Abfall_Update notify Abfall:(modeUpcoming|modeAlarmOrStart).* {Abfalltermine("$EVENT")}
attr Abfall_Update room Kalender


das event beinhaltet keine uids mehr wie früher die ihr an eure my utils übergeben könntet sondern nur eine, ds wort "triggered".

nutz doch einfach das abfall modul, wer das nicht will muss sein notfy auf calender triggered setzen und in myutils mit get calendar uid next erstmal selbt alle uids holen und dann wie gehabt den text dazu den ihr dann in eure dummys schreiben könnt.

modul ABFALL ist definitiv einfacher  bzw diese und calview könnt ihr im code analysieren und in eure utils übernehmen

Gunther

Super. Das hilft mir. Vor allem bin ich damit ja viel flexibler und bin nicht mehr in einer util unterwegs.
Danke!
FHEM@Proxmox@Nuc: TabletUI als User-Interface (4 Wandtablets) / IOs per ser2net gekapselt
Homematic: Heizung, Fenster, Bewegung | Jeelink: Temperatur | Z-Wave: Bewegung, Temperatur | FS20: Temperatur, Fenster | Viessmann-Heizung eingebunden

Spartacus

Hallo,
auch ich habe gerade bemerkt dass meine Kalendermodule nicht mehr laufen. Ich nutze dieses Konstrukt nicht nur für den Abfallkalender, sondern auch um Schulferien auszuwerten.
Wenn jetzt keine uids mehr übergeben werden können, wie löst man das denn dann? Das Abfall-Modul kann ich für meinen Schulkalender nicht benutzen..

Problem ist hier:
define cal.02.Schulferien.not notify cal.01.Schulferien.all:.* {CountDownFerien("$EVENT")}
attr cal.02.Schulferien.not alias Schulferien berechnen
attr cal.02.Schulferien.not group Scripte
attr cal.02.Schulferien.not room 99-Dienste
attr cal.02.Schulferien.not sortby 05


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

chris1284

na selbst die uids holen mit get [meinferienkalender] uid next.
nicht vergessen im kalender hideOlderThan zu setzen

Spartacus

Hi chris1284,
Das mit dem selber holen, hab ich noch nicht kappiert!  Wo genau muss ich die jetzt zu Fuße einbauen?
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

chris1284

in deiner selbstgebauten funktion  {CountDownFerien()} würde ich meinen

Spartacus

Hallo,
irgendwie komme ich nicht so richtig auf die Lösung:

Aufgerufen wird meine Routine mit
define cal.02.Schulferien.not notify cal.01.Schulferien.all:.* {CountDownFerien("$EVENT")}

Meine Routine:
Übergeben wird das EVENT. Wie kann ich denn da jetzt die UIDs extrahieren? Verstehe noch nicht genau, wo ich die holen muss. Sie werden doch aus dem EVENT extrahiert?

sub CountDownFerien($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my (undef,undef,undef,$mday,$mon,$year) = localtime;
my $t = timelocal(0,0,0,$mday,$mon,$year);
my $dtOsternStart = '';
my $dtOsternEnd = '';
my $dtPfingstenStart = '';
my $dtPfingstenEnd = '';
my $dtSommerStart = '';
my $dtSommerEnd = '';
my $dtHerbstStart = '';
my $dtHerbstEnd = '';
my $dtWeihnachtenStart = '';
my $dtWeihnachtenEnd = '';
foreach my $uid (@uids) {
    my $Kalendertext = fhem("get cal.01.Schulferien summary $uid");
    if ($Kalendertext =~ /Oster/) {
        my $dtStart = fhem("get cal.01.Schulferien start $uid");
my $dtEnd = fhem("get cal.01.Schulferien end $uid");
        my @SplitDtStart = split(/ /,$dtStart);
my @SplitDtEnd = split(/ /,$dtEnd);
        my @SplitDateStart = split(/\./,$SplitDtStart[0]);
my @SplitDateEnd = split(/\./,$SplitDtEnd[0]);
        my $eventDateStart = timelocal(0,0,0,$SplitDateStart[0],$SplitDateStart[1]-1,$SplitDateStart[2]);
my $eventDateEnd = timelocal(0,0,0,$SplitDateEnd[0],$SplitDateEnd[1]-1,$SplitDateEnd[2]);
if (($dtOsternStart eq '' || $eventDateStart < $dtOsternStart) && $eventDateStart >= $t)
        {
         $dtOsternStart = $eventDateStart;
        }
if (($dtOsternEnd eq '' || $eventDateEnd < $dtOsternEnd) && $eventDateEnd >= $t)
        {
         $dtOsternEnd = $eventDateEnd;
        }
};
    if ($Kalendertext =~ /Pfingst/) {
        my $dtStart = fhem("get cal.01.Schulferien start $uid");
my $dtEnd = fhem("get cal.01.Schulferien end $uid");
        my @SplitDtStart = split(/ /,$dtStart);
my @SplitDtEnd = split(/ /,$dtEnd);
        my @SplitDateStart = split(/\./,$SplitDtStart[0]);
my @SplitDateEnd = split(/\./,$SplitDtEnd[0]);
        my $eventDateStart = timelocal(0,0,0,$SplitDateStart[0],$SplitDateStart[1]-1,$SplitDateStart[2]);
my $eventDateEnd = timelocal(0,0,0,$SplitDateEnd[0],$SplitDateEnd[1]-1,$SplitDateEnd[2]);
if (($dtPfingstenStart eq '' || $eventDateStart < $dtPfingstenStart) && $eventDateStart >= $t)
        {
         $dtPfingstenStart = $eventDateStart;
        }
if (($dtPfingstenEnd eq '' || $eventDateEnd < $dtPfingstenEnd) && $eventDateEnd >= $t)
        {
         $dtPfingstenEnd = $eventDateEnd;
        }
};
    if ($Kalendertext =~ /Sommer/) {
        my $dtStart = fhem("get cal.01.Schulferien start $uid");
my $dtEnd = fhem("get cal.01.Schulferien end $uid");
        my @SplitDtStart = split(/ /,$dtStart);
my @SplitDtEnd = split(/ /,$dtEnd);
        my @SplitDateStart = split(/\./,$SplitDtStart[0]);
my @SplitDateEnd = split(/\./,$SplitDtEnd[0]);
        my $eventDateStart = timelocal(0,0,0,$SplitDateStart[0],$SplitDateStart[1]-1,$SplitDateStart[2]);
my $eventDateEnd = timelocal(0,0,0,$SplitDateEnd[0],$SplitDateEnd[1]-1,$SplitDateEnd[2]);
if (($dtSommerStart eq '' || $eventDateStart < $dtSommerStart) && $eventDateStart >= $t)
        {
         $dtSommerStart = $eventDateStart;
        }
if (($dtSommerEnd eq '' || $eventDateEnd < $dtSommerEnd) && $eventDateEnd >= $t)
        {
         $dtSommerEnd = $eventDateEnd;
        }
};
    if ($Kalendertext =~ /Herbst/) {
        my $dtStart = fhem("get cal.01.Schulferien start $uid");
my $dtEnd = fhem("get cal.01.Schulferien end $uid");
        my @SplitDtStart = split(/ /,$dtStart);
my @SplitDtEnd = split(/ /,$dtEnd);
        my @SplitDateStart = split(/\./,$SplitDtStart[0]);
my @SplitDateEnd = split(/\./,$SplitDtEnd[0]);
        my $eventDateStart = timelocal(0,0,0,$SplitDateStart[0],$SplitDateStart[1]-1,$SplitDateStart[2]);
my $eventDateEnd = timelocal(0,0,0,$SplitDateEnd[0],$SplitDateEnd[1]-1,$SplitDateEnd[2]);
if (($dtHerbstStart eq '' || $eventDateStart < $dtHerbstStart) && $eventDateStart >= $t)
        {
         $dtHerbstStart = $eventDateStart;
        }
if (($dtHerbstEnd eq '' || $eventDateEnd < $dtHerbstEnd) && $eventDateEnd >= $t)
        {
         $dtHerbstEnd = $eventDateEnd;
        }
};
    if ($Kalendertext =~ /Weihnacht/) {
        my $dtStart = fhem("get cal.01.Schulferien start $uid");
my $dtEnd = fhem("get cal.01.Schulferien end $uid");
        my @SplitDtStart = split(/ /,$dtStart);
my @SplitDtEnd = split(/ /,$dtEnd);
        my @SplitDateStart = split(/\./,$SplitDtStart[0]);
my @SplitDateEnd = split(/\./,$SplitDtEnd[0]);
        my $eventDateStart = timelocal(0,0,0,$SplitDateStart[0],$SplitDateStart[1]-1,$SplitDateStart[2]);
my $eventDateEnd = timelocal(0,0,0,$SplitDateEnd[0],$SplitDateEnd[1]-1,$SplitDateEnd[2]);
if (($dtWeihnachtenStart eq '' || $eventDateStart < $dtWeihnachtenStart) && $eventDateStart >= $t)
        {
         $dtWeihnachtenStart = $eventDateStart;
        }
if (($dtWeihnachtenEnd eq '' || $eventDateEnd < $dtWeihnachtenEnd) && $eventDateEnd >= $t)
        {
         $dtWeihnachtenEnd = $eventDateEnd;
        }
};
};
my $dayDiffStart = 0;
my $dayDiffEnd = 0;

if ($dtOsternStart eq '') {
   fhem("set cnt.OS.start.Ferien.dum -kein Termin-");
   }
else {
  my $dayDiffStart = floor(($dtOsternStart - $t) / 60 / 60 / 24);
  if ($dayDiffStart >= 0) {
   fhem ("set cnt.OS.start.Ferien.dum $dayDiffStart")
  }
}
if ($dtOsternEnd eq '') {
   fhem("set cnt.OS.end.Ferien.dum -kein Termin-");
   }
else {
  my $dayDiffEnd = floor(($dtOsternEnd - $t) / 60 / 60 / 24);
  if ($dayDiffEnd >= 0) {
   fhem ("set cnt.OS.end.Ferien.dum $dayDiffEnd")
  } 
}
if ($dtPfingstenStart eq '') {
   fhem("set cnt.PG.start.Ferien.dum -kein Termin-");
   }
else {
  my $dayDiffStart = floor(($dtPfingstenStart - $t) / 60 / 60 / 24);
  if ($dayDiffStart >= 0) {
   fhem ("set cnt.PG.start.Ferien.dum $dayDiffStart")
  }
}
if ($dtPfingstenEnd eq '') {
   fhem("set cnt.PG.end.Ferien.dum -kein Termin-");
   }
else {
  my $dayDiffEnd = floor(($dtPfingstenEnd - $t) / 60 / 60 / 24);
  if ($dayDiffEnd >= 0) {
   fhem ("set cnt.PG.end.Ferien.dum $dayDiffEnd")
  } 

if ($dtSommerStart eq '') {
   fhem("set cnt.SO.start.Ferien.dum -kein Termin-");
   }
else {
  my $dayDiffStart = floor(($dtSommerStart - $t) / 60 / 60 / 24);
  if ($dayDiffStart >= 0) {
   fhem ("set cnt.SO.start.Ferien.dum $dayDiffStart")
  }
}
if ($dtSommerEnd eq '') {
   fhem("set cnt.SO.end.Ferien.dum -kein Termin-");
   }
else {
  my $dayDiffEnd = floor(($dtSommerEnd - $t) / 60 / 60 / 24);
  if ($dayDiffEnd >= 0) {
   fhem ("set cnt.SO.end.Ferien.dum $dayDiffEnd")
  } 
}
if ($dtHerbstStart eq '') {
   fhem("set cnt.HB.start.Ferien.dum -kein Termin-");
   }
else {
  my $dayDiffStart = floor(($dtHerbstStart - $t) / 60 / 60 / 24);
  if ($dayDiffStart >= 0) {
   fhem ("set cnt.HB.start.Ferien.dum $dayDiffStart")
  }
}
if ($dtHerbstEnd eq '') {
   fhem("set cnt.HB.end.Ferien.dum -kein Termin-");
   }
else {
  my $dayDiffEnd = floor(($dtHerbstEnd - $t) / 60 / 60 / 24);
  if ($dayDiffEnd >= 0) {
   fhem ("set cnt.HB.end.Ferien.dum $dayDiffEnd")
  } 
}
if ($dtWeihnachtenStart eq '') {
   fhem("set cnt.WE.start.Ferien.dum -kein Termin-");
   }
else {
  my $dayDiffStart = floor(($dtWeihnachtenStart - $t) / 60 / 60 / 24);
  if ($dayDiffStart >= 0) {
   fhem ("set cnt.WE.start.Ferien.dum $dayDiffStart")
  }
}
if ($dtWeihnachtenEnd eq '') {
   fhem("set cnt.WE.end.Ferien.dum -kein Termin-");
   }
else {
  my $dayDiffEnd = floor(($dtWeihnachtenEnd - $t) / 60 / 60 / 24);
  if ($dayDiffEnd >= 0) {
   fhem ("set cnt.WE.end.Ferien.dum $dayDiffEnd")
  } 

}
1;
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

chris1284

http://fhem.de/commandref.html#Calendar  dort im abschnitt events schauen. es gibt kein $event mehr was du auswerten / an deine funktion übergeben könntest
dein notify würde ich also auf
define cal.02.Schulferien.not notify cal.01.Schulferien.all:triggered {CountDownFerien} umstellen

deine sub müsste dann in etwa so starten

sub CountDownFerien()
{
#uids aus calendar holen. diese werden durch zeilenumbruch getrennt geliefert
my $all = my $all = fhem("get cal.01.Schulferien uid next");
#aufsplitten des strings mit den uids bei zeilenumbruch
my @uids=split(/\n/,$all);
#dein code
my (undef,undef,undef,$mday,$mon,$year) = localtime;
my $t = timelocal(0,0,0,$mday,$mon,$year);
my $dtOsternStart = '';
my $dtOsternEnd = '';
my $dtPfingstenStart = '';
my $dtPfingstenEnd = '';
my $dtSommerStart = '';
my $dtSommerEnd = '';
my $dtHerbstStart = '';
my $dtHerbstEnd = '';
my $dtWeihnachtenStart = '';
my $dtWeihnachtenEnd = '';
foreach my $uid (@uids) {
    my $Kalendertext = fhem("get cal.01.Schulferien summary $uid");
   .......
}



wichtig ist halt das du beim calendar das attribut hideOlderthan setzt damit du nicht auch die uids der vergangenen termine bekommst


Spartacus

Hallo chris1284,
ganz herzlichen Dank für Deine Erklärung,
ich werde das heute Abend mal durcharbeiten und gucken, ob ich es jetzt gepeilt habe..

Melde mich,
Gruß,
Christian
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

Hallo chris1284,
nochmal danke für Deine Hilfe. Die Berechnung funktioniert nun wieder einwandfrei. Aber das notify auf "triggert" das funzt noch nicht.

Wenn ich den Kalender "cal.01.Schulferien" mit "set reload" aktualisiere, wird das notify
define cal.02.Schulferien.not notify cal.01.Schulferien.all:triggered {CountDownFerien}
nicht ausgeführt, wobei ein Aufruf der Funktion {CountDownFerien} über die Kommandozeile in fhem einwandfrei läuft.

Noch eine Idee?
Christian

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

Hallo,
hab den Fehler gefunden! Nochmals danke für die Hilfe. Der Kalendernamen war nicht ganz richtig.

Der Aufruf muss so lauten:
define cal.02.Schulferien.not notify cal.01.Schulferien:triggered {CountDownFerien}

Christian
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