Hallo zusammen,
ich versuche den Codeschnipsel aus dem Threat
http://forum.fhem.de/index.php/topic,26209.0.html (http://forum.fhem.de/index.php/topic,26209.0.html)
zum Laufen zu bringen (nach version 5.7) und es so abgeändert:
define Abfall Calendar ical file ./Daten/Glattbach.ics
attr Abfall room Abfall
define RemovalBlack dummy
attr RemovalBlack alias Restmüll
attr RemovalBlack room Abfall,Kalender
attr RemovalBlack setList on off
define RemovalBlue dummy
attr RemovalBlue alias Papiertonne
attr RemovalBlue room Abfall,Kalender
attr RemovalBlue setList on off
define RemovalYellow dummy
attr RemovalYellow alias Gelber Sack
attr RemovalYellow room Abfall,Kalender
attr RemovalYellow setList on off
define RemovalBrown dummy
attr RemovalBrown alias Biomüll
attr RemovalBrown room Abfall,Kalender
attr RemovalBrown setList on off
define RemovalCheck notify RemovalCheck {\
my $RemovalBlack = "off";;\
my $RemovalBrown = "off";;\
my $RemovalGreen = "off";;\
my $RemovalYellow = "off";;\
\
my $rcal= fhem("get Abfall 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üll") {$RemovalBlack = "on"}\
elsif ($values[3] eq "Biotonne") {$RemovalBrown = "on"}\
elsif ($values[3] eq "Papiertonne") {$RemovalGreen = "on"}\
elsif ($values[3] eq "Gelber") {$RemovalYellow = "on"}\
}\
}\
fhem("set RemovalBlack $RemovalBlack");;\
fhem("set RemovalBrown $RemovalBrown");;\
fhem("set RemovalGreen $RemovalGreen");;\
fhem("set RemovalYellow $RemovalYellow");;\
return;;\
}
Der Code ist aus der fhem.cfg herauskopiert.
Ein
get RemovalCalendar text all 4
liefert auch:
08.12.15 06:00 Abfuhrtermin Restmüll am 08.12.2015
09.12.15 06:00 Abfuhrtermin Biomüllabfuhr am 09.12.2015
10.12.15 06:00 Abfuhrtermin Gelber Sack am 10.12.2015
11.12.15 06:00 Abfuhrtermin Restmüll am 11.12.2015
zurück, also genau das was gebraucht wird aber die Variablen bleiben leer. Kann mir da jemand auf die Sprünge helfen ?
zumindest
my $events = split ("\n", $rcal);;\
muss
my @events = split ("\n", $rcal);;\
lauten
Ich dachte @ darf nicht mehr im notify benutzt werden ?
Bringt aber auch keine Änderung nach einem trigger RemovalCheck
@events ist ein array/hash. Lies Dir mal die Perlgrundlangen an.
ok, hatte ich übersehen. Im Array muss ja dann aber folgendes stehen:
08.12.15 06:00 Abfuhrtermin Restmüll am 08.12.2015
09.12.15 06:00 Abfuhrtermin Biomüllabfuhr am 09.12.2015
10.12.15 06:00 Abfuhrtermin Gelber Sack am 10.12.2015
11.12.15 06:00 Abfuhrtermin Restmüll am 11.12.2015
Restmülltone habe ich im notify noch geändert:
RemovalCheck {
my $RemovalBlack = "off";
my $RemovalBrown = "off";
my $RemovalGreen = "off";
my $RemovalYellow = "off";
my $rcal= fhem("get Abfall 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üll") {$RemovalBlack = "on"}
elsif ($values[3] eq "Biotonne") {$RemovalBrown = "on"}
elsif ($values[3] eq "Papiertonne") {$RemovalGreen = "on"}
elsif ($values[3] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");
fhem("set RemovalBrown $RemovalBrown");
fhem("set RemovalGreen $RemovalGreen");
fhem("set RemovalYellow $RemovalYellow");
return;
}
Auf Feld 3 wird ja dann verglichen aber die entsprechende Variable bzw der zugehörige Dummy nicht gesetzt
Fällt Dir an dieser Zeile etwas auf?
my $tomorrow = strftime "%%d.%%m.%%y", localtime(time + 86400);;\
Wahrscheinlich die zweimal %% aber auch mit "%d.%m.%y" funktioniert es nicht.
Es wird der aktuelle Tag genommen und 1 Tag dazugezählt damit die Variable $tomorrow das Datum von morgen hat
sorry, stecke mit perl noch in den Kinderschuhen und versuche es mir mit Beispielen näher zu bringen
Zitat von: raspklaus am 07 Dezember 2015, 13:59:11
versuche es mir mit Beispielen näher zu bringen
Wenn Du lernen möchtest, dann würde ich so vorgehen:
- Falls Fehler im log, dann beheben.
- Keine Fehler im log, dann mit "Log" die Stellen im Code debuggen, die dafür zuständig seien könnten.
z.B. Wenn Du in der Zeile über "if ($values[0] eq $tomorrow)" folgendes schreibst, dann siehst Du im log z.B. ob die Bedingung zutreffen wird oder nicht.
Log 3, "values[0]: " . $values[0] . " / tomorrow: " . $tomorrow;
Wenn ich die Zeile eintrage dann kommen nur noch Fehlermeldungen bzgl der $ values und RemovalCheckvalues
Der Autor des Moduls schreibt:
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.
also gehe ich davon aus, dass strftime "%d.%m.%y" = 07.12.15 ist und dann mit +86400 die Variable $tomorrow gleich "08.12.15" enthält. Wo liege ich da falsch ?
Zitat von: raspklaus am 07 Dezember 2015, 15:14:13
Wenn ich die Zeile eintrage dann kommen nur noch Fehlermeldungen bzgl der $ values und RemovalCheckvalues
Und wie lautet die Fehlermeldung?
2015.12.07 15:21:14 5: Triggering RemovalCheck
2015.12.07 15:21:14 4: RemovalCheck exec {
my $RemovalBlack = "off";;
my $RemovalBrown = "off";;
my $RemovalGreen = "off";;
my $RemovalYellow = "off";;
my $rcal= fhem("get Abfall text all 4",1);;
my RemovalCheckevents = split ("\n", $rcal);;
my $tomorrow = strftime "%d.%m.%y", localtime(time + 86400);;
Log 3, "tomorrow:" . $tomorrow .
foreach my $event (RemovalCheckevents)
{
my $values = split(" ", $event);;
Log 3, "values[0]: " . $values[0] . " / tomorrow: " . $tomorrow;;
if ($values[0] eq $tomorrow)
{
if ($values[3] eq "Restmüll") {$RemovalBlack = "on"}
elsif ($values[3] eq "Biotonne") {$RemovalBrown = "on"}
elsif ($values[3] eq "Papiertonne") {$RemovalGreen = "on"}
elsif ($values[3] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");;
fhem("set RemovalBrown $RemovalBrown");;
fhem("set RemovalGreen $RemovalGreen");;
fhem("set RemovalYellow $RemovalYellow");;
return;;
}
2015.12.07 15:21:14 1: PERL WARNING: "my" variable $event masks earlier declaration in same statement at (eval 253) line 13.
2015.12.07 15:21:14 3: eval: {
my $RemovalBlack = "off";
my $RemovalBrown = "off";
my $RemovalGreen = "off";
my $RemovalYellow = "off";
my $rcal= fhem("get Abfall text all 4",1);
my RemovalCheckevents = split ("\n", $rcal);
my $tomorrow = strftime "%d.%m.%y", localtime(time + 86400);
Log 3, "tomorrow:" . $tomorrow .
foreach my $event (RemovalCheckevents)
{
my $values = split(" ", $event);
Log 3, "values[0]: " . $values[0] . " / tomorrow: " . $tomorrow;
if ($values[0] eq $tomorrow)
{
if ($values[3] eq "Restmüll") {$RemovalBlack = "on"}
elsif ($values[3] eq "Biotonne") {$RemovalBrown = "on"}
elsif ($values[3] eq "Papiertonne") {$RemovalGreen = "on"}
elsif ($values[3] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");
fhem("set RemovalBrown $RemovalBrown");
fhem("set RemovalGreen $RemovalGreen");
fhem("set RemovalYellow $RemovalYellow");
return;
}
2015.12.07 15:21:14 1: PERL WARNING: "my" variable $tomorrow masks earlier declaration in same scope at (eval 253) line 14.
2015.12.07 15:21:14 3: eval: {
my $RemovalBlack = "off";
my $RemovalBrown = "off";
my $RemovalGreen = "off";
my $RemovalYellow = "off";
my $rcal= fhem("get Abfall text all 4",1);
my RemovalCheckevents = split ("\n", $rcal);
my $tomorrow = strftime "%d.%m.%y", localtime(time + 86400);
Log 3, "tomorrow:" . $tomorrow .
foreach my $event (RemovalCheckevents)
{
my $values = split(" ", $event);
Log 3, "values[0]: " . $values[0] . " / tomorrow: " . $tomorrow;
if ($values[0] eq $tomorrow)
{
if ($values[3] eq "Restmüll") {$RemovalBlack = "on"}
elsif ($values[3] eq "Biotonne") {$RemovalBrown = "on"}
elsif ($values[3] eq "Papiertonne") {$RemovalGreen = "on"}
elsif ($values[3] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");
fhem("set RemovalBrown $RemovalBrown");
fhem("set RemovalGreen $RemovalGreen");
fhem("set RemovalYellow $RemovalYellow");
return;
}
2015.12.07 15:21:14 1: PERL WARNING: "my" variable @values masks earlier declaration in same scope at (eval 253) line 18.
2015.12.07 15:21:14 3: eval: {
my $RemovalBlack = "off";
my $RemovalBrown = "off";
my $RemovalGreen = "off";
my $RemovalYellow = "off";
my $rcal= fhem("get Abfall text all 4",1);
my RemovalCheckevents = split ("\n", $rcal);
my $tomorrow = strftime "%d.%m.%y", localtime(time + 86400);
Log 3, "tomorrow:" . $tomorrow .
foreach my $event (RemovalCheckevents)
{
my $values = split(" ", $event);
Log 3, "values[0]: " . $values[0] . " / tomorrow: " . $tomorrow;
if ($values[0] eq $tomorrow)
{
if ($values[3] eq "Restmüll") {$RemovalBlack = "on"}
elsif ($values[3] eq "Biotonne") {$RemovalBrown = "on"}
elsif ($values[3] eq "Papiertonne") {$RemovalGreen = "on"}
elsif ($values[3] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");
fhem("set RemovalBrown $RemovalBrown");
fhem("set RemovalGreen $RemovalGreen");
fhem("set RemovalYellow $RemovalYellow");
return;
}
2015.12.07 15:21:14 1: PERL WARNING: "my" variable @values masks earlier declaration in same scope at (eval 253) line 19.
2015.12.07 15:21:14 3: eval: {
my $RemovalBlack = "off";
my $RemovalBrown = "off";
my $RemovalGreen = "off";
my $RemovalYellow = "off";
my $rcal= fhem("get Abfall text all 4",1);
my RemovalCheckevents = split ("\n", $rcal);
my $tomorrow = strftime "%d.%m.%y", localtime(time + 86400);
Log 3, "tomorrow:" . $tomorrow .
foreach my $event (RemovalCheckevents)
{
my $values = split(" ", $event);
Log 3, "values[0]: " . $values[0] . " / tomorrow: " . $tomorrow;
if ($values[0] eq $tomorrow)
{
if ($values[3] eq "Restmüll") {$RemovalBlack = "on"}
elsif ($values[3] eq "Biotonne") {$RemovalBrown = "on"}
elsif ($values[3] eq "Papiertonne") {$RemovalGreen = "on"}
elsif ($values[3] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");
fhem("set RemovalBrown $RemovalBrown");
fhem("set RemovalGreen $RemovalGreen");
fhem("set RemovalYellow $RemovalYellow");
return;
}
2015.12.07 15:21:14 1: PERL WARNING: "my" variable @values masks earlier declaration in same scope at (eval 253) line 20.
2015.12.07 15:21:14 3: eval: {
my $RemovalBlack = "off";
my $RemovalBrown = "off";
my $RemovalGreen = "off";
my $RemovalYellow = "off";
my $rcal= fhem("get Abfall text all 4",1);
my RemovalCheckevents = split ("\n", $rcal);
my $tomorrow = strftime "%d.%m.%y", localtime(time + 86400);
Log 3, "tomorrow:" . $tomorrow .
foreach my $event (RemovalCheckevents)
{
my $values = split(" ", $event);
Log 3, "values[0]: " . $values[0] . " / tomorrow: " . $tomorrow;
if ($values[0] eq $tomorrow)
{
if ($values[3] eq "Restmüll") {$RemovalBlack = "on"}
elsif ($values[3] eq "Biotonne") {$RemovalBrown = "on"}
elsif ($values[3] eq "Papiertonne") {$RemovalGreen = "on"}
elsif ($values[3] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");
fhem("set RemovalBrown $RemovalBrown");
fhem("set RemovalGreen $RemovalGreen");
fhem("set RemovalYellow $RemovalYellow");
return;
}
2015.12.07 15:21:14 3: RemovalCheck return value: No such class RemovalCheckevents at (eval 253) line 8, near ";
my RemovalCheckevents"
syntax error at (eval 253) line 8, near "my RemovalCheckevents ="
syntax error at (eval 253) line 11, near ".
foreach "
syntax error at (eval 253) line 28, near ";
}"
Die Zeile ist falsch:
Log 3, "tomorrow:" . $tomorrow .
Sorry, das macht keinen Sinn, da Du nicht die elementarsten Perlgrundlagen kennst.
Lies ein Perl-Einsteigerbuch oder finde jemanden, der Dir Copy&Paste Code liefert.
Sorry, das war nach einem weiteren Versuch das Ergebnis. Wenn ich die Originalzeile über das Webinterface eintrage kommt:
2015.12.07 15:48:29 5: Triggering RemovalCheck
2015.12.07 15:48:29 4: RemovalCheck exec {
my $RemovalBlack = "off";;
my $RemovalBrown = "off";;
my $RemovalGreen = "off";;
my $RemovalYellow = "off";;
my $rcal= fhem("get Abfall text all 4",1);;
my @events = split ("\n", $rcal);;
my $tomorrow = strftime "%d.%m.%y", localtime(time + 86400);;
Log 3, "values[0]: " . $values[0] . " / tomorrow: " . $tomorrow;;
foreach my $event (@events)
{
my $values = split(" ", $event);;
if ($values[0] eq $tomorrow)
{
if ($values[3] eq "Restmüll") {$RemovalBlack = "on"}
elsif ($values[3] eq "Biotonne") {$RemovalBrown = "on"}
elsif ($values[3] eq "Papiertonne") {$RemovalGreen = "on"}
elsif ($values[3] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");;
fhem("set RemovalBrown $RemovalBrown");;
fhem("set RemovalGreen $RemovalGreen");;
fhem("set RemovalYellow $RemovalYellow");;
return;;
}
2015.12.07 15:48:29 3: RemovalCheck return value: Global symbol "@values" requires explicit package name at (eval 274) line 10.
Global symbol "@values" requires explicit package name at (eval 274) line 16.
Global symbol "@values" requires explicit package name at (eval 274) line 18.
Global symbol "@values" requires explicit package name at (eval 274) line 19.
Global symbol "@values" requires explicit package name at (eval 274) line 20.
Global symbol "@values" requires explicit package name at (eval 274) line 21.
Du solltest das, was dir hier gesagt wird, auch anwenden. Arrays werden mit @ bezeichnet.
my $values = split(" ", $event);
->
my @values = split(" ", $event);
Ich würde dir raten, dir ein Perl-Handbuch zu Gemüte zu führen. Dann sparst du dir hier die Ratespiele.
Dem obigen Hinweisen kann ichmir nur anschließen.
https://wiki.selfhtml.org/wiki/Perl
LG
pah
Ok Marvin, das habe ich jetzt durch Lektüre begriffen. Scheint auch jetzt etwas besser zu funktionieren. Trotzdem noch etwas unerklärliche Fehlermeldungen nach einem trigger.
2015.12.07 19:15:12 5: Triggering RemovalCheck
2015.12.07 19:15:12 4: RemovalCheck exec {
my $RemovalBlack = "off";;
my $RemovalBrown = "off";;
my $RemovalGreen = "off";;
my $RemovalYellow = "off";;
my $rcal= fhem("get Abfall text all 4",1);;
my RemovalCheckevents = split ("\n", $rcal);;
my $tomorrow = strftime "%d.%m.%y", localtime(time + 86400);;
foreach my $event (RemovalCheckevents)
{
my RemovalCheckvalues = split(" ", $event);;
if (RemovalCheckvalues[0] eq $tomorrow)
{
if (RemovalCheckvalues[3] eq "Restmüll") {$RemovalBlack = "on"}
elsif (RemovalCheckvalues[3] eq "Biotonne") {$RemovalBrown = "on"}
elsif (RemovalCheckvalues[3] eq "Papiertonne") {$RemovalGreen = "on"}
elsif (RemovalCheckvalues[3] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");;
fhem("set RemovalBrown $RemovalBrown");;
fhem("set RemovalGreen $RemovalGreen");;
fhem("set RemovalYellow $RemovalYellow");;
return;;
}
2015.12.07 19:15:12 3: RemovalCheck return value: No such class RemovalCheckevents at (eval 291) line 8, near ";
my RemovalCheckevents"
syntax error at (eval 291) line 8, near "my RemovalCheckevents ="
No such class RemovalCheckvalues at (eval 291) line 13, near "{
my RemovalCheckvalues"
syntax error at (eval 291) line 13, near "my RemovalCheckvalues ="
syntax error at (eval 291) line 15, near "RemovalCheckvalues["
Global symbol "$RemovalGreen" requires explicit package name at (eval 291) line 19.
Global symbol "$RemovalYellow" requires explicit package name at (eval 291) line 20.
Global symbol "$RemovalBrown" requires explicit package name at (eval 291) line 24.
Global symbol "$RemovalGreen" requires explicit package name at (eval 291) line 25.
Global symbol "$RemovalYellow" requires explicit package name at (eval 291) line 26.
syntax error at (eval 291) line 28, near ";
}"
(eval 291) has too many errors.
Hast du den Logeintrag mal gelesen? Daraus geht eindeutig hervor, wo der Fehler zu finden ist:
my RemovalCheckevents = split ("\n", $rcal);;
->
my @RemovalCheckevents = split ("\n", $rcal);;
Bitte versuche zu verstehen, was du da machst. Das hier ist wieder der gleiche Fehler, nur in einer anderen Ausprägung. Der Fehler setzt sich dann im weitern Verlauf des Codes fort (soll heißen, es gibt noch mehr Fehler, die das Array RemovalCheckvalues angehen). Lese die Perl Grundlagen, die dir vorgeschlagen wurden.
Hi,
so gut ich das jetzt verstanden habe ist es geändert
2015.12.07 19:30:05 5: Triggering RemovalCheck
2015.12.07 19:30:05 4: RemovalCheck exec {
my $RemovalBlack = "off";;
my $RemovalBrown = "off";;
my $RemovalGreen = "off";;
my $RemovalYellow = "off";;
my $rcal= fhem("get Abfall 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 (RemovalCheckvalues[3] eq "Restmüll") {$RemovalBlack = "on"}
elsif (RemovalCheckvalues[3] eq "Biotonne") {$RemovalBrown = "on"}
elsif (RemovalCheckvalues[3] eq "Papiertonne") {$RemovalGreen = "on"}
elsif (RemovalCheckvalues[3] eq "Gelber") {$RemovalYellow = "on"}
}
}
fhem("set RemovalBlack $RemovalBlack");;
fhem("set RemovalBrown $RemovalBrown");;
fhem("set RemovalGreen $RemovalGreen");;
fhem("set RemovalYellow $RemovalYellow");;
return;;
}
2015.12.07 19:30:05 3: RemovalCheck return value: syntax error at (eval 311) line 17, near "RemovalCheckvalues["
syntax error at (eval 311) line 18, near "RemovalCheckvalues["
Global symbol "$RemovalYellow" requires explicit package name at (eval 311) line 20.
Global symbol "$RemovalBrown" requires explicit package name at (eval 311) line 24.
Global symbol "$RemovalGreen" requires explicit package name at (eval 311) line 25.
Global symbol "$RemovalYellow" requires explicit package name at (eval 311) line 26.
syntax error at (eval 311) line 28, near ";
}"
Er springt jetzt also in die Schleife aber ????
Zitat von: marvin78 am 07 Dezember 2015, 19:22:11
(soll heißen, es gibt noch mehr Fehler, die das Array RemovalCheckvalues angehen)
Bitte. Beschäftige dich mit dem Code (und mit Perl). Lese in der Perl-Doku (pah hat sie verlinkt) den Abschnitt über Arrays (am besten aber von vorne bis hinten).
Da ich sehr nett bin, korrigiere ich dir noch einen der Fehler
RemovalCheckvalues[3]
->
$value[3]
Den Rest schaffst du selbst.