FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Starsurfer am 19 November 2021, 09:13:32

Titel: Ferienhaus Kalender Dummy steuern
Beitrag von: Starsurfer am 19 November 2021, 09:13:32
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)


Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: Beta-User am 19 November 2021, 09:29:33
...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).
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: Otto123 am 19 November 2021, 09:58:56
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
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: betateilchen am 19 November 2021, 10:20:44
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.
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: yersinia am 19 November 2021, 10:27:10
[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]
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: Beta-User am 19 November 2021, 10:30:42
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
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: juergen012 am 19 November 2021, 10:59:42
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.
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: Beta-User am 19 November 2021, 11:15:20
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 ..."
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: juergen012 am 19 November 2021, 11:25:23
..Hauptsache es schaltet..
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: Starsurfer am 19 November 2021, 12:00:07
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.
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: Beta-User am 19 November 2021, 12:24:33
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 :) .
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: eisman am 19 November 2021, 14:59:32
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
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag 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...
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: Starsurfer am 19 November 2021, 15:35:22
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.
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: Beta-User am 19 November 2021, 16:09:21
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');;
}
Titel: Antw:Ferienhaus Kalender Dummy steuern
Beitrag von: eisman am 19 November 2021, 18:29:06
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