Googlekalender zum schalten einsetzen, geht nicht

Begonnen von ErzGabriel, 08 Juni 2020, 19:41:49

Vorheriges Thema - Nächstes Thema

ErzGabriel

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.

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

nils_

poste doch mal ein list von deinem Kalender....
heisst der wirklich "Aktion_Kalender" ??


wo hast du denn den Code her?
viele Wege in FHEM es gibt!

ErzGabriel

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.

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

ErzGabriel

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

Otto123

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...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

ErzGabriel

Ahhh, mein Fehler. Hatte die Zeile unter die falsche Zeile eingefügt.
Habe es berichtigt aber ändern tut sich da nichts.

Otto123

#8
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

nils_

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)
viele Wege in FHEM es gibt!

Otto123

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)
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

ErzGabriel

@Otto:
Zeile 255 bis Zeile 260
      {
         #wenn ein entsprechendes Device gefunden wird
         if (true { /$Device/ } @DeviceList)
         { fhem("set $DeviceNames[ first_index { /$Device/ } @DeviceList ] $aktion");}
      }
}

Otto123

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 "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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

ErzGabriel

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.

Otto123

Vielleicht hilft Dir einer meiner Artikel 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.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz