Files
Smart-Dashboard/homeMesh_DB-layout.sql
T
adminandClaude Opus 5 56b2ab1648 Mehrere Messwerte auf einem Topic auseinanderhalten
Der go-eCharger schickt sechzehn Zahlen als JSON-Feld auf einem einzigen
Topic, die Wechselrichter und die WLAN-Felder machen es aehnlich. Welcher
Teil der Nutzlast gemeint ist, steht im value_template der
Home-Assistant-Discovery - das Modul las es bisher nur, um den Datentyp zu
raten, und warf es dann weg. Alle sechzehn Messwerte bekamen denselben
Rohtext.

actor_states hat jetzt eine Spalte value_path: ein Pfad in die Nutzlast, in
derselben Schreibweise, die WLED schon benutzt ("[4]", "ssid",
"seg[0].col[0]"). NULL heisst weiterhin: die ganze Nutzlast.

Gelesen wird aus dem Template nur der einfache Fall - ein Zugriff auf
value_json und was danach an Punkten und Klammern folgt. Von den 40
Vorlagen, die hier auf dem Broker liegen, sind 28 genau das. Die uebrigen
zwoelf sind entweder die ganze Nutzlast (dann ist NULL richtig) oder
Werttabellen wie ['Idle','Charging'][value_json|int] - das ist kein Pfad,
sondern eine Uebersetzung von Zahl nach Text, und dort bleibt es beim
bisherigen Verhalten. Kein einziger Fehltreffer: die Werttabellen liefern
sauber None statt eines erfundenen Pfades.

Die Pfad-Auswertung stand schon im WLED-Transport; sie ist jetzt eine
gemeinsame Funktion, die sich beide teilen. MQTT wertet die Nutzlast einmal
je Nachricht aus und verteilt sie danach an alle Messwerte des Topics.

Nachgemessen: die sechzehn nrg-Werte liefern jetzt sechzehn eigene Zahlen
statt sechzehnmal dasselbe, die Leseabdeckung bleibt bei 440 von 441, und
ein weiterer Discovery-Lauf aendert keine Zeile.

Die restlichen geteilten Topics sind kein Fehler: bei den Wechselrichtern
lesen "Limit Persistent" und "Limit NonPersistent" wirklich denselben Wert
und unterscheiden sich nur im Kommando-Topic, und beim Thermostat liest die
Klima-Entity dieselbe Temperatur wie der Sensor.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 15:23:08 +02:00

383 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',
`value_path` varchar(120) DEFAULT NULL COMMENT 'Pfad in die Nutzlast, wenn sich mehrere Messwerte ein Topic teilen: der go-eCharger schickt sechzehn Zahlen als JSON-Feld auf einem Topic. Schreibweise [3], ssid, foo[0].bar. NULL = ganze Nutzlast',
`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 */;