From 3292d4a1b7fec920056eaba3d5a607fadd497b8a Mon Sep 17 00:00:00 2001 From: Striker72rus Date: Wed, 25 Mar 2026 13:33:07 +0300 Subject: [PATCH] - --- README.md | 20 +++++++++++++++++ lib/config.php | 50 ++++++++++++++++++++++++++++++++---------- wall_panel/README.md | 20 +++++++++++++++++ wall_panel/config.yaml | 40 +++++++++++++++++++++++++++++++-- 4 files changed, 116 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 9ee5029..9faabb7 100755 --- a/README.md +++ b/README.md @@ -60,6 +60,26 @@ Add-on использует persistent config file: Этот файл является runtime source of truth для панели в HA-режиме и переживает рестарт add-on. +Частые настройки можно менять прямо из UI add-on в Home Assistant: + +- `app.title` +- `app.poll_interval_ms` +- `app.main_room_name` +- `app.main_room_icon` +- `app.edit_mode` +- `app.battery_history_hours` +- `home_assistant.base_url` +- `home_assistant.token` +- `home_assistant.verify_ssl` +- `home_assistant.weather_entity_id` +- `camera.rtsp_url` +- `camera.stream_url` +- `camera.stream_mode` +- `camera.poster_url` +- `camera.popup_timeout_minutes` + +Сложные структуры, вроде `rooms`, по-прежнему удобнее держать в JSON. + ### Старый embed-режим Отдельный PHP-доступ по-прежнему работает: diff --git a/lib/config.php b/lib/config.php index 08de032..d5933f8 100755 --- a/lib/config.php +++ b/lib/config.php @@ -51,6 +51,21 @@ function app_config_path(): string return APP_ROOT . '/config/config.json'; } +function app_runtime_mode(): string +{ + return strtolower(trim((string)getenv('WALL_PANEL_RUNTIME_MODE'))); +} + +function app_addon_options_path(): string +{ + $override = trim((string)getenv('WALL_PANEL_OPTIONS_PATH')); + if ($override !== '') { + return $override; + } + + return '/data/options.json'; +} + function app_storage_path(string $file): string { $override = trim((string)getenv('WALL_PANEL_STORAGE_DIR')); @@ -70,23 +85,34 @@ function app_load_config(): array $path = app_config_path(); app_ensure_directory(dirname($path)); + $config = app_default_config(); if (!file_exists($path)) { - $defaults = app_default_config(); - file_put_contents($path, json_encode($defaults, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); - return $defaults; + $json = json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); + if ($json === false) { + throw new RuntimeException('Failed to encode default config'); + } + + file_put_contents($path, $json . PHP_EOL, LOCK_EX); + } else { + $raw = file_get_contents($path); + if ($raw === false || trim($raw) !== '') { + $decoded = json_decode((string)$raw, true); + if (!is_array($decoded)) { + throw new RuntimeException('Invalid JSON in config/config.json'); + } + + $config = array_replace_recursive($config, $decoded); + } } - $raw = file_get_contents($path); - if ($raw === false || trim($raw) === '') { - return app_default_config(); + if (app_runtime_mode() === 'addon') { + $options = app_load_json_file(app_addon_options_path(), []); + if (is_array($options) && $options !== []) { + $config = array_replace_recursive($config, $options); + } } - $decoded = json_decode($raw, true); - if (!is_array($decoded)) { - throw new RuntimeException('Invalid JSON in config/config.json'); - } - - return array_replace_recursive(app_default_config(), $decoded); + return $config; } function app_save_config(array $config): void diff --git a/wall_panel/README.md b/wall_panel/README.md index a7635c1..d6f9cce 100755 --- a/wall_panel/README.md +++ b/wall_panel/README.md @@ -59,6 +59,26 @@ Add-on использует persistent config file: Этот файл является runtime source of truth для панели в HA-режиме и переживает рестарт add-on. +Частые настройки можно менять прямо из UI add-on в Home Assistant: + +- `app.title` +- `app.poll_interval_ms` +- `app.main_room_name` +- `app.main_room_icon` +- `app.edit_mode` +- `app.battery_history_hours` +- `home_assistant.base_url` +- `home_assistant.token` +- `home_assistant.verify_ssl` +- `home_assistant.weather_entity_id` +- `camera.rtsp_url` +- `camera.stream_url` +- `camera.stream_mode` +- `camera.poster_url` +- `camera.popup_timeout_minutes` + +Сложные структуры, вроде `rooms`, по-прежнему удобнее держать в JSON. + ### Старый embed-режим Отдельный PHP-доступ по-прежнему работает: diff --git a/wall_panel/config.yaml b/wall_panel/config.yaml index 65e4c95..03e257b 100755 --- a/wall_panel/config.yaml +++ b/wall_panel/config.yaml @@ -22,5 +22,41 @@ ports_description: map: - addon_config:rw homeassistant_api: true -options: {} -schema: {} +options: + app: + title: Wall Panel + poll_interval_ms: 5000 + main_room_name: Главная + main_room_icon: mdi:home + edit_mode: false + battery_history_hours: 4320 + home_assistant: + base_url: "" + token: "" + verify_ssl: true + weather_entity_id: "" + camera: + rtsp_url: rtsp://10.0.6.110:45321/feff99fa45f317e7 + stream_url: "" + stream_mode: hls + poster_url: http://10.0.6.110:5000/api/doorbell/latest.jpg + popup_timeout_minutes: 3 +schema: + app: + title: str + poll_interval_ms: int + main_room_name: str + main_room_icon: str + edit_mode: bool + battery_history_hours: int + home_assistant: + base_url: str + token: str + verify_ssl: bool + weather_entity_id: str + camera: + rtsp_url: str + stream_url: str + stream_mode: str + poster_url: str + popup_timeout_minutes: int