FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Spartacus am 01 Juli 2014, 20:08:37

Titel: Verständnisfragen und Probleme mit Perl-Code
Beitrag von: Spartacus am 01 Juli 2014, 20:08:37
Hallo,
ich habe mir aus diversen Threads Codestücke zusammengesammelt und daraus meine eigenen Routinen gebaut. Es funktioniert zwar alles, aber ich durchblicke es nicht! Wäre schön, wenn hier jemand etwas Licht ins Dunkle bringen könnte:

Problem 1:
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;


Legt beim Start von fhem mit dem Aufruf:
global:INITIALIZED {defineFerien($year)}
den Ferienkalender wie folgt an:
ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Nordrhein_Westfalen_2014.ics 21600

Ziel soll sein, dass der Kalender automatisch die Ferientermine für das aktuelle Kalenderjahr ausliest. Meiner Meinung nach wird der Kalender hier nicht automatisch aktualisiert, wenn doch, würde ich gerne verstehen, wie das gehen soll! Ich bin der Meinung, dass man hier jährlich einen Aufuf (z.B. notify am 01.01.) bauen muss und zuvor den "alten" Ferienkalender  "NRW_Ferien" löschen muss!

Problem 2:
wie kommt diese Fehlermeldung zu Stande! Ist hier ein grundsätzlicher Fehler in der Sub?
Argument "" isn't numeric in subtraction (-) at ./FHEM/99_myFhemUtils.pm line 195.

Zeile 195 aus der u.a. Sub:
my $dayDiff = floor(($dtWeihnachten - $t) / 60 / 60 / 24 + 1);

Außerdem wird hier noch folgende Meldung ausgegeben:
"my" variable $dayDiff masks earlier declaration in same scope at ./FHEM/99_myFhemUtils.pm line 105.
Kann es sein, dass fhem hier anmerkt, dass in einer anderen SUB ebenfalls die Variable dayDiff benutzt wird?

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 Ferien summary $uid");
    if ($Kalendertext =~ /Weihnachtsferien/) {
        my $dt = fhem("get 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;
        }
};
if ($Kalendertext =~ /Osterferien/) {
        my $dt = fhem("get 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;
        }
    };
if ($Kalendertext =~ /Pfingstferien/) {
        my $dt = fhem("get 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;
        }
    };
if ($Kalendertext =~ /Sommerferien/) {
        my $dt = fhem("get 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;
        }
    };
if ($Kalendertext =~ /Herbstferien/) {
        my $dt = fhem("get 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;
        }
    };
  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;


Danke und Gruß,
Spartacus.