Discovery: alle Geraete finden und stabil ablegen
Ein Lauf mit allen Modulen brachte 54 Geraete und 441 Messwerte - und fuenf Fehler ans Licht, die vorher niemand sehen konnte, weil clear_tables die Tabellen bei jedem Lauf geleert hat. Vier davon sind Schluessel- und Upsert-Fehler derselben Familie: * command_parameters war ueber (command_id, url) eindeutig. WLED-Parameter haben keine URL - ihr Name ist der Platzhalter in der Kommando-Vorlage -, und eine NULL kollidiert in MySQL nie. ON DUPLICATE KEY UPDATE griff also nicht, und jeder Lauf legte dieselben Parameter erneut an: aus 18 wurden nach drei Laeufen 54. Schluessel jetzt (command_id, parameter_name). * actor_states war ueber (actor_id, url) eindeutig. Umgekehrtes Problem: Messwerte, die sich ein Topic teilen, ueberschrieben einander. Der go-eCharger schickt sechzehn Werte als JSON-Feld auf einem Topic - von denen kam genau einer in der Datenbank an. Schluessel jetzt (actor_id, state_name), das bringt 50 verlorene Messwerte zurueck. * Kommandos, Messwerte und Parameter aktualisierten ihre URL beim Wiederholungslauf nicht - sie stand nicht im UPDATE-Teil. Eine Korrektur in einem Modul kam damit nie in einer bestehenden Datenbank an. * Der Typ eines Kommando-Parameters wurde als Text in eine int-Spalte geschrieben. MariaDB macht daraus stillschweigend 0, und 0 ist "bool" - deshalb bot der Editor fuer die WLED-Helligkeit (0..255) ein Ja/Nein an. Der fuenfte: die Shelly-Gen1-Relais hatten weder eine Kommando-URL noch eine URL am Zustand. Ohne die weiss niemand, was zu schicken und wo nachzusehen ist. Gen1 schaltet ueber ?turn=on|off|toggle und meldet sich in "ison". Damit entfaellt auch die Uebersetzungstabelle im HTTPTransport: die Zuordnung gehoert ins Geraetemodell, nicht in den Runner. Zwei Luecken auf der Runner-Seite, die derselbe Lauf gezeigt hat: * WLED liess sich gar nicht ansteuern - es gab keinen Transport dafuer. Der neue nutzt die JSON-Vorlage aus command_url, fuellt die Platzhalter und schickt sie am Stueck an /json/state. * Tahoma wurde am Schema "io://" erkannt. Das Schema beschreibt aber die Funkart: dieselbe Box liefert rts:// fuer die Dachfenster und internal:// fuer die Alarmanlage. Drei von 22 Geraeten fielen durch. Erkannt wird jetzt an der Box-Kennung in der URL. Nachgemessen: zwei Laeufe hintereinander aendern keine einzige Zeile mehr, die Geraete-IDs bleiben ueber Laeufe stabil (Voraussetzung fuer die Fremdschluessel der Automatiken), alle 54 Geraete finden genau einen Transport, und 440 der 441 Messwerte sind tatsaechlich lesbar. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+10
-2
@@ -261,7 +261,11 @@ ALTER TABLE `actor_commands`
|
||||
--
|
||||
ALTER TABLE `actor_states`
|
||||
ADD PRIMARY KEY (`id`),
|
||||
ADD UNIQUE KEY `actor_id_2` (`actor_id`,`url`),
|
||||
-- Auf den Namen und nicht auf die URL, aus demselben Grund wie bei
|
||||
-- command_parameters: korrigiert ein Modul die URL eines Messwerts, soll
|
||||
-- die vorhandene Zeile geaendert werden. Am URL-Schluessel entstand
|
||||
-- stattdessen eine zweite Zeile, und die alte blieb ohne URL zurueck.
|
||||
ADD UNIQUE KEY `actor_id_2` (`actor_id`,`state_name`),
|
||||
ADD KEY `actor_id` (`actor_id`),
|
||||
ADD KEY `idx_actor_states_name` (`state_name`),
|
||||
ADD KEY `state_type` (`state_type`);
|
||||
@@ -271,7 +275,11 @@ ALTER TABLE `actor_states`
|
||||
--
|
||||
ALTER TABLE `command_parameters`
|
||||
ADD PRIMARY KEY (`id`),
|
||||
ADD UNIQUE KEY `command_id_2` (`command_id`,`url`),
|
||||
-- Auf den Namen und nicht auf die URL: Parameter ohne URL (WLED traegt
|
||||
-- alles in der Kommando-Vorlage) haetten dort NULL, und eine NULL
|
||||
-- kollidiert in MySQL nie - ON DUPLICATE KEY UPDATE griff nicht und jeder
|
||||
-- Discovery-Lauf legte die Parameter erneut an.
|
||||
ADD UNIQUE KEY `command_id_2` (`command_id`,`parameter_name`),
|
||||
ADD KEY `command_id` (`command_id`);
|
||||
|
||||
--
|
||||
|
||||
Reference in New Issue
Block a user