Hauptmenü

Müllvisualisierung

Begonnen von raspklaus, 07 Dezember 2015, 12:34:40

Vorheriges Thema - Nächstes Thema

raspklaus

Hallo zusammen,

ich versuche den Codeschnipsel aus dem Threat

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 ?



dev0

zumindest
my $events = split ("\n", $rcal);;\
muss
my @events = split ("\n", $rcal);;\
lauten

raspklaus

#2
Ich dachte @ darf nicht mehr im notify benutzt werden ?

Bringt aber auch keine Änderung nach einem trigger RemovalCheck

dev0

@events ist ein array/hash. Lies Dir mal die Perlgrundlangen an.

raspklaus

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

dev0

Fällt Dir an dieser Zeile etwas auf?

my $tomorrow = strftime "%%d.%%m.%%y", localtime(time + 86400);;\

raspklaus

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

dev0

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;


raspklaus

#8
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 ?

dev0

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?

raspklaus

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


dev0

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.

raspklaus

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.

marvin78

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.

Prof. Dr. Peter Henning

Dem obigen Hinweisen kann ichmir nur anschließen.

https://wiki.selfhtml.org/wiki/Perl

LG

pah