holiday2we - 3 Zustände benötigt

978 views
Skip to first unread message

kossmann

unread,
Dec 5, 2012, 8:44:10 AM12/5/12
to fhem-...@googlegroups.com
Hallo zusammen,

ist es momentan möglich, Ferien von normalen Feiertagen zu unterscheiden?

Im Schlafzimmer soll das Rollo morgens hochfahren, wenn nicht gerade Wochenende oder Feiertag ist. Im Kinderzimmer gilt die selbe Regel, dort soll allerdings an Schulferien ebenfalls das Rollo unten bleiben.

Da die Eltern i.d.R. in den Schulferien weiterhin früh aufstehen müssen, wäre hier eine Möglichkeit zur Unterscheidung notwendig. Geht dies heute schon irgendwie? Ich kann doch nur eine Holiday-Datei einlesen und mittels holiday2we an $we "anhängen", oder?

Klar ist, dass ich mit zusätzlichen IF-Statements den Zeitraum zwischen Ferienbeginn und -ende im Kinderzimmer erkennen könnte, aber dies würde bei Winter-, Oster-, Sommer- und Herbstferien, sowie diversen beweglichen Ferientagen und anderen freien Schultagen ein sehr langes Statement und man würde bei der (halb-)jährlichen Anpassung schnell durcheinander kommen.

Fidel

unread,
Dec 5, 2012, 9:30:37 AM12/5/12
to fhem-...@googlegroups.com
Hallo,

lege eine weitere holiday Datei an z.B.: Ferien.holiday
und trage dort die Ferientage im Format 1 ein, Format 4 (als Zeitspanne liefert mir leider nur none zurück).

und dann kannst du den Ferientag mit {Value("Ferien")} in der Kommandozeile abfragen

Grüße

Tom

unread,
Dec 5, 2012, 9:35:22 AM12/5/12
to fhem-...@googlegroups.com
...oder ergänze das über das Kalender-Modul, ist vielleicht einfacher zu pflegen. ;)


--
To unsubscribe from this group, send email to
fhem-users+...@googlegroups.com

Fidel

unread,
Dec 5, 2012, 9:43:07 AM12/5/12
to fhem-...@googlegroups.com
Format 4 funktionierte bei mir nicht weil ich es jahresübergreifend probiert habe...

statt 

4 12-29 01-13 Frei

sollte man 

4 12-29 12-31 Frei1
4 01-01 01-13 Frei2

deklarieren.

kossmann

unread,
Dec 5, 2012, 9:56:08 AM12/5/12
to fhem-...@googlegroups.com
Das Kalendermodul ist natürlich eine sehr gute Idee, die Schulferien gibt´s sogar frei Haus, z.B. für NRW unter www.schulferien.org. Es reicht doch ein iCal-Kalender, Google ist nur ein Beispiel, oder?

Wenn ich die Command Reference allerdings richtig interpretiere, muss ich zwingend mit den UIDs arbeiten, die in dem Beispiels allerdings alle brav zu parsen wären, z.B. "UID:Sommerferien-Nordrhein_We...@schulferien.org", also mit ".*ferien.*".

Aber wie baue ich das in das IF-Statement ein?

UliM

unread,
Dec 7, 2012, 3:12:00 AM12/7/12
to fhem-...@googlegroups.com

Am Mittwoch, 5. Dezember 2012 15:56:08 UTC+1 schrieb kossmann:Aber wie baue ich das in das IF-Statement ein?

Sowas wie "contains" sieht in perl folgendermaßen aus:
if ($uid =~ m/ferien/) {blabla}

Siehe zB http://de.selfhtml.org/perl/sprache/regexpr.htm

=8-)

Dr. Boris Neubert

unread,
Dec 8, 2012, 1:41:28 PM12/8/12
to fhem-...@googlegroups.com
Hallo,

Am 07.12.2012 09:12, schrieb UliM:
>
> Am Mittwoch, 5. Dezember 2012 15:56:08 UTC+1 schrieb kossmann:Aber wie
> baue ich das in das IF-Statement ein?
>
> Sowas wie "contains" sieht in perl folgendermaßen aus:
> if ($uid =~ m/ferien/) {blabla}
>

interessanter Ansatz mit dem Schulferien-Kalender! Werde ich bei mir
einbauen.

Ich habe

define Holidays Calendar ical url
http://www.schulferien.org/iCal/Ferien/icals/Ferien_Hessen_2013.ics

definiert. Mit

{ ReadingsVal("Holidays","modeStart","") =~ "schulferien" ? 1 : 0 }

bekomme ich 1 oder 0 zurück, je nachdem, ob gerade Ferien sind oder
nicht (mit "modeUpcoming" anstelle von "modeStart" kann man das testen).

Wie bekomme ich das jetzt in einen Dummy?

define Ferien dummy
set Ferien { ReadingsVal("Holidays","modeStart","") =~ "schulferien" ? 1
: 0 }

wertet nämlich den Perl-Ausdruck nicht aus.

Ich würde mir dann ein notify anlegen, welches den Ferien-Dummy setzt.
Klar, mit if-else geht's, aber geht es auch Perl-typisch kurz?

Viele Grüße
Boris



UliM

unread,
Dec 8, 2012, 1:52:42 PM12/8/12
to fhem-...@googlegroups.com


Am Samstag, 8. Dezember 2012 19:41:28 UTC+1 schrieb Boris:
Wie bekomme ich das jetzt in einen Dummy?

Immer kurz nach Mitternacht prüfen:
define Feriencheck at *00:01 {fhem "set Ferien ".(ReadingsVal("Holidays","modeStart","") =~ "schulferien" ? 1: 0) }

Dr. Boris Neubert

unread,
Dec 8, 2012, 2:04:01 PM12/8/12
to fhem-...@googlegroups.com
Danke Uli,

Am 08.12.2012 19:52, schrieb UliM:
> (ReadingsVal("Holidays","modeStart","") =~ "schulferien" ? 1: 0)

so sieht das dann bei mir aus:

define isHoliday dummy # benutzen mit { Value("isHoliday") }
define Holidays Calendar ical url
http://www.schulferien.org/iCal/Ferien/icals/Ferien_Hessen_2012.ics
define Holidays.notify notify Holidays { fhem "set isHoliday " .
(ReadingsVal("Holidays","modeStart","") =~ "schulferien" ? 1: 0) }

Grüße
Boris

kossmann

unread,
Dec 10, 2012, 4:18:24 AM12/10/12
to fhem-...@googlegroups.com
Hallo Boris,

könntest du vielleicht erklären, was da genau passiert? Wo kommt das "schulferien" her? Ist das ein beliebiger Text in der UID (die hier ja immer auf "schulferien.org" endet)?

Ich habe deine 3 defines mal bei mir ausprobiert und bekomme nur...

{ Value("sindFerien") }
???

Den nächtlichen Check von Uli hast du nicht eingebaut, oder?

Dr. Boris Neubert

unread,
Dec 10, 2012, 8:11:40 AM12/10/12
to fhem-...@googlegroups.com
Hallo,

Am 10.12.2012 10:18, schrieb kossmann:
> könntest du vielleicht erklären, was da genau passiert? Wo kommt das
> "schulferien" her? Ist das ein beliebiger Text in der UID (die hier ja
> immer auf "schulferien.org" endet)?

# das definiert den Dummy, der auf 1 oder 0 steht, je nachdem, ob Ferien
sind oder nicht
define isHoliday dummy # benutzen mit { Value("isHoliday") }

# das definiert den Ferienkalender
# dieses notify wird bei jeder Aktualisierung des Kalenders, i.d.R. also
alle Stunde, aktiv
# dabei wird der Perl-Ausdruck in { } ausgeführt
# der Teil ReadingsVal("Holidays","modeStart","") =~ "schulferien"
liefert die Anzahl der Vorkommen des Texts "schulferien"
# im Reading "modeStart". Wenn gerade Schulferien sind, ist das
Ergebnis 1, sonst undef.
# mit (ReadingsVal("Holidays","modeStart","") =~ "schulferien" ? 1: 0)
wird dann aus dem Ergebnis 1 oder 0
# am Ende wird die 1 oder 0 mit dem fhem-Befehl zu fhem set isHoliday 0
oder fhem set isHoliday 1 zusammengefügt und ausgeführt
define Holidays.notify notify Holidays { fhem "set isHoliday " .
(ReadingsVal("Holidays","modeStart","") =~ "schulferien" ? 1: 0) }


Ich hoffe, daß das verständlich war. Ein wenig Herumspielen mit list
Holidays und get Holidays full all schadet nicht.

Ich wäre Dir dankbar, wenn Du das ins Wiki tust.

Viele Grüße
Boris

kossmann

unread,
Dec 10, 2012, 8:27:40 AM12/10/12
to fhem-...@googlegroups.com
Aua...

mein "set <Kalendername> update" fehlte, daher kamen auch nur die Fragezeichen zurück.

Ich glaube ich fasse das mal in einem entsprechenden Wiki-Artikel zusammen - Feiertage und Ferien über einen Kalender.

kossmann

unread,
Dec 10, 2012, 9:58:31 AM12/10/12
to fhem-...@googlegroups.com
Eine erste Version ist online: FhemWiki - Wochenende, Feiertage und Schulferien

Da ich den letzten Teil selbst noch nicht in die Steuerung eingebaut habe, fehlt das letzte, vollständige Beispiel noch.

kossmann

unread,
Dec 10, 2012, 11:17:33 AM12/10/12
to fhem-...@googlegroups.com
Ich muss leider doch noch mal nachfragen:


ReadingsVal("Holidays","modeStart","") =~ "schulferien" ? 1: 0

modeStart haben Ereignisse, welche Begonnen haben, aber noch nicht beendet sind. upcoming hingegegen gilt für Ereignisse, welche erst in der Zukunft beginnen.

Da momentan wohl nirgendwo Ferien sind (und ich außerdem mit 2013 teste), sollte o.a. Ausdruck mit upcoming statt modeStart doch insgesamt eine 1 liefern, oder? Dies ist bei mir während dem Testen leider nicht der Fall:

get NRW_Ferien full all
WeihnachtsferienNordrhein_Westfalen201301051066245570schulferienorg   known upcoming                     01.01.2013 00:00:00-05.01.2013 00:00:00 Weihnachtsferien Nordrhein-Westfalen
[...]

{ fhem "set NRW_Ferientag ".(ReadingsVal("NRW_Ferien", "upcoming", "") =~ "schulferien" ? 1: 0) }

{ Value("NRW_Ferientag") }
0

Warum bekomme ich hier keine 1 zurück?

Des weiteren verstehe ich dass "schulferien" immer noch nicht zu 100%. Dies müsste doch eigentlich ein regulärer Ausdruck sein, oder? Ein ".*schulferien.*" oder ".*schulferienorg$" wäre in meinen (blinden) Augen richtig - funktioniert aber leider genauso wenig.

Dr. Boris Neubert

unread,
Dec 10, 2012, 11:58:47 AM12/10/12
to fhem-...@googlegroups.com
Hallo,


Am 10.12.2012 17:17, schrieb kossmann:
Ich muss leider doch noch mal nachfragen:

ReadingsVal("Holidays","modeStart","") =~ "schulferien" ? 1: 0

Da momentan wohl nirgendwo Ferien sind (und ich außerdem mit 2013 teste), sollte o.a. Ausdruck mit upcoming statt modeStart doch insgesamt eine 1 liefern, oder? Dies ist bei mir während dem Testen leider nicht der Fall:
es gibt kein Reading namens upcoming. Das Reading heißt "modeUpcoming".


Des weiteren verstehe ich dass "schulferien" immer noch nicht zu 100%. Dies müsste doch eigentlich ein regulärer Ausdruck sein, oder? Ein ".*schulferien.*" oder ".*schulferienorg$" wäre in meinen (blinden) Augen richtig - funktioniert aber leider genauso wenig.


Der Operator =~ matcht Substrings.

Grüße
Boris

Andreas Schaller

unread,
Dec 10, 2012, 1:55:50 PM12/10/12
to fhem-...@googlegroups.com
Hallo
Wäre eigentlich auch folgende Lösung möglich :

we und !we sind ja fix als Parameter bekannt. Für Feiertage lässt sich schon der Parameter we=1 setzen. (Holiday2we)
Wenn nun im Kalender z.B. der Betreff Urlaub steht müsste man ebenfalls für diesen Tag die Variable we=1 definieren können.

Somit müsste man im Code keine zusätzliche Abfragen einbauen .
Oder geht das schon ?

Andreas

kossmann

unread,
Dec 10, 2012, 3:32:00 PM12/10/12
to fhem-...@googlegroups.com
Dann funktioniert´s auch :-) Ich hatte Reading mit Mode verwechselt - da heißt es nur "upcoming". Danke!
Reply all
Reply to author
Forward
0 new messages