Bisher loeste eine Automatik in dem Moment aus, in dem die Bedingung wahr wurde. Fuer Dauerzustaende taugt das nicht: "der Wasserzaehler laeuft" ist jedes Haendewaschen, gemeint war "laeuft seit einer halben Stunde ohne Pause". hold_secs schiebt die Flanke nach hinten, statt sie zu verbrauchen - cond_met bleibt bis dahin 0, und alles danach (Tagessperre, Sperrzeit, Protokoll) bleibt unberuehrt. Ein Aussetzer setzt die Zeit zurueck, das Zugehen des Zeitfensters ebenfalls. Gezaehlt wird im Speicher (erfuellt_seit) wie war_aktiv: nach einem Neustart weiss niemand, ob die Bedingung zwischendurch anlag. hold_secs = 0 ist die Vorgabe und heisst: wie bisher. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
35 lines
1.6 KiB
SQL
35 lines
1.6 KiB
SQL
-- ===========================================================================
|
|
-- Haltezeit: die Bedingung muss eine Weile durchgehend erfuellt sein
|
|
--
|
|
-- Einspielen:
|
|
-- mysql -h 127.0.0.1 -P 3310 -u homeMesh -p homeMesh < haltezeit.sql
|
|
--
|
|
-- Danach den Runner neu starten (startSolarServer.sh) - Daten laedt er
|
|
-- selbst nach, neuen Code nicht.
|
|
--
|
|
-- ---------------------------------------------------------------------------
|
|
-- Wozu
|
|
--
|
|
-- Bisher loeste eine Automatik in dem Moment aus, in dem die Bedingung wahr
|
|
-- wurde. Fuer "Temperatur ueber 22 Grad" ist das richtig. Fuer "der
|
|
-- Wasserzaehler laeuft und hoert nicht auf" ist es unbrauchbar: Jeder
|
|
-- Spuelgang macht die Bedingung wahr, und gemeint war "seit einer halben
|
|
-- Stunde ohne Pause".
|
|
--
|
|
-- Die Sperrzeit (lockout_secs) taugt dafuer nicht - sie begrenzt, wie oft
|
|
-- ausgeloest wird, nicht wie lange etwas anliegen muss. Und die Verkettung
|
|
-- ueber eine zweite Automatik traefe es nur ungefaehr.
|
|
--
|
|
-- hold_secs = 0 ist die Vorgabe und heisst: sofort, also genau wie bisher.
|
|
-- Jede vorhandene Automatik behaelt damit ihr Verhalten.
|
|
--
|
|
-- Gezaehlt wird im Runner, nicht in der Datenbank: Er weiss ohnehin bei
|
|
-- jedem Takt, ob die Bedingung gerade erfuellt ist. Faellt sie zwischendurch
|
|
-- aus, faengt die Zeit von vorn an - genau das ist "ohne Pause".
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
ALTER TABLE `automations`
|
|
ADD COLUMN IF NOT EXISTS `hold_secs` int(11) NOT NULL DEFAULT 0
|
|
COMMENT 'Haltezeit: so lange muss die Bedingung ununterbrochen erfuellt sein, bevor ausgeloest wird. 0 = sofort'
|
|
AFTER `lockout_secs`;
|