FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ErzGabriel am 08 Juni 2020, 19:41:49

Titel: Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: ErzGabriel am 08 Juni 2020, 19:41:49
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.
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: Otto123 am 08 Juni 2020, 21:45:36
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
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: nils_ am 09 Juni 2020, 08:58:59
poste doch mal ein list von deinem Kalender....
heisst der wirklich "Aktion_Kalender" ??


wo hast du denn den Code her?
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: ErzGabriel am 09 Juni 2020, 17:36:52
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.
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: Otto123 am 09 Juni 2020, 17:51:05
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
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: ErzGabriel am 09 Juni 2020, 17:54:07
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" ;
}
}
}
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: Otto123 am 09 Juni 2020, 17:58:14
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...
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: ErzGabriel am 09 Juni 2020, 18:15:36
Ahhh, mein Fehler. Hatte die Zeile unter die falsche Zeile eingefügt.
Habe es berichtigt aber ändern tut sich da nichts.
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: Otto123 am 09 Juni 2020, 20:38:27
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
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: nils_ am 10 Juni 2020, 09:56:36
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)
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: Otto123 am 10 Juni 2020, 10:05:36
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)
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: ErzGabriel am 10 Juni 2020, 19:03:39
@Otto:
Zeile 255 bis Zeile 260
      {
         #wenn ein entsprechendes Device gefunden wird
         if (true { /$Device/ } @DeviceList)
         { fhem("set $DeviceNames[ first_index { /$Device/ } @DeviceList ] $aktion");}
      }
}
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: Otto123 am 10 Juni 2020, 21:05:01
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
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: ErzGabriel am 10 Juni 2020, 21:25:46
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.
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: Otto123 am 10 Juni 2020, 21:30:14
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.
Titel: Antw:Googlekalender zum schalten einsetzen, geht nicht
Beitrag von: ErzGabriel am 10 Juni 2020, 21:33:29
Deinen digitalen Notizblock habe ich schon mal durch blättert. Ist echt gut gemacht, schlicht und doch informativ. Ein Inhaltsverzeichnis wäre noch super.