Files
SolarManager/wecker_zu_automatik.sql
adminandClaude Opus 5 1f1700391d Wecker als Automatik statt als eigener Prozess
wecker.py hat genau das getan, was der AutoAction-Runner ohnehin kann -
nur mit allem doppelt: eigener Datenbank alarm, eigenem Feiertags- und
Ferienkalender neben calendar_days, eigenem UDP-Log auf Port 13377,
eigener Endlosschleife und einem Startskript samt naechtlichem Neustart
um drei.

Punkt fuer Punkt hatte der Runner die bessere Fassung schon: die Zeit
als Bedingung "um 05:50" mit Nachholfenster statt eines Vergleichs im
20-Sekunden-Takt, weekdays als Bitmaske statt sieben Spalten,
on_holiday/on_vacation gegen calendar_days statt gegen einen zweiten
Kalender, die steigende Flanke statt einer wecked-Spalte, und den
Versand mit einem Faden je Geraet statt fuenf HTTP-Versuchen im Abstand
von vier Sekunden.

Umgezogen ist die eine Weckzeit, die scharf war: 05:50, Mo-Fr, nicht in
den Ferien, nicht an Feiertagen, WLED-Preset 5 auf MenasHimmel. Die drei
anderen Zeilen in alarmtime standen auf onoff = -1.
wecker_zu_automatik.sql legt die Automatik an und beschreibt im Kopf,
wie dasselbe im Dashboard von Hand geht.

Die Datenbank alarm und der Abschnitt [alarm] in der config.ini bleiben
vorerst stehen - sie liest nur niemand mehr.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-09 21:12:20 +02:00

77 lines
3.5 KiB
SQL

-- ===========================================================================
-- Der Wecker als Automatik
--
-- Ersetzt wecker.py. Das Skript hat dasselbe getan, was der AutoAction-Runner
-- ohnehin kann, nur mit eigener Datenbank (`alarm`), eigenem Feiertags- und
-- Ferienkalender, eigenem UDP-Log und einer eigenen Endlosschleife:
--
-- wecker.py Automatik
-- --------------------------------- ----------------------------------
-- alarmtime.time_1 = 05:50:00 Bedingung "Uhrzeit = 05:50"
-- alarmtime.mo..fr != -1 weekdays = 31 (Bit 0..4, Mo bis Fr)
-- mode = schule, is_holiday() on_holiday = 0
-- mode = schule, is_school_holiday() on_vacation = 0
-- alarmtime.wecked = heute cond_met, die steigende Flanke
-- POST {"ps": 5} an 192.168.179.139 Kommando "Preset" des Aktors
-- MenasHimmel, Parameter preset = 5
--
-- Preset 5 heisst am Geraet "Wakeup".
--
-- Von den vier Zeilen in `alarmtime` war nur eine scharf (id 3, 05:50, Modus
-- schule); die drei anderen standen auf onoff = -1. Nur diese eine zieht hier
-- also um.
--
-- Einspielen:
-- mysql -h 127.0.0.1 -P 3310 -u homeMesh -p homeMesh < wecker_zu_automatik.sql
--
-- Dasselbe geht auch ohne SQL: im Dashboard unter "Automatismen", Etage EG,
-- neue Automatik anlegen - Bedingung "Uhrzeit um 05:50", Aktion
-- "MenasHimmel / Preset" mit Wakeup, Wochentage Mo-Fr, die beiden Haken
-- "auch in den Ferien" und "auch an Feiertagen" heraus. Der Runner liest das
-- Regelwerk alle 30 Sekunden neu, ein Neustart ist so oder so nicht noetig.
-- ===========================================================================
INSERT INTO automations
(name, floor, enabled, window_from, window_to, weekdays,
on_vacation, on_holiday, force_once, lockout_secs)
SELECT Wecker Magdalena, EG, 1, 00:00:00, 23:59:00, 31, 0, 0, 0, 900
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM automations WHERE name = Wecker Magdalena);
SET @auto = (SELECT id FROM automations WHERE name = Wecker Magdalena);
-- Bedingung: state_id 1 ist der gerechnete Messwert "Uhrzeit" des
-- Logic-Aktors. Operator = heisst "um", also ab dieser Minute noch
-- catchup_minutes lang wahr - ausgeloest wird trotzdem nur einmal, dafuer
-- sorgt die Flanke.
INSERT INTO automation_conditions
(automation_id, group_no, position, state_id, operator, value)
SELECT @auto, 0, 0, 1, =, 05:50
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM automation_conditions
WHERE automation_id = @auto AND state_id = 1);
-- Aktion: command_id 20 ist "Preset" des WLED-Aktors MenasHimmel
-- (wled://192.168.179.139), Vorlage {"ps":%preset%}.
INSERT INTO automation_actions (automation_id, position, command_id)
SELECT @auto, 0, 20
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM automation_actions
WHERE automation_id = @auto AND command_id = 20);
SET @aktion = (SELECT id FROM automation_actions
WHERE automation_id = @auto AND command_id = 20);
-- parameter_id 16 ist "preset" zu diesem Kommando.
INSERT INTO automation_action_params (action_id, parameter_id, value)
VALUES (@aktion, 16, "5")
ON DUPLICATE KEY UPDATE value = VALUES(value);
SELECT a.id, a.name, a.weekdays, a.on_vacation, a.on_holiday,
c.operator, c.value AS uhrzeit, p.value AS preset
FROM automations a
JOIN automation_conditions c ON c.automation_id = a.id
JOIN automation_actions ak ON ak.automation_id = a.id
JOIN automation_action_params p ON p.action_id = ak.id
WHERE a.name = "Wecker Magdalena";