Hallo zusammen.
Ich habe mir zwei Dummys angelegt, ein notify und ein doif. Zusätzlich habe ich ein Sub in der 99Utils angelegt.
Kalender ist eingebunden und geladen, der notify zeigt auch die zeit an, wo was passieren soll aber der Dummy schaltet nicht um. Ich weiß aber nicht wo der Fehler ist und da ich die Sub aus dem Internet kopiert habe, weil ich von Perl keine Ahnung habe, finde ich den Fehler nicht.
Deswegen möchte ich hier um Hilfe bitten.
Subroutine:
sub
Aktion_Kalender($$)
{
my ($KalenderEreignis, $KalenderUids) = @_;
my @uids=split(/;/,$KalenderUids);
my $aktion;
my @DeviceList = ("Marcus","Vera"); #Einträge im Kalender
my @DeviceNames = ("duMarcus", "duVera"); #Übersetzung zum Device
if($KalenderEreignis eq "start:") { $aktion = "on" } else { $aktion = "off" }
#falls mehrere Termine gleichzeitig starten, diese nun durchlaufen
foreach my $uid (@uids)
{
#Summary auslesen und prüfen, ob es sich um ein Device handelt
my $Device = fhem("get Aktion_Kalender summary $uid");
#falls das Device existiert, so wie es im Kalender steht kann die Schaltung direkt erfolgen
if( defined($defs{$Device}) )
{ fhem("set $Device $aktion"); }
else
{
#wenn ein entsprechendes Device gefunden wird
if (true { /$Device/ } @DeviceList)
{ fhem("set $DeviceNames[ first_index { /$Device/ } @DeviceList ] $aktion"); }
}
}
}
Notify:
defmod notAktion_Kalender notify Aktion_Kalender:(start|end):.* { Aktion_Kalender($EVTPART0, $EVTPART1)}
attr notAktion_Kalender room Kalender
setstate notAktion_Kalender 2020-06-08 19:30:00
setstate notAktion_Kalender 2020-06-08 18:20:29 state active
DOIF:
defmod doif_Aktion DOIF ([duMarcus] eq "on" )\
(set arbeit frei) DOELSE (set arbeit arbeiten)
attr doif_Aktion do always
attr doif_Aktion room Kalender
setstate doif_Aktion cmd_2
setstate doif_Aktion 2020-06-08 19:17:55 cmd 2
setstate doif_Aktion 2020-06-08 19:17:55 cmd_event doif_Aktion
setstate doif_Aktion 2020-06-08 19:17:55 cmd_nr 2
setstate doif_Aktion 2020-06-08 19:17:55 state cmd_2
DUMMY1:
defmod duMarcus dummy
attr duMarcus event-on-change-reading .*
attr duMarcus room Kalender
attr duMarcus setList on off
setstate duMarcus off
setstate duMarcus 2020-06-07 16:07:17 state off
DUMMY2:
defmod duVera dummy
attr duVera event-on-change-reading .*
attr duVera room Kalender
attr duVera setList on off
setstate duVera off
setstate duVera 2020-06-07 16:07:15 state off
Schalte ich einen der Dummys manuell ein, wird der DOIF auch ausgeführt und funktioniert einwandfrei., Deswegen schließe ich den als Fehler aus, der der Notify auch die Zeit anzeigt, wo er schalten soll, schließe ich den aus, somit bleibt nur die Subroutine und dabei bräuchte ich bitte Hilfe.
Danke.
Hi,
bau doch mal ein Logging in deine Sub ein:
unter diese Zeile
my $Device = fhem("get Aktion_Kalender summary $uid");
Fügst Du diese Zeile ein
Log 1, "Das Device heisst $Device" ;
Und schaust ins Log wenn das notify ausgelöst hat.
Gruß Otto
poste doch mal ein list von deinem Kalender....
heisst der wirklich "Aktion_Kalender" ??
wo hast du denn den Code her?
Habe die Zeile der Subroutine hinzugefügt und im Log steht jetzt folgendes.
2020.06.09 17:30:00 2: get Aktion_Kalender summary is deprecated and will be removed soon. Use get Aktion_Kalender events instead.
2020.06.09 17:30:00 3: get Aktion_Kalender summary 1oo9cstoljac2ecvgmtvfu5oqggooglecom : Marcus
2020.06.09 17:30:00 1: ERROR evaluating my $TYPE='Calendar';my $SELF='notAktion_Kalender';my $EVENT='start: 1oo9cstoljac2ecvgmtvfu5oqggooglecom ';my $NAME='Aktion_Kalender';my $EVTPART1='1oo9cstoljac2ecvgmtvfu5oqggooglecom';my $EVTPART0='start:';{ Aktion_Kalender($EVTPART0, $EVTPART1)}: Can't locate object method "true" via package "Marcus" (perhaps you forgot to load "Marcus"?) at ./FHEM/99_myUtils.pm line 257.
2020.06.09 17:30:00 3: notAktion_Kalender return value: Can't locate object method "true" via package "Marcus" (perhaps you forgot to load "Marcus"?) at ./FHEM/99_myUtils.pm line 257.
Ich habe jetzt gerade nochmal die Subroutine überprüft, ob ich einen Copy & Paste Fehler habe aber sieht genau aus, wie auf der Page, von der ich es habe.
Also wenn diese Einträge im Log wirklich neu sind, hast Du einen Fehler mit dem Log Eintrag gemacht.
Er bricht bei dieser Zeile ab, den Log Eintrag selbst sehe ich nicht.
Gruß Otto
So sieht die Sub jetzt aus.
sub
Aktion_Kalender($$)
{
my ($KalenderEreignis, $KalenderUids) = @_;
my @uids=split(/;/,$KalenderUids);
my $aktion;
my @DeviceList = ("Marcus","Vera"); #Einträge im Kalender
my @DeviceNames = ("duMarcus", "duVera"); #Übersetzung zum Device
if($KalenderEreignis eq "start:") { $aktion = "on" } else { $aktion = "off" }
#falls mehrere Termine gleichzeitig starten, diese nun durchlaufen
foreach my $uid (@uids)
{
#Summary auslesen und prüfen, ob es sich um ein Device handelt
my $Device = fhem("get Aktion_Kalender summary $uid");
#falls das Device existiert, so wie es im Kalender steht kann die Schaltung direkt erfolgen
if( defined($defs{$Device}) )
{ fhem("set $Device $aktion"); }
else
{
#wenn ein entsprechendes Device gefunden wird
if (true { /$Device/ } @DeviceList)
{ fhem("set $DeviceNames[ first_index { /$Device/ } @DeviceList ] $aktion"); }
Log 1, "Das Device heisst $Device" ;
}
}
}
Ich meinte es so:
my $Device = fhem("get Aktion_Kalender summary $uid");
Log 1, "Das Device heisst $Device" ;
Sehe jetzt auf die Schnelle nicht wo der Fehler ist. Muss erstmal weg...
Ahhh, mein Fehler. Hatte die Zeile unter die falsche Zeile eingefügt.
Habe es berichtigt aber ändern tut sich da nichts.
Was steht in der Zeile 257
Zitatat ./FHEM/99_myUtils.pm line 257.
bzw. auch ein paar Zeilen davor und danach. Oder wenn Du magst in Deiner 99_myUtils.pm?
Gruß Otto
ich wieerhole mal meine frage :)
Zitat von: nils_ am 09 Juni 2020, 08:58:59
wo hast du denn den Code her?
was macht denn diese Zeile??
if (true { /$Device/ } @DeviceList)
Und meine Anmerkung zu nils seiner Frage:
Wenn das hier zu kompliziert wird das fremde Problem zu lösen: In der Doku (commandref) stehen gute, knackige und funktionierende Beispiele zu genau dieser Funktionalität! 8)
@Otto:
Zeile 255 bis Zeile 260
{
#wenn ein entsprechendes Device gefunden wird
if (true { /$Device/ } @DeviceList)
{ fhem("set $DeviceNames[ first_index { /$Device/ } @DeviceList ] $aktion");}
}
}
Naja ok, da sich zwischen dem Code und heute das Modul weiterentwickelt hat, kommt nicht das zurück was der Code erwartet.
Zitat2020.06.09 17:30:00 2: get Aktion_Kalender summary is deprecated and will be removed soon. Use get Aktion_Kalender events instead.
2020.06.09 17:30:00 3: get Aktion_Kalender summary 1oo9cstoljac2ecvgmtvfu5oqggooglecom : Marcus
Du musst also eventuell den Befehl
my $Device = fhem("get Aktion_Kalender summary $uid");
vielleicht in sowas (aus der commandref Abschnitt Calendar (https://fhem.de/commandref_DE.html#Calendar) "Schalte Aktoren an und aus"):
my $Device = fhem('get Aktion_Kalender filter:uid=="'.$uid.'" format:custom="$S"')
Aber da musst Du erstmal interaktiv probieren. Die uid hast Du ja. Probier es einfach in der Oberfläche aus und bau Dir den Befehl entsprechen zusammen.
Gruß Otto
Hi Otto.
Danke für Deine Mühen, verstehe zwar gerade nur Bahnhof aber ich werde mich da durchlesen und schauen, ob ich klar komme.
1. Schlau machen, wie man sowas manuell testet.
2. Informieren, wie ich die besagte Zeile zusammen bauen muss.
3. In die Subroutine einbauen und testen, ob es dann läuft.
Vielleicht hilft Dir einer meiner Artikel (https://heinz-otto.blogspot.com/search?q=kalender)dabei weiter.
Es ist nicht so schwer und glaub mir, es ist gut wenn Du das ein bisschen verstehst. Bei dem richtigen Perl Code kann Dir jeder helfen, aber bei der Abfrage deines Kalenders wird es schwierig. Das muss man interaktiv probieren.
Deinen digitalen Notizblock habe ich schon mal durch blättert. Ist echt gut gemacht, schlicht und doch informativ. Ein Inhaltsverzeichnis wäre noch super.