Geraete hingen ueber den Text "Etage/Raum" an ihrem Raum, das Raum-Modal zerlegte "EG_Bad" am Unterstrich, und das Thermostat-Topic wurde aus Etage und Name zusammengesetzt. Ein umbenannter Raum haette still alle Geraete, seinen Temperaturregler und sein Heizsymbol verloren. - actors.room (Text) -> actors.room_id, Fremdschluessel auf rooms, beim Loeschen eines Raums SET NULL. Alle 59 Zuordnungen uebernommen. - automations.floor: ENUM(UG,EG,OG,AG) -> Verweis auf floors. Eine neue Etage kann damit auch Automatiken tragen. - room.php nimmt ?room=<Nummer>; Solltemperatur geht an rooms.thermostat + /changeSetTemp. - homeMQTT.js: Heizsymbol, Regler und Ist-Werte ueber mqttZweig(thermostat) statt mqttData.Raumtemp[Etage][Name]. - Raumvorschlaege in den Einstellungen: Messwerte unter dem Thermostat- Zweig eines Raums statt fest Raumtemp/<Etage>/<Name>. - Schluessel in raumListe(), Katalog und Maske ist die Raumnummer als Text. Geprueft gegen den Stand davor: Startseite gleich bis auf das Klickziel, jede der 25 Kacheln oeffnet ihren eigenen Raum; Geraeteliste, Vorschlaege, Editor-Katalog und die eigenen Geraete je Kachel gleich. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
384 lines
13 KiB
SQL
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_id` int(11) DEFAULT NULL COMMENT 'Raum (rooms.id, siehe homeMesh_grundriss.sql). 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 */;
|