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>
382 lines
13 KiB
SQL
382 lines
13 KiB
SQL
-- phpMyAdmin SQL Dump
|
|
-- version 5.2.1
|
|
-- https://www.phpmyadmin.net/
|
|
--
|
|
-- Host: 192.168.179.174:3310
|
|
-- Erstellungszeit: 30. Aug 2026 um 16:22
|
|
-- Server-Version: 11.3.2-MariaDB-1:11.3.2+maria~ubu2204
|
|
-- PHP-Version: 8.2.17
|
|
|
|
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
|
START TRANSACTION;
|
|
SET time_zone = "+00:00";
|
|
|
|
|
|
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
|
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
|
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
|
/*!40101 SET NAMES utf8mb4 */;
|
|
|
|
--
|
|
-- Datenbank: `homeMesh`
|
|
--
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Tabellenstruktur für Tabelle `actors`
|
|
--
|
|
|
|
CREATE TABLE `actors` (
|
|
`id` int(11) NOT NULL,
|
|
`type` varchar(50) NOT NULL COMMENT 'Gerätetyp z.B. RollerShutter',
|
|
`name` varchar(70) NOT NULL COMMENT 'Name des Geräts',
|
|
`url` varchar(100) NOT NULL COMMENT 'Tahoma Device URL'
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
|
|
|
|
--
|
|
-- Daten für Tabelle `actors`
|
|
--
|
|
|
|
INSERT INTO `actors` (`id`, `type`, `name`, `url`) VALUES
|
|
(1, 'LOGIC', 'Zeitpunkt', 'Logic');
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Tabellenstruktur für Tabelle `actor_commands`
|
|
--
|
|
|
|
CREATE TABLE `actor_commands` (
|
|
`id` int(11) NOT NULL,
|
|
`actor_id` int(11) NOT NULL COMMENT 'Referenz zum Aktor',
|
|
`command_name` varchar(100) NOT NULL COMMENT 'Name des Commands z.B. setPosition, open, close',
|
|
`command_url` varchar(100) NOT NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Tabellenstruktur für Tabelle `actor_states`
|
|
--
|
|
|
|
CREATE TABLE `actor_states` (
|
|
`id` int(11) NOT NULL,
|
|
`actor_id` int(11) NOT NULL COMMENT 'Referenz zum Aktor',
|
|
`state_name` varchar(100) NOT NULL COMMENT 'Name des State z.B. core:ClosureState',
|
|
`state_type` int(11) DEFAULT NULL COMMENT 'State-Typ Code aus Tahoma API',
|
|
`current_value` varchar(255) DEFAULT NULL COMMENT 'Aktueller Wert des State',
|
|
`unit` varchar(20) DEFAULT NULL COMMENT 'Einheit falls vorhanden',
|
|
`url` varchar(255) DEFAULT NULL COMMENT 'MQTT Topic oder URL zum State',
|
|
`last_updated` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
|
`possible_values` text NOT NULL COMMENT 'JSON array with possible enum values.'
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
|
|
|
|
--
|
|
-- Daten für Tabelle `actor_states`
|
|
--
|
|
|
|
INSERT INTO `actor_states` (`id`, `actor_id`, `state_name`, `state_type`, `current_value`, `unit`, `url`, `last_updated`, `possible_values`) VALUES
|
|
(1, 1, 'Uhrzeit', 5, '13:45', NULL, 'time', '2026-03-16 18:16:44', ''),
|
|
(2, 1, 'Datum', 8, '20.03.2026', NULL, 'date', '2026-03-16 18:16:44', ''),
|
|
(3, 1, 'Sonnenaufgang', 7, '00:00', NULL, 'sunrise', '2026-03-16 18:16:44', ''),
|
|
(4, 1, 'Sonnenuntergang', 7, '00:00', NULL, 'sunset', '2026-03-16 18:16:44', '');
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Tabellenstruktur für Tabelle `command_parameters`
|
|
--
|
|
|
|
CREATE TABLE `command_parameters` (
|
|
`id` int(11) NOT NULL,
|
|
`command_id` int(11) NOT NULL COMMENT 'Referenz zum Command',
|
|
`parameter_name` varchar(100) NOT NULL COMMENT 'Name des Parameters z.B. position',
|
|
`parameter_type` varchar(50) DEFAULT NULL COMMENT 'Datentyp z.B. integer, string',
|
|
`min_value` decimal(10,2) DEFAULT NULL COMMENT 'Minimaler Wert (falls numerisch)',
|
|
`max_value` decimal(10,2) DEFAULT NULL COMMENT 'Maximaler Wert (falls numerisch)',
|
|
`possible_values` text DEFAULT NULL COMMENT 'JSON Array mit möglichen Werten (für Enums)',
|
|
`url` varchar(255) DEFAULT NULL COMMENT 'MQTT Topic oder URL zum Parameter'
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Tabellenstruktur für Tabelle `sensors`
|
|
--
|
|
|
|
CREATE TABLE `sensors` (
|
|
`id` int(11) NOT NULL,
|
|
`type` varchar(50) NOT NULL COMMENT 'Sensortyp z.B. TemperatureSensor',
|
|
`name` varchar(70) NOT NULL COMMENT 'Name des Sensors',
|
|
`url` varchar(100) NOT NULL COMMENT 'Tahoma Device URL'
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Tabellenstruktur für Tabelle `sensor_states`
|
|
--
|
|
|
|
CREATE TABLE `sensor_states` (
|
|
`id` int(11) NOT NULL,
|
|
`sensor_id` int(11) NOT NULL COMMENT 'Referenz zum Sensor',
|
|
`state_name` varchar(100) NOT NULL COMMENT 'Name des State z.B. core:TemperatureState',
|
|
`state_type` int(11) DEFAULT NULL COMMENT 'State-Typ Code aus Tahoma API',
|
|
`current_value` varchar(255) DEFAULT NULL COMMENT 'Aktueller Wert des State',
|
|
`unit` varchar(20) DEFAULT NULL COMMENT 'Einheit z.B. °C, %, lux',
|
|
`url` varchar(255) DEFAULT NULL COMMENT 'MQTT Topic oder URL zum State',
|
|
`last_updated` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Tabellenstruktur für Tabelle `state_types`
|
|
--
|
|
|
|
CREATE TABLE `state_types` (
|
|
`id` int(11) NOT NULL,
|
|
`type` varchar(50) NOT NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
|
|
|
--
|
|
-- Daten für Tabelle `state_types`
|
|
--
|
|
|
|
INSERT INTO `state_types` (`id`, `type`) VALUES
|
|
(6, 'array'),
|
|
(0, 'bool'),
|
|
(8, 'date'),
|
|
(9, 'datetime'),
|
|
(7, 'deltatime'),
|
|
(2, 'float'),
|
|
(1, 'integer'),
|
|
(3, 'string'),
|
|
(5, 'time'),
|
|
(4, 'undefined');
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Stellvertreter-Struktur des Views `view_actors_with_commands`
|
|
-- (Siehe unten für die tatsächliche Ansicht)
|
|
--
|
|
CREATE TABLE `view_actors_with_commands` (
|
|
`actor_id` int(11)
|
|
,`actor_name` varchar(70)
|
|
,`actor_type` varchar(50)
|
|
,`actor_url` varchar(100)
|
|
,`command_id` int(11)
|
|
,`command_name` varchar(100)
|
|
,`parameter_name` varchar(100)
|
|
,`parameter_type` varchar(50)
|
|
,`min_value` decimal(10,2)
|
|
,`max_value` decimal(10,2)
|
|
,`possible_values` text
|
|
);
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Stellvertreter-Struktur des Views `view_all_devices`
|
|
-- (Siehe unten für die tatsächliche Ansicht)
|
|
--
|
|
CREATE TABLE `view_all_devices` (
|
|
`device_category` varchar(6)
|
|
,`id` int(11)
|
|
,`type` varchar(50)
|
|
,`name` varchar(70)
|
|
,`url` varchar(100)
|
|
);
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Stellvertreter-Struktur des Views `view_sensors_with_states`
|
|
-- (Siehe unten für die tatsächliche Ansicht)
|
|
--
|
|
CREATE TABLE `view_sensors_with_states` (
|
|
`sensor_id` int(11)
|
|
,`sensor_name` varchar(70)
|
|
,`sensor_type` varchar(50)
|
|
,`sensor_url` varchar(100)
|
|
,`state_name` varchar(100)
|
|
,`state_type` int(11)
|
|
,`current_value` varchar(255)
|
|
,`unit` varchar(20)
|
|
,`last_updated` timestamp
|
|
);
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Struktur des Views `view_actors_with_commands`
|
|
--
|
|
DROP TABLE IF EXISTS `view_actors_with_commands`;
|
|
|
|
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `view_actors_with_commands` AS SELECT `a`.`id` AS `actor_id`, `a`.`name` AS `actor_name`, `a`.`type` AS `actor_type`, `a`.`url` AS `actor_url`, `ac`.`id` AS `command_id`, `ac`.`command_name` AS `command_name`, `cp`.`parameter_name` AS `parameter_name`, `cp`.`parameter_type` AS `parameter_type`, `cp`.`min_value` AS `min_value`, `cp`.`max_value` AS `max_value`, `cp`.`possible_values` AS `possible_values` FROM ((`actors` `a` left join `actor_commands` `ac` on(`a`.`id` = `ac`.`actor_id`)) left join `command_parameters` `cp` on(`ac`.`id` = `cp`.`command_id`)) ORDER BY `a`.`id` ASC, `ac`.`id` ASC, `cp`.`id` ASC ;
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Struktur des Views `view_all_devices`
|
|
--
|
|
DROP TABLE IF EXISTS `view_all_devices`;
|
|
|
|
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `view_all_devices` AS SELECT 'actor' AS `device_category`, `actors`.`id` AS `id`, `actors`.`type` AS `type`, `actors`.`name` AS `name`, `actors`.`url` AS `url` FROM `actors`union all select 'sensor' AS `device_category`,`sensors`.`id` AS `id`,`sensors`.`type` AS `type`,`sensors`.`name` AS `name`,`sensors`.`url` AS `url` from `sensors` order by `device_category`,`name` ;
|
|
|
|
-- --------------------------------------------------------
|
|
|
|
--
|
|
-- Struktur des Views `view_sensors_with_states`
|
|
--
|
|
DROP TABLE IF EXISTS `view_sensors_with_states`;
|
|
|
|
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `view_sensors_with_states` AS SELECT `s`.`id` AS `sensor_id`, `s`.`name` AS `sensor_name`, `s`.`type` AS `sensor_type`, `s`.`url` AS `sensor_url`, `ss`.`state_name` AS `state_name`, `ss`.`state_type` AS `state_type`, `ss`.`current_value` AS `current_value`, `ss`.`unit` AS `unit`, `ss`.`last_updated` AS `last_updated` FROM (`sensors` `s` left join `sensor_states` `ss` on(`s`.`id` = `ss`.`sensor_id`)) ORDER BY `s`.`id` ASC, `ss`.`id` ASC ;
|
|
|
|
--
|
|
-- Indizes der exportierten Tabellen
|
|
--
|
|
|
|
--
|
|
-- Indizes für die Tabelle `actors`
|
|
--
|
|
ALTER TABLE `actors`
|
|
ADD PRIMARY KEY (`id`),
|
|
ADD UNIQUE KEY `url` (`url`),
|
|
ADD KEY `idx_actors_type` (`type`);
|
|
|
|
--
|
|
-- Indizes für die Tabelle `actor_commands`
|
|
--
|
|
ALTER TABLE `actor_commands`
|
|
ADD PRIMARY KEY (`id`),
|
|
ADD UNIQUE KEY `actor_id_2` (`actor_id`,`command_name`),
|
|
ADD KEY `actor_id` (`actor_id`),
|
|
ADD KEY `idx_actor_commands_name` (`command_name`);
|
|
|
|
--
|
|
-- Indizes für die Tabelle `actor_states`
|
|
--
|
|
ALTER TABLE `actor_states`
|
|
ADD PRIMARY KEY (`id`),
|
|
-- 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`);
|
|
|
|
--
|
|
-- Indizes für die Tabelle `command_parameters`
|
|
--
|
|
ALTER TABLE `command_parameters`
|
|
ADD PRIMARY KEY (`id`),
|
|
-- 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`);
|
|
|
|
--
|
|
-- Indizes für die Tabelle `sensors`
|
|
--
|
|
ALTER TABLE `sensors`
|
|
ADD PRIMARY KEY (`id`),
|
|
ADD UNIQUE KEY `url` (`url`),
|
|
ADD KEY `idx_sensors_type` (`type`);
|
|
|
|
--
|
|
-- Indizes für die Tabelle `sensor_states`
|
|
--
|
|
ALTER TABLE `sensor_states`
|
|
ADD PRIMARY KEY (`id`),
|
|
ADD UNIQUE KEY `sensor_id_2` (`sensor_id`,`url`),
|
|
ADD KEY `sensor_id` (`sensor_id`),
|
|
ADD KEY `idx_sensor_states_name` (`state_name`);
|
|
|
|
--
|
|
-- Indizes für die Tabelle `state_types`
|
|
--
|
|
ALTER TABLE `state_types`
|
|
ADD PRIMARY KEY (`id`),
|
|
ADD UNIQUE KEY `type` (`type`);
|
|
|
|
--
|
|
-- AUTO_INCREMENT für exportierte Tabellen
|
|
--
|
|
|
|
--
|
|
-- AUTO_INCREMENT für Tabelle `actors`
|
|
--
|
|
ALTER TABLE `actors`
|
|
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
|
|
|
|
--
|
|
-- AUTO_INCREMENT für Tabelle `actor_commands`
|
|
--
|
|
ALTER TABLE `actor_commands`
|
|
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
|
|
|
|
--
|
|
-- AUTO_INCREMENT für Tabelle `actor_states`
|
|
--
|
|
ALTER TABLE `actor_states`
|
|
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
|
|
|
|
--
|
|
-- AUTO_INCREMENT für Tabelle `command_parameters`
|
|
--
|
|
ALTER TABLE `command_parameters`
|
|
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
|
|
|
|
--
|
|
-- AUTO_INCREMENT für Tabelle `sensors`
|
|
--
|
|
ALTER TABLE `sensors`
|
|
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
|
|
|
|
--
|
|
-- AUTO_INCREMENT für Tabelle `sensor_states`
|
|
--
|
|
ALTER TABLE `sensor_states`
|
|
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
|
|
|
|
--
|
|
-- Constraints der exportierten Tabellen
|
|
--
|
|
|
|
--
|
|
-- Constraints der Tabelle `actor_commands`
|
|
--
|
|
ALTER TABLE `actor_commands`
|
|
ADD CONSTRAINT `fk_actor_commands_actor` FOREIGN KEY (`actor_id`) REFERENCES `actors` (`id`) ON DELETE CASCADE;
|
|
|
|
--
|
|
-- Constraints der Tabelle `actor_states`
|
|
--
|
|
ALTER TABLE `actor_states`
|
|
ADD CONSTRAINT `fk_actor_states_actor` FOREIGN KEY (`actor_id`) REFERENCES `actors` (`id`) ON DELETE CASCADE,
|
|
ADD CONSTRAINT `fk_type_states_type` FOREIGN KEY (`state_type`) REFERENCES `state_types` (`id`) ON DELETE CASCADE;
|
|
|
|
--
|
|
-- Constraints der Tabelle `command_parameters`
|
|
--
|
|
ALTER TABLE `command_parameters`
|
|
ADD CONSTRAINT `fk_command_parameters_command` FOREIGN KEY (`command_id`) REFERENCES `actor_commands` (`id`) ON DELETE CASCADE;
|
|
|
|
--
|
|
-- Constraints der Tabelle `sensor_states`
|
|
--
|
|
ALTER TABLE `sensor_states`
|
|
ADD CONSTRAINT `fk_sensor_states_sensor` FOREIGN KEY (`sensor_id`) REFERENCES `sensors` (`id`) ON DELETE CASCADE;
|
|
COMMIT;
|
|
|
|
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
|
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
|
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|