Seite 1 von 2

Rule - Xmas-Beleuchtung

Verfasst: 9. Nov 2019 11:03
von EMaster
Servus,

ich hatte in letzter Zeit schon ein wenig mit Rules experimentiert, was auch durch intensive Recherche immer zum Erfolg führte. Aktuell stehe ich jedoch auf dem Schlauch und habe auch in den Weiten des Inet nicht das gefunden, was ich benötige.
Folgendes wollte ich realisieren.
Die Weihnachtsbeleuchtung soll vom 1. Dezember - 6. Januar nach bestimmten Zeiten schalten, jedoch am Wochenende anders, als unter der Woche. Der letzte erste Schaltpunkt soll am 1. Dezember 5.00Uhr/5.30Uhr (je nach Tag) sein und der letzte am 6. Januar um 23.59Uhr.
Folgende Experimente habe ich bereits gemacht aber alle haben nicht funktioniert. "Invalid..." (Ich habe es dann erstmal immer auskommentiert!)

Code: Alles auswählen

// Schaltet die Weihnachtsbeleuchtung vom 1. Dezember bis 6. Januar

rule "Xmas-Beleuchtung EIN"

when
Time cron "0 30 5 * * MON,TUE,WED,THU,FRI *"
// Time cron "0 51 12 1-31 11 1-5"
// Time cron "0 37 21 ? 11 MON,WED,FRI *" or
// Time cron "0 45 21 31-1 11 SAT,SUN *" or
// Time cron "0 05 05 1-31 11 TUE,THU *"
// Time cron "0 30 05 1-31 12 MON,TUE,WED,THU,FRI,SAT,SUN" or
// Time cron "0 00 15 1-31 12 SAT,SUN" or
// Time cron "0 00 16 1-31 12 MON,TUE,WED,THU,FRI" or
// Time cron "0 30 05 1-6 1 MON,TUE,WED,THU,FRI,SAT,SUN" or
// Time cron "0 00 05 1-6 1 SAT,SUN" or
// Time cron "0 00 16 1-6 1 MON,TUE,WED,THU,FRI"

then
Swi_FritzBox.sendCommand(ON)
end


rule "Xmas-Beleuchtung AUS"

when
Time cron "0 55 12 * * ?"
// Time cron "0 42 21 ? 11 MON,WED,FRI *" or
// Time cron "0 50 21 31-1 11 SAT,SUN *" or
// Time cron "0 15 05 1-31 11 TUE,THU *"
// Time cron "0 00 08 1-31 12 MON,TUE,WED,THU,FRI" or
// Time cron "0 30 09 1-31 12 SAT,SUN" or
// Time cron "0 30 00 2-31 12 MON,TUE,WED,THU,FRI,SAT,SUN" or
// Time cron "0 00 08 1-6 1 MON,TUE,WED,THU,FRI" or
// Time cron "0 30 09 1-6 1 SAT,SUN" or
// Time cron "0 30 00 1-5 1 MON,TUE,WED,THU,FRI,SAT,SUN" or
// Time cron "0 59 23 6 1 ?"

then
Swi_FritzBox.sendCommand(OFF)
(Ich habe gelesen, dass der Cron-Tag mindestens ein ? enthalten muss und damit funktioniert meine Datumsbeschränkung vermutlich nicht. )

Wie könnte ich das denn lösen?
Ich hatte mir das mit Time cron simpel vorgestellt aber irgendwie schein es nicht so zu sein.
Ich wollte auch nicht für jedem Tag eine einzelne Rule machen.

Danke für Eure Vorschläge...

Re: Rule - Xmas-Beleuchtung

Verfasst: 9. Nov 2019 11:17
von peter-pan
Was genau ist denn "Invalid". Kannst du die Fehlermeldung posten. Auf jeden Fall fehlen (in den auskommentierten) Trigger-Bedingungen einige "or" Bedingungen. ;)
EMaster hat geschrieben: 9. Nov 2019 11:03 Time cron "0 30 5 * * MON,TUE,WED,THU,FRI *"
// Time cron "0 51 12 1-31 11 1-5"
// Time cron "0 37 21 ? 11 MON,WED,FRI *" or
// Time cron "0 45 21 31-1 11 SAT,SUN *" or
// Time cron "0 05 05 1-31 11 TUE,THU *"
// Time cron "0 30 05 1-31 12 MON,TUE,WED,THU,FRI,SAT,SUN" or

Re: Rule - Xmas-Beleuchtung

Verfasst: 9. Nov 2019 14:04
von EMaster
Eine Zeile aus der openhab.log wäre zum Beispiel: Cannot create timer for rule 'Xmas-Beleuchtung EIN': CronExpression '0 51 12 1-31 11 1-5' is invalid.
Heißt ja eigentlich im Klartext nur, dass die Cron-Parameter nicht passen.

Die "or" Bedingungen sind nicht das Problem. Die fehlen nur, weil ich da verschiedenes (blockweise) probiert habe.

Re: Rule - Xmas-Beleuchtung

Verfasst: 9. Nov 2019 18:53
von udo1toni
EMaster hat geschrieben: 9. Nov 2019 11:03 (Ich habe gelesen, dass der Cron-Tag mindestens ein ? enthalten muss und damit funktioniert meine Datumsbeschränkung vermutlich nicht. )
Ein gültiges Time cron Statement enthält exakt ein ?, nicht mehr und nicht weniger.

Das Fragezeichen ist der Tatsache geschuldet, dass man nicht sinnvoll auf bestimmte Tage eines Monats und gleichzeitig bestimmten Wochentagen einschränken kann. Naja, streng genommen natürlich schon, aber dann geht es wieder um Datumsbereiche. Es gibt zwei Möglichkeiten, mit dem Problem umzugehen, entweder, Du beschränkst die Ausführung der Rules auf die Wochentage und Monate und prüfst dann innerhalb der Rule, ob der Tag passt, oder Du begrenzt die Ausführung der Rule auf Monate und Tage und prüfst anschließend auf die Wochentage. Da die Obergrenze der 6. Januar ist, bietet es sich an, die erste Variante zu verwenden, da eine Zeitspanne vom 1. Dezember bis zum 6. Januar ohnehin nicht in ein Statement passt.

Die Menge an Schaltzeiten macht es ehrlich gesagt etwas kompliziert.

Code: Alles auswählen

rule "Xmas-Beleuchtung EIN"
when
    Time cron "0 30 05 * 12 ?"  or // 05:30:00 Uhr, Dezember
    Time cron "0 30 05 1-6 1 ?"    //05:30:00 Uhr, 1.-6. Januar
then
    Swi_FritzBox.sendCommand(ON)
end
schaltet von Montag bis Sonntag vom 1.12. bis 6.1.

Code: Alles auswählen

rule "Xmas-Beleuchtung EIN"
when
    Time cron "0 00 16 ? 12,1 1-5" // 16:00:00 Uhr Montag-Freitag, Dezember und Januar
then
    if(now.getDayOfYear < 7 || now.getMonth = 12)
        Swi_FritzBox.sendCommand(ON)
end
Den Tag des Jahres zu prüfen hat den Vorteil, dass man nur eine Bedingung für den 1. bis 6. Januar benötigt. es gibt noch einen kleinen Trick:

Code: Alles auswählen

rule "Xmas-Beleuchtung EIN"
when
    Time cron "0 00 16 ? 12,1 1-5" // 16:00:00 Uhr Montag-Freitag, Dezember und Januar
then
    if(now.plusDays(31).getDayOfYear < 38) /1. Dezember + 31 Tage = 1. Januar = 1. Tag...
        Swi_FritzBox.sendCommand(ON)
end
Die Rules werden also den gesamten Januar ausgeführt, der Schaltbefehl wird aber nur bis zum 6. Januar ausgeführt.

Re: Rule - Xmas-Beleuchtung

Verfasst: 10. Nov 2019 08:53
von EMaster
Danke Dir erstmal für die ausführliche Erklärung. Ich schaue mir das mal in Ruhe an und versuche da durchzusteigen.

Re: Rule - Xmas-Beleuchtung

Verfasst: 24. Nov 2019 22:45
von EMaster
Dann müsste das jetzt so funktionieren?

Code: Alles auswählen

// Schaltet die Weihnachtsbeleuchtung (Innen) vom 1. Dezember bis 6. Januar

rule "Xmas-Beleuchtung (Innen) EIN"

when
    Time cron "0 30 05 ? 12,1 1-5" or // 05:30:00 Uhr Montag-Freitag, Dezember und Januar
    Time cron "0 00 16 ? 12,1 1-5" or // 16:00:00 Uhr Montag-Freitag, Dezember und Januar
    Time cron "0 00 05 ? 12,1 6-7" or // 05:00:00 Uhr Samstag + Sonntag, Dezember und Januar
    Time cron "0 00 15 ? 12,1 6-7"    // 15:00:00 Uhr Samstag + Sonntag, Dezember und Januar
then
    if(now.plusDays(31).getDayOfYear < 38) //1. Dezember + 31 Tage = 1. Januar = 1. Tag... (1. Dezember - 6. Januar = 38 Tage)
        Xmas.sendCommand(ON)
end



rule "Xmas-Beleuchtung (Innen) AUS"

when
    Time cron "0 30 07 ? 12,1 1-5" or // 07:30:00 Uhr Montag-Freitag, Dezember und Januar
    Time cron "0 45 23 ? 12,1 1-5" or // 23:45:00 Uhr Montag-Freitag, Dezember und Januar
    Time cron "0 00 10 ? 12,1 6-7" or // 10:00:00 Uhr Samstag + Sonntag, Dezember und Januar
    Time cron "0 59 23 ? 12,1 6-7"    // 05:00:00 Uhr Samstag + Sonntag, Dezember und Januar
then
    if(now.plusDays(31).getDayOfYear < 38) //1. Dezember + 31 Tage = 1. Januar = 1. Tag... (1. Dezember - 6. Januar = 38 Tage)
        Xmas.sendCommand(OFF)
end
Wie müsste ich dann diese Regel noch erweitern, dass die Beleuchtung am 6. Januar um 23:59Uhr ausschaltet?
Der aktuell letzte Schaltpunkt wäre "EIN" um 15.00 oder 16.00Uhr am 6. Januar.

Code: Alles auswählen

// Schaltet die Weihnachtsbeleuchtung (Aussen) vom 1. Dezember bis 6. Januar

rule "Xmas-Beleuchtung (Aussen) EIN"

when
    Time cron "0 00 16 ? 12,1 1-5" or // 16:00:00 Uhr Montag-Freitag, Dezember und Januar
    Time cron "0 00 15 ? 12,1 6-7" // 15:00:00 Uhr Samstag + Sonntag, Dezember und Januar
then
    if(now.plusDays(31).getDayOfYear < 38) //1. Dezember + 31 Tage = 1. Januar = 1. Tag... (1. Dezember - 6. Januar = 38 Tage)
        Swi_Xmas_Aussen.sendCommand(ON)
end



rule "Xmas-Beleuchtung (Aussen) AUS"

when
    Time cron "0 00 08 ? 12,1 1-5" or // 16:00:00 Uhr Montag-Freitag, Dezember und Januar
    Time cron "0 00 09 ? 12,1 6-7" // 05:00:00 Uhr Samstag + Sonntag, Dezember und Januar
then
    if(now.plusDays(31).getDayOfYear < 38) //1. Dezember + 31 Tage = 1. Januar = 1. Tag... (1. Dezember - 6. Januar = 38 Tage)
        Swi_Xmas_Aussen.sendCommand(OFF)
end
Herzlichen Dank

Re: Rule - Xmas-Beleuchtung

Verfasst: 24. Nov 2019 23:51
von udo1toni
Na ja, da es sich um ein fixes Datum und eine fixe Uhrzeit handelt, sollte nichts dagegen sprechen, das als zusätzlichen Time cron Ausdruck an die OFF-Rule zu koppeln:

Code: Alles auswählen

Time cron "59 59 23 6 1 ?" or // weitere Trigger

Re: Rule - Xmas-Beleuchtung

Verfasst: 1. Dez 2019 07:55
von EMaster
Guten Morgen,

heute war der große Tag.
Leider funktioniert es nicht ganz so, wie gedacht und ich verstehe gerade nicht warum.
Obwohl am Wochenende (6-7) erst 10:00Uhr ausgeschalten werden soll, wurde die Regel laut LOG 7:30Uhr ausgeführt, was eigentlich Mo - Fr (1-5) passieren soll.

Code: Alles auswählen

rule "Xmas-Beleuchtung (Innen) AUS"

when
    Time cron "0 30 07 ? 12,1 1-5" or // 07:30:00 Uhr Montag-Freitag, Dezember und Januar
    Time cron "0 45 23 ? 12,1 1-5" or // 23:45:00 Uhr Montag-Freitag, Dezember und Januar
    Time cron "0 00 10 ? 12,1 6-7" or // 10:00:00 Uhr Samstag + Sonntag, Dezember und Januar
    Time cron "0 59 23 ? 12,1 6-7"    // 05:00:00 Uhr Samstag + Sonntag, Dezember und Januar
then
    if(now.plusDays(31).getDayOfYear < 38) //1. Dezember + 31 Tage = 1. Januar = 1. Tag... (1. Dezember - 6. Januar = 38 Tage)
        Xmas.sendCommand(OFF)
end
Ich habe es gerade noch einmal simuliert.
Es wird immer der Time crone fürs WE (6-7) ignoriert und die Zeit unter der Woche(1-5) genommen.

Gelöst: Re: Rule - Xmas-Beleuchtung

Verfasst: 1. Dez 2019 08:24
von EMaster
Ich hab die Lösung gefunden!

Die Angaben der Tage mit 1,2,3,4,5,6,7 scheint er zu ignorieren. Wenn ich stattdessen "SAT,SUN" und "MON,TUE,WED,THU,FRI" eintrage, benutzt er den richtigen Time cron.

Code: Alles auswählen

rule "Xmas-Beleuchtung (Innen) AUS"

when
    Item Swi_Dummy changed or
    Time cron "0 59 23 30 11 ?" or    // 23:59:00 Uhr 30.11. erster Schaltpunkt AUS
    Time cron "0 30 07 ? 12,1 MON,TUE,WED,THU,FRI" or // 07:30:00 Uhr Montag-Freitag, Dezember und Januar
    Time cron "0 45 23 ? 12,1 MON,TUE,WED,THU,FRI" or // 23:45:00 Uhr Montag-Freitag, Dezember und Januar
    Time cron "0 00 10 ? 12,1 SAT,SUN" or // 10:00:00 Uhr Samstag + Sonntag, Dezember und Januar
    Time cron "0 59 23 ? 12,1 SAT,SUN"    // 05:00:00 Uhr Samstag + Sonntag, Dezember und Januar
then
    if(now.plusDays(31).getDayOfYear < 38) //1. Dezember + 31 Tage = 1. Januar = 1. Tag... (1. Dezember - 6. Januar = 38 Tage)
        Xmas.sendCommand(OFF)
end
Ich teste das aber nochmal Live. :-)

Re: Rule - Xmas-Beleuchtung

Verfasst: 29. Jan 2020 17:57
von EMaster
Ich wollte mich nochmal für die Hilfestellungen bedanken. Es hat alles perfekt geklappt.