Files
Smart-Dashboard/homeMesh_DB-layout.sql
T
adminandClaude Opus 5 4b47372015 Geraete den Raeumen zuordnen
Beim Anlegen einer Automatik denkt man in Raeumen ("im Bad soll ..."), nicht
in Geraetearten. Ein Raummodell gibt es schon - restricted/rooms.php, die
einzige Quelle fuer die Home-Ansicht -, nur fehlte die Zuordnung Geraet ->
Raum.

Die neue Spalte actors.room haelt sie als "Etage/Raum" (OG/Bad), dazu
"aussen" fuer Carport, Garage und Regensensor. Etage und Raum zusammen,
weil "Bad" allein auf drei Etagen vorkommt. Discovery fasst die Spalte nicht
an - der Upsert setzt nur type und name -, die Zuordnung ueberlebt also
jeden Suchlauf.

Zugeordnet wird ueber das Haus-Symbol in der Karte "Automatismen". Wo der
Raum aus dem MQTT-Topic hervorgeht ("Raumtemp/OG/Bad/Temp[degC]"), schlaegt
die Ansicht ihn vor und uebernimmt ihn auf Knopfdruck - das sind die
dreizehn Thermostate, ohne jedes Raten. Bei allen anderen wird bewusst nicht
geraten: "Bad Links" sagt nichts darueber, auf welcher der drei Etagen
dieses Bad liegt. Noch nicht zugeordnete Geraete stehen in der Tabelle oben.

Die Geraeteauswahl im Editor gruppiert danach nach Raum, in der Reihenfolge
aus rooms.php. Solange niemand zugeordnet hat, bleibt es bei der Gruppierung
nach Geraeteart - eine einzige Gruppe "Nicht zugeordnet" waere ein
Rueckschritt. Und weil auch nach der ersten Zuordnung noch viel ohne Raum
ist, wird dieser Rest weiter nach Geraeteart unterteilt ("Ohne Raum ·
Aussenjalousie (11)").

Anders als bei den Gerätearten behalten Raeume mit nur einem Geraet ihre
Ueberschrift: "OG · Bad" ist auch mit einem einzigen Thermostat genau die
Zeile, die man sucht - und mehr als eines haengt selten in einem Raum.

Die dreizehn Thermostate sind bereits zugeordnet, weil das ihre eigenen
Topics hergeben; alles andere steht auf "-" und will von Hand vergeben
werden.

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

384 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',
`room` varchar(60) DEFAULT NULL COMMENT 'Raum aus restricted/rooms.php als "Etage/Raum" (z.B. OG/Bad) oder "aussen". Wird von Hand vergeben und deshalb vom Discovery nicht angefasst - der Upsert setzt nur type und name.'
) 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 */;