Datumsbedingungen: Jahr wird ignoriert, jaehrliche Wiederholung moeglich

uhrzeit_erfuellt() verglich beim Datentyp "date" bisher das volle Datum
samt Jahr. Damit musste jede Automatik mit einer Datumsbedingung jedes Jahr
von Hand nachgezogen werden - die Frostwarnung stand deshalb fest auf
2026/2027 und waere zum naechsten Jahreswechsel wieder falsch gewesen.

Verglichen wird jetzt nur noch (Monat, Tag). Ein Fenster, das ueber den
Jahreswechsel reicht, laesst sich damit weiterhin nicht in einer einzigen
Bedingung ausdruecken - dafuer braucht es zwei Bedingungen ohne obere bzw.
untere Grenze in getrennten (oder verbundenen) Gruppen, wie es die
Frostwarnung schon vorher tat.

Dabei die eigentliche Ursache gefunden, warum die Frostwarnung nie
ausloeste: alle sechs Bedingungen standen in derselben Gruppe (group_no = 0)
und damit UND-verknuepft - ein Datum kann nicht gleichzeitig im
September/November- UND im Februar/April-Fenster liegen. Die zweite Haelfte
(Bedingungen 271-273) steht jetzt in einer eigenen Gruppe, ODER-verknuepft
mit der ersten. Reine Datenaenderung, kein Schema-Update noetig.

Getestet gegen das echte Regelwerk, ohne Schaltbefehle: vorher an keinem
Tag erfuellbar, nachher am 22.09. (3,6 Grad) korrekt ausgeloest - siehe
automation_log, push_abos.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-22 07:36:41 +02:00
co-authored by Claude Sonnet 5
parent 813af4e8a2
commit d6da199df1
+11 -4
View File
@@ -380,10 +380,17 @@ def uhrzeit_erfuellt(typ, op, soll, jetzt, fenster):
soll_d = als_datum(soll)
if soll_d is None:
return False
ist_d = jetzt.date()
if op == "=": return ist_d == soll_d
if op == "<": return ist_d < soll_d
return ist_d >= soll_d
# Nur Monat und Tag zaehlen, das Jahr der Eingabe wird ignoriert -
# eine Datumsbedingung soll sich jaehrlich wiederholen, ohne dass sie
# jedes Jahr von Hand nachgezogen werden muss. Der Vergleich zweier
# (Monat, Tag)-Paare ordnet sich wie das Kalenderjahr selbst; nur ein
# Fenster, das über den Jahreswechsel reicht, laesst sich damit nicht
# in einer einzigen Bedingung ausdruecken (siehe doku/automatiken.md).
ist_mt = (jetzt.month, jetzt.day)
soll_mt = (soll_d.month, soll_d.day)
if op == "=": return ist_mt == soll_mt
if op == "<": return ist_mt < soll_mt
return ist_mt >= soll_mt
jetzt_m, soll_m = jetzt.hour * 60 + jetzt.minute, minuten(soll)
if op == "=": return im_nachholfenster(jetzt_m, soll_m, fenster)