From d6da199df1a8da9ba7f9514a989f5566b71be5d7 Mon Sep 17 00:00:00 2001 From: "m0@nas" Date: Tue, 22 Sep 2026 07:36:41 +0200 Subject: [PATCH] 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 --- autoActions/autoaction_runner.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/autoActions/autoaction_runner.py b/autoActions/autoaction_runner.py index 015d62d..bf44a77 100644 --- a/autoActions/autoaction_runner.py +++ b/autoActions/autoaction_runner.py @@ -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)