Eine Kalenderänderung in Calendar, wie man sie wahrnimmt und verarbeitet

Begonnen von Paul Guijt, 22 Oktober 2020, 13:47:16

Vorheriges Thema - Nächstes Thema

Paul Guijt

Hallo Alle,

Wenn eine (ankommende) Kalendereintrag ändert, wie bemerkt mann dass? Und hat jemand eine Vorschlag, die Änderung zu verarbeiten?

Freundliche Grüßen,
Paul
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände

Dr. Boris Neubert

Hallo Paul,

ich habe sicherheitshalber gerade noch extra in den Code geschaut: die Änderung eines Kalendereintrags kannst Du nicht über ein Event greifen. Ich gehe dabei davon aus, dass der Kalendereintrag im Ursprungskalender gemeint ist und nicht den Wechsel des Zustands des Termins.

Im Ursprungskalender sind VEVENTs. Ein VEVENT wird in FHEM zu keinem, einem oder mehreren Terminen aufgelöst. Da ist es schon schwer überhaupt zu definieren, welche Events FHEM auslösen soll.

Wozu willst Du denn wissen, ob ein Kalendereintrag im Ursprungskalender geändert wurde? Was ist der Anwendungsfall? Vielleicht gibt es eine Lösung dafür auch ohne die Prüfung.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Paul Guijt

Hallo Boris,

Ich möchte meinen Alarm über meinen Google-Kalender planen. Aber es kann sein, dass ich nachdenklich meine Weckzeit absagen möchte.

Mein Wecker ist ein Squeezebox-Radio, das seinen Wecker einblendet, wenn es weiß, wie spät es gewünscht ist. Ich kann der Radio über FHEM einstellen, auch einen Alarm mit Weckzeit. Dies funktioniert jedoch nicht über modeStart oder modeAlarm, das ist zu spät.

Um dieses Problem zu umgehen, dachte ich daran, das Weckerereignis zwei Stunden im Voraus über modeUpcoming zu sehen und es dann im Radio einschalte, da ich in diesen zwei Stunden dazwischen (hoffentlich) schlafe.

Aber allgemeiner: Elemente in einem Kalender möchten manchmal geändert werden oder verfallen.

Freundliche Grüße,
Paul
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände

Dr. Boris Neubert

Hallo Paul,

wenn ich Deinen Anwendungsfall betrachte, würde ich wie folgt vorgehen:
- im Google-Kalender die Benachrichtigung auf 2 Stunden vor dem Termin setzen
- in FHEM ein notify auf das Alarm-Event setzen (siehe Beispiel  Inform about garbage collection in der commandref). Das notify stellt das Squeezebox-Radio auf die Weckzeit (eigentliche Startzeit des Termins).
- Updates des Kalenders häufiger als alle zwei Stunden, um neu eingestellte Wecker zu berücksichtigen.

Problem: wenn der Weckertermin nach Stellen des Squeezebox-Radios gelöscht wird, bleibt der Alarm im Squeezebox-Radio an.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Paul Guijt

Hallo Boris,

Ich habe gestern dieses gemacht:
defmod AgendaFollowUp notify Agenda:modeUpcoming:.* { my $reading="$EVTPART0";;;; my $uid= "$EVTPART1";;;; my $Format = "\$M \$T1 \$S" ;;;;\
   my $Str = fhem("get Agenda events filter:uid=='".$uid."' format:text limit:to=5400" );;;; \
   my ($Time, $What) = split( / /, $Str ) ;;;;\  \
   if ( $What eq "Wekker" ) \
        { fhem("set SB_Slaapkamer alarm1 time $Time ") ;;;; fhem("set SB_Slaapkamer alarm1 enable ") } \
   }


Heute werde ich weiter machen mit testen.

Gestern hatte ich Probleme mit der format-Option von "get events" in Perl. Fhem verschluckte sich immer wieder am $ -Zeichen. Ich habe es seitdem versucht mit der $Format, aber muss es noch testen. Ich habe bemerkt das 'switch ... case' und 'given ... when' nicht functionieren.

Freundliche Grüße,
Paul
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände

Dr. Boris Neubert

Hallo Paul,

habe die Erfahrung gemacht, dass inline-Perl-Code schwer schreibbar ist wegen der erforderlichen Maskierungen  ;;  \

Vielleicht geht es einfacher, eine 99_MyUtils.pm anzulegen und darin eine Funktion

sub wekkerchecker() {
  my ($reading, $uid)= @_;
  # ...

}


und diese im Notify mit

{ wekkerchecker($EVTPART0,$EVTPART1) }

aufzurufen.

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

Was spricht denn dagegen, das Einschalten der Squeezebox direkt über den Kalender von FHEM aus zu veranlassen, anstatt die Uhrzeit von FHEM in die Squeezebox zu übertragen?

Wenn man den eingebundenen Google Kalender beispielsweise alle 30 Minuten einliest und verarbeitet, kann man das Einschalten auch noch recht kurzfristig unterbinden, indem man den zugehörigen Termin löscht.

Alternativ könnte man auch das "Programmieren" des Weckers erst eine Minute vor der gewünschten Weckzeit durchführen. Also um 06:59 dafür sorgen, dass die Squeezebox eine Weckzeit von 07:00 erhält.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Paul Guijt

Sehr dekadent: Dann verpasst man das Einblenden des Alarmsignals ...
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände

Paul Guijt

Hallo Boris,

Agenda:modeUpcoming:.* { my $reading="$EVTPART0"; my $uid= "$EVTPART1"; my $Format = "\$T1 \$T2 \$S" ;
   my $Str = fhem("get Agenda events filter:uid=='".$uid."' format:custom='$Format' limit:to=5400" );
   my ($TimeStart,$TimeEnd,$What) = split( / /, $Str ) ;

   fhem ("setreading Agenda aan $TimeStart . $TimeEnd . $What ") ;

   }


wirkt wie gewünscht. Aber nicht wenn ich $M schreibe statt $S: $What ist dann leer. Aber für mich genügt es.

Freundliche Grüße,
Paul
RasPi 2B, CUL 433, Jens' FW, Berker, HomeMatic, KlikaanKlikuit, RFXtrx443, Squeezebox, Z-Wave, TradFri in die Niederlände

Dr. Boris Neubert

Zitat von: Paul Guijt am 24 Oktober 2020, 12:01:41
Aber nicht wenn ich $M schreibe statt $S: $What ist dann leer.

Es könnte daran liegen, dass der Mode mit Leerzeichen beginnt (rechtsbündig 9stellig). Das split greift dann ggf. nicht. Da hilft nur Debuggen.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!