Moin,
ich habe ein Kalender für unser Ferienhaus angelegt, damit möchte ich einen Dummy steuern. Der Dummy soll nur anzeigen, ob das Ferienhaus belegt ist.
List Kalender:
Internals:
DEF ical url https://calendar.google.com/calendar/ical/XXXXXXXXXXXXXXXXXXXXX%40import.calendar.google.com/public/basic.ics 2600
FUUID 618e8606-f33f-ae29-0140-1afc252464f9e08e
NAME FerienhausKalender
NOTIFYDEV global
NR 364
NTFY_ORDER 50-FerienhausKalender
STATE triggered
TYPE Calendar
READINGS:
2021-11-19 08:43:03 calname https://www.traum-ferienwohnungen.de/ical/xxxxxxxxxxxxxxxxxx/47267.ics?provider=1
2021-11-19 08:43:03 lastUpdate 2021-11-19 08:43:02
2021-11-19 08:43:03 nextUpdate 2021-11-19 09:26:22
2021-11-19 08:43:03 nextWakeup 2021-11-19 09:26:22
2021-11-19 08:43:03 state triggered
Attributes:
DbLogExclude .*
hideLaterThan 30d
hideOlderThan 1d
onCreateEvent { $e->{alarm}= $e->{start}-86400 }
room FEWO
Ein
get FerienhausKalender events format:custom="$A $T1-$T2"
ergibt:
17.11.2021 00:00 18.11.2021 00:00-28.11.2021 00:00
26.11.2021 00:00 27.11.2021 00:00-29.11.2021 00:00
01.12.2021 00:00 02.12.2021 00:00-11.12.2021 00:00
13.12.2021 00:00 14.12.2021 00:00-24.12.2021 00:00
Jetzt würde ich gerne ein DOIF anlegen, welches prüft, ob ein Termin für den heutigen Tag im Kalender steht und wenn ja, dann setzte den Dummy FWEO auf belegt, wenn nicht, dann Dummy Fewo auf unbelegt.
In den Beispielen, die ich bisher gefunden habe, wird immer ein bestimmter Betreff benötigt, um einen Dummy zu steuern. Der Betreff ist aber immer unterschiedlich und ich kann ihn nicht beeinflussen, da der Kalender von unserem Ferienhaus Portal zur Verfügung gestellt wird.
Wenn ich jetzt ein DOIF anlege mit folgendem Inhalt, funktioniert das dann so, wie ich mir das denke?
defmod FEWO_CHECK DOIF (defined fhem('get FerienhausKalender events limit:when=today'))\
(set FEWO Belegt)\
DOELSE\
(set FEWO Unbelegt)
...falls du auf dummy verzichten magst und stattdessen eine .holiday und ein holiday-Device verwenden könntest, wäre evtl. in https://forum.fhem.de/index.php/topic,85759.msg1167954.html#msg1167954 eine Lösungsmöglichkeit für das Problem zu finden.
Als regex müßte dann ein ".*" passen, wenn die summary beliebig ist.
Weiterer Vorteil: Du siehst die summary als state (zumindest, wenn ich das richtig im Kopf habe).
Hi,
das funktioniert ohne dummy oder weitere Devices direkt im Calendardevice mit einem userReadings. Die Frage ist, wie es genau angezeigt werden soll: aktuell? Mit Vorlauf?
Ich habe ein Beispiel für die Abfalltonne, das lässt sich dafür abwandeln / vereinfachen.
Gruß Otto
Ein Calendar-device + ein dummy-device + ein DOIF-device.
Mal schauen, ob jemandem eine noch kompliziertere Lösung für eine so einfache Aufgabe einfällt.
Ich mach mal Popcorn.
[OT]
Zitat von: betateilchen am 19 November 2021, 10:20:44Mal schauen, ob jemandem eine noch kompliziertere Lösung für eine so einfache Aufgabe einfällt.
Ich mach mal Popcorn.
Per cronjob und wget die Ical-abholen, das Ganze mit python (https://stackoverflow.com/questions/3408097/parsing-files-ics-icalendar-using-python) parsen und in JSON (https://www.w3schools.com/python/python_json.asp) konvertieren sowie lokal abspeichern und dann per MQTT client (via cronjob) an den FHEM MQTT2 Server senden; dort dann per notify drauf reagieren und einen Dummy befüllen, der ein DOIF auslöst? :o ;D
Ich meine, man könnte noch eine datenbank zwischenhängen - was einfaches wie PostgreSQL oder CouchDB.
[/OT]
Zitat von: yersinia am 19 November 2021, 10:27:10
[OT]Per cronjob und wget die Ical-abholen, das Ganze mit python (https://stackoverflow.com/questions/3408097/parsing-files-ics-icalendar-using-python) parsen und in JSON (https://www.w3schools.com/python/python_json.asp) konvertieren sowie lokal abspeichern und dann per MQTT client (via cronjob) an den FHEM MQTT2 Server senden; dort dann per notify drauf reagieren und einen Dummy befüllen, der ein DOIF auslöst? :o ;D
[/OT]
Bitte dabei aber noch MQTT2_SERVER durch einen externen MQTT-Server ersetzen, (00_)MQTT+dummy+MQTT_BRIDGE verwenden, und dann das JSON durch expandJSON auspacken lassen :P
Hallo, ich mache das mit 2 notify:
defmod SwitchActorOn notify Google_privat:start:.* {my $reading="$EVTPART0";; my $uid= "$EVTPART1";; my $actor= fhem("get Google_privat summary $uid 1");; if(defined $actor) { fhem("set $actor on") }}
attr SwitchActorOn DbLogExclude .*
attr SwitchActorOn room Hilfsprogramme
defmod SwitchActorOff notify Google_privat:end:.* {my $reading="$EVTPART0";; my $uid= "$EVTPART1";; my $actor= fhem("get Google_privat summary $uid 1");; if(defined $actor) { fhem("set $actor off") }}
attr SwitchActorOff DbLogExclude .*
attr SwitchActorOff room Hilfsprogramme
wenn im Google Kalender im Titel zb. Belegt eingetragen ist, wird der dummy Belegt zu den eingetragenen Zeiten ein- und ausgeschaltet..
Gruß
Jürgen K.
Zitat von: juergen012 am 19 November 2021, 10:59:42
Hallo, ich mache das mit 2 notify:
Spielverderber....
Dafür muss man nicht kreativ sein, das steht doch so schon in der commandref...
Wobei man sich fragt, für was das mit "$reading" gut sein soll... "$uid" als Variable kann ich zu Anschaungszwecken noch nachvollziehen, aber die Kurzfassung wäre dann z.B.:
defmod SwitchActorOn notify Google_privat:start:.* { my $actor = fhem("get Google_privat summary $EVTPART1 1") // return;; fhem("set $actor on") }
Anmerkung zu "// return": Das ist der Perl-defined-or-Operator und eine Kurzschreibweise für "if !defined ..."
..Hauptsache es schaltet..
Hm hab ich wieder zu kompliziert gedacht?
@Beta-User, bei deinem Beispiel muss in summary das DEVICE stehen, verstehe ich das richtig?
Zitat aus Device specific help:
ZitatStell Dir einen Kalender vor, dessen Zusammenfassungen (Betreff, Titel) die Namen von Devices in Deiner FHEM-Installation sind. Du willst nun die entsprechenden Devices an- und ausschalten, wenn das Kalender-Ereignis beginnt bzw. endet.
Denn das wäre ein Problem, wenn wir das Ferienhaus für uns selber blocken ist summary leer, das kann ich auch nicht ändern. Ansonsten besteht der Betreff immer aus den ersten Buchstaben von Vornamen und Nachnamen der Mieter.
get FerienhausKalender events format:custom="4 $T1 $t2 $S ($D)"
4 18.11.2021 00:00 1638054000 GH (10d)
4 27.11.2021 00:00 1638140400 (48h)
4 02.12.2021 00:00 1639177200 HG (9d)
4 14.12.2021 00:00 1640300400 HG (10d)
Holidays schaue ich mir mal an.
Zitat von: Starsurfer am 19 November 2021, 12:00:07
@Beta-User, bei deinem Beispiel muss in summary das DEVICE stehen, verstehe ich das richtig?
Es ist das Beispiel aus der commandref, aber sonst: korrekt.
Zitat
Zitat aus Device specific help:Denn das wäre ein Problem, wenn wir das Ferienhaus für uns selber blocken ist summary leer, das kann ich auch nicht ändern. Ansonsten besteht der Betreff immer aus den ersten Buchstaben von Vornamen und Nachnamen der Mieter.
Dann kannst du ja mit etwas Perl den Fall "leer" abfangen und z.B. "$actor = 'wir selbst' if !$actor;;" da reinknödeln...
Ansonsten viel Spaß mit den Anregungen hier :) .
Hi,
meiner ist so
Kalendereintrag fhem Test on
im Calender attr forceEvents 1
cal.Wohnung.Google:start:.* {
my $reading = "$EVTPART0";
my $uid = "$EVTPART1";
my $actor = fhem("get cal.Wohnung.Google summary $uid");
my @Dev = (split(' ', $actor));
if($Dev[0] eq "fhem") {
fhem("set $Dev[1] $Dev[2] $Dev[3];");
}
}
mfg
...das mit "$reading" ist immer wieder lustig, und es würde mich auch interessieren, was bei diesem konkreten "summary" denn nach deiner Ansicht in "$Dev[3]" zu finden ist (ok, Fangfrage, es macht dann Sinn, wenn man anders strukturierte summarys hat... - aber dann würde ich eher ein shift auf das array machen und den Rest wieder mit "join q{ }, @Dev;" zusammensetzen.)
Hier noch eine 0/1-dummy-Lösung, dieses Mal für "start" und "end":
define n_BW_Ferien_start_end notify Familienkalender:changed:.*start|Familienkalender:changed:.*end {
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, "BW_Ferientag $cmd") if ($MYACTOR =~ /ferien/);;
}
PS: Falls das jetzt jemand mit den commandref-Beispielen vergleicht oder meint, man könne die regexp kürzer fassen - ja, geht, aber damit ist dann NOTIFYDEV weg...
Also ich finde die ganzen Beispiele ja ganz nett und hilfreich, aber sie haben größtenteils nichts mit meiner Frage zu tun oder ich bin einfach zu blöd das zu verstehen...
Trotzdem danke für die vielen Beispiele.
Meine Güte...
define n_FEWO notify FerienhausKalender:changed:.*start|FerienhausKalender:changed:.*end {
my $cmd = $EVTPART2;;
my $MYACTOR = fhem('get FerienhausKalender events format:custom="$S" filter:uid=="'.$EVTPART1.'" limit:count=1') ;;
$cmd = $cmd eq 'start' ? 'Belegt' : 'Unbelegt';;
fhem("set FEWO $cmd");;
}
Edit: Da da ja sowieso nur die "passenden" Termine drin sind, kann man sich den Mittelteil auch ganz schenken - Ungetestet:
define n_FEWO notify FerienhausKalender:changed:.*start|FerienhausKalender:changed:.*end {
fhem("set FEWO " . $EVTPART2 eq 'start' ? 'Belegt' : 'Unbelegt');;
}
Zitat von: Beta-User am 19 November 2021, 15:12:15
...das mit "$reading" ist immer wieder lustig, und es würde mich auch interessieren, was bei diesem konkreten "summary" denn nach deiner Ansicht in "$Dev[3]" zu finden ist (ok, Fangfrage, es macht dann Sinn, wenn man anders strukturierte summarys hat... - aber dann würde ich eher ein shift auf das array machen und den Rest wieder mit "join q{ }, @Dev;" zusammensetzen.)
Hier noch eine 0/1-dummy-Lösung, dieses Mal für "start" und "end":
define n_BW_Ferien_start_end notify Familienkalender:changed:.*start|Familienkalender:changed:.*end {
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, "BW_Ferientag $cmd") if ($MYACTOR =~ /ferien/);;
}
PS: Falls das jetzt jemand mit den commandref-Beispielen vergleicht oder meint, man könne die regexp kürzer fassen - ja, geht, aber damit ist dann NOTIFYDEV weg...
"$Dev[3]" nüscht, war für erweiterungen.
lüpt seit ein paar jahren.... (Was für mich wichtig war)
gruss