Kalenderevent "Urlaub" in $we umwandeln

Begonnen von wfas303, 28 Januar 2013, 22:16:20

Vorheriges Thema - Nächstes Thema

wfas303

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

     

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

wfas303

Danke Boris,

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

Danke
Andreas


kossmann

Guck dir mal meinen Artikel 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.

wfas303

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

crissiloop

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
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

wfas303

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

crissiloop

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
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

wfas303

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

crissiloop

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
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

kossmann

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.

crissiloop

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
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

crissiloop

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 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
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT

crissiloop

durch die Änderung von Rudolf, siehe Link 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. 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

crissiloop
FHEM 5.5 auf Cubietruck

1x HMLAN, 1x HMUSB, 12x HM-LC-Bl1 PBU-FM, 5x HM-LC-Sw1-Pl, 1x HM-LC-Sw1-FM, 2x HM-LC-Sw2-FM, 2x HM-SEC-RHS, 3x HM-SEC-SD, 8x HM-SEC-SC, 3x HM-RC-4-2, 1x HM-RC-8, 1x HM-Sec-SFA-SM, Jeelink, 7x Technoline TX 29 DTH-IT