FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: wfas303 am 28 Januar 2013, 22:16:20

Titel: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: wfas303 am 28 Januar 2013, 22:16:20
Hallo,

gibt es zufällig, ähnlich wie bei "holiday2we" bereits eine Möglichkeit durch ein ganztägiges Kalenderevent mit z.B. dem Titel "Urlaub" einen Tag (oder mehrere Tage) in ein "Wochenende" $we umzuprogrammieren. Dies würde den weiteren Code meiner Meinung nach vereinfachen, da man nur noch die Variable $we abfragen müsste und zudem durch eine Weiterleitung des Urlaubseintrages im Büro an den Hauskalender sofort die Wohnung "umprogrammiert" hätte.

Vielen Dank im Voraus
Andreas

     
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: Dr. Boris Neubert am 29 Januar 2013, 06:14:14
Zitat von: wfas303 schrieb am Mo, 28 Januar 2013 22:16gibt es zufällig, ähnlich wie bei "holiday2we" bereits eine Möglichkeit durch ein ganztägiges Kalenderevent mit z.B. dem Titel "Urlaub" einen Tag (oder mehrere Tage) in ein "Wochenende" $we umzuprogrammieren. Dies würde den weiteren Code meiner Meinung nach vereinfachen, da man nur noch die Variable $we abfragen müsste und zudem durch eine Weiterleitung des Urlaubseintrages im Büro an den Hauskalender sofort die Wohnung "umprogrammiert" hätte.
 

Hallo,

gibt es nicht, auch nicht zufällig :-)

Du kannst mit notify auf den Kalendereintrag reagieren und abhängig vom Modus und von $we einen dummy auf on oder off setzen.

Viele Grüße
Boris
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: wfas303 am 29 Januar 2013, 07:28:08
Danke Boris,

dann muss ich wohl einen Dummy Urlaub erzeugen  den ich abhaengig vom Kalenderevent On oder Off schalte.
Auch kein Beinbruch ...

Danke
Andreas

Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: kossmann am 06 Februar 2013, 13:31:27
Guck dir mal meinen Artikel Wochenende, Feiertage und Schulferien (//www.fhemwiki.de/wiki/Wochenende,_Feiertage_und_Schulferien) im Wiki an - dort mache ich das mit den Schulferien. Du müsstest nur den eigenen Kalender einlesen und natürlich nicht auf "schulferien", sondern "Urlaub" parsen.
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: wfas303 am 10 Februar 2013, 11:02:28
Danke. Mein System liest jetzt ebenfalls, wie in obigem Beispiel, das "Subject" aus dem Kalendereintrag aus und falls dieses "Urlaub" lautet, wird ein Dummy gesetzt.

Andreas
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: crissiloop am 01 März 2013, 15:42:49
Hallo Andreas, Hallo kossmann
nach einigem probieren und dank kossmann seinem Wiki-Eintrag habe ich es hinbekommen, dass mein Dummy gesetzt wird.
Aber das Notify wird sehr oft ausgeführt!

Hier der Auszug aus dem Logfile, nachdem ich den Kalender geupdated habe. Die ganze Zeile erscheint 13 mal im Log.

2013.03.01 16:52:05 3: get Urlaub_Christian summary modeStart : Urlaubtest

Und mein Notify schaut so aus:
define Urlaub_Christian_notify notify Urlaub_Christian {my $Urlaubtext = \
fhem("get Urlaub_Christian summary modeStart");;\
if ($Urlaubtext =~ m"Urlaub") {\
fhem("setstate Urlaub_dummy 1")\
}\
else {\
fhem("setstate Urlaub_dummy 0")\
}\
}


Hat jemand eine Idee, wie ich das Notify dazu bekomme, dass es nur einmal ausgeführt wird?

Danke!
Christian
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: wfas303 am 04 März 2013, 20:05:33
Hallo Christian,

ich habe letztendlich über Key-Word realisiert. Die Event leite ich mir ( dem Hauskalender ) aus der Arbeit heraus weiter.  

define Business_Kalender notify Standby:modeStarted.*00000.* {\
        my $uid= "%EVTPART1";;\
        my $var= fhem("get Standby location $uid");;\
        my $actor= fhem("get Standby summary $uid");;\
        if ( $actor eq "Urlaub") {\
             fhem("set AndreasatVacation on");;\
        if ( $actor eq "Reise") {\
             fhem("set AndreasonTheRoad on");;\
        }\
}

Die Dummy's AndreasatVacation und AndreasonTheRoad benutze ich als "Schalter" für die weiteren Abfragen.

Andreas
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: crissiloop am 07 März 2013, 17:29:17
Hallo,

habe die Geschichte mit dem Urlaub nun geändert in:
define Urlaub_Christian_notify notify Urlaub_Christian:modeStarted.* {\
my $uid= "%EVTPART1";;\
my $Urlaubtext = fhem("get Urlaub_Christian summary $uid");;\
if ($Urlaubtext =~ m"Urlaub") {\
fhem("setstate Urlaub_dummy 1")\
}\
else {\
fhem("setstate Urlaub_dummy 0")\
}\
}


Nur warum wird das Notify bei einem Update des Kalenders getriggert? Es ist kein Event im Kalender im modeStarted!
Demzufolge taucht natürlich dann im Log auf:
2013.03.07 17:20:33 3: get Urlaub_Christian summary modeStarted: EVTPART1 : argument is missing

Christian
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: wfas303 am 07 März 2013, 20:19:19
Falls du einen Kalender bei Google hast, sollte der erste Teil so aussehen :

define Urlaub_Christian_notify notify Urlaub_Christian:modeStarted.*googlecom.*

und nicht

define Urlaub_Christian_notify notify Urlaub_Christian:modeStarted.*

Andreas
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: crissiloop am 07 März 2013, 21:43:48
Besten Dank Andreas,
so funktioniert das Notify nun.

Urlaub_Christian:modeStarted.*googlecom.* {
my $uid= "%EVTPART1";
my $Urlaubtext = fhem("get Urlaub_Christian summary $uid");
if ($Urlaubtext =~ m"Urlaub") {
fhem("setstate Urlaub_dummy 1")
}
}

Das mit dem googlecom war mir nicht bewusst. Ich habe mich an dem Beispiel im Commandref und von dir und kossmann lang gehangelt.
Nun muss ich das Gleiche ja nur für den Status ended machen, damit der oder die Dummys zurück gesetzt werden.

Christian
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: kossmann am 08 März 2013, 08:57:56
Falls du dir den ended-Status sparen möchtest, önntest den Status nachts um 23:55 Uhr ja immer auf 0 setzen, das Notify setzt dann 5 Minuten später den korrekten Wert - falls du mit den paar Minuten eventueller Fehl-Information auskommst. Besser wäre es aber sicher, wenn man das Ende korrekt abfängt. Dann könnte man damit auch Minuten-genau Events steuern, z.B. automatisches Bewässern im Garten...

... und dann wäre ich (und die Comunity) dir noch dankbar, wenn du das hier auch noch veröffentlichst, so dass jemand (du, ich, sonst wer) den Artikel im Wiki noch ausbauen oder ggf. einen neuen erstellen kann.
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: crissiloop am 08 März 2013, 09:43:17
das versteht sich von selbst.
Sobald ich es funktionsfähig habe, werde ich es natürlich bekannt machen.
Ich habe ja schließlich auch von deinem Eintrag und der Hilfe hier im Forum profitiert.

Christian
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: crissiloop am 08 März 2013, 18:18:21
so und da ich nun weiter am Basteln bin, tut sich folgendes Problem auf:
Wenn zwei Termine gleichzeitig starten, werden zwei Uids getrennt mit Semikolon zurückgegeben. Das Problem wurde hier https://groups.google.com/forum/?fromgroups=#!topic/fhem-users/l4qRTL2WYRA (//groups.google.com/forum/?fromgroups=#!topic/fhem-users/l4qRTL2WYRA) bereits angesprochen. Und das Problem scheint das Semikolon zu sein. Aber die Lösung, die calendar.pm zu ändern ist für mich keine Lösung.

Also wie bekomme ich das Split sauber zum Arbeiten mit dem Semikolon als Trennzeichen. Ich habe es mit "\073" als regex versucht als octal maskiert laut Perl Anleitungen. Und in Regex-Testern funktioniert dies auch.

Folgende Fehlermeldung erscheint bei gleichzeitig beginnenden Terminen:


2013.03.08 18:07:00 3: Kalender_Christian_Start return value: Unknown command {\
my, try help
Unknown command ecq175f7hrfcrim7ld5kkq44gkgooglecom");\
foreach, try help


Das Notify sieht wie folgt aus:

define Kalender_Christian_Start notify Kalender_Christian:modeStarted.*googlecom.* {\
my @uids=split("\073","%EVTPART1");;\
foreach my $uid (@uids) {\
my $Kalendertext = fhem("get Kalender_Christian summary $uid");;\
if ($Kalendertext =~ m"Urlaub") {\
fhem("setstate Urlaub_dummy 1")\
};;\
if ($Kalendertext =~ m"Besuch") {\
fhem("setstate Gast_dummy 1")\
};;\
};;\
}


Vielleicht kann hier jemand helfen?

Christian
Titel: Aw: Kalenderevent "Urlaub" in $we umwandeln
Beitrag von: crissiloop am 18 April 2013, 14:42:06
durch die Änderung von Rudolf, siehe Link (http://forum.fhem.de/index.php?topic=11886.msg70240#msg70240) ist das Semikolon kein Problem mehr beim Split.

Da ich aber im Forum bereits mehrfach die Aussage herausgelesen habe, dass $Event selber zu splitten, habe ich es jetzt auch so umgesetzt.

Ich habe mir also zwei Dummys für Urlaub und für Besuch angelegt. Sinn ist folgender: Der Rolladen im Gästezimmer soll bei Besuch nicht zum Sonnenaufgang hoch fahren sondern erst später. Und im Schlafzimmer halt auch bei Urlaub später. Das Schlafzimmer fährt bereits am WE und an Feiertagen später hoch. Dies ist mit $we und holiday gelöst.

Und durch die beiden Funktionen in meiner 99myutils.pm kann ich die Dummys jetzt über Einträge im Google Kalender setzen lassen.

sub
Kalenderstart ($)
{
my ($Ereignis) = @_;
        Log 3, "übergebenes Ereignis: $Ereignis";
        my @Ereignisarray = split(/.*:\s/,$Ereignis);
        my $Ereignisteil1 = $Ereignisarray[1];
        Log 3, "Eventpart 1: $Ereignisteil1";
my @uids=split(/;/,$Ereignisteil1);
        foreach my $uid (@uids) {
                Log 3, "Eventpart1 gesplittet: $uid";
my $Kalendertext = fhem("get Kalender_Christian summary $uid");
                if ($Kalendertext =~ /Urlaub/) {
fhem("set Urlaub_dummy ja");
};
if ($Kalendertext =~ /Besuch/) {
fhem("set Gast_dummy ja");
};
};
}

sub Kalenderende ($) {
    my ($Ereignis) = @_;
        Log 3, "übergebenes Ereignis: $Ereignis";
        my @Ereignisarray = split(/.*:\s/,$Ereignis);
        my $Ereignisteil1 = $Ereignisarray[1];
        Log 3, "Eventpart 1: $Ereignisteil1";
my @uids=split(/;/,$Ereignisteil1);
        foreach my $uid (@uids) {
                Log 3, "Eventpart1 gesplittet: $uid";
my $Kalendertext = fhem("get Kalender_Christian summary $uid");
                if ($Kalendertext =~ /Urlaub/) {
fhem("set Urlaub_dummy nein");
};
if ($Kalendertext =~ /Besuch/) {
fhem("set Gast_dummy nein");
};
};
}


Und ausgelöst werden die Funktionen über jeweils ein Notify, welches auf die Kalendereignisse reagiert:


define Kalender_Christian_Start notify Kalender_Christian:modeStarted.*googlecom.* {
Kalenderstart("$EVENT");

define Kalender_Christian_Start notify Kalender_Christian:modeEnded.*googlecom.* {
Kalenderstart("$EVENT");
}


Vielen Dank auch nochmal an das Forum und kossmann seinen Wiki Artikel http://www.fhemwiki.de/wiki/Wochenende,_Feiertage_und_Schulferien (//www.fhemwiki.de/wiki/Wochenende,_Feiertage_und_Schulferien). Dieser war der Einstieg für das ganze.

Ich habe meine Vorgehensweise als Wiki-Artikel bereitgestellt: http://www.fhemwiki.de/wiki/Google-Kalender_zur_Steuerung_von_Dummies (//www.fhemwiki.de/wiki/Google-Kalender_zur_Steuerung_von_Dummies)

crissiloop