Urlaubskalender mit notify nach Wiki-Artikel funktioniert nicht

Begonnen von fhemthom, 19 Juni 2022, 12:15:12

Vorheriges Thema - Nächstes Thema

fhemthom

Hallo,

ich habe mir nach https://wiki.fhem.de/wiki/Wochenende,_Feiertage_und_Schulferien#Feiertage_mittels_Internet-Kalender einen Urlaubskalender gebaut:

define Urlaubstage Calendar ical file ./my_config/urlaub.ics 300
setuuid Urlaubstage 5c73d783-f33f-2301-6830-518c006143a79066
attr Urlaubstage hideOlderThan 31d
attr Urlaubstage icon time_calendar
attr Urlaubstage room Kalender


define Urlaubstag dummy
setuuid Urlaubstag 5c73d783-f33f-2301-684c-91b6fd4cddc1df02
attr Urlaubstag icon time_calendar
attr Urlaubstag room Kalender
define n_Urlaubstag notify Urlaubstage:changed:.*(start|end) {\
   my $stat=($EVTPART2 eq "start")?1:0;;\
   fhem("set Urlaubstag $stat") if defined fhem('get '.$NAME.' events filter:uid=="'.\
         $EVTPART1.'",field(summary)=~"(?i)Urlaub" limit:count=1,from=0',1)\
}
setuuid n_Urlaubstag 61d41cd0-f33f-bd54-8309-081662b2a0e58c6b


Die start und stop Events eines Kalendereintrags kann ich im Eventmonitor sehen, von Hand kann ich Events auch erfolgreich testen (mit trigger), soweit alles ok.
Allerdings triggert wenn ich das ganze nun laufen lasse nur das start Event den zugehörigen notify, das end Event bleibt unbeachtet und der Urlaubstag bleibt (einmal getriggert) ständig auf  '1'.

In den Internals des notify sehe ich allerdings auch folgendes wenn ich auf das Ausraufezeichen hinter der Regexp klicke:

Could not optimize the regexp:

    Urlaubstage:changed:.*(start|end)

How I tried (notifyRegexpCheck):

    Urlaubstage:changed:.*(start: device Urlaubstage (OK)
    end): unknown (ignored)


Ich vermute, dass da der Fehler liegt - nur wie behebe ich das und falls das stimmt: ist dann nicht der Wiki-Artikel an der Stelle falsch?

Danke für alle Hinweise!

Beta-User

Das mit dem nicht erkannten NOTIFYDEF ist vermutlich nicht das Problem, das kann man durch Anpassung des triggers lösen.

defmod n_Urlaubstag notify Urlaubstage:changed:.*start|Urlaubstage:changed:.*end { \
[...]
}

Sind das "sehr kurze" Einträge, bei denen Start und Ende zusammenfällt? Dann hast du uU. eben keine zwei Auswertungen, sondern nur eine (für den Eventstapel mit start+end-Events). In der commandref zu Calendar sollte eine Abhilfe für sowas zu finden sein.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

DetlefR

ZitatDie start und stop Events eines Kalendereintrags kann ich im Eventmonitor sehen
Zitatdefine n_Urlaubstag notify Urlaubstage:changed:.*(start|end)

Nur mal so. Ohne Kommentar

fhemthom

Zitat von: DetlefR am 19 Juni 2022, 17:24:51
Nur mal so. Ohne Kommentar

start und end ist schon richtig. Ich hatte es in der Beschreibung des Problems missverständlich formuliert - sorry.

Zitat von: Beta-User am 19 Juni 2022, 14:33:33
Das mit dem nicht erkannten NOTIFYDEF ist vermutlich nicht das Problem, das kann man durch Anpassung des triggers lösen.

defmod n_Urlaubstag notify Urlaubstage:changed:.*start|Urlaubstage:changed:.*end { \
[...]
}


vielen Dank, das hat zumindest das gelöst!

Zitat von: Beta-User am 19 Juni 2022, 14:33:33
Sind das "sehr kurze" Einträge, bei denen Start und Ende zusammenfällt? Dann hast du uU. eben keine zwei Auswertungen, sondern nur eine (für den Eventstapel mit start+end-Events). In der commandref zu Calendar sollte eine Abhilfe für sowas zu finden sein.

Nein, die Urlaubstag-Einträge sind vollkommen unterschiedlich. Mal ein Tag, mal eine Woche, mehrere Tage am Stück, eine halbe Stunde... Das Ergebnis ist immer gleich. start triggert zuverlässig den notify, end niemals.

Beta-User

Zitat von: fhemthom am 20 Juni 2022, 11:09:23
Nein, die Urlaubstag-Einträge sind vollkommen unterschiedlich. Mal ein Tag, mal eine Woche, mehrere Tage am Stück, eine halbe Stunde... Das Ergebnis ist immer gleich. start triggert zuverlässig den notify, end niemals.
triggert oder führt nicht zum gewünschten Ergebnis?

Hier mal mein "Zwischenteil", müßte eigentlich funktionieren, die Abfrage ist aber etwas weniger rigide, vielleicht macht das Probleme iVm. dem "end"-Event:
    my $UID = $EVTPART1;;\
    my $cmd = $EVTPART2;;\
    my $MYACTOR = fhem('get Familienkalender events format:custom="$S" filter:uid=="'.$UID.'" limit:count=1') ;;\
    $cmd = $cmd eq 'start' ?  1 : 0;;\
       CommandSet(undef, "Ferientag $cmd") if ($MYACTOR =~ /ferien/);;\
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

fhemthom

Zitat von: Beta-User am 20 Juni 2022, 13:15:25
triggert oder führt nicht zum gewünschten Ergebnis?

Ich meine damit, dass Start- und Endzeit des Termins aus dem ics ein Event im Eventmonitor werfen - das notify wird aber nur beim Startevent auf 1 gesetzt und beim Endevent nicht wieder auf 0.

Zitat von: Beta-User am 20 Juni 2022, 13:15:25
Hier mal mein "Zwischenteil", müßte eigentlich funktionieren, die Abfrage ist aber etwas weniger rigide, vielleicht macht das Probleme iVm. dem "end"-Event:
    my $UID = $EVTPART1;;\
    my $cmd = $EVTPART2;;\
    my $MYACTOR = fhem('get Familienkalender events format:custom="$S" filter:uid=="'.$UID.'" limit:count=1') ;;\
    $cmd = $cmd eq 'start' ?  1 : 0;;\
       CommandSet(undef, "Ferientag $cmd") if ($MYACTOR =~ /ferien/);;\


Danke, aber mir fehlt leider das notwendige Know-How das auf meinen Fall umzuschreiben.

Beta-User

Vermutlich macht das ",from=0" Probleme.

Würde das mal löschen und noch eine Zeile einfügen:
my $stat=($EVTPART2 eq "start")?1:0;;\
   fhem("setreading Urlaubstag test $stat");;\

Damit solltest du sehen, ob es an der if-Bedingung liegt.

Ansonsten kann ich nur empfehlen, dich mit der Perl-Syntax zu befassen, ohne wirst du bei FHEM nicht glücklich.
(Mein Schnippsel entspricht übrigens auch nicht mehr dem, was ich heute schreiben würde...).

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

fhemthom

Zitat von: Beta-User am 20 Juni 2022, 14:40:38
Vermutlich macht das ",from=0" Probleme.

Würde das mal löschen und noch eine Zeile einfügen:
my $stat=($EVTPART2 eq "start")?1:0;;\
   fhem("setreading Urlaubstag test $stat");;\

Damit solltest du sehen, ob es an der if-Bedingung liegt.

Vielen Dank - das Reading test wird beim start des Termins auf 1 und beim end wieder auf 0 gesetzt, also liegt es an dem if? Wie muss ich das denn dann ändern, dass es passt?

Zitat von: Beta-User am 20 Juni 2022, 14:40:38
Ansonsten kann ich nur empfehlen, dich mit der Perl-Syntax zu befassen, ohne wirst du bei FHEM nicht glücklich.

Bisher bin ich mit der FHEM-Dokumentation immer recht gut klargekommen. Was die Perl-Syntax angeht, so wird das bei mir allerdings nichts mehr werden. Mir fehlen dafür fundamentale Grundkenntnisse... Daher bin ich sehr froh über die vielen Beispiele hier im Forum und im Wiki - aber in diesem Fall funktioniert das bei mir leider nicht :(

Beta-User

Zitat von: Beta-User am 20 Juni 2022, 14:40:38
Würde das mal löschen und noch eine Zeile einfügen:
Hast du nur das zusätzliche Reading eingefügt oder auch das if angepaßt wie vorgeschlagen?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

fhemthom

Zitat von: Beta-User am 20 Juni 2022, 17:42:09
Hast du nur das zusätzliche Reading eingefügt oder auch das if angepaßt wie vorgeschlagen?

Ich habe jetzt erstmal nur das Reading eingefügt und alles andere auskommentiert. Ich weiss ja eben nicht wie ich das if bei mir anpassen muss, damit es passt...

fhemthom

Ich habe das jetzt so angepasst, dass ich aus dem Beispiel aus dem Forum nur das from=0 entfernt habe:

define n_Urlaubstag notify Urlaubstage:changed:.*start|Urlaubstage:changed:.*end { \
   my $stat=($EVTPART2 eq "start")?1:0;;\
   fhem("set Urlaubstag $stat") if defined fhem('get '.$NAME.' events filter:uid=="'.\
#         $EVTPART1.'",field(summary)=~"(?i)Urlaub" limit:count=1,from=0',1)\
         $EVTPART1.'",field(summary)=~"(?i)Urlaub" limit:count=1',1)\
}


was auch immer das machen soll... So funktioniert das bei mir nun. Vielen Dank für die Unterstützung!

Beta-User

Zitat von: fhemthom am 20 Juni 2022, 18:34:34
Ich habe das jetzt so angepasst, dass ich aus dem Beispiel aus dem Forum nur das from=0 entfernt habe
[...]
was auch immer das machen soll... So funktioniert das bei mir nun. Vielen Dank für die Unterstützung!
Das steht in der commandref unter "<limitSpec>".
Kann sein, dass da unterschiedliche Zeitformate eine Rolle spielen, was vermutlich auch der Grund war, warum ich mein notify auch entsprechend geändert hatte (aber wohl vor der Wiki-Änderung). Wie dem auch sei, im Wiki hab ich's jetzt auch die from-Zeitgrenze rausgenommen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

fhemthom

Moin,

ich muss das mal wieder hochholen, da es nicht mehr funktioniert. Warum auch immer - ich bin am verzweifeln :(
Die Definition des notify sieht so aus:

Urlaubstage:changed:.*start|Urlaubstage:changed:.*end {
   my $stat=($EVTPART2 eq "start")?1:0;
   fhem("set Urlaubstag $stat") if defined fhem('get '.$NAME.' events filter:uid=="'.
#         $EVTPART1.'",field(summary)=~"(?i)Urlaub" limit:count=1,from=0',1)
         $EVTPART1.'",field(summary)=~"(?i)Urlaub" limit:count=1',1)
}


Es wird allerdings nur das start event getriggert, niemals das "end" event. Die triggeredByEvent Zeit steht - obwohl das Event schon lange vorbei ist immer noch auf "changed: ID_DES_EVENTS end" Spannend ist - dass wenn ich das "end" von Hand triggere mit:

trigger Urlaubstage changed: ID_DES_EVENTS end


wird der Urlaubstag auf 0 gesetzt.

Kann mir hier nochmal jemand helfen bitte? Ich habe mal wieder keine Ahnung wo ich ansetzen soll. Zu allem Überfluss sagt mir das Log auch noch:

get Urlaubstage end is deprecated and will be removed soon. Use get Urlaubstage events instead.

Das heisst ich muss das sowieso bald wieder anfannse? *seufz*

Otto123

#13
Hi,

ich meine: die Zeile mit Kommentar versehen funktioniert an der Stelle nicht. Das ist mitten im String. Ich würde die Zeile löschen, ich "merke" mir so etwas immer vorübergehen im Kommentar. Kann aber sein da liege ich falsch, aber auf alle Fälle sieht das gruselig aus ;)

Ich fürchte den Fehler im Wiki habe ich seinerzeit da rein gebracht.  :o sorry
Habe ich später irgendwann gemerkt, beim "Event mit end" ist ja quasi gerade alles vorbei, from 0 liefert dann nichts mehr.

Kommt die Meldung im Log von etwas anderem? Du machst in dem notify kein get ... end,  zumindest kann ich mir das mit dem Code nicht erklären.

Du sagst der Event mit end kommt nicht mehr? Was ist das für ein Kalender der die Events liefert? Sind da die Termine irgendwie "komisch", hast Du da was geändert?

Mach mal eine get ... events Abfrage mit dem Filter (oder spiele selbst um den Sinn zu verstehen. Erklärung steht in der commandref)
format:custom="$M : $U : $T1-$T2" filter:field(summary)=~"(?i)Urlaub" limit:count=10,from=-5d da sollten "end" Einträge kommen.
Ein Sonderfall sind nämlich Serientermine, deswegen kam ursächlich die from=0 ins Spiel. Sonst bekommt man einen uralten Termin zurück, dachte ich. Aber eigentlich ist das egal, der Event ist ja aktuell.

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

fhemthom

Zitat von: Otto123 am 04 Oktober 2022, 09:25:56
ich meine: die Zeile mit Kommentar versehen funktioniert an der Stelle nicht. Das ist mitten im String. Ich würde die Zeile löschen, ich "merke" mir so etwas immer vorübergehen im Kommentar. Kann aber sein da liege ich falsch, aber auf alle Fälle sieht das gruselig aus ;)

Meehh...  :o
Du hast natürlich Recht.

vielen Dank für den Pointer - jetzt geht es (wieder).