Seite 3 von 3

Re: Rule - Xmas-Beleuchtung

Verfasst: 30. Nov 2025 16:02
von udo1toni
Ähm... Ja, das hat schon seine Richtigkeit :) Die Formel stimmt und funktioniert soweit.
Allerdings ist die Prüfung in der Rule falsch, denn heute ist der erste Advent und da ist now.getDayOfYear = intStAdvent. Korrekt wäre also

Code: Alles auswählen

var Integer intStAdvent            = 0
rule "Berechnung nach Mitternacht"
 when
    Time cron "5 0 0 * * ?" or
    System started
 then
    val firstAdvent = LocalDate.of(now.getYear,12,25).minusDays(LocalDate.of(now.getYear,12,25).getDayOfWeek.getValue + 21)
    intStAdvent = firstAdvent.getDayOfYear
    logInfo("holiday","Der erste Advent ist am {}", firstAdvent)
end

rule "Weihnachtslicht ein"
 when
    Time cron "0 0 6 * * ?" or          // morgens 6 Uhr
    Time cron "0 30 16 * * ?"          // nachmittags 16:30 Uhr
 then
    if (now.getDayOfYear < 7 || now.getDayOfYear >= intStAdvent) { // ab 1. Advent, inclusive
        logDebug("x-mas","Weihnachtsbeleuchtung ein.")
        Swi_Weihnachtsbaum.sendCommand(ON)
    }
end

rule "Weihnachtslicht aus"
 when
    Time cron "0 0 8 * * ?" or               // morgens 8 Uhr
    Time cron "0 45 23 * * ?"               // abends 23:45 Uhr
 then
    if (now.getDayOfYear < 7 || now.getDayOfYear >= intStAdvent) { // ab 1. Advent, inclusive
        logDebug("x-mas","Weihnachtsbeleuchtung aus.")
        Swi_Weihnachtsbaum.sendCommand(OFF)
    }
end
Ich habe schon lange keine Adventsbeleuchtung mehr aufgehängt, sonst wäre mir dieser Fehler schon früher aufgefallen...

Re: Rule - Xmas-Beleuchtung

Verfasst: 30. Nov 2025 16:06
von EMaster
Nach etwas Basteln und Auswertung der entstandenen Fehlermeldungen im LOG, habe ich jetzt folgende Version, die bis jetzt funktioniert.
Mal schauen, wie es über den Jahreswechsel bis zum 6. Januar ausschaut. Wobei ich denke, dass der Teil da jetzt irgendwie fehlt. :-(

Code: Alles auswählen

import java.time.LocalDate
import java.time.format.DateTimeFormatter

var Integer intStAdvent = 0

rule "Berechnung des 1. Advents nach Mitternacht"
when
    Time cron "5 0 0 * * ?" or
    System started
then
    val firstAdvent = LocalDate.of(LocalDate.now().getYear, 12, 25)
        .minusDays(LocalDate.of(LocalDate.now().getYear, 12, 25).getDayOfWeek().getValue + 21)

    intStAdvent = firstAdvent.getDayOfYear()

    logInfo("holiday", "Der erste Advent ist in diesem Jahr am " + firstAdvent.toString)

    val formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy")
    logInfo("holiday", "Formatiert: " + firstAdvent.format(formatter))
end

rule "Weihnachtslicht AUSSEN ein"
when
    Time cron "0 00 05 * * MON,TUE,WED,THU,FRI" or // 05:00:00 Uhr Montag-Freitag
    Time cron "0 00 05 * * SAT,SUN" or // 05:00:00 Uhr Samstag + Sonntag
    Time cron "0 00 16 * * MON,TUE,WED,THU,FRI" or // 16:00:00 Uhr Montag-Freitag
    Time cron "0 00 16 * * SAT,SUN" // 16:00:00 Uhr Samstag + Sonntag
then
    val today = LocalDate.now()
    if (today.getDayOfYear() < 7 || today.getDayOfYear() >= intStAdvent) {
        logDebug("x-mas_aussen", "Weihnachtsbeleuchtung Aussen ein.")
        Xmas_Aussen.sendCommand(ON)
    }
end

Re: Rule - Xmas-Beleuchtung

Verfasst: 30. Nov 2025 17:45
von udo1toni
Nein, diese Regel funktioniert nicht.
Der Time cron Ausdruck ist falsch.

Re: Rule - Xmas-Beleuchtung

Verfasst: 30. Nov 2025 22:35
von EMaster
udo1toni hat geschrieben: 30. Nov 2025 17:45 Nein, diese Regel funktioniert nicht.
Der Time cron Ausdruck ist falsch.
OK, da sind paar 0 zu viel drin. Das meinst Du doch sicher, oder?
Hat aber auch mit den 0 zum richtigen Zeitpunkt eingeschaltet.
Die Frage war eher, ob sie bis zum 6. Januar berechnet.

Re: Rule - Xmas-Beleuchtung

Verfasst: 1. Dez 2025 11:42
von udo1toni
Nein.

Jeder Time cron Ausdruck muss exakt(!) ein Fragezeichen enthalten.
Entweder, Du setzt das Fragezeichen beim Tag im Monat (4. Stelle) oder beim Wochentag (6. Stelle). Also entweder

Code: Alles auswählen

when
    Time cron "0 00 05 ? * MON,TUE,WED,THU,FRI" or // 05:00:00 Uhr Montag-Freitag
    Time cron "0 00 05 ? * SAT,SUN" or             // 05:00:00 Uhr Samstag + Sonntag
    Time cron "0 00 16 ? * MON,TUE,WED,THU,FRI" or // 16:00:00 Uhr Montag-Freitag
    Time cron "0 00 16 ? * SAT,SUN"                // 16:00:00 Uhr Samstag + Sonntag
then
oder

Code: Alles auswählen

when
    Time cron "0 00 05 * * ?" or // 05:00:00 Uhr
    Time cron "0 00 16 * * ?"    // 16:00:00 Uhr
then
Im vorliegenden Fall sind die Trigger tatsächlich Wochentag unabhängig. entsprechend wäre die zweite Variante zielführender ;)

Ob man 0 oder 00 schreibt, ist hingegen egal. Auch * und 0/1 sind gleichwertig. 0/1 bedeutet: "nimm jeden möglichen Wert, beginnend mit 0". Entsprechend wäre 2/5: "Nimm jeden 5. Wert, beginnend mit 2", also 2,7,12 usw. bis zum höchstmöglichen Wert des Feldes.

Re: Rule - Xmas-Beleuchtung

Verfasst: 2. Dez 2025 17:44
von EMaster
Ah, OK.
Vielen Dank für den Hinweis.