diff --git a/restricted/autoActions/README.md b/restricted/autoActions/README.md index 1768c49..8418f51 100644 --- a/restricted/autoActions/README.md +++ b/restricted/autoActions/README.md @@ -69,9 +69,14 @@ folgen derselben Überlegung. Beim Sonnenauf- und -untergang ist der Wert ein Versatz, und der kann davor oder danach liegen — deshalb dieselben drei Fälle mal zwei: `+ 00:30` eine halbe Stunde nach Sonnenaufgang, `ab - 00:30` ab einer halben Stunde davor, -`vor + 00:30` bis eine halbe Stunde danach. Rutscht ein Versatz rechnerisch -über den Tagesrand, bleibt es beim Tagesrand — „kurz vor Sonnenaufgang" soll -nicht plötzlich gestern Abend bedeuten. +`vor + 00:30` bis eine halbe Stunde danach. + +Über den Tagesrand wird gerechnet, nicht abgeschnitten: „sechs Stunden vor +Sonnenaufgang" landet am Vorabend, und das ist so gewollt — abgeschnitten +wären solche Angaben gar nicht mehr formulierbar. Verglichen wird die Uhrzeit +innerhalb des Tages; ein Ziel jenseits von Mitternacht gilt als diese Uhrzeit +am selben Tag. Bei `+` und `-` ist das genau der gemeinte Zeitpunkt, bei `ab` +und `vor` verschiebt sich der wahre Bereich entsprechend mit. `force_once` („am Ende des Zeitraums auf jeden Fall ausführen") greift, wenn das Fenster zugeht und in diesem Fenster noch nichts passiert ist. diff --git a/restricted/autoActions/autoaction_runner.py b/restricted/autoActions/autoaction_runner.py index 6bdaf6c..2121790 100644 --- a/restricted/autoActions/autoaction_runner.py +++ b/restricted/autoActions/autoaction_runner.py @@ -282,12 +282,16 @@ def bedingung_erfuellt(bedingung, state, wert, jetzt): # davor: ">=-" heisst "ab einer halben Stunde davor". versatz = minuten(soll) ziel = minuten(wert) + (-versatz if op.endswith("-") else versatz) - # Ein Versatz kann rechnerisch ueber den Tagesrand rutschen - # (Sonnenaufgang 05:34 minus sechs Stunden). Dann bleibt es beim - # Tagesrand, statt auf die andere Seite von Mitternacht zu - # springen - "kurz vor Sonnenaufgang" soll nicht ploetzlich - # gestern abend bedeuten. - ziel = max(0, min(1439, ziel)) + # Ueber den Tagesrand wird gerechnet, nicht abgeschnitten: "sechs + # Stunden vor Sonnenaufgang" ist eine gewollte Angabe und landet + # dann eben am Vorabend. Abgeschnitten waeren solche Faelle gar + # nicht mehr formulierbar. + # + # Verglichen wird die Uhrzeit innerhalb des Tages. Ein Ziel + # jenseits von Mitternacht gilt also als diese Uhrzeit am selben + # Tag - bei "um" ist das genau der gemeinte Zeitpunkt, bei "ab" + # und "vor" verschiebt sich der wahre Bereich entsprechend. + ziel %= 1440 jetzt_m = jetzt.hour * 60 + jetzt.minute if op.startswith(">="): return jetzt_m >= ziel if op.startswith("<"): return jetzt_m < ziel