Ferien und Feiertage dreiwertig, dazu eine Tagessperre
"An Wochenenden und Feiertagen" liess sich bisher gar nicht schreiben. Die Wochentagsmaske kennt nur Samstag und Sonntag, und ein Feiertag am Dienstag ist fuer sie eben ein Dienstag; on_holiday war ja/nein und konnte nur wegnehmen, nie hinzufuegen. on_vacation und on_holiday tragen deshalb jetzt drei Werte: 0 nie, 1 egal (Vorgabe), 2 zusaetzlich. Der dritte zaehlt wie ein angehakter Wochentag - Sa+So angehakt und "Feiertage: zusaetzlich" ergibt den gewuenschten Fall, und mit gar keinem angehakten Tag sogar "nur an Feiertagen". In tag_passt() wird erst geoeffnet, dann gesperrt: ein Verbot schlaegt eine Erweiterung. Wer in den Ferien nie laeuft und an Feiertagen zusaetzlich, laeuft an einem Feiertag in den Ferien nicht - andersherum liesse sich "nie" nicht mehr verlassen. Dazu once_per_day: nach dem Ausloesen bis Mitternacht Ruhe. Fuer alles, was man hinterher von Hand wieder anders stellt - ein Rollladen, den man um acht zugezogen hat, soll nicht um neun von selbst wieder auffahren, weil eine Wolke weiterzieht und die Helligkeitsschwelle ein zweites Mal steigt. Die Sperrzeit taugte dafuer nicht: sie zaehlt Sekunden und muesste auf 86400 stehen, womit eine Automatik, die heute um 07:00:05 lief, morgen um 07:00:00 noch gesperrt waere und einen ganzen Tag ausfiele. Gefragt wird deshalb nach dem Datum von last_run - dieselbe Funktion, die auch force_once benutzt, nur mit umgekehrtem Vorzeichen. Die Spalten bleiben TINYINT und tragen die 2 ohne Weiteres; die vorhandenen Zeilen stehen auf 0 oder 1 und behalten damit genau ihre bisherige Bedeutung. Umzurechnen gibt es nichts. rahmen_erweitern.sql setzt nur Kommentare und legt once_per_day an. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
-- ===========================================================================
|
||||
-- Rahmenbedingungen erweitern: Ferien und Feiertage dreiwertig,
|
||||
-- dazu die Tagessperre.
|
||||
--
|
||||
-- Einspielen:
|
||||
-- mysql -h 127.0.0.1 -P 3310 -u homeMesh -p homeMesh < rahmen_erweitern.sql
|
||||
--
|
||||
-- Danach den Runner neu starten (startSolarServer.sh) - Daten laedt er
|
||||
-- selbst nach, neuen Code nicht.
|
||||
--
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- 1. on_vacation / on_holiday sind jetzt dreiwertig
|
||||
--
|
||||
-- 0 = nie an solchen Tagen laeuft die Automatik nicht
|
||||
-- 1 = egal der Tag aendert nichts (Vorgabe, wie bisher)
|
||||
-- 2 = zusaetzlich zaehlt wie ein passender Wochentag
|
||||
--
|
||||
-- Die Spalten bleiben, wie sie sind - TINYINT traegt die 2 ohne Weiteres,
|
||||
-- und die vorhandenen Zeilen stehen bereits auf 0 oder 1 und behalten damit
|
||||
-- genau ihre bisherige Bedeutung. Es gibt nichts umzurechnen.
|
||||
--
|
||||
-- Gebraucht wird die 2 fuer den Fall, den man vorher gar nicht schreiben
|
||||
-- konnte: "an Wochenenden und Feiertagen". Die Wochentagsmaske kennt nur
|
||||
-- Samstag und Sonntag, ein Feiertag am Dienstag ist eben ein Dienstag. Mit
|
||||
-- der 2 genuegt Sa+So angehakt und "Feiertage: zusaetzlich".
|
||||
--
|
||||
-- 2. once_per_day - nach dem Auslösen bis Mitternacht Ruhe
|
||||
--
|
||||
-- Fuer alles, was man hinterher von Hand wieder anders stellt. Ein Rollladen,
|
||||
-- den man um acht nochmal zugezogen hat, soll nicht um neun von selbst wieder
|
||||
-- auffahren, nur weil eine Wolke weiterzieht und die Helligkeitsschwelle ein
|
||||
-- zweites Mal steigt.
|
||||
--
|
||||
-- Die Sperrzeit (lockout_secs) taugt dafuer nicht: sie zaehlt Sekunden und
|
||||
-- muesste auf 86400 stehen, womit sie am naechsten Morgen den Termin knapp
|
||||
-- verfehlen wuerde - eine Automatik, die heute um 07:00:05 lief, waere
|
||||
-- morgen um 07:00:00 noch gesperrt und fiele einen ganzen Tag aus.
|
||||
-- ===========================================================================
|
||||
|
||||
ALTER TABLE automations
|
||||
MODIFY COLUMN on_vacation TINYINT(1) NOT NULL DEFAULT 1
|
||||
COMMENT '0=nie, 1=egal, 2=zusaetzlich (zaehlt wie passender Wochentag)',
|
||||
MODIFY COLUMN on_holiday TINYINT(1) NOT NULL DEFAULT 1
|
||||
COMMENT '0=nie, 1=egal, 2=zusaetzlich (zaehlt wie passender Wochentag)';
|
||||
|
||||
-- Idempotent: beim zweiten Lauf steht die Spalte schon da.
|
||||
SET @vorhanden := (SELECT COUNT(*) FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'automations'
|
||||
AND COLUMN_NAME = 'once_per_day');
|
||||
|
||||
SET @sql := IF(@vorhanden = 0,
|
||||
'ALTER TABLE automations ADD COLUMN once_per_day TINYINT(1) NOT NULL DEFAULT 0
|
||||
COMMENT ''nach dem Auslösen bis Mitternacht gesperrt''
|
||||
AFTER force_once',
|
||||
'DO 0');
|
||||
|
||||
PREPARE stmt FROM @sql;
|
||||
EXECUTE stmt;
|
||||
DEALLOCATE PREPARE stmt;
|
||||
|
||||
SELECT COLUMN_NAME, COLUMN_DEFAULT, COLUMN_COMMENT
|
||||
FROM information_schema.COLUMNS
|
||||
WHERE TABLE_SCHEMA = DATABASE()
|
||||
AND TABLE_NAME = 'automations'
|
||||
AND COLUMN_NAME IN ('on_vacation', 'on_holiday', 'once_per_day');
|
||||
Reference in New Issue
Block a user