diff --git a/.gitignore b/.gitignore index 7e6816e..f4870fb 100644 --- a/.gitignore +++ b/.gitignore @@ -26,8 +26,13 @@ lighthub/modules/out_humidifier.h spare_files/* spare_files/ArduinoOTA/* lib/* +# site tools: WP session state (cookies, nonce, password) — never commit +tools/wp/state/ + # doxygen generated output (published to lighthub.github.io, not to repo) doxygen-docs/html/ doxygen-docs/latex/ doxygen-docs/rtf/ doxygen-docs/doxygen-warnings.log +privateconf/* +tools/* \ No newline at end of file diff --git a/documentation/README.md b/documentation/README.md index e576f49..5ac6815 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -8,56 +8,56 @@ | Файл | Я | Описание | |--|--|--| -| [light_hub_полное_инженерное_описание_json_конфигурации_v2.md](core/light_hub_полное_инженерное_описание_json_конфигурации_v2.md) | RU | Полное описание JSON-конфигурации: секции, 24 типа каналов (0-23), примеры | -| [channel_types_reference.md](core/channel_types_reference.md) | RU | Справочник типов каналов: коды, форматы настройки, команды, доступность по целям | -| [technical_channel_types_table.md](core/technical_channel_types_table.md) | RU | Техническая таблица типов каналов (формат item.h, суффиксы, матрица) | -| [suffixes_reference.md](core/suffixes_reference.md) | RU | Справочник MQTT-суффиксов и команд, таблицы по типам каналов | -| [mqtt_api_reference.md](core/mqtt_api_reference.md) | RU | Полный справочник MQTT: топики, команды, HTTP API, $command/$stats, homie | -| [mqtt_quick_reference.md](core/mqtt_quick_reference.md) | RU | Быстрая шпаргалка по MQTT и HTTP | -| [configuration_examples.md](core/configuration_examples.md) | RU | Примеры JSON-конфигураций по всем типам каналов | -| [modules_real_config.md](core/modules_real_config.md) | RU | Реальные конфигурации по драйверам | -| [modules_description.md](core/modules_description.md) | RU | Описание драйверов (out_*, in_*) с параметрами getConfig() | -| [cli_interface.md](core/cli_interface.md) | RU | CLI-интерфейс (USB-сериал) | -| [web_ui.md](core/web_ui.md) | RU | Web-интерфейс и HTTP API настройки | -| [config_file_workflow.md](core/config_file_workflow.md) | RU | Как контроллер загружает/сохраняет файл конфигурации | -| [button_presses.md](core/button_presses.md) | RU | Двойные/тройные/длительные нажатия, несколько кнопок на одном входе | -| [rotary_encoder.md](core/rotary_encoder.md) | RU | Rotary encoder (T:32): профили, примеры | -| [analog_inputs_and_map.md](core/analog_inputs_and_map.md) | RU | Аналоговые входы, преобразования `map` | -| [command_signature.md](core/command_signature.md) | RU | Криптоподпись команд (SHA256, protected pins) | +| [light\_hub\_полное\_инженерное\_описание\_json\_конфигурации\_v2.md](core/light_hub_полное_инженерное_описание_json_конфигурации_v2.md) | RU | Полное описание JSON-конфигурации: секции, 24 типа каналов (0-23), примеры | +| [channel\_types\_reference.md](core/channel_types_reference.md) | RU | Справочник типов каналов: коды, форматы настройки, команды, доступность по целям | +| [technical\_channel\_types\_table.md](core/technical_channel_types_table.md) | RU | Техническая таблица типов каналов (формат item.h, суффиксы, матрица) | +| [suffixes\_reference.md](core/suffixes_reference.md) | RU | Справочник MQTT-суффиксов и команд, таблицы по типам каналов | +| [mqtt\_api\_reference.md](core/mqtt_api_reference.md) | RU | Полный справочник MQTT: топики, команды, HTTP API, $command/$stats, homie | +| [mqtt\_quick\_reference.md](core/mqtt_quick_reference.md) | RU | Быстрая шпаргалка по MQTT и HTTP | +| [configuration\_examples.md](core/configuration_examples.md) | RU | Примеры JSON-конфигураций по всем типам каналов | +| [modules\_real\_config.md](core/modules_real_config.md) | RU | Реальные конфигурации по драйверам | +| [modules\_description.md](core/modules_description.md) | RU | Описание драйверов (out\_*, in\_*) с параметрами getConfig() | +| [cli\_interface.md](core/cli_interface.md) | RU | CLI-интерфейс (USB-сериал) | +| [web\_ui.md](core/web_ui.md) | RU | Web-интерфейс и HTTP API настройки | +| [config\_file\_workflow.md](core/config_file_workflow.md) | RU | Как контроллер загружает/сохраняет файл конфигурации | +| [button\_presses.md](core/button_presses.md) | RU | Двойные/тройные/длительные нажатия, несколько кнопок на одном входе | +| [rotary\_encoder.md](core/rotary_encoder.md) | RU | Rotary encoder (T:32): профили, примеры | +| [analog\_inputs\_and\_map.md](core/analog_inputs_and_map.md) | RU | Аналоговые входы, преобразования `map` | +| [command\_signature.md](core/command_signature.md) | RU | Криптоподпись команд (SHA256, protected pins) | | [ota.md](core/ota.md) | RU | OTA-обновление прошивки по воздуху | ## integrations/ — внешние системы | Файл | Я | Описание | |--|--|--| -| [can_lightspot.md](integrations/can_lightspot.md) | RU | CAN-шина, lightspot, протокол datagram, шлюз | -| [modbus_setup.md](integrations/modbus_setup.md) | RU | Настройка Modbus (v2), режим шлюза IP-Modbus | -| [1wire_sensors.md](integrations/1wire_sensors.md) | RU | Подключение 1-wire датчиков | +| [can\_lightspot.md](integrations/can_lightspot.md) | RU | CAN-шина, lightspot, протокол datagram, шлюз | +| [modbus\_setup.md](integrations/modbus_setup.md) | RU | Настройка Modbus (v2), режим шлюза IP-Modbus | +| [1wire\_sensors.md](integrations/1wire_sensors.md) | RU | Подключение 1-wire датчиков | | [homeassistant.md](integrations/homeassistant.md) | RU | Интеграция с Home Assistant | | [openhab.md](integrations/openhab.md) | RU | Интеграция с OpenHAB | -| [work_remotely.md](integrations/work_remotely.md) | RU | Работа дистанционно (cloud-брокеры) | +| [work\_remotely.md](integrations/work_remotely.md) | RU | Работа дистанционно (cloud-брокеры) | ## modules/ — функциональные модули | Файл | Я | Описание | |--|--|--| -| [multivent_module_description.md](modules/multivent_module_description.md) | RU | Многозональная вентиляция/кондиционирование (CH 18) | -| [Sprinkler_module.md](modules/Sprinkler_module.md) | RU | Контроллер полива (CH 23): состояния, команды, FA | -| [Sprinkler_HomeAssistant.md](modules/Sprinkler_HomeAssistant.md) | RU | HA-дашборд для поливального модуля | +| [multivent\_module\_description.md](modules/multivent_module_description.md) | RU | Многозональная вентиляция/кондиционирование (CH 18) | +| [Sprinkler\_module.md](modules/Sprinkler_module.md) | RU | Контроллер полива (CH 23): состояния, команды, FA | +| [Sprinkler\_HomeAssistant.md](modules/Sprinkler_HomeAssistant.md) | RU | HA-дашборд для поливального модуля | ## hardware/ — железо | Файл | Я | Описание | |--|--|--| -| [hardware_platforms.md](hardware/hardware_platforms.md) | RU | LightHub на разных платах/чипах | -| [pins_io.md](hardware/pins_io.md) | RU | Карта входов/выходов платы LightHub (rev 2.0 / 2.2) | -| [mac_address.md](hardware/mac_address.md) | RU | MAC-адрес контроллера: генерация, замена | +| [hardware\_platforms.md](hardware/hardware_platforms.md) | RU | LightHub на разных платах/чипах | +| [pins\_io.md](hardware/pins_io.md) | RU | Карта входов/выходов платы LightHub (rev 2.0 / 2.2) | +| [mac\_address.md](hardware/mac_address.md) | RU | MAC-адрес контроллера: генерация, замена | | [flashing.md](hardware/flashing.md) | RU | Заливка прошивки, список целей | ## reference/ — справочные материалы - [dokuwiki-2026-10-02/](reference/dokuwiki-2026-10-02/README.md) — замороженный снапшот официальной Wiki (источник истины уровня 2) -- [config_samples/](reference/config_samples/) — эталонные JSON-конфигурации +- [config\_samples/](reference/config_samples/) — эталонные JSON-конфигурации - [images/](reference/images/) — иллюстрации ## Прочее diff --git a/documentation/core/analog_inputs_and_map.md b/documentation/core/analog_inputs_and_map.md index e73654c..ab84d26 100644 --- a/documentation/core/analog_inputs_and_map.md +++ b/documentation/core/analog_inputs_and_map.md @@ -1,6 +1,6 @@ # Аналоговые входы и преобразования map -> Источник: Wiki LightHub (lazyhome.ru), страницы «аналоговые_входы» и «использование_преобразований_map». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страницы «аналоговые\_входы» и «использование\_преобразований\_map». Снапшот от 2026-10-02. ## Общая информация diff --git a/documentation/core/button_presses.md b/documentation/core/button_presses.md index c85888c..abdbd24 100644 --- a/documentation/core/button_presses.md +++ b/documentation/core/button_presses.md @@ -1,6 +1,6 @@ # Двойные, тройные, длительные нажатия -> Источник: Wiki LightHub (lazyhome.ru), страницы «двойные_тройные_длительные_нажатия» и «несколько_кнопок_на_одном_входе». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страницы «двойные\_тройные\_длительные\_нажатия» и «несколько\_кнопок\_на\_одном\_входе». Снапшот от 2026-10-02. Начиная с [этого коммита](https://github.com/anklimov/lighthub/commit/0044b741ac9f6fb8fc4b1ff8388e47c8bb8efd9b) у прошивки появилась возможность отслеживать одинарные, двойные, тройные, долгие нажатия diff --git a/documentation/core/channel_types_reference.md b/documentation/core/channel_types_reference.md index 364e7c5..63ed8cc 100644 --- a/documentation/core/channel_types_reference.md +++ b/documentation/core/channel_types_reference.md @@ -18,7 +18,7 @@ | **5** | `THERMO` | Simple Thermostat | ON/OFF термостат с гистерезисом | `[GPIO_pin, целевая_температура_°C]` | | **6** | `RELAY` | Relay Output | Электромагнитное реле ON/OFF | GPIO пин | | **7** | `GROUP` | Group Channel | Логическая группа каналов для синхронного управления | Массив строк с именами каналов | -| **8** | `VCTEMP` | Vacom PID Thermo | Температура из VC-канала Vacom (ссылка на item типа CH_VC) | `[имя_канала_VC]` (строка) | +| **8** | `VCTEMP` | Vacom PID Thermo | Температура из VC-канала Vacom (ссылка на item типа CH\_VC) | `[имя_канала_VC]` (строка) | | **9** | `MBUSVC` | Vacom Modbus Motor | Управление мотор-регулятором вентилятора Vacom через Modbus | `[modbus_адрес, "имя_объекта"]` | | **10** | `ACHAIER` | Air Conditioner Haier | Управление кондиционером Haier по проприетарному UART-протоколу (9600) | `[порт_serial(0-3)]` | | **11** | `SPILED` | SPI LED Strip | Управление NeoPixel LED лентой (WS2812B и совместимые, один data-пин) | `[data_pin, numLeds(дефолт 43), ledsType]` | @@ -29,7 +29,7 @@ | **16** | `RELAYPWM` | Relay PWM | Медленный PWM через реле для инертных систем | `[GPIO_pin, период_цикла_сек(дефолт 5)]` | | **17** | `DMXRGBWW` | DMX RGBWW | DMX 512 выход RGB + теплый белый + холодный белый (5 каналов) | Номер стартового DMX канала | | **18** | `VENTS` | Multiroom Ventilation | Многозональная вентиляция с каскадным управлением | `[объект_зон]` (без Modbus-адреса) | -| **19** | `ELEVATOR` | Elevator Control | Управление лифтом | `{"serial":"8N1","baud":19200,"log":...}` (компилируется с ELEVATOR_ENABLE) | +| **19** | `ELEVATOR` | Elevator Control | Управление лифтом | `{"serial":"8N1","baud":19200,"log":...}` (компилируется с ELEVATOR\_ENABLE) | | **20** | `COUNTER` | Generic Counter | Счётчик импульсов (электроэнергия, газ, вода) | `[коэффициент_импульса, период_автосуммирования_сек]` | | **21** | `HUM` | Humidifier | Управление увлажнителем воздуха (только один в системе) | `[[pumpPin, flushPin, pressurePin, maxPumpTime, idleTime, capacity, minLevel, startLevel], {зоны_краны}, motorExec, faultExec]` | | **22** | `MERCURY` | Mercury Energy Meter | Счётчик энергии Mercury по RS485/Modbus | `[адрес, baud, "8N1", уровень_доступа, пароль, pollingInterval_ms(дефолт 10000)]` | @@ -53,33 +53,33 @@ ## Примеры конфигурации по типам -### CH_DIMMER (0) - DMX выход с регулировкой +### CH\_DIMMER (0) - DMX выход с регулировкой ```json "dimmer1": [0, 5], // DMX канал 5 "dimmer2": [0, [1, 2, 3, 4]] // 4-канальный (RGBW), DMX 1-4 ``` -### CH_RGBW (1) - DMX RGB+White +### CH\_RGBW (1) - DMX RGB+White ```json "rgb_light": [1, 10] // RGB+W на DMX 10-13 ``` -### CH_RGB (2) - DMX RGB +### CH\_RGB (2) - DMX RGB ```json "rgb_light": [2, 15] // RGB начиная с 15-го (на DMX 15-17) ``` -### CH_PWM (3) - GPIO PWM +### CH\_PWM (3) - GPIO PWM ```json "pwm1": [3, 9], // PWM на GPIO pin 9 "pwm_4ch": [3, [11, 12, 13, 14]] // 4-х канальный PWM ``` -### CH_MODBUS (4) - AC Dimmer (Legacy) +### CH\_MODBUS (4) - AC Dimmer (Legacy) ```json "mbus_dim": [4, [96, 0, 0, 255]] @@ -89,20 +89,20 @@ // Макс значение: 255 ``` -### CH_THERMO (5) - Термостат +### CH\_THERMO (5) - Термостат ```json "thermo_bath": [5, 24, 33] // GPIO 24, уставка 33°C ``` -### CH_RELAY (6) - Реле +### CH\_RELAY (6) - Реле ```json "relay1": [6, 23], // Реле на GPIO 23 "relay2": ["RELAY", 28, 1, 1] // Реле, по умолчанию ON ``` -### CH_GROUP (7) - Группа каналов +### CH\_GROUP (7) - Группа каналов ```json "lights_all": [7, [ @@ -112,19 +112,19 @@ "lights_bedroom": [7, ["lamp1", "rgb1"]] ``` -### CH_VCTEMP (8) - Vacom PID терморегулятор +### CH\_VCTEMP (8) - Vacom PID терморегулятор ```json "fm_t": [8, "fm"] // строка-имя item типа CH_VC (9) ``` -### CH_VC (9) - Vacom мотор регулятор +### CH\_VC (9) - Vacom мотор регулятор ```json "fan_speed": [9, [96, "a_ext"]] // Modbus адрес 96, "имя_объекта" (строка) ``` -### CH_AC (10) - Кондиционер Haier +### CH\_AC (10) - Кондиционер Haier ```json "ac_main": [10, 1] // номер порта serial (0-3) @@ -132,13 +132,13 @@ // также доступны подканалы lock/swing/quiet/raw (/mode — число, текстовые режимы — в /cmd) ``` -### CH_SPILED (11) - SPI LED лента +### CH\_SPILED (11) - SPI LED лента ```json "led_strip": [11, [7, 8]] // data-пин GPIO7, 8 светодиодов ``` -### CH_MOTOR (12) - Моторная задвижка с обратной связью +### CH\_MOTOR (12) - Моторная задвижка с обратной связью ```json "gate_motor": [12, [9, 10, 11, 0, 255, 30000]] @@ -146,7 +146,7 @@ // fbOpen: 0, fbClosed: 255, maxOnTime_ms: 30000 ``` -### CH_PID (13) - PID регулятор +### CH\_PID (13) - PID регулятор ```json "pid_temp": [13, [ @@ -159,7 +159,7 @@ // min_out=0, max_out=255 ``` -### CH_MBUS (14) - Универсальный Modbus +### CH\_MBUS (14) - Универсальный Modbus ```json "mbus_generic": [14, [96, "temperature_sensor", { @@ -168,7 +168,7 @@ }]] ``` -### CH_UARTBRIDGE (15) - UART мост +### CH\_UARTBRIDGE (15) - UART мост ```json "uart_debug": [15, { @@ -180,19 +180,19 @@ }] ``` -### CH_RELAYX (16) - Медленный PWM через реле +### CH\_RELAYX (16) - Медленный PWM через реле ```json "relay_pwm": [16, [22, 60]] // GPIO 22, период цикла 60 сек ``` -### CH_RGBWW (17) - DMX RGBWW +### CH\_RGBWW (17) - DMX RGBWW ```json "led_warm_cold": [17, 30] // DMX 30-34 (RGBWW, 5 каналов) ``` -### CH_MULTIVENT (18) - Многозональная вентиляция +### CH\_MULTIVENT (18) - Многозональная вентиляция ```json "multivent_system": [18, { @@ -206,14 +206,14 @@ }] ``` -### CH_COUNTER (20) - Счётчик по импульсам/времени +### CH\_COUNTER (20) - Счётчик по импульсам/времени ```json "energy_meter": [20, [0.02, 1.2]] // коэфф 0.02, период автосуммирования 1.2 с "gas_counter": [20, 0] // без калибровки ``` -### CH_HUMIDIFIER (21) - Увлажнитель +### CH\_HUMIDIFIER (21) - Увлажнитель ```json "humidifier1": [21, [13, 14, 15, 120, 15, 50, 5, 25]] @@ -221,7 +221,7 @@ // (только один humidifier в системе; компилируется с HUMIDIFIER_ENABLE) ``` -### CH_MERCURY (22) - Счётчик энергии Mercury +### CH\_MERCURY (22) - Счётчик энергии Mercury ```json "mercury_meter": [22, [1, 9600, "8N1", 2, "123456", 10000]] @@ -233,7 +233,7 @@ // Интервал опроса: 10000 мс (дефолт) ``` -### CH_SPRINKLR (23) - Система полива +### CH\_SPRINKLR (23) - Система полива ```json "irrigation_system": [23, { @@ -281,7 +281,7 @@ - `HIGH` / `MEDIUM` / `LOW` — скорость вентилятора - `RGB` / `HSV` / `RESET` — цветовые команды (для RGB каналов) и сброс -Полный список команд: ON OFF REST TOGGLE HALT XON XOFF INCREASE DECREASE ENABLE DISABLE UNFREEZE FREEZE AUTO FAN_ONLY HIGH MEDIUM LOW HEAT_COOL HEAT COOL DRY RGB HSV RESET. +Полный список команд: ON OFF REST TOGGLE HALT XON XOFF INCREASE DECREASE ENABLE DISABLE UNFREEZE FREEZE AUTO FAN\_ONLY HIGH MEDIUM LOW HEAT\_COOL HEAT COOL DRY RGB HSV RESET. --- diff --git a/documentation/core/cli_interface.md b/documentation/core/cli_interface.md index 7beab2d..29ff07e 100644 --- a/documentation/core/cli_interface.md +++ b/documentation/core/cli_interface.md @@ -1,6 +1,6 @@ # Command Line Interface -> Источник: Wiki LightHub (lazyhome.ru), страница «cli_интерфейс». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «cli\_интерфейс». Снапшот от 2026-10-02. Иначе, интерфейс командной строки. diff --git a/documentation/core/command_signature.md b/documentation/core/command_signature.md index f877cfb..fa79f75 100644 --- a/documentation/core/command_signature.md +++ b/documentation/core/command_signature.md @@ -1,10 +1,10 @@ # Криптоподпись команды -> Источник: Wiki LightHub (lazyhome.ru), страница «криптоподпись_команды». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «криптоподпись\_команды». Снапшот от 2026-10-02. В том случае, если надо гарантировать, что, даже получив доступ к локальной сети, MQTT брокеру или HTTP API, потенциальный злоумышленник не сможет выполнить критичную команду (например, открытие ворот), можно использовать механизм цифровой подписи команды. -Для задействования режима, необходимо пересобрать прошивку, добавив в приватный файл опций компиляции ([опции компиляции](https://www.lazyhome.ru/dokuwiki/doku.php?id=опции_компиляции)) (пример custom-build-flags/build_flags_lighthub21 для сборки под lighthub21) следующие опции (приведен пример): +Для задействования режима, необходимо пересобрать прошивку, добавив в приватный файл опций компиляции ([опции компиляции](https://www.lazyhome.ru/dokuwiki/doku.php?id=опции_компиляции)) (пример custom-build-flags/build\_flags\_lighthub21 для сборки под lighthub21) следующие опции (приведен пример): ``` -D CRYPT @@ -18,11 +18,11 @@ * Авторизованная сторона, желающая выполнить команду, вычисляет SHA256 хэш от строки, содержащей `<Команда>` * при отправке MQTT команды, авторизованная сторона добавляет в MQTT Payload полученный хэш цифровой подписи ДО команды, отделив подпись от тела команды знаком @ * Контроллер, получив команду с подписью, производит аналогичную операцию по вычислению подписи и, если значения совпали, запрос считается авторизованным - * Если команда направлена на управление пином контроллера, из перечня PROTECTED_PINS, заданного при компиляции прошивки, то она будет выполнена только том случае, если является авторизованной + * Если команда направлена на управление пином контроллера, из перечня PROTECTED\_PINS, заданного при компиляции прошивки, то она будет выполнена только том случае, если является авторизованной ### Ограничения -Если пин входит в перечень, заданный при компиляции в опции PROTECTED_PINS, то для него действуют следующие ограничения, смысл которых в том, чтобы сделать крайне сложным подачу высокого логического уровня на выход контроллера (открытие мощных ключей) не имея физического доступа к самому устройству: +Если пин входит в перечень, заданный при компиляции в опции PROTECTED\_PINS, то для него действуют следующие ограничения, смысл которых в том, чтобы сделать крайне сложным подачу высокого логического уровня на выход контроллера (открытие мощных ключей) не имея физического доступа к самому устройству: * Он не будет работать на канале типа термостат (THERMO) * Для канала типа RELAY вывод работает только в не инверсном режиме. То есть, настройками не получится добиться перевода в состояние с высоким уровнем по-умолчанию, не получив подписанной команды. Настройки команды по умолчанию в файле конфигурации, также, будут проигнорированы. требуется цифровая подпись команде для управления таким каналом @@ -40,4 +40,4 @@ - Корректно: механизм реализован под флагом `CRYPT`: ключ `cryptoKey[] = QUOTE(SHAREDSECRET)` (`lighthub/main.cpp:110`), публикация `$salt` в топике устройства — `lighthub/main.cpp:2793-2804` (функция `publishStat()`, вызывается раз в 30 секунд из `thermoLoop()`, период `THERMOSTAT_CHECK_PERIOD=30000`, `lighthub/options.h:147`). - Корректно: подпись вычисляется как SHA256 от `<Команда>` — `checkToken()` в `lighthub/utils.cpp:901-942` (sha256.update: saltStr, cryptoKey, data). - Корректно: формат payload «подпись@команда» — разбор по символу `@` в `lighthub/item.cpp:752` (`char * authPos = strchr(payload,'@'); //token@command`). -- Корректно: ограничения для PROTECTED_PINS подтверждены в коде: THERMO — `main.cpp:3237`; RELAY — `modules/out_relay.cpp:39,110`; MOTOR — `modules/out_motor.cpp:53,77,102`; PWM требует авторизованную команду — `modules/out_pwm.cpp:129-165`; SPRINKLER (увлажнитель) — `modules/out_sprinkler.cpp:50`. Перечень пинов задается опцией `PROTECTED_PINS` (`lighthub/options.h:390-403`). +- Корректно: ограничения для PROTECTED\_PINS подтверждены в коде: THERMO — `main.cpp:3237`; RELAY — `modules/out_relay.cpp:39,110`; MOTOR — `modules/out_motor.cpp:53,77,102`; PWM требует авторизованную команду — `modules/out_pwm.cpp:129-165`; SPRINKLER (увлажнитель) — `modules/out_sprinkler.cpp:50`. Перечень пинов задается опцией `PROTECTED_PINS` (`lighthub/options.h:390-403`). diff --git a/documentation/core/config_file_workflow.md b/documentation/core/config_file_workflow.md index 07d6868..7c81310 100644 --- a/documentation/core/config_file_workflow.md +++ b/documentation/core/config_file_workflow.md @@ -1,13 +1,13 @@ # Как LightHub работает с файлом конфигурации -> Источник: Wiki LightHub (lazyhome.ru), страница «как_lighthub_работает_с_файлом_конфигурации». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «как\_lighthub\_работает\_с\_файлом\_конфигурации». Снапшот от 2026-10-02. ## Первое включение По-умолчанию, контроллер получает динамический адрес локальной сети по DHCP При этом, он записывает его в энергонезависимую память. И если при очередном перезапуске, DHCP сервер не доступен - он будет использовать последний известный IP адрес. -Если надо определить статический адрес (а, также, GW, DNS, NetMask), это можно сделать при помощи команды ip в [cli_интерфейс](cli_interface.md) +Если надо определить статический адрес (а, также, GW, DNS, NetMask), это можно сделать при помощи команды ip в [cli\_интерфейс](cli_interface.md) Адрес будет сохранен в энергонезависимую память контроллера. При включении, контроллер сначала проверяет наличие записанного в памяти конфигурационного файла. (У нового контроллера, а также, после перезаливки прошивки, конфигурационный файл отсутствует (кроме mega2560, в случае этого контроллера, конфигурация не утрачивается в процессе перепрошивки)). Затем контроллер поднимает сетевые интерфейсы, подключается к интернету, идет на сайт lazyhome.ru и пытается скачать конфигурационный файл JSON для своего МАС-адреса. (данное поведение можно отключить при помощи cli команды get OFF) @@ -26,7 +26,7 @@ Для того, чтобы быстро начать работу, этого достаточно. -В дальнейшем, Автоматическую загрузку конфига можно отменить при помощи команды `get OFF` в [cli_интерфейс](cli_interface.md) или изменив конфиг через web интерфейс контроллера +В дальнейшем, Автоматическую загрузку конфига можно отменить при помощи команды `get OFF` в [cli\_интерфейс](cli_interface.md) или изменив конфиг через web интерфейс контроллера ### Автономный метод настройки - веб интерфейс/плагин браузера @@ -35,7 +35,7 @@ ### Дополнительные возможности -Также можно разместить настройки на своем собственном http сервере, в папке cnf. Формат имени файла: http://MY_CONFIG_SERVER/cnf/12-12-12-12-12-12.config.json (вместо 12-12-12-12-12-12 ваш mac адрес) +Также можно разместить настройки на своем собственном http сервере, в папке cnf. Формат имени файла: http://MY\_CONFIG\_SERVER/cnf/12-12-12-12-12-12.config.json (вместо 12-12-12-12-12-12 ваш mac адрес) После этого выполнить через CLI команду `get ` Контроллер запомнит ваш сервер и далее, будет загружать обновление конфига из этого источника. (на платформах STM, NRF пока не сохраняется) @@ -46,7 +46,7 @@ После этого контроллер готов к автономной работе. При загрузке конфигурации проверяется наличие изменений - если в памяти сохранен тот же конфиг, что имеется на портале, повторная загрузка и сохранение не происходит. -Данное поведение можно изменить при помощи команды save в [cli_интерфейс](cli_interface.md) +Данное поведение можно изменить при помощи команды save в [cli\_интерфейс](cli_interface.md) ``` save ON - включить автосохранение конфига (по умолчанию) diff --git a/documentation/core/configuration_examples.md b/documentation/core/configuration_examples.md index f1b6586..4c2fe93 100644 --- a/documentation/core/configuration_examples.md +++ b/documentation/core/configuration_examples.md @@ -7,34 +7,34 @@ ## Содержание -- [CH_DIMMER (0)](#ch_dimmer-0---dmx-диммер) -- [CH_RGBW (1)](#ch_rgbw-1---dmx-rgbwhite) -- [CH_RGB (2)](#ch_rgb-2---dmx-rgb) -- [CH_PWM (3)](#ch_pwm-3---gpio-pwm) -- [CH_MODBUS (4)](#ch_modbus-4---modbus-ac-dimmer-legacy) -- [CH_THERMO (5)](#ch_thermo-5---onoff-термостат) -- [CH_RELAY (6)](#ch_relay-6---gpio-реле) -- [CH_GROUP (7)](#ch_group-7---группа-каналов) -- [CH_VCTEMP (8)](#ch_vctemp-8---vacom-pid-терморегулятор) -- [CH_VC (9)](#ch_vc-9---vacom-мотор-регулятор) -- [CH_AC (10)](#ch_ac-10---кондиционер-haier) -- [CH_SPILED (11)](#ch_spiled-11---spi-led-лента) -- [CH_MOTOR (12)](#ch_motor-12---шаговый-двигатель) -- [CH_PID (13)](#ch_pid-13---pid-регулятор) -- [CH_MBUS (14)](#ch_mbus-14---universal-modbus) -- [CH_UARTBRIDGE (15)](#ch_uartbridge-15---uart-мост) -- [CH_RELAYX (16)](#ch_relayx-16---медленный-pwm-через-реле) -- [CH_RGBWW (17)](#ch_rgbww-17---dmx-rgbww) -- [CH_MULTIVENT (18)](#ch_multivent-18---многозональная-вентиляция) -- [CH_ELEVATOR (19)](#ch_elevator-19---управление-лифтом) -- [CH_COUNTER (20)](#ch_counter-20---счётчик-импульсов) -- [CH_HUMIDIFIER (21)](#ch_humidifier-21---управление-увлажнителем) -- [CH_MERCURY (22)](#ch_mercury-22---счётчик-энергии-mercury) -- [CH_SPRINKLER (23)](#ch_sprinkler-23---система-полива) +- [CH\_DIMMER (0)](#ch_dimmer-0---dmx-диммер) +- [CH\_RGBW (1)](#ch_rgbw-1---dmx-rgbwhite) +- [CH\_RGB (2)](#ch_rgb-2---dmx-rgb) +- [CH\_PWM (3)](#ch_pwm-3---gpio-pwm) +- [CH\_MODBUS (4)](#ch_modbus-4---modbus-ac-dimmer-legacy) +- [CH\_THERMO (5)](#ch_thermo-5---onoff-термостат) +- [CH\_RELAY (6)](#ch_relay-6---gpio-реле) +- [CH\_GROUP (7)](#ch_group-7---группа-каналов) +- [CH\_VCTEMP (8)](#ch_vctemp-8---vacom-pid-терморегулятор) +- [CH\_VC (9)](#ch_vc-9---vacom-мотор-регулятор) +- [CH\_AC (10)](#ch_ac-10---кондиционер-haier) +- [CH\_SPILED (11)](#ch_spiled-11---spi-led-лента) +- [CH\_MOTOR (12)](#ch_motor-12---шаговый-двигатель) +- [CH\_PID (13)](#ch_pid-13---pid-регулятор) +- [CH\_MBUS (14)](#ch_mbus-14---universal-modbus) +- [CH\_UARTBRIDGE (15)](#ch_uartbridge-15---uart-мост) +- [CH\_RELAYX (16)](#ch_relayx-16---медленный-pwm-через-реле) +- [CH\_RGBWW (17)](#ch_rgbww-17---dmx-rgbww) +- [CH\_MULTIVENT (18)](#ch_multivent-18---многозональная-вентиляция) +- [CH\_ELEVATOR (19)](#ch_elevator-19---управление-лифтом) +- [CH\_COUNTER (20)](#ch_counter-20---счётчик-импульсов) +- [CH\_HUMIDIFIER (21)](#ch_humidifier-21---управление-увлажнителем) +- [CH\_MERCURY (22)](#ch_mercury-22---счётчик-энергии-mercury) +- [CH\_SPRINKLER (23)](#ch_sprinkler-23---система-полива) --- -## CH_DIMMER (0) - DMX диммер +## CH\_DIMMER (0) - DMX диммер **Назначение**: Регулировка яркости одного или нескольких DMX каналов @@ -69,7 +69,7 @@ myhome/s_out/lamp_bedroom/val → опубликованная яркость --- -## CH_RGBW (1) - DMX RGBW +## CH\_RGBW (1) - DMX RGBW **Назначение**: Управление RGB + White каналом через DMX (4 канала DMX) @@ -105,7 +105,7 @@ myhome/dev/rgb_light/RGB ← 255,0,0,100 (RGB+White) --- -## CH_RGB (2) - DMX RGB +## CH\_RGB (2) - DMX RGB **Назначение**: Управление RGB каналом через DMX (3 канала DMX) @@ -128,7 +128,7 @@ myhome/dev/mood_light/HSV ← 120,100,100 (зелёный в HSV) --- -## CH_PWM (3) - GPIO PWM +## CH\_PWM (3) - GPIO PWM **Назначение**: PWM выход через GPIO пины (для плат Arduino, ESP) @@ -159,9 +159,9 @@ myhome/dev/pwm_dim/cmd ← ON --- -## CH_MODBUS (4) - Modbus AC Dimmer (Legacy) +## CH\_MODBUS (4) - Modbus AC Dimmer (Legacy) -**Назначение**: Управление AC-диммером через Modbus RTU (устаревший тип, использовать CH_MBUS (14)) +**Назначение**: Управление AC-диммером через Modbus RTU (устаревший тип, использовать CH\_MBUS (14)) ### Синтаксис @@ -183,11 +183,11 @@ myhome/dev/pwm_dim/cmd ← ON } ``` -⚠️ **Примечание**: Для новых проектов используйте CH_MBUS (14) вместо этого +⚠️ **Примечание**: Для новых проектов используйте CH\_MBUS (14) вместо этого --- -## CH_THERMO (5) - ON/OFF Термостат +## CH\_THERMO (5) - ON/OFF Термостат **Назначение**: Простой ON/OFF термостат с гистерезисом @@ -219,7 +219,7 @@ myhome/dev/thermo_bath/cmd ← ON, OFF --- -## CH_RELAY (6) - GPIO Реле +## CH\_RELAY (6) - GPIO Реле **Назначение**: Простое электромагнитное реле ON/OFF или иное дискретное устройство @@ -250,7 +250,7 @@ myhome/dev/relay_water/cmd ← ON, OFF, TOGGLE --- -## CH_GROUP (7) - Группа каналов +## CH\_GROUP (7) - Группа каналов **Назначение**: Логическая группа для синхронного управления несколькими каналами @@ -291,7 +291,7 @@ myhome/dev/lights_all/cmd ← SET 100 (установит яркость --- -## CH_VCTEMP (8) - Vacom PID Терморегулятор +## CH\_VCTEMP (8) - Vacom PID Терморегулятор **Назначение**: PID регулятор температуры для систем вентиляции Vacom @@ -317,7 +317,7 @@ myhome/dev/lights_all/cmd ← SET 100 (установит яркость --- -## CH_VC (9) - Vacom Мотор-регулятор +## CH\_VC (9) - Vacom Мотор-регулятор **Назначение**: Управление мотор-регулятором вентилятора Vacom @@ -333,7 +333,7 @@ myhome/dev/lights_all/cmd ← SET 100 (установит яркость --- -## CH_AC (10) - Кондиционер Haier +## CH\_AC (10) - Кондиционер Haier **Назначение**: Управление кондиционером Haier по UART (проприетарный протокол Haier, 9600 baud, не Modbus) @@ -374,7 +374,7 @@ myhome/dev/ac_hall/fan ← 0, 1, 2, 3 (скорость) --- -## CH_SPILED (11) - SPI LED Лента +## CH\_SPILED (11) - SPI LED Лента **Назначение**: Управление адресуемой SPI LED лентой (WS2812B, APA102) @@ -399,7 +399,7 @@ myhome/dev/ac_hall/fan ← 0, 1, 2, 3 (скорость) --- -## CH_MOTOR (12) - Шаговый двигатель +## CH\_MOTOR (12) - Шаговый двигатель **Назначение**: Управление шаговым двигателем с обратной связью (для задвижек, жалюзи) @@ -436,7 +436,7 @@ myhome/dev/gate_motor/val ← текущая позиция обратно --- -## CH_PID (13) - PID Регулятор +## CH\_PID (13) - PID Регулятор **Назначение**: Универсальный PID контроллер для процессов @@ -484,7 +484,7 @@ myhome/dev/gate_motor/val ← текущая позиция обратно --- -## CH_MBUS (14) - Universal Modbus +## CH\_MBUS (14) - Universal Modbus **Назначение**: Универсальный Modbus канал с полной поддержкой шаблонизации @@ -532,7 +532,7 @@ myhome/dev/gate_motor/val ← текущая позиция обратно --- -## CH_UARTBRIDGE (15) - UART Мост +## CH\_UARTBRIDGE (15) - UART Мост **Назначение**: Мост между двумя UART портами с отладкой через UDP @@ -558,7 +558,7 @@ myhome/dev/gate_motor/val ← текущая позиция обратно --- -## CH_RELAYX (16) - Медленный PWM через реле +## CH\_RELAYX (16) - Медленный PWM через реле **Назначение**: Медленный PWM через реле для инертных систем (тепловые системы, комплексы) @@ -591,7 +591,7 @@ myhome/dev/floor_heating/val ← текущий PWM --- -## CH_RGBWW (17) - DMX RGBWW +## CH\_RGBWW (17) - DMX RGBWW **Назначение**: DMX управление RGB + тёплый белый + холодный белый (5 каналов) @@ -615,7 +615,7 @@ myhome/dev/led_tunable_white/RGB ← 255,128,0,200,50 --- -## CH_MULTIVENT (18) - Многозональная вентиляция +## CH\_MULTIVENT (18) - Многозональная вентиляция **Назначение**: Каскадная система вентиляции с независимым регулированием по зонам @@ -670,7 +670,7 @@ myhome/dev/multivent_main/bedroom/mode ← HEAT, COOL, FAN --- -## CH_ELEVATOR (19) - Управление лифтом +## CH\_ELEVATOR (19) - Управление лифтом **Назначение**: Управление лифтом (зарезервировано для будущего использования) @@ -678,7 +678,7 @@ myhome/dev/multivent_main/bedroom/mode ← HEAT, COOL, FAN --- -## CH_COUNTER (20) - Счётчик импульсов +## CH\_COUNTER (20) - Счётчик импульсов **Назначение**: Счётчик импульсов (электроэнергия, газ, вода) @@ -710,7 +710,7 @@ myhome/dev/gas_meter/val ← текущее значение (м³) --- -## CH_HUMIDIFIER (21) - Управление увлажнителем +## CH\_HUMIDIFIER (21) - Управление увлажнителем **Назначение**: Управление форсуночным увлажнителем воздуха @@ -743,7 +743,7 @@ myhome/dev/humidifier_room/cmd ← ON, OFF --- -## CH_MERCURY (22) - Счётчик энергии Mercury +## CH\_MERCURY (22) - Счётчик энергии Mercury **Назначение**: Счётчик энергии Mercury по RS485/Modbus @@ -777,7 +777,7 @@ myhome/dev/energy_mercury/val ← текущие показания энерг --- -## CH_SPRINKLER (23) - Система полива +## CH\_SPRINKLER (23) - Система полива **Назначение**: Многозональная система автоматического полива с контролем воды и насосов diff --git a/documentation/core/light_hub_полное_инженерное_описание_json_конфигурации_v2.md b/documentation/core/light_hub_полное_инженерное_описание_json_конфигурации_v2.md index a8876e1..fcf817e 100644 --- a/documentation/core/light_hub_полное_инженерное_описание_json_конфигурации_v2.md +++ b/documentation/core/light_hub_полное_инженерное_описание_json_конфигурации_v2.md @@ -1,6 +1,6 @@ # LightHub: Полное инженерное описание JSON‑конфигурации контроллера -> **Документ актуален для ядра LightHub с типами каналов CH_DIMMER (0) - CH_SPRINKLER (23)** +> **Документ актуален для ядра LightHub с типами каналов CH\_DIMMER (0) - CH\_SPRINKLER (23)** > > Предназначен для инженеров автоматизации, интеграторов и разработчиков. > Основан **строго** на официальной документации LazyHome / LightHub и исходном коде. @@ -188,7 +188,7 @@ myhome/s_out/lamp1/hue # текущий оттенок RGB лампы | Параметр | Описание | |--|--| -| GPIO pin | Не используется: пин фиксирован (AVR_DMXOUT_PIN) | +| GPIO pin | Не используется: пин фиксирован (AVR\_DMXOUT\_PIN) | | Кол-во каналов | Число DMX каналов (обычно 512) — берётся только последний элемент массива | --- @@ -400,7 +400,7 @@ myhome/s_out/lamp1/hue # текущий оттенок RGB лампы ### Типы каналов (0-23) -**Полный справочник типов каналов см. в [channel_types_reference.md](channel_types_reference.md)** +**Полный справочник типов каналов см. в [channel\_types\_reference.md](channel_types_reference.md)** | Код | Тип | Описание | Конфигурация | |--|--|--|--| @@ -423,15 +423,15 @@ myhome/s_out/lamp1/hue # текущий оттенок RGB лампы | **16** | `RELAYX` | Медленный PWM | `[GPIO_pin, период_сек]` | | **17** | `DMXRGBWW` | DMX RGBWW | Стартовый DMX канал | | **18** | `VENTS` | Многозональная вентиляция | `{зоны}` (объект; рабочая форма `[[18,5], {зоны}]`) | -| **19** | `ELEVATOR` | Лифт (ELEVATOR_ENABLE) | `{serial, baud, log}` | +| **19** | `ELEVATOR` | Лифт (ELEVATOR\_ENABLE) | `{serial, baud, log}` | | **20** | `COUNTER` | Автосуммирующий счётчик | `[коэффициент_импульса, период_автосуммирования_сек]` | -| **21** | `HUM` | Увлажнитель (HUMIDIFIER_ENABLE) | `[[пины...], {зоны}, motorExecObj, faultExecObj]` | +| **21** | `HUM` | Увлажнитель (HUMIDIFIER\_ENABLE) | `[[пины...], {зоны}, motorExecObj, faultExecObj]` | | **22** | `MERCURY` | Счётчик энергии Mercury | `[адрес, baudrate, ...]` | | **23** | `SPRINKLR` | Система полива | `{конфиг}` (корневой объект `""` + зоны с `pin`) | ### Примеры конфигурации items -#### CH_RELAY (6) — Простое реле +#### CH\_RELAY (6) — Простое реле ```json "relay1": [6, 23], // Реле на GPIO 23 @@ -439,7 +439,7 @@ myhome/s_out/lamp1/hue # текущий оттенок RGB лампы "relay3": [6, 28, 1, 1] // С начальным значением и командой ``` -#### CH_DMX (0) — DMX выход +#### CH\_DMX (0) — DMX выход ```json "lamp1": [0, 5], // DMX канал 5 @@ -447,20 +447,20 @@ myhome/s_out/lamp1/hue # текущий оттенок RGB лампы "dmx_4ch": ["DMX", [1, 2, 3, 4]] // 4-х канальный диммер ``` -#### CH_RGBW (1) — RGB+White +#### CH\_RGBW (1) — RGB+White ```json "rgb_light": [1, 10] // RGB+W на DMX 10-13 ``` -#### CH_PWM (3) — GPIO PWM +#### CH\_PWM (3) — GPIO PWM ```json "pwm1": [3, 9], // PWM на GPIO 9 "pwm_4ch": [3, [11, 12, 13, 14]] // 4-х канальный PWM ``` -#### CH_GROUP (7) — Группа каналов +#### CH\_GROUP (7) — Группа каналов ```json "lights_all": [7, [ @@ -470,13 +470,13 @@ myhome/s_out/lamp1/hue # текущий оттенок RGB лампы "lights_bedroom": [7, ["lamp1", "rgb1", "relay1"]] ``` -#### CH_THERMO (5) — Термостат +#### CH\_THERMO (5) — Термостат ```json "thermo_bath": [5, 24, 33] // GPIO 24, уставка 33°C ``` -#### CH_ACHAIER (10) — Кондиционер Haier +#### CH\_ACHAIER (10) — Кондиционер Haier Проприетарный UART-протокол (НЕ Modbus): @@ -484,14 +484,14 @@ myhome/s_out/lamp1/hue # текущий оттенок RGB лампы "ac_haier": [10, 0] // portNum 0-3 ``` -#### CH_COUNTER (20) — Счётчик энергии +#### CH\_COUNTER (20) — Счётчик энергии ```json "energy": [20, [0.02, 60]], // импульс, период автосуммирования (сек) "gas": [20, 0] // без калибровки ``` -#### CH_MULTIVENT (18) — Многозональная вентиляция +#### CH\_MULTIVENT (18) — Многозональная вентиляция ```json "multivent": [[18, 5], { @@ -684,5 +684,5 @@ LightHub использует **жёстко структурированную, **Версия документа**: 2.0 **Дата обновления**: 2025-01-24 -**Актуально для**: LightHub с CH_DIMMER (0) - CH_SPRINKLER (23) +**Актуально для**: LightHub с CH\_DIMMER (0) - CH\_SPRINKLER (23) **Источник**: [item.h](../../lighthub/item.h), [item.cpp](../../lighthub/item.cpp) diff --git a/documentation/core/modules_description.md b/documentation/core/modules_description.md index bf61a5c..171c2cd 100644 --- a/documentation/core/modules_description.md +++ b/documentation/core/modules_description.md @@ -8,29 +8,29 @@ ## Содержание 1. [Выходные модули (Out)](#выходные-модули) - - [out_Multivent](#out_multivent---многоканальный-кондиционер-вентиляция) - - [out_AC](#out_ac---управление-кондиционером) - - [out_PID](#out_pid---пид-регулятор) - - [out_Relay](#out_relay---электромагнитное-реле) - - [out_PWM](#out_pwm---широтно-импульсная-модуляция) - - [out_DMX](#out_dmx---dmx512-управление-светом) - - [out_Motor](#out_motor---управление-двигателем) - - [out_Elevator](#out_elevator---управление-лифтом) - - [out_Humidifier](#out_humidifier---управление-увлажнителем) - - [out_Counter](#out_counter---автосуммирующий-счётчик) - - [out_SPILed](#out_spiled---управление-светодиодами) - - [out_Mercury](#out_mercury---счётчик-меркурий) - - [out_Sprinkler](#out_sprinkler---система-полива) - - [out_UARTBridge](#out_uartbridge---uart-мост) + - [out\_Multivent](#out_multivent---многоканальный-кондиционер-вентиляция) + - [out\_AC](#out_ac---управление-кондиционером) + - [out\_PID](#out_pid---пид-регулятор) + - [out\_Relay](#out_relay---электромагнитное-реле) + - [out\_PWM](#out_pwm---широтно-импульсная-модуляция) + - [out\_DMX](#out_dmx---dmx512-управление-светом) + - [out\_Motor](#out_motor---управление-двигателем) + - [out\_Elevator](#out_elevator---управление-лифтом) + - [out\_Humidifier](#out_humidifier---управление-увлажнителем) + - [out\_Counter](#out_counter---автосуммирующий-счётчик) + - [out\_SPILed](#out_spiled---управление-светодиодами) + - [out\_Mercury](#out_mercury---счётчик-меркурий) + - [out\_Sprinkler](#out_sprinkler---система-полива) + - [out\_UARTBridge](#out_uartbridge---uart-мост) 2. [Входные модули (In)](#входные-модули) - - [in_CCS811_HDC1080](#in_ccs811_hdc1080---датчик-качества-воздуха) + - [in\_CCS811\_HDC1080](#in_ccs811_hdc1080---датчик-качества-воздуха) --- # Выходные модули -## out_Multivent — Многоканальный кондиционер/вентиляция +## out\_Multivent — Многоканальный кондиционер/вентиляция ### Описание @@ -100,7 +100,7 @@ | XON | 6 | | XOFF | 7 | | AUTO | 0xE (14) | -| FAN_ONLY | 0xF (15) | +| FAN\_ONLY | 0xF (15) | | HIGH | 0x10 (16) | | MEDIUM | 0x11 (17) | | LOW | 0x12 (18) | @@ -110,18 +110,18 @@ ### Примеры -Полное описание с примерами: [multivent_module_description.md](../modules/multivent_module_description.md) +Полное описание с примерами: [multivent\_module\_description.md](../modules/multivent_module_description.md) --- -## out_AC — Управление кондиционером +## out\_AC — Управление кондиционером ### Описание Управление одиночным кондиционером через проприетарный UART-протокол Haier (9600, кадры 13 байт — команда / 37 байт — ответ). НЕ Modbus. **Основные функции:** -- Управление режимом (HEAT, COOL, FAN_ONLY, DRY, AUTO) +- Управление режимом (HEAT, COOL, FAN\_ONLY, DRY, AUTO) - Управление скоростью вентилятора (LOW, MEDIUM, HIGH, OFF или число) - Управление температурой - Поддержка качания жалюзей (SWING) @@ -158,8 +158,8 @@ | `portNum` | 0-3 | Номер UART-порта (0 = основной Serial) | | `/set` | 16-40 | Установка температуры | | `/fan` | LOW/MEDIUM/HIGH/OFF или число | Скорость вентилятора | -| `/cmd` | AUTO/HEAT/COOL/FAN_ONLY/DRY | Текстовые режимы (payload команды) | -| `/mode` | число (B_MODE) | Режим | +| `/cmd` | AUTO/HEAT/COOL/FAN\_ONLY/DRY | Текстовые режимы (payload команды) | +| `/mode` | число (B\_MODE) | Режим | | `/lock` | ON/OFF | Блокировка пульта | | `/swing` | ON/OFF | Качание жалюзей | | `/quiet` | ON/OFF | Тихий режим (legacy «queit» принимается; статус публикуется в `/quiet`) | @@ -167,7 +167,7 @@ --- -## out_PID — PID-регулятор +## out\_PID — PID-регулятор ### Описание @@ -215,7 +215,7 @@ --- -## out_Relay — Электромагнитное реле +## out\_Relay — Электромагнитное реле ### Описание @@ -254,7 +254,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] --- -## out_PWM — Широтно-импульсная модуляция +## out\_PWM — Широтно-импульсная модуляция ### Описание @@ -263,7 +263,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] **Основные функции:** - Регулирование от 0% до 100% - Поддержка RGB-управления (в base-классе colorChannel) -- Число пинов (1-5) определяет режим: CH_PWM / RGB / RGBW / RGBWW +- Число пинов (1-5) определяет режим: CH\_PWM / RGB / RGBW / RGBWW ### Тип в JSON ``` @@ -289,7 +289,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] --- -## out_DMX — DMX512 управление светом +## out\_DMX — DMX512 управление светом ### Описание @@ -324,7 +324,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] --- -## out_Motor — Управление двигателем +## out\_Motor — Управление двигателем ### Описание @@ -374,7 +374,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] --- -## out_Elevator — Управление лифтом +## out\_Elevator — Управление лифтом ### Описание @@ -390,7 +390,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] ``` [19, {"serial": "8N1", "baud": 19200, "log": ...}] ``` -Реализован (компилируется с ELEVATOR_ENABLE). itemArg — объект. Порты фиксированные (MODULE_UATRBRIDGE_UARTA/B). +Реализован (компилируется с ELEVATOR\_ENABLE). itemArg — объект. Порты фиксированные (MODULE\_UATRBRIDGE\_UARTA/B). ### Формат конфигурации @@ -415,7 +415,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] --- -## out_Humidifier — Управление увлажнителем +## out\_Humidifier — Управление увлажнителем ### Описание @@ -453,25 +453,25 @@ RELAYX: [16, [pin, period_сек], val, cmd] | Состояние | Код | Описание | |-----------|-----|---------| -| H_UNKNOWN | 0 | Неизвестное | -| H_READY | 1 | Готов к работе | -| H_PREPARE_FOR_START | 2 | Подготовка к пуску | -| H_PREPARE_VALVES | 3 | Подготовка клапанов | -| H_MOTOR_ON | 4 | Мотор работает | -| H_OPERATE | 5 | В режиме увлажнения | -| H_MOTOR_PAUSE | 6 | Пауза мотора | -| H_MOTOR_OFF | 7 | Мотор выключен | -| H_FLUSH | 8 | Промывка системы | -| H_IDLE | 9 | Ожидание | -| H_MOTOR_OFF_OK | 10 | Мотор выключен (окончательно) | -| H_FAULT_PRESSURE | -1 | Ошибка давления | -| H_FAULT_PRESSURE_KEEP | -2 | Давление не удерживается | -| H_FAULT_OVERPRESSURE | -3 | Перепад давления | -| H_FAULT_MOTOR_OFF | -4 | Ошибка: мотор не выключился | +| H\_UNKNOWN | 0 | Неизвестное | +| H\_READY | 1 | Готов к работе | +| H\_PREPARE\_FOR\_START | 2 | Подготовка к пуску | +| H\_PREPARE\_VALVES | 3 | Подготовка клапанов | +| H\_MOTOR\_ON | 4 | Мотор работает | +| H\_OPERATE | 5 | В режиме увлажнения | +| H\_MOTOR\_PAUSE | 6 | Пауза мотора | +| H\_MOTOR\_OFF | 7 | Мотор выключен | +| H\_FLUSH | 8 | Промывка системы | +| H\_IDLE | 9 | Ожидание | +| H\_MOTOR\_OFF\_OK | 10 | Мотор выключен (окончательно) | +| H\_FAULT\_PRESSURE | -1 | Ошибка давления | +| H\_FAULT\_PRESSURE\_KEEP | -2 | Давление не удерживается | +| H\_FAULT\_OVERPRESSURE | -3 | Перепад давления | +| H\_FAULT\_MOTOR\_OFF | -4 | Ошибка: мотор не выключился | --- -## out_Counter — Автосуммирующий счётчик +## out\_Counter — Автосуммирующий счётчик ### Описание @@ -504,7 +504,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] --- -## out_SPILed — Управление светодиодами +## out\_SPILed — Управление светодиодами ### Описание @@ -539,7 +539,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] |----------|-----|---------| | `data_pin` | int | GPIO пин (данные) | | `numLeds` | int | Количество светодиодов, деф 43 | -| `ledsType` | int | Код NeoPixel (NEO_BRG+NEO_KHZ800 и т.п.) | +| `ledsType` | int | Код NeoPixel (NEO\_BRG+NEO\_KHZ800 и т.п.) | ### Управление @@ -553,7 +553,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] --- -## out_Mercury — Счётчик Меркурий +## out\_Mercury — Счётчик Меркурий ### Описание @@ -562,7 +562,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] **Основные функции:** - Чтение энергопотребления (активная/реактивная) - Контроль связи и состояния счётчика -- Тарифные (пиковое/полупиковое/ночное) данные НЕ читаются — только M_NOW +- Тарифные (пиковое/полупиковое/ночное) данные НЕ читаются — только M\_NOW ### Тип в JSON ``` @@ -612,7 +612,7 @@ RELAYX: [16, [pin, period_сек], val, cmd] --- -## out_Sprinkler — Система полива +## out\_Sprinkler — Система полива ### Описание @@ -782,7 +782,7 @@ root/s_out/sprinkler/south/val # Выполненный объём/вре --- -## out_UARTBridge — UART мост +## out\_UARTBridge — UART мост ### Описание @@ -790,7 +790,7 @@ root/s_out/sprinkler/south/val # Выполненный объём/вре **Основные функции:** - Прозрачная маршрутизация UART↔UART -- Буферизация пакетов (MAX_PDU = 64 байт) +- Буферизация пакетов (MAX\_PDU = 64 байт) - Логирование трафика - Одна скорость на оба порта. Порты фиксированные: Serial1/Serial2 @@ -827,7 +827,7 @@ root/s_out/sprinkler/south/val # Выполненный объём/вре # Входные модули -## in_CCS811_HDC1080 — Датчик качества воздуха +## in\_CCS811\_HDC1080 — Датчик качества воздуха ### Описание @@ -916,21 +916,21 @@ root/s_out/sprinkler/south/val # Выполненный объём/вре | Модуль | Тип | Назначение | Управление | |--------|-----|-----------|-----------| -| out_Multivent | 18 | Многоканальный кондиционер | PID + MQTT | -| out_AC | 10 | Одиночный кондиционер | Проприетарный UART (Haier) | -| out_PID | 13 | PID-регулятор | MQTT | -| out_Relay | 6 | Электромагнитное реле | GPIO | -| out_PWM | 3 | ШИМ-управление | GPIO-PWM | -| out_DMX | 0 | DMX512 освещение | DMX512 | -| out_Motor | 12 | Управление двигателем | GPIO-пары | -| out_Elevator | 19 | Управление лифтом | UART | -| out_Humidifier | 21 | Управление увлажнителем | GPIO + датчики | -| out_Counter | 20 | Автосуммирующий счётчик | MQTT | -| out_SPILed | 11 | Адресуемые светодиоды | SPI/GPIO | -| out_Mercury | 22 | Электросчётчик | Modbus RTU | -| out_Sprinkler | 23 | Система полива | GPIO + MQTT | -| out_UARTBridge | 15 | UART-мост | UART↔UART | -| in_CCS811_HDC1080 | входы T=5 (CCS811) / T=6 (HDC1080) | Качество воздуха | I2C | +| out\_Multivent | 18 | Многоканальный кондиционер | PID + MQTT | +| out\_AC | 10 | Одиночный кондиционер | Проприетарный UART (Haier) | +| out\_PID | 13 | PID-регулятор | MQTT | +| out\_Relay | 6 | Электромагнитное реле | GPIO | +| out\_PWM | 3 | ШИМ-управление | GPIO-PWM | +| out\_DMX | 0 | DMX512 освещение | DMX512 | +| out\_Motor | 12 | Управление двигателем | GPIO-пары | +| out\_Elevator | 19 | Управление лифтом | UART | +| out\_Humidifier | 21 | Управление увлажнителем | GPIO + датчики | +| out\_Counter | 20 | Автосуммирующий счётчик | MQTT | +| out\_SPILed | 11 | Адресуемые светодиоды | SPI/GPIO | +| out\_Mercury | 22 | Электросчётчик | Modbus RTU | +| out\_Sprinkler | 23 | Система полива | GPIO + MQTT | +| out\_UARTBridge | 15 | UART-мост | UART↔UART | +| in\_CCS811\_HDC1080 | входы T=5 (CCS811) / T=6 (HDC1080) | Качество воздуха | I2C | --- diff --git a/documentation/core/modules_real_config.md b/documentation/core/modules_real_config.md index ec9010e..9a825a0 100644 --- a/documentation/core/modules_real_config.md +++ b/documentation/core/modules_real_config.md @@ -9,27 +9,27 @@ | Type | Модуль | Класс | Описание | |------|--------|-------|---------| -| 0 | DMX | out_dmx | DMX512 управление освещением | -| 3 | PWM | out_pwm | Широтно-импульсная модуляция | -| 4 | Modbus Dimmer | out_Modbus | AC-диммер через Modbus RTU (legacy) | -| 6 | Реле | out_relay | Управление электромагнитным реле | -| 10 | AC | out_AC | Управление кондиционером (Haier, UART) | -| 11 | SPI LED | out_SPILed | Адресуемые светодиоды WS2812/APA102 | -| 12 | Мотор | out_Motor | Управление моторами с обратной связью | -| 13 | PID | out_pid | PID-регулятор | -| 14 | Modbus | out_Modbus | Modbus устройства (general) | -| 15 | UART Bridge | out_UARTbridge | UART-мост между портами | -| 16 | RELAYX | out_relay | Медленный PWM через реле | -| 18 | Multivent | out_Multivent | Многозональная вентиляция | -| 19 | Лифт | out_Elevator | Управление лифтом (UART) | -| 20 | Счётчик | out_counter | Счётчик импульсов | -| 21 | Увлажнитель | out_humidifier | Форсуночное увлажнение | -| 22 | Меркурий | out_Mercury | Счётчик электроэнергии Меркурий | -| 23 | Полив | out_sprinkler | Система полива | +| 0 | DMX | out\_dmx | DMX512 управление освещением | +| 3 | PWM | out\_pwm | Широтно-импульсная модуляция | +| 4 | Modbus Dimmer | out\_Modbus | AC-диммер через Modbus RTU (legacy) | +| 6 | Реле | out\_relay | Управление электромагнитным реле | +| 10 | AC | out\_AC | Управление кондиционером (Haier, UART) | +| 11 | SPI LED | out\_SPILed | Адресуемые светодиоды WS2812/APA102 | +| 12 | Мотор | out\_Motor | Управление моторами с обратной связью | +| 13 | PID | out\_pid | PID-регулятор | +| 14 | Modbus | out\_Modbus | Modbus устройства (general) | +| 15 | UART Bridge | out\_UARTbridge | UART-мост между портами | +| 16 | RELAYX | out\_relay | Медленный PWM через реле | +| 18 | Multivent | out\_Multivent | Многозональная вентиляция | +| 19 | Лифт | out\_Elevator | Управление лифтом (UART) | +| 20 | Счётчик | out\_counter | Счётчик импульсов | +| 21 | Увлажнитель | out\_humidifier | Форсуночное увлажнение | +| 22 | Меркурий | out\_Mercury | Счётчик электроэнергии Меркурий | +| 23 | Полив | out\_sprinkler | Система полива | --- -## 1. out_counter — Счётчик импульсов +## 1. out\_counter — Счётчик импульсов ### Конфигурация (Type 20) @@ -47,9 +47,9 @@ ### Логика работы -1. Модуль ждёт команду (S_SET или любой CMD) +1. Модуль ждёт команду (S\_SET или любой CMD) 2. При получении команды с процентом > 0 запускается таймер -3. По истечении периода [1] добавляется значение [0] * TENS_BASE +3. По истечении периода [1] добавляется значение [0] * TENS\_BASE 4. Считанное значение публикуется в MQTT ### Пример использования @@ -65,7 +65,7 @@ --- -## 2. out_relay — Электромагнитное реле (Type 6) +## 2. out\_relay — Электромагнитное реле (Type 6) ### Конфигурация @@ -96,7 +96,7 @@ --- -## 3. out_Motor — Управление моторами (Type 12) +## 3. out\_Motor — Управление моторами (Type 12) ### Конфигурация @@ -118,11 +118,11 @@ ### Логика работы 1. Модуль сравнивает **targetPos** (из команды 0-255) с **curPos** (из обратной связи) -2. Если разница > POS_ERR (10): +2. Если разница > POS\_ERR (10): - Если targetPos < curPos → движение вниз (pinDown) - Если targetPos > curPos → движение вверх (pinUp) 3. При достижении targetPos или maxOnTime мотор останавливается -4. Защита от перегрузки: одновременно работают макс. MOTOR_QUOTE моторов (обычно 2) +4. Защита от перегрузки: одновременно работают макс. MOTOR\_QUOTE моторов (обычно 2) ### Примеры @@ -141,7 +141,7 @@ --- -## 4. out_PID — PID-регулятор (Type 13) +## 4. out\_PID — PID-регулятор (Type 13) ### Конфигурация @@ -189,7 +189,7 @@ --- -## 5. out_PWM — ШИМ управление (Type 3) +## 5. out\_PWM — ШИМ управление (Type 3) ### Конфигурация @@ -215,7 +215,7 @@ --- -## 6. out_relay (Type 6) — детально +## 6. out\_relay (Type 6) — детально ### Загружаемые параметры (getConfig) @@ -233,7 +233,7 @@ if (!period) period = 5000UL; // по умолчанию 5 сек --- -## 7. out_counter (Type 20) — детально +## 7. out\_counter (Type 20) — детально ### Загружаемые параметры (Poll) @@ -250,7 +250,7 @@ uint32_t period = item->getFloatArg(1) * 1000.0; // [1] в мс --- -## 8. out_Motor (Type 12) — детально +## 8. out\_Motor (Type 12) — детально ### Загружаемые параметры (getConfig) @@ -278,7 +278,7 @@ if (pinDown < 0) { --- -## 9. out_PID (Type 13) — детально +## 9. out\_PID (Type 13) — детально ### Загружаемые параметры (getConfig) @@ -308,7 +308,7 @@ store->setpoint = item->itemVal->valuefloat; // Установка из JSON va --- -## 11. out_humidifier (Type 21) — Форсуночное увлажнение +## 11. out\_humidifier (Type 21) — Форсуночное увлажнение ### Конфигурация @@ -380,30 +380,30 @@ MAX_OPERATION_PRESSURE = 600 // максимальное рабочее д | Состояние | Код | Описание | |-----------|-----|---------| -| H_UNKNOWN | 0 | Неизвестное состояние | -| H_READY | 1 | Готов к работе | -| H_PREPARE_FOR_START | 2 | Подготовка к пуску | -| H_PREPARE_VALVES | 3 | Открытие форсунок | -| H_MOTOR_ON | 4 | Включение насоса | -| H_OPERATE | 5 | В режиме увлажнения | -| H_MOTOR_PAUSE | 6 | Пауза насоса | -| H_MOTOR_OFF | 7 | Выключение насоса | -| H_MOTOR_OFF_OK | 10 | Насос остановлен | -| H_FLUSH | 8 | Промывка системы | -| H_IDLE | 9 | Ожидание | -| H_FAULT_PRESSURE | -1 | Ошибка давления | -| H_FAULT_PRESSURE_KEEP | -2 | Потеря давления во время работы | -| H_FAULT_OVERPRESSURE | -3 | Перепад давления | -| H_FAULT_MOTOR_OFF | -4 | Отказ насоса | +| H\_UNKNOWN | 0 | Неизвестное состояние | +| H\_READY | 1 | Готов к работе | +| H\_PREPARE\_FOR\_START | 2 | Подготовка к пуску | +| H\_PREPARE\_VALVES | 3 | Открытие форсунок | +| H\_MOTOR\_ON | 4 | Включение насоса | +| H\_OPERATE | 5 | В режиме увлажнения | +| H\_MOTOR\_PAUSE | 6 | Пауза насоса | +| H\_MOTOR\_OFF | 7 | Выключение насоса | +| H\_MOTOR\_OFF\_OK | 10 | Насос остановлен | +| H\_FLUSH | 8 | Промывка системы | +| H\_IDLE | 9 | Ожидание | +| H\_FAULT\_PRESSURE | -1 | Ошибка давления | +| H\_FAULT\_PRESSURE\_KEEP | -2 | Потеря давления во время работы | +| H\_FAULT\_OVERPRESSURE | -3 | Перепад давления | +| H\_FAULT\_MOTOR\_OFF | -4 | Отказ насоса | ### Логика работы 1. **Инициализация**: модуль ждёт команду включения или когда уровень влажности > startLevel 2. **Подготовка**: открывает клапаны форсунок, ждёт достижения давления -3. **Работа**: включает насос, поддерживает давление в диапазоне [MIN_OPERATION_PRESSURE, MAX_OPERATION_PRESSURE] +3. **Работа**: включает насос, поддерживает давление в диапазоне [MIN\_OPERATION\_PRESSURE, MAX\_OPERATION\_PRESSURE] 4. **Балансировка**: одновременно открыто не более `capacity` форсунок из группы `N` -5. **Очистка**: периодическая промывка при давлении FLUSH_PRESSURE -6. **Контроль**: отключение при падении давления ниже MIN_OPERATION_PRESSURE +5. **Очистка**: периодическая промывка при давлении FLUSH\_PRESSURE +6. **Контроль**: отключение при падении давления ниже MIN\_OPERATION\_PRESSURE ### Примеры конфигурации @@ -453,7 +453,7 @@ MAX_OPERATION_PRESSURE = 600 // максимальное рабочее д --- -## 12. out_Mercury (Type 22) — Счётчик электроэнергии +## 12. out\_Mercury (Type 22) — Счётчик электроэнергии ### Конфигурация @@ -497,7 +497,7 @@ MAX_OPERATION_PRESSURE = 600 // максимальное рабочее д --- -## 13. out_AC (Type 10) — Управление кондиционером +## 13. out\_AC (Type 10) — Управление кондиционером ### Конфигурация @@ -535,7 +535,7 @@ portNum = item->getArg(0); // 0=Serial, 1=Serial1, 2=Serial2, 3=Serial3 --- -## 14. out_Modbus (тип MBUS) — Modbus устройства +## 14. out\_Modbus (тип MBUS) — Modbus устройства ### Конфигурация общая @@ -625,7 +625,7 @@ pollingInterval = delayObj->valueint; // по умолчанию 1000 мс --- -## 15. out_Multivent (Type 18) — Многозональная вентиляция +## 15. out\_Multivent (Type 18) — Многозональная вентиляция ### Конфигурация diff --git a/documentation/core/mqtt_api_reference.md b/documentation/core/mqtt_api_reference.md index 79f154b..2399546 100644 --- a/documentation/core/mqtt_api_reference.md +++ b/documentation/core/mqtt_api_reference.md @@ -34,7 +34,7 @@ root/[id-устройства или bcst или out]/имя_item/[subitem/]suff - `out` — контроллер публикует статус в эти топики - **Пример**: `myhome/s_out/lamp1/set` (где `s_out` — значение `out`) -#### 3. **item_name** — имя объекта (канала) +#### 3. **item\_name** — имя объекта (канала) Определяется в разделе `items` конфигурации. @@ -59,7 +59,7 @@ myhome/in/multivent/bedroom/set (установить T в спальне) myhome/in/multivent/kitchen/fan (управление вентилятором кухни) ``` -**Пример для LED ленты (пиксели 10-20; работает ТОЛЬКО для CH_SPILED, тип 11 — DMX-драйвер subitem игнорирует)**: +**Пример для LED ленты (пиксели 10-20; работает ТОЛЬКО для CH\_SPILED, тип 11 — DMX-драйвер subitem игнорирует)**: ``` myhome/in/led_strip/10-20/set (установить значение пиксели 10-20) ``` @@ -87,16 +87,16 @@ myhome/in/floor/OFF/set (применится для теплых | **`/hue`** | Command | Оттенок (0-365°, HSV формат) | RGB/RGBW/RGBWW | | **`/sat`** | Command | Насыщенность (0-100%, HSV формат) | RGB/RGBW/RGBWW | | **`/HSV`** | Command | Полный цвет (hue,saturation,volume). Суффикс ЗАГЛАВНЫЙ, строчный `/hsv` игнорируется | RGB/RGBW/RGBWW | -| **`/rgb`** | Command | **Не обрабатывается** в текущей сборке (S_RGB) | — | +| **`/rgb`** | Command | **Не обрабатывается** в текущей сборке (S\_RGB) | — | | **`/temp`** | Command | Цветовая температура 153-500 mireds (RGBWW); у AC — текущая T | RGBWW, AC | | **`/raw`** | Command | «Сырые» данные, передаваемые драйверу без интерпретации | AC, ELEVATOR | | **`/fan`** | Command, Status | Скорость вентилятора 0-255 или (HIGH, MEDIUM, LOW, OFF) | AC, Multivent | -| **`/mode`** | Command, Status | Режим работы — число 0-4 (AC). Команды FAN нет — есть FAN_ONLY. Текстовые режимы (HEAT, COOL, DRY, AUTO) — payload в /cmd | AC, Multivent | +| **`/mode`** | Command, Status | Режим работы — число 0-4 (AC). Команды FAN нет — есть FAN\_ONLY. Текстовые режимы (HEAT, COOL, DRY, AUTO) — payload в /cmd | AC, Multivent | | **`/lock`** | Command, Status | Блокировка (ON, OFF) | AC | | **`/swing`** | Command, Status | Направление воздушного потока (ON, OFF) | AC | | **`/quiet`** | Command, Status | Тихий режим (ON, OFF) | AC | | **`/ctrl`** | Command, Status | Управление состоянием (FREEZE, UNFREEZE, ENABLE, DISABLE) | Специальное | -| **`/del`** | Command | Команда с задержкой — только команды ON…FAN_ONLY (код ≤ 0x0F); HIGH/MEDIUM/LOW/HEAT_COOL/HEAT/COOL/DRY запланировать нельзя | ON…FAN_ONLY | +| **`/del`** | Command | Команда с задержкой — только команды ON…FAN\_ONLY (код ≤ 0x0F); HIGH/MEDIUM/LOW/HEAT\_COOL/HEAT/COOL/DRY запланировать нельзя | ON…FAN\_ONLY | --- @@ -138,7 +138,7 @@ myhome/lighthub01/lamp1/set ← 150 root/out/item[/subitem]/suffix ``` -**Примеры** (при out="s_out"): +**Примеры** (при out="s\_out"): ``` myhome/s_out/lamp1/set → 255 (текущая яркость, 0-255; общий топик s_out/lamp1 — 0-100) myhome/s_out/lamp1/cmd → ON (последняя команда) @@ -311,7 +311,7 @@ myhome/in/light/cmd → "ON 3000" ### Восстановление состояния при старте -1. Контроллер подписывается на **статусные топики** на **8 секунд** после старта (TIMEOUT_RETAIN = 8000 мс) +1. Контроллер подписывается на **статусные топики** на **8 секунд** после старта (TIMEOUT\_RETAIN = 8000 мс) 2. Брокер отправляет **последний актуальный статус** 3. Контроллер восстанавливает все значения: яркость, цвет, температуру и т.д. @@ -394,7 +394,7 @@ curl --user arduino:password -X POST http://192.168.1.10/item/ac_main/mode -d " 1. **Командные широковещательные**: `root/bcst/#` 2. **Командные индивидуальные**: `root/id-устройства/#` -3. **Статусные** (только при старте, на 8 сек, TIMEOUT_RETAIN = 8000 мс): `root/out/+/+/#` +3. **Статусные** (только при старте, на 8 сек, TIMEOUT\_RETAIN = 8000 мс): `root/out/+/+/#` 4. **Служебные**: `$command` ловится общей подпиской `root/id-устройства/#` (отдельной подписки нет) --- @@ -471,5 +471,5 @@ mosquitto_sub -h 192.168.1.100 -t "myhome/s_out/#" -v --- -**Версия документа**: 2.1 (актуально для работа_с_mqtt из wiki.lazyhome.ru) +**Версия документа**: 2.1 (актуально для работа\_с\_mqtt из wiki.lazyhome.ru) **Источники**: [MQTT wiki](https://www.lazyhome.ru/dokuwiki/doku.php?id=%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_mqtt), [API wiki](https://www.lazyhome.ru/dokuwiki/doku.php?id=api) diff --git a/documentation/core/mqtt_quick_reference.md b/documentation/core/mqtt_quick_reference.md index 66abbec..b7a8906 100644 --- a/documentation/core/mqtt_quick_reference.md +++ b/documentation/core/mqtt_quick_reference.md @@ -92,7 +92,7 @@ mosquitto_pub -h 192.168.1.100 -t "myhome/in/rgb/HSV" -m "240,100,200" ### Цвет по RGB (не поддерживается) -> Суффикс `/rgb` **не поддерживается** в текущей сборке (S_RGB не обрабатывается). +> Суффикс `/rgb` **не поддерживается** в текущей сборке (S\_RGB не обрабатывается). > Цвет задаётся через `/HSV` или строкой «h,s,v[,ct]» в общем топике без суффикса. ```bash @@ -288,7 +288,7 @@ curl http://192.168.1.10/ram/lamp1 | `/hue` | Оттенок RGB | 0-365° | | `/sat` | Насыщенность RGB | 0-100% | | `/HSV` | Полный HSV (ЗАГЛАВНЫЙ) | hue,sat,value | -| `/rgb` | **Не поддерживается** (S_RGB не обрабатывается) | — | +| `/rgb` | **Не поддерживается** (S\_RGB не обрабатывается) | — | | `/fan` | Вентилятор | LOW, MEDIUM, HIGH, OFF или число| | `/mode` | Режим работы — число 0-4 (AC); текстовые режимы — через /cmd | 0-4 | | `/ctrl` | Управление | ENABLE, DISABLE, FREEZE, UNFREEZE | @@ -297,6 +297,6 @@ curl http://192.168.1.10/ram/lamp1 --- **Дополнительно**: -- Полный справочник: [mqtt_api_reference.md](mqtt_api_reference.md) -- Справочник суффиксов: [suffixes_reference.md](suffixes_reference.md) -- Примеры конфигураций: [configuration_examples.md](configuration_examples.md) +- Полный справочник: [mqtt\_api\_reference.md](mqtt_api_reference.md) +- Справочник суффиксов: [suffixes\_reference.md](suffixes_reference.md) +- Примеры конфигураций: [configuration\_examples.md](configuration_examples.md) diff --git a/documentation/core/ota.md b/documentation/core/ota.md index 9833d3b..a88ce40 100644 --- a/documentation/core/ota.md +++ b/documentation/core/ota.md @@ -1,6 +1,6 @@ # OTA — обновление прошивки по воздуху -> Источник: Wiki LightHub (lazyhome.ru), страница «ota_обновление_прошивки_по_воздуху». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «ota\_обновление\_прошивки\_по\_воздуху». Снапшот от 2026-10-02. ### OTA @@ -19,7 +19,7 @@ Чтобы прошивка могла успешно обновиться, она должна занимать строго не более 50% flash памяти. Это не является проблемой для всех архитектур, исключая MEGA2560. Данный контроллер имеет очень скромные характеристики, поэтому приходится ужиматься. В пред-компилированной версии для этой архитектуры отключены почти все опциональные модули (DMX, Modbus, 1-wire). Но перекомпилировав проект, можно подключить нужные опции, пожертвовав чем-то еще (например, MDNS) -См файл build-flags/build_flags_mega2560-optiboot с опциями по умолчанию, которые можно переопределить в custom-build-flags/build_flags_mega2560-optiboot +См файл build-flags/build\_flags\_mega2560-optiboot с опциями по умолчанию, которые можно переопределить в custom-build-flags/build\_flags\_mega2560-optiboot Подробнее про опции компиляции в разделе [опции компиляции](https://www.lazyhome.ru/dokuwiki/doku.php?id=опции_компиляции) @@ -51,9 +51,9 @@ arduinoOTA -address 192.168.1.2 -port 80 -username arduino -password password -s В примере приведены username и password по-умолчанию Пароль необходимо сменить на свой -Задать пароль и сохранить его в NVRAM можно при помощи команды otapwd [cli_интерфейс](cli_interface.md) +Задать пароль и сохранить его в NVRAM можно при помощи команды otapwd [cli\_интерфейс](cli_interface.md) -для коммита прошивки от 20/05/24 и позднее, можно воспользоваться опциями компиляции DEFAULT_OTA_USERNAME и DEFAULT_OTA_PASSWORD +для коммита прошивки от 20/05/24 и позднее, можно воспользоваться опциями компиляции DEFAULT\_OTA\_USERNAME и DEFAULT\_OTA\_PASSWORD Примечание (2026-10-02): OTA в актуальных версиях прошивки переделана. Механизм управляется опцией компиляции `OTA_ENABLE` (флаг в `build-flags/build_flags_*` и код под `#ifdef OTA_ENABLE` в `lighthub/main.cpp`), обновление по воздуху для ESP-платформ осуществляется через библиотеку ArduinoOTA (форк https://github.com/anklimov/ArduinoOTA). Для ESP32/ESP8266 в `platformio.ini` задана таблица разделов `board_build.partitions = min_spiffs.csv`, выделенная под обновление прошивка больше не ограничена правилом «строго не более 50% flash» (комментарий в platformio.ini: «>50% space - ok for ESP due spare partition»). Правило 50% flash по-прежнему актуально для AVR-платформ (MEGA2560). Порт OTA по умолчанию 65280 (`OTA_PORT`, `lighthub/options.h:28-29`), для esp32-wifi задан `-DOTA_PORT=80`. В wiki не упомянута сборка esp32c3-wifi, также поддерживающая OTA. diff --git a/documentation/core/rotary_encoder.md b/documentation/core/rotary_encoder.md index 8da6b0e..4f8c344 100644 --- a/documentation/core/rotary_encoder.md +++ b/documentation/core/rotary_encoder.md @@ -25,7 +25,7 @@ Параметр `T` соответствует значению **32** — это тип входа «rotary encoder». -Параметр `"+-"` определяет обработчик, вызываемый при вращении рукоятки энкодера по или против часовой стрелки. Обработчик аналогичен описанному в разделе «диммирование с использованием кнопок» ([button_presses.md](button_presses.md)). Но там пары параметров `icmd`/`irev` и `ecmd`/`erev` используются поочередно, а в случае энкодера первый параметр используется в случае вращения по часовой стрелке, а второй — против часовой. +Параметр `"+-"` определяет обработчик, вызываемый при вращении рукоятки энкодера по или против часовой стрелки. Обработчик аналогичен описанному в разделе «диммирование с использованием кнопок» ([button\_presses.md](button_presses.md)). Но там пары параметров `icmd`/`irev` и `ecmd`/`erev` используются поочередно, а в случае энкодера первый параметр используется в случае вращения по часовой стрелке, а второй — против часовой. Настройка в примере ниже переключает локальное устройство `dimmer` между состояниями ON и OFF (команда `toggle`) по однократному клику на энкодер (параметр `click`), а при вращении рукоятки по и против часовой стрелки увеличивает или уменьшает яркость локального устройства `dimmer` соответственно (команды `%+1` и `%-1`): diff --git a/documentation/core/suffixes_reference.md b/documentation/core/suffixes_reference.md index d13002e..84e5f81 100644 --- a/documentation/core/suffixes_reference.md +++ b/documentation/core/suffixes_reference.md @@ -29,7 +29,7 @@ myhome/in/lamp_bedroom/set | `/set` | ✅ | ✅ | Установка численного значения | 0-255 (шкала 0-100 — только в общем топике без суффикса) | | `/val` | ✅ | ❌ | Вход сенсора (THERMO, PID, MULTIVENT, SPRINKLER) | Число (T / значение) | | `/raw` | ✅ | ✅ | «Сырые» данные, передаваемые драйверу без интерпретации | Текст / число | -| `/del` | ✅ | ❌ | Команда с задержкой. Только команды ON…FAN_ONLY (код ≤ 0x0F); HIGH/MEDIUM/LOW/HEAT_COOL/HEAT/COOL/DRY запланировать нельзя | Текст (команда + время) | +| `/del` | ✅ | ❌ | Команда с задержкой. Только команды ON…FAN\_ONLY (код ≤ 0x0F); HIGH/MEDIUM/LOW/HEAT\_COOL/HEAT/COOL/DRY запланировать нельзя | Текст (команда + время) | > **Полный список команд** (payload `/cmd`): `ON`, `OFF`, `REST`, `TOGGLE`, `HALT`, `XON`, `XOFF`, `INCREASE`, `DECREASE`, `ENABLE`, `DISABLE`, `UNFREEZE`, `FREEZE`, `AUTO`, `FAN_ONLY`, `HIGH`, `MEDIUM`, `LOW`, `HEAT_COOL`, `HEAT`, `COOL`, `DRY`, `RGB`, `HSV`, `RESET`. > `TOGGLE` в `/ctrl` не включает/выключает, а **инвертирует флаг DISABLE**. @@ -41,7 +41,7 @@ myhome/in/lamp_bedroom/set | `/hue` | ✅ | ✅ | Оттенок (HSV) | 0-365° | | `/sat` | ✅ | ✅ | Насыщенность (HSV) | 0-100% | | `/HSV` | ✅ | ✅ | Полный цвет (hue,sat,val). Суффикс ЗАГЛАВНЫЙ, строчный `/hsv` игнорируется | `H,S,V` | -| `/rgb` | ❌ | ❌ | **Не поддерживается** в текущей сборке (S_RGB нигде не обрабатывается) | — | +| `/rgb` | ❌ | ❌ | **Не поддерживается** в текущей сборке (S\_RGB нигде не обрабатывается) | — | | `/temp` | ✅ | ✅ | Цветовая температура 153-500 mireds (RGBWW); у AC — текущая T | 153-500 | **Примеры**: @@ -108,7 +108,7 @@ myhome/in/ac_main/quiet → ON | `/cmd` | ✅ | ✅ | Включить/выключить | ON, OFF, TOGGLE | | `/set` | ✅ | ✅ | Установленная температура | Текущее значение | | `/fan` | ✅ | ✅ | Скорость вентилятора (HIGH/MEDIUM/LOW → 255/128/64) | HIGH, MEDIUM, LOW | -| `/mode` | ✅ | ❌ | Только у основного item (обратная связь от AC). У зон S_MODE не обрабатывается — режим зоны задаётся командой в `zone/cmd` | — | +| `/mode` | ✅ | ❌ | Только у основного item (обратная связь от AC). У зон S\_MODE не обрабатывается — режим зоны задаётся командой в `zone/cmd` | — | **Структура многозональной вентиляции**: @@ -227,30 +227,30 @@ myhome/in/ac/HEAT/set → 25 | Номер | Тип канала | Суффиксы | Примеры | |:-----:|-----------|----------|---------| -| 0 | CH_DIMMER (DMX 1-4 ch) | `/cmd`, `/set` (subitem-адресация игнорируется) | Лампа, светодиод | -| 1 | CH_RGBW (DMX 4 ch) | `/cmd`, `/set`, `/hue`, `/sat`, `/HSV`, `/temp` | RGBW люстра | -| 2 | CH_RGB (DMX 3 ch) | `/cmd`, `/set`, `/hue`, `/sat`, `/HSV` | RGB лента, LED | -| 3 | CH_PWM | `/cmd`, `/set` | PWM вывод | -| 4 | CH_MODBUS | `/cmd`, `/set` | Modbus диммер | -| 5 | CH_THERMO | `/cmd`, `/set`, `/val` (вход сенсора), `/ctrl` | Термостат | -| 6 | CH_RELAY | `/cmd`, `/set`, `/del` | Реле, розетка | -| 7 | CH_GROUP | `/cmd`, `/set`, `/hue`, `/sat`, `/HSV` | Группа каналов | -| 8 | CH_VCTEMP | — | Регулятор Vacon (PID) | -| 9 | CH_VC | — | Привод Vacon (Modbus) | -| 10 | CH_AC (Haier) | `/cmd`, `/set` (16-40), `/mode` (0-4), `/fan`, `/lock`, `/swing`, `/quiet` (legacy `queit`), `/temp`, `/raw` | Кондиционер | -| 11 | CH_SPILED | `/cmd`, `/set`, `/hue`, `/sat`, `/HSV` + subitem-пиксели 10-20 | Адресуемая LED лента | -| 12 | CH_MOTOR | `/cmd`, `/set` | Сервопривод | -| 13 | CH_PID | `/cmd`, `/set`, `/val` (вход сенсора), `/ctrl` | PID регулятор, теплые полы | -| 14 | CH_MBUS | `/cmd`, `/set` | Modbus устройство | -| 15 | CH_UARTBRIDGE | `/cmd`, `/set` | UART-мост | -| 16 | CH_RELAYX | `/cmd`, `/set`, `/del` | Реле + ШИМ | -| 17 | CH_RGBWW (DMXRGBWW) | `/cmd`, `/set`, `/hue`, `/sat`, `/HSV`, `/temp` | Теплый+холодный белый | -| 18 | CH_MULTIVENT | `/cmd`, `/set`, `/fan` + zone-subitem-ы (`set`, `fan`, `cmd`) | Многозональная вентиляция | -| 19 | CH_ELEVATOR | `/cmd`, `/set`, `/raw` | Лифт | -| 20 | CH_COUNTER | `/cmd`, `/set` | Счетчик | -| 21 | CH_HUMIDIFIER | `/cmd` | Увлажнитель | -| 22 | CH_MERCURY | — | Счетчик электроэнергии | -| 23 | CH_SPRINKLER | `/cmd`, `/set`, `/val` | Полив (ирригатор) | +| 0 | CH\_DIMMER (DMX 1-4 ch) | `/cmd`, `/set` (subitem-адресация игнорируется) | Лампа, светодиод | +| 1 | CH\_RGBW (DMX 4 ch) | `/cmd`, `/set`, `/hue`, `/sat`, `/HSV`, `/temp` | RGBW люстра | +| 2 | CH\_RGB (DMX 3 ch) | `/cmd`, `/set`, `/hue`, `/sat`, `/HSV` | RGB лента, LED | +| 3 | CH\_PWM | `/cmd`, `/set` | PWM вывод | +| 4 | CH\_MODBUS | `/cmd`, `/set` | Modbus диммер | +| 5 | CH\_THERMO | `/cmd`, `/set`, `/val` (вход сенсора), `/ctrl` | Термостат | +| 6 | CH\_RELAY | `/cmd`, `/set`, `/del` | Реле, розетка | +| 7 | CH\_GROUP | `/cmd`, `/set`, `/hue`, `/sat`, `/HSV` | Группа каналов | +| 8 | CH\_VCTEMP | — | Регулятор Vacon (PID) | +| 9 | CH\_VC | — | Привод Vacon (Modbus) | +| 10 | CH\_AC (Haier) | `/cmd`, `/set` (16-40), `/mode` (0-4), `/fan`, `/lock`, `/swing`, `/quiet` (legacy `queit`), `/temp`, `/raw` | Кондиционер | +| 11 | CH\_SPILED | `/cmd`, `/set`, `/hue`, `/sat`, `/HSV` + subitem-пиксели 10-20 | Адресуемая LED лента | +| 12 | CH\_MOTOR | `/cmd`, `/set` | Сервопривод | +| 13 | CH\_PID | `/cmd`, `/set`, `/val` (вход сенсора), `/ctrl` | PID регулятор, теплые полы | +| 14 | CH\_MBUS | `/cmd`, `/set` | Modbus устройство | +| 15 | CH\_UARTBRIDGE | `/cmd`, `/set` | UART-мост | +| 16 | CH\_RELAYX | `/cmd`, `/set`, `/del` | Реле + ШИМ | +| 17 | CH\_RGBWW (DMXRGBWW) | `/cmd`, `/set`, `/hue`, `/sat`, `/HSV`, `/temp` | Теплый+холодный белый | +| 18 | CH\_MULTIVENT | `/cmd`, `/set`, `/fan` + zone-subitem-ы (`set`, `fan`, `cmd`) | Многозональная вентиляция | +| 19 | CH\_ELEVATOR | `/cmd`, `/set`, `/raw` | Лифт | +| 20 | CH\_COUNTER | `/cmd`, `/set` | Счетчик | +| 21 | CH\_HUMIDIFIER | `/cmd` | Увлажнитель | +| 22 | CH\_MERCURY | — | Счетчик электроэнергии | +| 23 | CH\_SPRINKLER | `/cmd`, `/set`, `/val` | Полив (ирригатор) | --- @@ -319,7 +319,7 @@ myhome/s_out/ac_hallway/fan → HIGH ], 22] } ``` -(13 — CH_PID; 2-й аргумент — массив `[kP,kI,kD,dT,…], {выходной execObj}, {каскад}]`; 3-й — стартовый setpoint 22°C) +(13 — CH\_PID; 2-й аргумент — массив `[kP,kI,kD,dT,…], {выходной execObj}, {каскад}]`; 3-й — стартовый setpoint 22°C) **Команды**: ``` @@ -472,4 +472,4 @@ light: **Версия документа**: 2.0 (обновлено для соответствия wiki.lazyhome.ru) **Последнее обновление**: 2024 -**Источник**: https://www.lazyhome.ru/dokuwiki/doku.php?id=%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_mqtt +**Источник**: https://www.lazyhome.ru/dokuwiki/doku.php?id=%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0\_%D1%81\_mqtt diff --git a/documentation/core/technical_channel_types_table.md b/documentation/core/technical_channel_types_table.md index 64750b5..908010f 100644 --- a/documentation/core/technical_channel_types_table.md +++ b/documentation/core/technical_channel_types_table.md @@ -17,7 +17,7 @@ | 5 | THERMO | Thermostat | ON/OFF термостат | array | `[24, 33]` (GPIO, T°C) | | 6 | RELAY | Relay Output | GPIO реле | int | `23` (GPIO pin) | | 7 | GROUP | Group Channel | Логическая группа каналов | array | `["lamp1", "lamp2"]` | -| 8 | VCTEMP | Vacom Temp | Температура из VC-канала | string | `"fm"` (имя CH_VC канала) | +| 8 | VCTEMP | Vacom Temp | Температура из VC-канала | string | `"fm"` (имя CH\_VC канала) | | 9 | MBUSVC | Vacom Motor | Vacom мотор регулятор | array | `[96, "a_ext"]` (адрес, имя) | | 10 | ACHAIER | AC Haier | Кондиционер Haier (UART) | int | `1` (порт 0-3) | | 11 | SPILED | SPI LED | NeoPixel LED лента | array | `[7, 8]` (data-пин 7, 8 светодиодов) | @@ -25,7 +25,7 @@ | 13 | PID | PID Regulator | PID регулятор | array | `[[1.0,0.05,...],{...}]` | | 14 | MBUS | Modbus | Universal Modbus v2 | array | `[96, "template", {...}]` | | 15 | UARTBRDG | UART Bridge | UART мост | object | `{"serial","baud","ip","port","hd","log","bond"}` | -| 16 | RELAYX | Relay PWM | Медленный PWM реле | array | `[22, 60]` (GPIO, период_сек) | +| 16 | RELAYX | Relay PWM | Медленный PWM реле | array | `[22, 60]` (GPIO, период\_сек) | | 17 | DMXRGBWW | DMX RGBWW | DMX RGB+2White (5 каналов) | int | `30` (DMX 30-34) | | 18 | VENTS | Multivent | Многозональная вентиляция | object | `{зоны}` (без Modbus-адреса) | | 19 | ELEVATOR | Elevator | Лифт (реализован) | object | `{"serial":"8N1","baud":19200}` | @@ -70,7 +70,7 @@ ## Детальная таблица (с командами и суффиксами) -### CH_DIMMER (0) — DMX Диммер +### CH\_DIMMER (0) — DMX Диммер | Параметр | Значение | |----------|----------| @@ -83,7 +83,7 @@ | **Начальное значение** | Опционально (элемент 3) | | **MQTT примеры** | `myhome/<имя_контроллера>/lamp/cmd ← ON`, `myhome/<имя_контроллера>/lamp/set ← 150` (индивидуальный командный топик) | -### CH_RGBW (1) — DMX RGB+White +### CH\_RGBW (1) — DMX RGB+White | Параметр | Значение | |----------|----------| @@ -96,7 +96,7 @@ | **MQTT формат RGBW** | `255,128,0,100` (R,G,B,W) | | **MQTT команды** | `/HSV`, `/RGB`, `/hue`, `/sat`, `/temp` | -### CH_RGB (2) — DMX RGB +### CH\_RGB (2) — DMX RGB | Параметр | Значение | |----------|----------| @@ -105,7 +105,7 @@ | **Формат конфига** | `[2, 15]` (DMX каналы 15-17) | | **Суффиксы** | /cmd, /val, /set, /hue, /sat, /temp, /RGB | -### CH_PWM (3) — GPIO PWM +### CH\_PWM (3) — GPIO PWM | Параметр | Значение | |----------|----------| @@ -117,16 +117,16 @@ | **Частота** | 4000 Гц (Mega2560, таймеры 3/4); на ESP32 PWM недоступен (stub) | | **Суффиксы** | /cmd, /val, /set | -### CH_MODBUS (4) — AC Dimmer (Legacy) +### CH\_MODBUS (4) — AC Dimmer (Legacy) | Параметр | Значение | |----------|----------| | **Назначение** | Управление AC-диммером через Modbus (устаревшее) | | **Конфигурация** | array `[addr, reg, mask, max_val]` | -| **Параметры** | - addr: Modbus адрес (1-247)
- reg: регистр (обычно 0)
- mask: маска (0, 1, 2 (пропуск 16 бит), 3 (Modbus relay), 4 (swap байтов), -1/отсутствует — без поллинга)
- max_val: максимальное значение (обычно 255) | -| **Примечание** | **Использовать CH_MBUS (14) для новых проектов** | +| **Параметры** | - addr: Modbus адрес (1-247)
- reg: регистр (обычно 0)
- mask: маска (0, 1, 2 (пропуск 16 бит), 3 (Modbus relay), 4 (swap байтов), -1/отсутствует — без поллинга)
- max\_val: максимальное значение (обычно 255) | +| **Примечание** | **Использовать CH\_MBUS (14) для новых проектов** | -### CH_THERMO (5) — ON/OFF Термостат +### CH\_THERMO (5) — ON/OFF Термостат | Параметр | Значение | |----------|----------| @@ -137,7 +137,7 @@ | **Гистерезис** | Включение при T<уставка−1, выключение при T≥уставка | | **MQTT команды** | `/set` (целевая T), `/val` (вход текущей температуры) | -### CH_RELAY (6) — GPIO Реле +### CH\_RELAY (6) — GPIO Реле | Параметр | Значение | |----------|----------| @@ -148,7 +148,7 @@ | **Макс. ток** | 40 мА на pin (требуется транзистор для реле) | | **Состояния** | 0 = OFF, 1 = ON | -### CH_GROUP (7) — Группа каналов +### CH\_GROUP (7) — Группа каналов | Параметр | Значение | |----------|----------| @@ -158,15 +158,15 @@ | **Команды** | ON, OFF, TOGGLE, SET (для диммеров) | | **Рекурсия** | Поддерживается (группы в группах) | -### CH_VCTEMP (8) — Vacom PID Терморегулятор +### CH\_VCTEMP (8) — Vacom PID Терморегулятор | Параметр | Значение | |----------|----------| | **Назначение** | Публикация температуры из VC-канала Vacom | -| **Конфигурация** | string — имя_канала_VC (itemArg — строка-имя item типа CH_VC (9)) | +| **Конфигурация** | string — имя\_канала\_VC (itemArg — строка-имя item типа CH\_VC (9)) | | **Пример** | `[8, "fm"]` | -### CH_VC (9) — Vacom Мотор-регулятор +### CH\_VC (9) — Vacom Мотор-регулятор | Параметр | Значение | |----------|----------| @@ -174,17 +174,17 @@ | **Конфигурация** | array `[modbus_адрес, "имя_объекта"]` | | **Пример** | `[9, [96, "a_ext"]]` | -### CH_AC (10) — Кондиционер Haier +### CH\_AC (10) — Кондиционер Haier | Параметр | Значение | |----------|----------| | **Назначение** | Управление кондиционером Haier | | **Конфигурация** | `[10, portNum(0-3)]` | | **Порт** | Номер serial порта (0-3) | -| **Режимы** | AUTO, FAN_ONLY, HEAT, COOL, DRY, HEAT_COOL (текст — в payload /cmd; /mode — число); fan: LOW/MEDIUM/HIGH; /set 16-40 | +| **Режимы** | AUTO, FAN\_ONLY, HEAT, COOL, DRY, HEAT\_COOL (текст — в payload /cmd; /mode — число); fan: LOW/MEDIUM/HIGH; /set 16-40 | | **Требует** | Проприетарный UART-протокол Haier (9600, кадры 13/37 байт) | -### CH_SPILED (11) — SPI LED Лента +### CH\_SPILED (11) — SPI LED Лента | Параметр | Значение | |----------|----------| @@ -193,7 +193,7 @@ | **Протокол** | NeoPixel (один data-пин); по умолчанию Adafruit NeoPixel, при FASTLED — TM1809 | | **Диапазон пинов** | 0-53 | -### CH_MOTOR (12) — Моторная задвижка с обратной связью +### CH\_MOTOR (12) — Моторная задвижка с обратной связью | Параметр | Значение | |----------|----------| @@ -204,7 +204,7 @@ | **maxOnTime** | Максимальное время движения (мс, дефолт 10000) | | **Команды** | ON — к заданной позиции, OFF — в позицию 0, HALT | -### CH_PID (13) — PID Регулятор +### CH\_PID (13) — PID Регулятор | Параметр | Значение | |----------|----------| @@ -218,7 +218,7 @@ | **alarm** | Значение аварии | | **min/max** | Диапазон выхода | -### CH_MBUS (14) — Universal Modbus +### CH\_MBUS (14) — Universal Modbus | Параметр | Значение | |----------|----------| @@ -229,7 +229,7 @@ | **Params** | Привязка параметров к MQTT/items | | **Тип данных** | i16, i32, u16, u32, i8h, i8l, u8h, u8l, x10, 100 | -### CH_UARTBRIDGE (15) — UART Мост +### CH\_UARTBRIDGE (15) — UART Мост | Параметр | Значение | |----------|----------| @@ -237,7 +237,7 @@ | **Конфигурация** | object `{serial, baud, ip, port, hd, log, bond}` (порты фиксированы) | | **Отладка** | Может логировать через UDP | -### CH_RELAYX (16) — Медленный PWM через реле +### CH\_RELAYX (16) — Медленный PWM через реле | Параметр | Значение | |----------|----------| @@ -247,16 +247,16 @@ | **Период** | Цикл коммутации в секундах (дефолт 5 с, ограничений нет) | | **Применение** | Система напольного отопления, тепловые системы | -### CH_RGBWW (17) — DMX RGBWW +### CH\_RGBWW (17) — DMX RGBWW | Параметр | Значение | |----------|----------| | **Назначение** | RGB + Тёплый белый + Холодный белый | | **Конфигурация** | int (стартовый DMX) | -| **Каналов DMX** | 5 (R, G, B, W_warm, W_cold) | +| **Каналов DMX** | 5 (R, G, B, W\_warm, W\_cold) | | **Формат** | DMX 30-34 (5 каналов) | -### CH_MULTIVENT (18) — Многозональная вентиляция +### CH\_MULTIVENT (18) — Многозональная вентиляция | Параметр | Значение | |----------|----------| @@ -266,15 +266,15 @@ | **PID** | Для каждой зоны свои коэффициенты | | **itemArg** | объект зон (не массив с адресом) | -### CH_ELEVATOR (19) — Лифт +### CH\_ELEVATOR (19) — Лифт | Параметр | Значение | |----------|----------| | **Назначение** | Управление лифтом | | **Конфигурация** | `[19, {"serial":"8N1","baud":19200,"log":...}]` | -| **Статус** | Реализован; компилируется с ELEVATOR_ENABLE (включён только в custom-build mega2560-optiboot) | +| **Статус** | Реализован; компилируется с ELEVATOR\_ENABLE (включён только в custom-build mega2560-optiboot) | -### CH_COUNTER (20) — Счётчик импульсов +### CH\_COUNTER (20) — Счётчик импульсов | Параметр | Значение | |----------|----------| @@ -284,15 +284,15 @@ | **Период** | Период автосуммирования (сек) | | **Вход** | Внешние импульсы (GPIO-входа в конфиге нет) | -### CH_HUMIDIFIER (21) — Увлажнитель +### CH\_HUMIDIFIER (21) — Увлажнитель | Параметр | Значение | |----------|----------| | **Назначение** | Управление увлажнителем воздуха (только один в системе) | | **Конфигурация** | array `[[pumpPin, flushPin, pressurePin, maxPumpTime, idleTime, capacity, minLevel, startLevel], {зоны_краны}, motorExecObj, faultExecObj]` | -| **Сборка** | Компилируется с HUMIDIFIER_ENABLE (custom lighthub21) | +| **Сборка** | Компилируется с HUMIDIFIER\_ENABLE (custom lighthub21) | -### CH_MERCURY (22) — Счётчик энергии Mercury +### CH\_MERCURY (22) — Счётчик энергии Mercury | Параметр | Значение | |----------|----------| @@ -305,7 +305,7 @@ | **Пароль** | Строка из 6 цифр или массив 6 цифр | | **PollingInterval** | Интервал опроса (мс, дефолт 10000) | -### CH_SPRINKLER (23) — Система полива +### CH\_SPRINKLER (23) — Система полива | Параметр | Значение | |----------|----------| @@ -425,9 +425,9 @@ |-----|---------------------------| | SPRINKLER (23) | due, esp32-wifi, esp32c3-wifi, lighthub21, nrf52840 | | MERCURY (22) | due, lighthub21, stm32 | -| ELEVATOR (19) | только custom-build mega2560-optiboot (ELEVATOR_ENABLE) | -| HUMIDIFIER (21) | только custom-build lighthub21 (HUMIDIFIER_ENABLE) | -| UARTBRIDGE (15) | закомментирован во всех стандартных build-flags (UARTBRIDGE_ENABLE) | +| ELEVATOR (19) | только custom-build mega2560-optiboot (ELEVATOR\_ENABLE) | +| HUMIDIFIER (21) | только custom-build lighthub21 (HUMIDIFIER\_ENABLE) | +| UARTBRIDGE (15) | закомментирован во всех стандартных build-flags (UARTBRIDGE\_ENABLE) | --- diff --git a/documentation/core/web_ui.md b/documentation/core/web_ui.md index 1af704f..9a40330 100644 --- a/documentation/core/web_ui.md +++ b/documentation/core/web_ui.md @@ -1,6 +1,6 @@ # Интерфейс настройки контроллера -> Источник: Wiki LightHub (lazyhome.ru), страница «интерфейс_настройки». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «интерфейс\_настройки». Снапшот от 2026-10-02. ### Интерфейс настройки контроллера @@ -34,7 +34,7 @@ * Появляется возможность поиска контроллеров в вашей локальной сети, так как в них давно реализован протокол MDNS Недостаток тут только один - надо потратить 5 минут на установку этого плагина. -Так как браузер не имеет прав просканировать локальную сеть на предмет наличия контроллеров, плагин использует утилиту zeroconf_lookup которая была разработана в рамках открытого проекта https://github.com/railduino/zeroconf-lookup +Так как браузер не имеет прав просканировать локальную сеть на предмет наличия контроллеров, плагин использует утилиту zeroconf\_lookup которая была разработана в рамках открытого проекта https://github.com/railduino/zeroconf-lookup На базе этого проекта, я сделал прототип плагина для конфигурирования контроллеров lighthub https://github.com/anklimov/zeroconf-lighthub @@ -58,21 +58,21 @@ https://github.com/anklimov/zeroconf-lighthub * Для этого открываем браузер chrome, в меню "расширения" выбираем "управление расширениями". * Включаем переключатель "режим разработчика", * нажимаем кнопку"Загрузить распакованное расширение". - * Выбираем папку __zeroconf-lighthub-master/Chrome__ в распакованном на предыдущем этапе архиве + * Выбираем папку _\_zeroconf-lighthub-master/Chrome_\_ в распакованном на предыдущем этапе архиве * Расширение устанавливается, заглядываем на страницу его свойств и копируем идентификатор расширения (например gepnlbipogackhpjkojhkonkijdgpgji ) это нам пригодится чуть позже ### Как установить утилиту: ### Windows - - Переходите в каталог __zeroconf-lighthub-master\Windows_Go__ + - Переходите в каталог _\_zeroconf-lighthub-master\Windows\_Go_\_ - Из командной строки запускаете - `zeroconf_lookup.exe -i -с gepnlbipogackhpjkojhkonkijdgpgji` (тут укажите ваш идентификатор расширения, скопированный на предыдущем этапе) - После этого переносить данный файл с этого места или удалять папку нельзя - Если ставили плагин из магазина приложений - можно при запуске не указывать идентификатор расширения. `zeroconf_lookup.exe -i` ### MacOS -то же самое, только выполнимый файл лежит в директории __zeroconf-lighthub/Apple_Go__ +то же самое, только выполнимый файл лежит в директории _\_zeroconf-lighthub/Apple\_Go_\_ ### Использование @@ -83,6 +83,6 @@ https://github.com/anklimov/zeroconf-lighthub ## Сверка с кодом (2026-10-02) - Корректно: обращение по адресу контроллера (`http://` / `http://<имя>.local`) приводит к 301-редиректу на страницу управления с публичного ресурса: `httpHandler` в `lighthub/main.cpp:264-286` отвечает `Location: http://?mac=...&ip=...&port=...&name=...`. По умолчанию `REDIRECTION_URL` для esp32-wifi задан как `http://lazyhome.ru/pwa` (`build-flags/build_flags_esp32-wifi`), то есть «портал» подгружается с lazyhome.ru и дальше использует HTTP API контроллера. -- Корректно: MDNS-анонс контроллера реализован (`MDNS.addService("http", "tcp", OTA_PORT)`, main.cpp:650; на STM — `mdns.addServiceRecord`, main.cpp:1332), на этом основан поиск плагина через zeroconf_lookup. +- Корректно: MDNS-анонс контроллера реализован (`MDNS.addService("http", "tcp", OTA_PORT)`, main.cpp:650; на STM — `mdns.addServiceRecord`, main.cpp:1332), на этом основан поиск плагина через zeroconf\_lookup. - Корректно: веб-контент не размещается в памяти контроллера — в коде есть только HTTP API: `GET/POST /item/<имя>`, `GET /ram/[<имя>]`, `POST /command/<команда>` (подача CLI-команд по HTTP), `POST /config.json` (локальное изменение конфига отключает загрузку с портала, main.cpp:368-374). - Примечание: ограничение Chrome на доступ внешних страниц к локальной сети — особенность браузеров, описана верно; рекомендация по fireFox/плагину актуальна. diff --git a/documentation/hardware/flashing.md b/documentation/hardware/flashing.md index e94a861..41f7097 100644 --- a/documentation/hardware/flashing.md +++ b/documentation/hardware/flashing.md @@ -1,6 +1,6 @@ # Заливка прошивки -> Источник: Wiki LightHub (lazyhome.ru), страница «заливка_прошивки». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «заливка\_прошивки». Снапшот от 2026-10-02. ## Заливка уже откомпилированной прошивки @@ -12,7 +12,7 @@ Далее, нажимаем зеленую кнопку "Clone or download" Выбираем пункт "Download ZIP", скачиваем и распаковываем архив -Переходим в директорию lighthub-master/compiled/<требуемая_платформа> (список платформ выше) +Переходим в директорию lighthub-master/compiled/<требуемая\_платформа> (список платформ выше) Подключаете плату USB кабелем к компьютеру (кроме платформы NRF52 - там программирование только при помощи специального устройства JLink, об этом позже) @@ -40,7 +40,7 @@ В Atom или VSC выбираем пункт "Открыть директорию" (Open Folder), и указываем директорию lighthub.master (или в директорию lighthub если использовался git) -Далее, выбираем файл platformio.ini и раскомментариваем в нем нужный вам вариант платформы (платы) в пункте env_default (убираем ; перед строкой, содержащей нужную платформу, добавляем - перед строкой, содержащей ненужные платформы) +Далее, выбираем файл platformio.ini и раскомментариваем в нем нужный вам вариант платформы (платы) в пункте env\_default (убираем ; перед строкой, содержащей нужную платформу, добавляем - перед строкой, содержащей ненужные платформы) NEW - если используете среду VSC (рекомендуется) - то можете ничего не комментировать/раскомментировать а просто выбрать нужную платформу в меню "switch PlatformIO Project environment" (нажмите на Default (lighthub) в самом низу экрана) diff --git a/documentation/hardware/hardware_platforms.md b/documentation/hardware/hardware_platforms.md index 9516bd1..7413a55 100644 --- a/documentation/hardware/hardware_platforms.md +++ b/documentation/hardware/hardware_platforms.md @@ -1,6 +1,6 @@ # LightHub на разном железе -> Источник: Wiki LightHub (lazyhome.ru), страница «lighthub_на_разном_железе». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «lighthub\_на\_разном\_железе». Снапшот от 2026-10-02. Прошивка может компилироваться и работать на следующих аппаратных платформах: diff --git a/documentation/hardware/mac_address.md b/documentation/hardware/mac_address.md index ea97ed9..a44948d 100644 --- a/documentation/hardware/mac_address.md +++ b/documentation/hardware/mac_address.md @@ -1,6 +1,6 @@ # MAC-адрес контроллера -> Источник: Wiki LightHub (lazyhome.ru), страница «mac_адрес». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «mac\_адрес». Снапшот от 2026-10-02. Важно, чтобы у вашего контроллера был уникальный MAC адрес. Это важно не только потому, что в пределах одной локальной сети два контроллера с одинаковыми MAC не могут работать но еще и потому, что при старте, контроллер загружает с сервера конфигураций или с других контроллеров по шине CAN свою настройку, используя MAC как свой уникальный ключ. @@ -38,7 +38,7 @@ | Платформа | Механизм в коде | Строки | Соответствие wiki | |---|---|---|---| -| (все) `CUSTOM_FIRMWARE_MAC` | MAC разбирается из build-flag (`parseBytes(macStr, ':', ...)`), затем принудительно: `mac[0] &= 0xFE; mac[0] \|= 2;` (locally-administered, не multicast) | main.cpp:2823-2828 | ✅ «опция CUSTOM_FIRMWARE_MAC» | +| (все) `CUSTOM_FIRMWARE_MAC` | MAC разбирается из build-flag (`parseBytes(macStr, ':', ...)`), затем принудительно: `mac[0] &= 0xFE; mac[0] \|= 2;` (locally-administered, не multicast) | main.cpp:2823-2828 | ✅ «опция CUSTOM\_FIRMWARE\_MAC» | | ESP8266/ESP32 (`WIFI_ENABLE`) | Используется штатный MAC чипа: `WiFi.macAddress(sysConf.mac)` | main.cpp:2830-2833 | ✅ «ESP и так имеют уникальные адреса» | | DUE (`__SAM3X8E__`) / STM32 (`ARDUINO_ARCH_STM32`) | MAC генерируется из серийного номера чипа: `mac[0]=0xDE;` остальные байты = сумма байтов `UniqueID.UID_Byte[]` | main.cpp:2835-2840 | ✅ «DUE и STM имеют уникальный ID чипа» | | fallback `DEFAULT_FIRMWARE_MAC` | Хардкод `{0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xFF}` | options.h:180 | (доп. fallback, в wiki не описан) | diff --git a/documentation/hardware/pins_io.md b/documentation/hardware/pins_io.md index a499fc6..2bda527 100644 --- a/documentation/hardware/pins_io.md +++ b/documentation/hardware/pins_io.md @@ -1,6 +1,6 @@ # Входы и выходы платы LightHub -> Источник: Wiki LightHub (lazyhome.ru), страница «входы_выходы». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «входы\_выходы». Снапшот от 2026-10-02. ## Электропитание @@ -16,7 +16,7 @@ DCDC преобразователь может работать в двух ре Режим питания платы Ардуино выбирается джампером J4 (желто-фиолетовый на рисунке ниже) В "желтом" режиме, Ардуино питается с выхода DCDC, в фиолетовом - от входного питания. -_Важно: при использовании второго (фиолетового) режима, контроллер следует питать от источника 12В. Использование источника 24В выведет процессорную плату из строя_~~ +\_Важно: при использовании второго (фиолетового) режима, контроллер следует питать от источника 12В. Использование источника 24В выведет процессорную плату из строя\_~~ Внимание: Используйте контроллер версии 2.2 ТОЛЬКО в режиме, когда плата Ардуино питается от DCDC преобразователя. (J4 в Желтом режиме). Испытания показали, что DCDC преобразователь в ином случае работает нестабильно. @@ -45,9 +45,9 @@ _Важно: при использовании второго (фиолетов Контроллер поставляется с перемычками, установленными для работе в диапазоне питающих напряжений 12-24В и UEXT 3,3В -_Внимание: логические уровни сигналов на разъеме UEXT соответствуют применяемой процессорной плате: 5В для MEGA2560 и 3,3В для DUE_ +\_Внимание: логические уровни сигналов на разъеме UEXT соответствуют применяемой процессорной плате: 5В для MEGA2560 и 3,3В для DUE\_ -_Подача уровней, превышающие данные значения, могут вывести процессор из строя._ +\_Подача уровней, превышающие данные значения, могут вывести процессор из строя.\_ ## Версия платы 2.2 @@ -62,10 +62,10 @@ _Подача уровней, превышающие данные значени Выберете по таблице интересующий вход или выход, найдите в таблице номер MPU PIN, его используйте в конфиге Также, таблица пригодится чтобы преобразовать названия аналоговых каналов в цифровой номер PIN -_Внимание: максимальные уровни сигналов на клеммниках PWM 0-3, PWM 10, и разъеме RJ-45 (UNPROT 0-7) соответствуют применяемой процессорной плате: 5В для MEGA2560 и 3,3В для DUE_ +\_Внимание: максимальные уровни сигналов на клеммниках PWM 0-3, PWM 10, и разъеме RJ-45 (UNPROT 0-7) соответствуют применяемой процессорной плате: 5В для MEGA2560 и 3,3В для DUE\_ -_Подача на данные разъемы напряжений, превышающие данные значения, могут вывести процессор из строя._ -_Данные входы не защищены. Подключайте к ним только локальную слаботочную нагрузку_ +\_Подача на данные разъемы напряжений, превышающие данные значения, могут вывести процессор из строя.\_ +\_Данные входы не защищены. Подключайте к ним только локальную слаботочную нагрузку\_ | Mnemonic | MPU PIN # | Plug | Plug PIN | Gnd | Comment | |---|---|---|---|---|---| diff --git a/documentation/integrations/1wire_sensors.md b/documentation/integrations/1wire_sensors.md index 6ee81a5..310205d 100644 --- a/documentation/integrations/1wire_sensors.md +++ b/documentation/integrations/1wire_sensors.md @@ -1,6 +1,6 @@ # Подключение 1-Wire датчиков -> Источник: Wiki LightHub (lazyhome.ru), страница «подключение_1-wire_датчиков». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «подключение\_1-wire\_датчиков». Снапшот от 2026-10-02. ## Подключение к контроллеру @@ -27,11 +27,11 @@ }, ``` -АДРЕС_ДАТЧИКА в виде: 282DA307D6013C08 +АДРЕС\_ДАТЧИКА в виде: 282DA307D6013C08 ## MQTT -Подписываемся на топик "myhome/s_out/Temperature01" и получаем значения температуры. +Подписываемся на топик "myhome/s\_out/Temperature01" и получаем значения температуры. ## Простой релейный термостат (теплый пол) @@ -61,7 +61,7 @@ Суффикс /val при передаче температуры локальным обьектам можно не добавлять -Значение температуры, также, может быть принято с внешних систем или иных контроллеров по MQTT c использованием топика формата /myhome/controller-id/local_termostat/val +Значение температуры, также, может быть принято с внешних систем или иных контроллеров по MQTT c использованием топика формата /myhome/controller-id/local\_termostat/val При отсутствии показаний в течение 10 мин термостат отключается и переходит в аварийный режим, выдавая аварию в топик /alarm diff --git a/documentation/integrations/can_lightspot.md b/documentation/integrations/can_lightspot.md index 1be1994..3a02c1b 100644 --- a/documentation/integrations/can_lightspot.md +++ b/documentation/integrations/can_lightspot.md @@ -79,7 +79,7 @@ CAN-шины очень широко используются в промышл | 7 | `sysCmd` | Системные команды (см. commandType) | | 8 | `rawPinCtrl` | Прямое управление пинами | -### Формат данных (datagram_t) +### Формат данных (datagram\_t) ```c enum metricType { MAC=1, IP=2, NetMask=3, GW=4, DNS=5, UpTime=6, Salt=7 }; diff --git a/documentation/integrations/homeassistant.md b/documentation/integrations/homeassistant.md index 2dcf6c1..fba054c 100644 --- a/documentation/integrations/homeassistant.md +++ b/documentation/integrations/homeassistant.md @@ -1,6 +1,6 @@ # Интеграция с Home Assistant -> Источник: Wiki LightHub (lazyhome.ru), страница «интеграция_с_homeassistant». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «интеграция\_с\_homeassistant». Снапшот от 2026-10-02. Контроллер LightHub прекрасно интегрируется в систему Home Assistant с использованием MQTT diff --git a/documentation/integrations/images/z031/btn_down.png b/documentation/integrations/images/z031/btn_down.png new file mode 100644 index 0000000..1c36e02 Binary files /dev/null and b/documentation/integrations/images/z031/btn_down.png differ diff --git a/documentation/integrations/images/z031/btn_fan.png b/documentation/integrations/images/z031/btn_fan.png new file mode 100644 index 0000000..b6e7719 Binary files /dev/null and b/documentation/integrations/images/z031/btn_fan.png differ diff --git a/documentation/integrations/images/z031/btn_mode.png b/documentation/integrations/images/z031/btn_mode.png new file mode 100644 index 0000000..7fe03d7 Binary files /dev/null and b/documentation/integrations/images/z031/btn_mode.png differ diff --git a/documentation/integrations/images/z031/btn_power.png b/documentation/integrations/images/z031/btn_power.png new file mode 100644 index 0000000..f76d808 Binary files /dev/null and b/documentation/integrations/images/z031/btn_power.png differ diff --git a/documentation/integrations/images/z031/btn_up.png b/documentation/integrations/images/z031/btn_up.png new file mode 100644 index 0000000..49d97c8 Binary files /dev/null and b/documentation/integrations/images/z031/btn_up.png differ diff --git a/documentation/integrations/images/z031/ind_ac_auto.png b/documentation/integrations/images/z031/ind_ac_auto.png new file mode 100644 index 0000000..69137bd Binary files /dev/null and b/documentation/integrations/images/z031/ind_ac_auto.png differ diff --git a/documentation/integrations/images/z031/ind_ac_cool.png b/documentation/integrations/images/z031/ind_ac_cool.png new file mode 100644 index 0000000..03135aa Binary files /dev/null and b/documentation/integrations/images/z031/ind_ac_cool.png differ diff --git a/documentation/integrations/images/z031/ind_ac_heat.png b/documentation/integrations/images/z031/ind_ac_heat.png new file mode 100644 index 0000000..7cb0e16 Binary files /dev/null and b/documentation/integrations/images/z031/ind_ac_heat.png differ diff --git a/documentation/integrations/images/z031/ind_ac_vent.png b/documentation/integrations/images/z031/ind_ac_vent.png new file mode 100644 index 0000000..7bb1300 Binary files /dev/null and b/documentation/integrations/images/z031/ind_ac_vent.png differ diff --git a/documentation/integrations/images/z031/ind_airq.png b/documentation/integrations/images/z031/ind_airq.png new file mode 100644 index 0000000..276de3b Binary files /dev/null and b/documentation/integrations/images/z031/ind_airq.png differ diff --git a/documentation/integrations/images/z031/ind_err.png b/documentation/integrations/images/z031/ind_err.png new file mode 100644 index 0000000..a93c39e Binary files /dev/null and b/documentation/integrations/images/z031/ind_err.png differ diff --git a/documentation/integrations/images/z031/ind_fan_speed.png b/documentation/integrations/images/z031/ind_fan_speed.png new file mode 100644 index 0000000..9599b5b Binary files /dev/null and b/documentation/integrations/images/z031/ind_fan_speed.png differ diff --git a/documentation/integrations/images/z031/ind_filter.png b/documentation/integrations/images/z031/ind_filter.png new file mode 100644 index 0000000..a557ef6 Binary files /dev/null and b/documentation/integrations/images/z031/ind_filter.png differ diff --git a/documentation/integrations/images/z031/ind_heatpwr.png b/documentation/integrations/images/z031/ind_heatpwr.png new file mode 100644 index 0000000..e3a88b4 Binary files /dev/null and b/documentation/integrations/images/z031/ind_heatpwr.png differ diff --git a/documentation/integrations/images/z031/ind_hum_off.png b/documentation/integrations/images/z031/ind_hum_off.png new file mode 100644 index 0000000..75d1cda Binary files /dev/null and b/documentation/integrations/images/z031/ind_hum_off.png differ diff --git a/documentation/integrations/images/z031/ind_hum_on.png b/documentation/integrations/images/z031/ind_hum_on.png new file mode 100644 index 0000000..9a3dd5f Binary files /dev/null and b/documentation/integrations/images/z031/ind_hum_on.png differ diff --git a/documentation/integrations/images/z031/ind_humval.png b/documentation/integrations/images/z031/ind_humval.png new file mode 100644 index 0000000..529b108 Binary files /dev/null and b/documentation/integrations/images/z031/ind_humval.png differ diff --git a/documentation/integrations/images/z031/ind_param.png b/documentation/integrations/images/z031/ind_param.png new file mode 100644 index 0000000..55759ad Binary files /dev/null and b/documentation/integrations/images/z031/ind_param.png differ diff --git a/documentation/integrations/images/z031/ind_set_hum.png b/documentation/integrations/images/z031/ind_set_hum.png new file mode 100644 index 0000000..45098c0 Binary files /dev/null and b/documentation/integrations/images/z031/ind_set_hum.png differ diff --git a/documentation/integrations/images/z031/ind_set_temp.png b/documentation/integrations/images/z031/ind_set_temp.png new file mode 100644 index 0000000..6b8e368 Binary files /dev/null and b/documentation/integrations/images/z031/ind_set_temp.png differ diff --git a/documentation/integrations/images/z031/ind_t_duct.png b/documentation/integrations/images/z031/ind_t_duct.png new file mode 100644 index 0000000..98d5446 Binary files /dev/null and b/documentation/integrations/images/z031/ind_t_duct.png differ diff --git a/documentation/integrations/images/z031/ind_t_floor.png b/documentation/integrations/images/z031/ind_t_floor.png new file mode 100644 index 0000000..71be9ef Binary files /dev/null and b/documentation/integrations/images/z031/ind_t_floor.png differ diff --git a/documentation/integrations/images/z031/ind_t_int.png b/documentation/integrations/images/z031/ind_t_int.png new file mode 100644 index 0000000..12e4bc1 Binary files /dev/null and b/documentation/integrations/images/z031/ind_t_int.png differ diff --git a/documentation/integrations/images/z031/ind_t_out.png b/documentation/integrations/images/z031/ind_t_out.png new file mode 100644 index 0000000..7656117 Binary files /dev/null and b/documentation/integrations/images/z031/ind_t_out.png differ diff --git a/documentation/integrations/images/z031/ind_t_room.png b/documentation/integrations/images/z031/ind_t_room.png new file mode 100644 index 0000000..6fc6b46 Binary files /dev/null and b/documentation/integrations/images/z031/ind_t_room.png differ diff --git a/documentation/integrations/images/z031/ind_temp.png b/documentation/integrations/images/z031/ind_temp.png new file mode 100644 index 0000000..a51f5f6 Binary files /dev/null and b/documentation/integrations/images/z031/ind_temp.png differ diff --git a/documentation/integrations/images/z031/ind_time.png b/documentation/integrations/images/z031/ind_time.png new file mode 100644 index 0000000..aad8b1f Binary files /dev/null and b/documentation/integrations/images/z031/ind_time.png differ diff --git a/documentation/integrations/images/z031/ind_timer.png b/documentation/integrations/images/z031/ind_timer.png new file mode 100644 index 0000000..1f2233f Binary files /dev/null and b/documentation/integrations/images/z031/ind_timer.png differ diff --git a/documentation/integrations/images/z031/panel_buttons.png b/documentation/integrations/images/z031/panel_buttons.png new file mode 100644 index 0000000..72f5a84 Binary files /dev/null and b/documentation/integrations/images/z031/panel_buttons.png differ diff --git a/documentation/integrations/images/z031/scr_ac.png b/documentation/integrations/images/z031/scr_ac.png new file mode 100644 index 0000000..710c87c Binary files /dev/null and b/documentation/integrations/images/z031/scr_ac.png differ diff --git a/documentation/integrations/images/z031/scr_default.png b/documentation/integrations/images/z031/scr_default.png new file mode 100644 index 0000000..ab23408 Binary files /dev/null and b/documentation/integrations/images/z031/scr_default.png differ diff --git a/documentation/integrations/images/z031/scr_err_ln.png b/documentation/integrations/images/z031/scr_err_ln.png new file mode 100644 index 0000000..ab20d94 Binary files /dev/null and b/documentation/integrations/images/z031/scr_err_ln.png differ diff --git a/documentation/integrations/images/z031/scr_fan_speed1.png b/documentation/integrations/images/z031/scr_fan_speed1.png new file mode 100644 index 0000000..33adedb Binary files /dev/null and b/documentation/integrations/images/z031/scr_fan_speed1.png differ diff --git a/documentation/integrations/images/z031/scr_floorheat.png b/documentation/integrations/images/z031/scr_floorheat.png new file mode 100644 index 0000000..944ed38 Binary files /dev/null and b/documentation/integrations/images/z031/scr_floorheat.png differ diff --git a/documentation/integrations/images/z031/scr_heatpwr.png b/documentation/integrations/images/z031/scr_heatpwr.png new file mode 100644 index 0000000..214637f Binary files /dev/null and b/documentation/integrations/images/z031/scr_heatpwr.png differ diff --git a/documentation/integrations/images/z031/scr_hum.png b/documentation/integrations/images/z031/scr_hum.png new file mode 100644 index 0000000..136b175 Binary files /dev/null and b/documentation/integrations/images/z031/scr_hum.png differ diff --git a/documentation/integrations/images/z031/scr_t_builtin.png b/documentation/integrations/images/z031/scr_t_builtin.png new file mode 100644 index 0000000..c73ee45 Binary files /dev/null and b/documentation/integrations/images/z031/scr_t_builtin.png differ diff --git a/documentation/integrations/images/z031/scr_t_duct.png b/documentation/integrations/images/z031/scr_t_duct.png new file mode 100644 index 0000000..6a829a0 Binary files /dev/null and b/documentation/integrations/images/z031/scr_t_duct.png differ diff --git a/documentation/integrations/images/z031/scr_t_out.png b/documentation/integrations/images/z031/scr_t_out.png new file mode 100644 index 0000000..5dacec5 Binary files /dev/null and b/documentation/integrations/images/z031/scr_t_out.png differ diff --git a/documentation/integrations/images/z031/scr_t_room.png b/documentation/integrations/images/z031/scr_t_room.png new file mode 100644 index 0000000..46da4aa Binary files /dev/null and b/documentation/integrations/images/z031/scr_t_room.png differ diff --git a/documentation/integrations/modbus_setup.md b/documentation/integrations/modbus_setup.md index 67570f3..e31d515 100644 --- a/documentation/integrations/modbus_setup.md +++ b/documentation/integrations/modbus_setup.md @@ -1,6 +1,6 @@ # Настройка Modbus -> Источник: Wiki LightHub (lazyhome.ru), страницы «настройка_modbus» и «режим_шлюза_ip_modbus». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страницы «настройка\_modbus» и «режим\_шлюза\_ip\_modbus». Снапшот от 2026-10-02. ## Функциональность драйвера Modbus v2 @@ -25,7 +25,7 @@ LightHub можно настроить на работу в качестве ш В примере выше: -- "t_heat" - имя параметра устройства. +- "t\_heat" - имя параметра устройства. - "reg" - регистр (или стартовый HOLDING REGISTER) параметра - "ir" - INPUT REGISTER или "reg"- HOLDING REGISTER или "coil": COIL или "din" - DISCRETE INPUT - "map" - правила преобразования (TBD) @@ -162,10 +162,10 @@ LightHub можно настроить на работу в качестве ш Устройство опрашивается согласно настройкам в библиотеке. А вот результаты опроса используются согласно настройкам в items. В данном примере, -- "ch1" передается в MQTT топик "myhome/s_out/aaa1" плюс локальному устройству "localdimmer1" +- "ch1" передается в MQTT топик "myhome/s\_out/aaa1" плюс локальному устройству "localdimmer1" - "ch2" передается в MQTT топик "abc/aaa2" (если в названии топика есть / - он не дополняется слева статусным префиксом) - "ch3" передается локальному устройству "localdimmer3" -- "ch4" передается в MQTT топик "myhome/s_out/aaa4" и "myhome/s_out/aaa44", локальному устройству "localdimmer4" и "localdimmer44" (использован массив из двух JSON объектов) +- "ch4" передается в MQTT топик "myhome/s\_out/aaa4" и "myhome/s\_out/aaa44", локальному устройству "localdimmer4" и "localdimmer44" (использован массив из двух JSON объектов) Строки ch1 - ch4 в данном примере, определенные в третем параметре массива конфигурации, далее будем называть "именованными параметрами modbus item" @@ -328,18 +328,18 @@ NB. Не надо именовать данные параметры имена items:{ "p_zal3":[14,[2,"panel", { - "fan" :{"emit":"edem/air/vents/zal3/fan"}, - "mode":{"emit":"edem/air/vents/zal3/mode"}, - "pwr" :{"emit":"edem/air/vents/zal3/pwr"}, + "fan" :{"emit":"house/air/vents/zal3/fan"}, + "mode":{"emit":"house/air/vents/zal3/mode"}, + "pwr" :{"emit":"house/air/vents/zal3/pwr"}, - "sethum":{"emit":"edem/air/humzal3/set"}, - "hum" :{"emit":"edem/air/humzal3/val","@S":null}, + "sethum":{"emit":"house/air/humzal3/set"}, + "hum" :{"emit":"house/air/humzal3/val","@S":null}, - "setvoc":{"emit":"edem/air/voczal3/set"}, - "voc" :{"emit":"edem/air/voczal3/val"}, + "setvoc":{"emit":"house/air/voczal3/set"}, + "voc" :{"emit":"house/air/voczal3/val"}, "settemp" :{"item":"tzal3/set"}, - "roomtemp" :{"emit":"edem/fl2/term_bedr/1/val"}, + "roomtemp" :{"emit":"house/fl2/term_bedr/1/val"}, "ch_temp":{}, "ch_hum":{}, "ext_temp":{}, @@ -359,7 +359,7 @@ NB. Не надо именовать данные параметры имена Например так: ```json -"fan" :{"emit":"edem/air/vents/zal3/fan","@V":null}, +"fan" :{"emit":"house/air/vents/zal3/fan","@V":null}, ``` В этом случае, после того, как мы что-то записали в регистр, при следующем же опросе устройства, это будет обнаружено (если значение изменилось) и будут предприняты настроенные действия (например, значение будет отправлено по MQTT и отобразится в мобильном приложении Home Assistant) @@ -433,12 +433,12 @@ RAW 14 "vent":[14,[247,"airset", { - "tset":{"emit":"edem/s_out/vent/tset/set","@V":null}, - "pmode":{"emit":"edem/s_out/vent/pmode/set","@V":null}, - "fanspeed":{"emit":"edem/s_out/vent/fanspeed/set","@V":null}, - "on":{"emit":"edem/s_out/vent/on/set","@V":null}, + "tset":{"emit":"house/s_out/vent/tset/set","@V":null}, + "pmode":{"emit":"house/s_out/vent/pmode/set","@V":null}, + "fanspeed":{"emit":"house/s_out/vent/fanspeed/set","@V":null}, + "on":{"emit":"house/s_out/vent/on/set","@V":null}, - "rtemp":{"emit":"edem/s_out/vent/rtemp"}, + "rtemp":{"emit":"house/s_out/vent/rtemp"}, "fanmin":{}, "fanmax":{} @@ -460,7 +460,7 @@ RAW 14 - AUTO - ON - HEAT -- FAN_ONLY +- FAN\_ONLY Для команды OFF записываем 0 Это реализуется строкой @@ -527,20 +527,20 @@ RAW 14 "vent":[14,[247,"airset", { - "tset":{"emit":"edem/s_out/vent/set","@V":null}, - "pmode":{"emit":"edem/s_out/vent/cmd","@V":null}, - "fanspeed":{"emit":"edem/s_out/vent/fan","@V":null}, - "on":{"emit":"edem/s_out/vent/oncmd","@V":null}, + "tset":{"emit":"house/s_out/vent/set","@V":null}, + "pmode":{"emit":"house/s_out/vent/cmd","@V":null}, + "fanspeed":{"emit":"house/s_out/vent/fan","@V":null}, + "on":{"emit":"house/s_out/vent/oncmd","@V":null}, - "ruheat":{"emit":"edem/s_out/vent/ruheat"}, - "ruslow":{"emit":"edem/s_out/vent/rupump"}, - "ramode":{"emit":"edem/s_out/vent/ramode"}, - "rfanspd":{"emit":"edem/s_out/vent/rfanspd"}, - "rfanlvl":{"emit":"edem/s_out/vent/rfanlvl"}, - "rpumpon":{"emit":"edem/s_out/vent/rpumpon"}, - "rtemp":{"emit":"edem/s_out/vent/rtemp"}, - "rtempset":{"emit":"edem/s_out/vent/rtempset"}, - "fault":{"emit":"edem/s_out/vent/fault"}, + "ruheat":{"emit":"house/s_out/vent/ruheat"}, + "ruslow":{"emit":"house/s_out/vent/rupump"}, + "ramode":{"emit":"house/s_out/vent/ramode"}, + "rfanspd":{"emit":"house/s_out/vent/rfanspd"}, + "rfanlvl":{"emit":"house/s_out/vent/rfanlvl"}, + "rpumpon":{"emit":"house/s_out/vent/rpumpon"}, + "rtemp":{"emit":"house/s_out/vent/rtemp"}, + "rtempset":{"emit":"house/s_out/vent/rtempset"}, + "fault":{"emit":"house/s_out/vent/fault"}, "tautoheat":{}, "tautocool":{}, @@ -554,7 +554,7 @@ RAW 14 "twaterstart":{}, "twatershut":{}, "twateridle":{}, - "fanauto":{"emit":"edem/s_out/vent/fanauto/set","@V":null}, + "fanauto":{"emit":"house/s_out/vent/fanauto/set","@V":null}, "numspeed":{}, "offbyfan":{} } @@ -587,13 +587,13 @@ RAW 14 Сверено с `lighthub/modules/out_modbus.cpp`, `lighthub/modules/out_modbus.h`, `lighthub/ipmodbus.cpp`, `lighthub/ipmodbus.h`, `lighthub/options.h`, `lighthub/item.h`. -- Ключи шаблона устройства, подтвержденные в коде (`out_Modbus::getConfig`, out_modbus.cpp:139-249): `baud` (по умолчанию 9600), `serial` (по умолчанию `SERIAL_8N1`), `poll` с подклавишами `regs`, `irs`, `coils`, `dins` и `delay` (по умолчанию 1000 мс — в wiki значение по умолчанию не указано), `par`. -- Ключи параметра в `par` (out_modbus.cpp:433-467, 1084-1085, 203-204): `reg`, `ir`, `coil`, `din`, `type`, `map`, `id`, `prefetch` (boolean). Ключ `prefetch` поддерживается кодом (при записи предварительно опрашивается регистр), но в wiki не описан. -- Поддерживаемые типы (таблица `regSize_P`, out_modbus.cpp:47-60): `i16`, `i32`, `u16`, `u32`, `i8h`, `i8l`, `u8h`, `u8l`, `x10`, `100` — только эти типы. Список в wiki неполный: отсутствуют `u8h` и `u8l`. +- Ключи шаблона устройства, подтвержденные в коде (`out_Modbus::getConfig`, out\_modbus.cpp:139-249): `baud` (по умолчанию 9600), `serial` (по умолчанию `SERIAL_8N1`), `poll` с подклавишами `regs`, `irs`, `coils`, `dins` и `delay` (по умолчанию 1000 мс — в wiki значение по умолчанию не указано), `par`. +- Ключи параметра в `par` (out\_modbus.cpp:433-467, 1084-1085, 203-204): `reg`, `ir`, `coil`, `din`, `type`, `map`, `id`, `prefetch` (boolean). Ключ `prefetch` поддерживается кодом (при записи предварительно опрашивается регистр), но в wiki не описан. +- Поддерживаемые типы (таблица `regSize_P`, out\_modbus.cpp:47-60): `i16`, `i32`, `u16`, `u32`, `i8h`, `i8l`, `u8h`, `u8l`, `x10`, `100` — только эти типы. Список в wiki неполный: отсутствуют `u8h` и `u8l`. - Ключ `mapcmd` (пример панели Zentec, раздел «Подавление повторных значений») в коде не найден — поддерживается только `map`; вероятно, опечатка/устаревшее имя. -- Ключ `"mode":"r"` в примере параметра `rtemp` в out_modbus.cpp не обрабатывается — вероятно, унаследован от драйвера Modbus v1. -- В коде есть ключ `sendchanges` (out_modbus.cpp:1085), не упомянутый в wiki. +- Ключ `"mode":"r"` в примере параметра `rtemp` в out\_modbus.cpp не обрабатывается — вероятно, унаследован от драйвера Modbus v1. +- В коде есть ключ `sendchanges` (out\_modbus.cpp:1085), не упомянутый в wiki. - Перечень числовых идентификаторов суффиксов в wiki (HUE 9, SAT 10, TEMP 11, VAL 12, DELAYED 13, RAW 14) **не совпадает** с текущим кодом (item.h:27-39): `CMD 1, SET 2, VAL 3, DELAYED 4, HSV 5, RGB 6, FAN 7, MODE 8, CTRL 9, HUE 10, SAT 11, TEMP 12, RAW 13`. Примеры с `id` 11-18 (Zentec, вентустановка) соответствуют старой нумерации; при использовании на актуальной прошивке значения `id` нужно пересматривать. -- Описание типа `i8h`/`i8l` («при записи другие 8 бит будут заполнены 0xFF») не подтверждается кодом: запись идет целиком в 16-битный регистр смещенным байтом (`writeSingleRegister`, out_modbus.cpp:897-905), остальные биты обнуляются. -- Механика `@S`/`@V` (подавление повторных значений и «записали сами — не обрабатываем») подтверждена: `createLastMeasured`/`getLastMeasured`, сравнение с `@V` («Ignored - equal with setted val», out_modbus.cpp:676-701). +- Описание типа `i8h`/`i8l` («при записи другие 8 бит будут заполнены 0xFF») не подтверждается кодом: запись идет целиком в 16-битный регистр смещенным байтом (`writeSingleRegister`, out\_modbus.cpp:897-905), остальные биты обнуляются. +- Механика `@S`/`@V` (подавление повторных значений и «записали сами — не обрабатываем») подтверждена: `createLastMeasured`/`getLastMeasured`, сравнение с `@V` («Ignored - equal with setted val», out\_modbus.cpp:676-701). - Шлюз IP-Modbus: компиляционная опция `IPMODBUS` (ipmodbus.h:1), порты TCP и UDP — оба 502 (ipmodbus.h:26-27), значения по умолчанию `MODBUS_SERIAL_BAUD 9600` и `MODBUS_SERIAL_PARAM SERIAL_8N1` (options.h:154-159) — совпадает с wiki. diff --git a/documentation/integrations/openhab.md b/documentation/integrations/openhab.md index 25d898a..8ed7415 100644 --- a/documentation/integrations/openhab.md +++ b/documentation/integrations/openhab.md @@ -62,7 +62,7 @@ And appropriate configuration of LightHub items Note: There is not necessary to set-up persistent topics in Openhab nor configure persistent storage in OpenHab. -LightHub using persistent MQTT publishing for Status topic /myhome/s_out. After "cold start" and establishing MQTT connection with broker, Lighthub subscribing on Status topic for 5 seconds interval to capture and retrieve previous status from persistent MQTT topic /myhome/s_out +LightHub using persistent MQTT publishing for Status topic /myhome/s\_out. After "cold start" and establishing MQTT connection with broker, Lighthub subscribing on Status topic for 5 seconds interval to capture and retrieve previous status from persistent MQTT topic /myhome/s\_out ## Сверка с кодом (2026-10-02) diff --git a/documentation/integrations/work_remotely.md b/documentation/integrations/work_remotely.md index 6358523..dd5d533 100644 --- a/documentation/integrations/work_remotely.md +++ b/documentation/integrations/work_remotely.md @@ -1,6 +1,6 @@ # Работаем дистанционно -> Источник: Wiki LightHub (lazyhome.ru), страница «работаем_дистанционно». Снапшот от 2026-10-02. +> Источник: Wiki LightHub (lazyhome.ru), страница «работаем\_дистанционно». Снапшот от 2026-10-02. ## ОТА прошивка @@ -25,7 +25,7 @@ password - значение по-умолчанию. Его можно заме ## Работа с SYSLOG -Для Windows устанавливаем Visual Syslog Сервер для Windows [https://github.com/MaxBelkov/visualsyslog/blob/master/readme_rus.md](https://github.com/MaxBelkov/visualsyslog/blob/master/readme_rus.md) +Для Windows устанавливаем Visual Syslog Сервер для Windows [https://github.com/MaxBelkov/visualsyslog/blob/master/readme\_rus.md](https://github.com/MaxBelkov/visualsyslog/blob/master/readme_rus.md) В корне конфигурационного файлa Lighthub указываем: @@ -37,7 +37,7 @@ password - значение по-умолчанию. Его можно заме ## Выполнение CLI команд через MQTT -Достаточно в топик myhome/имя_контроллера/$command послать нужную команду [CLI интерфейс](../core/cli_interface.md) +Достаточно в топик myhome/имя\_контроллера/$command послать нужную команду [CLI интерфейс](../core/cli_interface.md) Также, можно воспользоваться http [API](https://www.lazyhome.ru/dokuwiki/doku.php?id=api) diff --git a/documentation/integrations/z031_panel.md b/documentation/integrations/z031_panel.md new file mode 100644 index 0000000..8064028 --- /dev/null +++ b/documentation/integrations/z031_panel.md @@ -0,0 +1,463 @@ +# Панель управления климатом Zentec Z031-2C0 — интеграция с LightHub + +> Документ описывает настенную панель управления климатом **Z031-2C0** с +> нестандартной прошивкой **P190919LH** (адаптация стокового ПО P190919 под +> LightHub), её карту регистров Modbus и схему интеграции в умный дом +> LightHub + Home Assistant. Все примеры в документе — обобщённые рабочие +> конфигурации; имена топиков соответствуют схеме `house/<контроллер>/...`. +> +> Назначение переработанного ПО: с одной панели в помещении управлять +> кондиционером, приточной вентиляцией, увлажнителем, температурой воздуха +> (батареи отопления) и температурой тёплого пола. + +--- + +## 1. Отличия от стоковой прошивки + +Стоковая панель Z031 управляла одной вентустановкой и имела дежурный режим. +В прошивке P190919LH пользовательский интерфейс переработан: + +| Функция | Стоковая прошивка | P190919LH | +|---|---|---| +| Кнопка «Питание» | Дежурный/рабочий режим | Вкл/выкл кондиционера (гл. экран); вкл/выкл увлажнителя (режим увлажнения); смена режима кондиционера (режим кондиционера) | +| Главный экран | Рабочий экран вентустановки | Попеременно: уставка температуры воздуха и текущее время | +| Стрелки ↑/↓ (гл. экран) | — | Уставка температуры воздуха: применяется одновременно к термостату батарей **и** к кондиционеру | +| Кнопка «Вентилятор» | Скорость вентустановки | Интенсивность многозональной приточной вентиляции (значок «A» — авторежим по датчику CO2) | +| Кнопка «Режим» | — | Циклическое переключение экранов: главный → увлажнение → качество воздуха → уличная температура → тёплый пол → кондиционер | +| Режим «температура отработанного теплоносителя» | Отображение | Заменён на **настройку температуры тёплого пола** | +| Режим «отображение и обработка воздуха» | Режим вентустановки | Заменён на **режим управления кондиционером** (уставка — стрелки, режим — «Питание», скорость вентилятора — «Вентилятор») | + +Режимы дежурного/рабочего в новом ПО нет. При работе кондиционера его режим +индицируется вверху панели значками «охлаждение» / «нагрев» / «вентиляция». +Мигание значка «волнистая линия» у индикатора скорости вентиляции означает, +что вентилятор включён (даже если он обслуживает иную зону). + +## 2. Органы управления и индикации + +![Панель Z031, нумерация элементов](images/z031/panel_buttons.png) + +| Поз. | Назначение | Описание | +|---|---|---| +| 1 | Индикатор работы вентилятора | ![скорость](images/z031/ind_fan_speed.png) В главном режиме — установленная скорость приточной вентиляции или авторежим. Мигает, когда работает приточная вентиляция в доме | +| 2 | «Фильтр» / «Авария» | ![фильтр](images/z031/ind_filter.png) Требуется замена фильтра / серьёзная авария | +| 3 | Дополнительный режим | ![увлажнение вкл](images/z031/ind_hum_on.png) / ![увлажнение выкл](images/z031/ind_hum_off.png) режим увлажнения; ![качество воздуха](images/z031/ind_airq.png) режим качества воздуха | +| 4 | Физические параметры | ![встр. датчик](images/z031/ind_t_int.png) встроенный датчик, ![канальный](images/z031/ind_t_duct.png) канальный, ![улица](images/z031/ind_t_out.png) улица, ![помещение](images/z031/ind_t_room.png) помещение, ![тёплый пол](images/z031/ind_t_floor.png) тёплый пол (с настройкой), ![мощность](images/z031/ind_heatpwr.png) мощность нагревателя, % | +| 5 | День недели | | +| 6 | Режим кондиционера | ![авто](images/z031/ind_ac_auto.png) авто, ![вентиляция](images/z031/ind_ac_vent.png) вентиляция, ![охлаждение](images/z031/ind_ac_cool.png) охлаждение, ![нагрев](images/z031/ind_ac_heat.png) нагрев | +| 7 | Вспомогательный индикатор | ![уставка T](images/z031/ind_set_temp.png) уставка температуры; ![уставка влажности](images/z031/ind_set_hum.png) уставка влажности/качества воздуха; ![параметризация](images/z031/ind_param.png) сервисный режим параметризации | +| 8 | Главный индикатор | ![время](images/z031/ind_time.png) время, ![ошибка](images/z031/ind_err.png) код ошибки, ![температура](images/z031/ind_temp.png) температура, ![влажность](images/z031/ind_humval.png) влажность/качество воздуха | +| 9 | Индикатор таймера | ![таймер](images/z031/ind_timer.png) выполняется управление по расписанию | +| 10.1 | «Питание» | Главный экран — вкл/выкл кондиционера; увлажнение — вкл/выкл увлажнителя; кондиционер — смена режимов работы | +| 10.2 | «Таймер/Режим» | Циклическое переключение экранов: главный → увлажнение → качество воздуха → уличная температура → тёплый пол → кондиционер; настройка времени/даты в сервисных меню | +| 10.3 | «Вентилятор» | Главный экран — скорость приточной вентиляции; кондиционер — скорость вентилятора кондиционера; вход в меню параметризации (удержание 4 с) | +| 10.4/10.5 | «Стрелка вверх/вниз» | Изменение уставок и параметров, вход в дополнительные меню | + +## 3. Меню параметризации + +Вход: удержание кнопки «Вентилятор» 4 секунды, выбор пункта стрелками, +вход — кратковременное нажатие «Вентилятор». + +| № | Пункт | Назначение | +|---|---|---| +| 1 | `o_1` | Настройка расписания (таймер, задачи t1–t9) | +| 2 | `o_2` | Настройка часов и календаря | +| 3 | `o_3` | Настройка параметров (группы A, B, C, D, E, F, U) | + +Кнопки в меню: «Режим» — переход между полями (в о\_1 — активация записи +таймера), «Питание» — выход в главный экран, «Вентилятор» — переход к +следующему полю (в о\_3 — кольцевой переход группа → номер → значение). + +## 4. Карта регистров Modbus + +Протокол: Modbus RTU, `8E1` (8 бит, чётность Even, 1 стоп-бит), 9600 бод. +Тип регистра параметров: беззнаковый 2 байта, команда чтения +Read Holding Registers. + +### 4.1 Группа A — технологические параметры (адреса 50000–50007) + +| Параметр | Назначение | Нач. значение | Доступ | Адрес | +|---|---|---:|:---:|---:| +| A0 | Маска режима тёплого пола (аналог A6) | 10 | R/W | 50000 | +| A1 | Маска режима кондиционера (аналог A6) | 15 | R/W | 50001 | +| A2 | Конфигурация вентилятора кондиционера (аналог A5) | 3 | R/W | 50002 | +| A3 | Кол-во скоростей кондиционера | 3 | R/W | 50003 | +| A4 | Макс. кол-во скоростей вентилятора (1–7). При 0 — не выводится скорость, авторежим, знак вентилятора и обдува | 5 | R/W | 50004 | +| A5 | Конфигурация вентилятора: bit0 — разрешить авторежим; bit1 — значок вентилятора; bit2 — значок обдува | 5 | R/W | 50005 | +| A6 | Маска режима работы: bit0 — vent, bit1 — warm, bit2 — cool, bit3 — auto | 15 | R/W | 50006 | +| A7 | Маска дополнительных режимов: bit0 — влажность; bit1 — качество воздуха; bit2 — тёплый пол; bit3 — кондиционер | 15 | R/W | 50007 | + +### 4.2 Группа B — технологические параметры (адреса 50008–50015) + +| Параметр | Назначение | Нач. значение | Доступ | Адрес | +|---|---|---:|:---:|---:| +| B0 | Мин. уставка температуры (15–30) | 15 | R/W | 50008 | +| B1 | Макс. уставка температуры (30–255) | 35 | R/W | 50009 | +| B2 | Мин. уставка влажности (0–50) | 25 | R/W | 50010 | +| B3 | Макс. уставка влажности (50–100) | 70 | R/W | 50011 | +| B4 | Мин. уставка качества воздуха (0–50) | 10 | R/W | 50012 | +| B5 | Макс. уставка качества воздуха (50–100) | 99 | R/W | 50013 | +| B6 | Точка измерения температуры (вывод на гл. экран): 0 — встроенный датчик; 1 — канальный; 2 — вытяжка (домик) | 1 | R/W | 50014 | +| B7 | Маска вспомогательного вывода: bit0 — встроенная T; bit1 — канальная T; bit2 — вытяжка; bit3 — улица; bit4 — тёплый пол; bit5 — мощность нагревателя % | 24 | R/W | 50015 | + +### 4.3 Группы C, D, E, F — параметры свободного назначения + +Адреса 50016–50047 (C0–C7, D0–D7, E0–E7, F0–F7), по 8 ячеек в группе, +значения 0–255, R/W, начальное значение 0. + +### 4.4 Группа U — системные параметры (адреса 50048–50055) + +| Параметр | Назначение | Нач. значение | Доступ | Адрес | +|---|---|---:|:---:|---:| +| U0 | Флаг первого включения | 0 | R/W | 50048 | +| U1 | Корректировка встроенного датчика T (шаг 1 °C) | 10 | R/W | 50049 | +| U2 | Время автовыхода из вспомогательных меню, с (5–30) | 15 | R/W | 50050 | +| U3–U6 | Подсветка min/max дневная и ночная (0–100) | 20/100/0/20 | R/W | 50051–50054 | +| U7 | Резерв | 0 | R/W | 50055 | + +### 4.5 Переменные управления (адреса 39993–40008) + +| Назначение | ПЗУ | Пределы | Нач. значение | Доступ | Адрес | +|---|:---:|---|---:|:---:|---:| +| Авторежим вентилятора | — | 0/1 | — | R/W | 39999 | +| Авторежим вентилятора конд. | — | 0/1 | — | R/W | 39993 | +| Уставка скорости вентилятора (приток) | + | 1–7 | 1 | R/W | 40000 | +| Главный режим работы (битовая маска) | + | 1/2/4/8 | 1 | R/W | 40001 | +| Главная уставка температуры | + | 0–99 | 18 | R/W | 40002 | +| Главный пуск (питание кондиционера) | + | 0–1 | 0 | R/W | 40003 | +| Аварии 01–16 | — | битовая маска | — | R/W | 40004 | +| Аварии 17–32 | — | битовая маска | — | R/W | 40005 | +| Аварии 33–48 | — | битовая маска | — | R/W | 40006 | +| Главная уставка влажности | + | 0–99 | 0 | R/W | 40007 | +| Главная уставка VOC % | + | 0–99 | 0 | R/W | 40008 | +| Уставка температуры кондиционера | — | °C | — | R/W | 39994 | +| Режим работы тёплого пола | — | | — | R/W | 39995 | +| Уставка температуры тёплого пола | — | °C | 30 | R/W | 39996 | +| Скорость вентиляции кондиционера | — | | 0 | R/W | 39997 | +| Увлажнение включено | — | 0/1 | 0 | R/W | 39998 | + +Битовая маска главного режима (40001): bit0 — vent (1), bit1 — warm (2), +bit2 — cool (4), bit3 — auto (8). + +**ВАЖНО.** Регистры 40000, 40001, 40002, 40007, 40008 имеют прямой доступ к +ПЗУ (flash с ресурсом 10000 циклов записи). Частая запись недопустима. +Запись значения вне диапазона, ограниченного параметрами групп A/B, приводит +к циклической перезаписи ПЗУ и преждевременному выходу панели из строя. +Поэтому в LightHub для таких параметров включён `prefetch: true` — +контроллер пишет в регистр только при реальном изменении значения. + +### 4.6 Аварии + +Регистры 40004/40005/40006 — битовые маски аварий E01–E16, E17–E32, +E33–E48 (бит 0 = E01 и т.д.). Запись значения 1–15 блокирует клавиатуру, +останавливает систему («Главный пуск» = 0) и показывает «АВАРИЯ Exx». +Запись 0 возвращает экран в главный режим. Можно записывать несколько бит +одновременно — сообщения выводятся последовательно. В конфигурации Эдема +регистр 40005 (alm17) используется для отображения аварии увлажнителя, +40004 (alm01) — аварии вентустановки. + +При отсутствии запросов к панели на экране выводится код «АВАРИЯ LN». + +### 4.7 Технические переменные (только чтение, 30000–30002) + +| Назначение | Тип | Доступ | Адрес | +|---|---|:---:|---:| +| Температура от встроенного датчика* | SInt16 | R | 30000 | +| Влажность от встроенного датчика** | UInt8 | R | 30001 | +| Встроенный датчик качества воздуха** | UInt8 | R | 30002 | + +### 4.8 Технические переменные (R/W, 40009–40017) + +| Назначение | Тип | Доступ | Адрес | +|---|---|:---:|---:| +| Канальный внешний датчик температуры (приточный воздух)* | SInt16 | R/W | 40009 | +| Температура наружного воздуха* | SInt16 | R/W | 40010 | +| Температура вытяжного воздуха* | SInt16 | R/W | 40011 | +| Температура тёплого пола* | SInt16 | R/W | 40012 | +| Канальный датчик влажности*** | UInt8 | R/W | 40013 | +| Общая мощность нагревателя, %*** | UInt8 | R/W | 40014 | +| Качество воздуха с внешнего датчика | UInt16 | R/W | 40015 | +| Текущая температура кондиционера* | SInt16 | R/W | 40016 | +| Скорость главной вентустановки | UInt8 | R/W | 40017 | + +\* значение ×10 (267 → 26.7 °C). \*\* в модели Z031-2C0 не используется. +\*\*\* значение 0–99. + +Часы/календарь панели также доступны по Modbus: 65512 — год, 65513 — месяц, +65514 — день, 65515 — день недели, 65516 — час, 65517 — минута, 65518 — +секунда, 65519 — часовой пояс (UInt8, R/W). + +## 5. Интеграция с LightHub + +Панель — Modbus RTU-абонент контроллера LightHub (тип канала **MBUS**, +канал-тип 14). Архитектура интеграции на примере объекта «Эдем»: + +``` + MQTT (Home Assistant, syslog) + ▲ │ + │ ▼ + ┌─────────────────────┐ + │ LightHub "house3" │ CAN addr 13 + │ - Modbus master │──── RTU 8E1 9600 ──► Панель Z031 №1 (зал) addr 31 + │ - PID термостаты │──── RTU 8E1 9600 ──► Панель Z031 №2 (кабинет) addr 32 + │ (батареи, тёплый │──── RTU 8E1 9600 ──► Панель Z031 №3 (спальня) addr 33 + │ пол) │──── 1-Wire ──► датчики температуры помещений/полов + │ - датчики CO2 (S8) │ + └─────────┬───────────┘ + │ CAN (маршрутизация команд/статусов) + ▼ + ┌─────────────────────┐ + │ LightHub "air" │ CAN addr 15 + │ - приточная │──── Modbus ──► вентустановка (приток, нагреватели, насос) + │ вентустановка │ + │ - MULTIVENT: зоны │──── реле задвижек зон + │ - HUMIDIFIER: │──── клапаны зон, насос, датчик давления + │ увлажнение │ + │ - PID по CO2 │───── CO2 датчики Sensair S8 по комнатам + └─────────────────────┘ +``` + +### 5.1 Modbus-шаблон панели + +Шаблон `panel` задаётся в секции `modbus` конфига LightHub. Он описывает +линию (`serial: "8E1"`), расписание опроса (`poll`) и таблицу соответствия +параметров (`par`). Опрашиваются диапазоны 39993–40008 и 30000–30001 +каждые 5 секунд: + +```json +"panel": { + "serial": "8E1", + "poll": { + "regs": [[39993, 40008], [30000, 30001]], + "delay": 5000 + }, + "par": { ... } +} +``` + +Каждый параметр `par` привязывает имя (subitem) к регистру и опциям: + +| Имя (subitem) | Регистр | Опции | Смысл | +|---|---:|---|---| +| `fanspeed` | 40000 | `prefetch`, `map`, `id: 7` (S\_FAN) | Скорость приточной вентиляции; `map.val` [1,255,1,5] масштабирует 1–7 в 0–255; команда OFF → 0 | +| `settemp` | 40002 | `prefetch`, `id: 12` | Уставка температуры воздуха (батареи + кондиционер) | +| `alm01` / `alm17` / `alm33` | 40004/40005/40006 | `id: 13/14/15` | Регистры аварий | +| `sethum` | 40007 | `prefetch`, `id: 16` | Уставка влажности | +| `setvoc` | 40008 | `prefetch`, `map.val` [400,2000,0,100], `id: 17` | Уставка качества воздуха: ppm CO2 ↔ % | +| `roomtemp` | 30000 | `type: "x10"` | Температура встроенного датчика (×10) | +| `hum` | 30001 | | Влажность встроенного датчика | +| `voc` | 30002 | | Качество воздуха встроенного датчика | +| `ch_temp` | 40009 | `type: "x10"` | Приточный (канальный) воздух | +| `ext_temp` | 40010 | `type: "x10"`, `id: 18` | Наружная температура | +| `out_temp` | 40011 | `type: "x10"`, `id: 19` | Температура вытяжки | +| `floor_temp` | 40012 | `type: "x10"`, `id: 20` | Температура тёплого пола | +| `ch_hum` | 40013 | `id: 28` | Влажность канального датчика | +| `heat_pwr` | 40014 | `id: 29` | Мощность нагревателя, % | +| `extvoc` | 40015 | `map.val` [400,2000,0,100], `id: 27` | CO2 внешнего датчика (ppm ↔ %) | +| `actemp` | 40016 | `type: "x10"`, `id: 25` | Текущая температура кондиционера | +| `fanlvl` | 40017 | `id: 21` | Скорость главной вентустановки | +| `floormode` | 39995 | `prefetch`, `id: 22` | Режим тёплого пола | +| `setfloor` | 39996 | `prefetch`, `id: 23` | Уставка тёплого пола | +| `humpwr` | 39998 | `prefetch`, `map.cmd` ON→1 / OFF→0, `id: 24` | Увлажнение вкл/выкл | +| `fanauto` | 39999 | `prefetch`, `map.cmd` ENABLE/AUTO→1, DISABLE→0, `id: 7` | Авторежим вентиляции по CO2 | +| `acsettemp` | 39994 | `prefetch`, `id: 26` | Уставка кондиционера | +| `acon` | 40003 | `prefetch`, `map.cmd` OFF→0, `def: 40001`, `id: 8` | Питание кондиционера | +| `acmode` | 40001 | `prefetch`, `map.cmd` FAN\_ONLY→1, HEAT→4, COOL→2, AUTO→8, `id: 8` | Режим кондиционера | +| `acfanauto` | 39993 | `prefetch`, `map.cmd` AUTO→1, `def: 39997`, `id: 2` | Авторежим вентилятора кондиционера | +| `acfan` | 39997 | `prefetch`, `map.cmd` OFF→0, LOW→1, MEDIUM→2, HIGH→3, `id: 2` | Скорость вентилятора кондиционера | +| `y/mo/d/dw/h/m/s` | 65512–65518 | | Часы/календарь | +| `blmind/blmaxd/blminn/blmaxn` | 50051–50054 | | Подсветка | + +Механика драйвера MBUS: + +- **Опрос**: списки `regs` читаются каждые `delay` мс; найденные значения + публикуются в статусные топики (или направляются в связанные items через + `item`/`emit` у параметра). +- **Запись**: при получении команды на item ищется параметр шаблона по имени + subitem, иначе — по числовому коду суффикса, совпадающему с `id` + (стандартные коды: S\_CMD=1, S\_SET=2, S\_VAL=3, S\_FAN=7, S\_MODE=8). +- **`prefetch: true`**: перед записью читается текущее значение регистра; + запись выполняется только при отличии. Обязательно для регистров с + прямым доступом к ПЗУ (см. раздел 4.5). +- **`map.val`** масштабирует числовое значение между регистром и + LightHub-значением: `[fromRegMin, fromRegMax, toMin, toMax]`. + **`map.cmd`** преобразует текстовые команды (ON, HEAT, COOL...) в числа + регистра и обратно. **`def`** — подстановка значения из другого регистра + при записи. +- **`@S: 0`** в описании параметра item'а подавляет повторную публикацию + неизменившегося статуса. + +### 5.2 Каналы панелей (items) + +Каждая панель — item типа `MBUS` (14) с адресом абонента и именем шаблона: + +```json +"p_zal3": [14, [31, "panel", { ...маршрутизация параметров... }], null, 8192, 0] +``` + +Первый элемент — Modbus-адрес панели (31/32/33), второй — имя шаблона, +третий — объект маршрутизации. Маршрутизация связывает параметр шаблона с +локальными items, MQTT и CAN: + +```json +"p_zal3": [14, [31, "panel", { + "fanspeed": { "can": [15, 3, "fan", 7], "@S": 0 }, + "settemp": [{ "item": "tzal3/set", "@S": 0 }, // уставка → PID батарей + { "item": "ac_zal3/set" }], // и → уставка кондиционера + "acsettemp": { "item": "ac_zal3/set", "@S": 0 }, + "acon": { "item": "ac_zal3/cmd", "@S": 0 }, + "acfanauto": { "item": "ac_zal3/fan", "@S": 0 }, + "setfloor": { "item": "tfl31/set", "@S": 0 }, // уставка тёплого пола → PID пола + "sethum": { "can": [15, 431, "set"], "@S": 0 }, // → увлажнитель на контроллере air + "humpwr": { "can": [15, 431, "cmd"], "@S": 0 }, + "setvoc": { "can": [15, 331, "set"], "@S": 0 }, // → CO2-PID вентиляции на air + "fanauto": { "can": [15, 331, "cmd"], "@S": 0 }, + "hum": { "emit": "${snsr}humzal3/val", "@S": null, + "can": [15, 431, "val"] }, // влажность → air (обратная связь) + "roomtemp": { "emit": "t_zal3_p", "@S": 0 }, + "ch_temp": {}, "ext_temp": {}, "out_temp": {}, "extvoc": {}, + "floor_temp": {}, "actemp": {}, "fanlvl": {}, + "alm01": {}, "alm17": {}, "alm33": {}, + "acmode": { "@S": 0 }, "acfan": { "@S": 0 }, + "m": {}, "s": {}, "blmind": {}, "blmaxd": {} +}], null, 8192, 0] +``` + +Элемент `"can"` — маршрутизация на другой контроллер по CAN: `[адрес, +itemId, суффикс, subitem]`. Здесь `15` — CAN-адрес контроллера `air`, +`331/332/333` — item'ы PID-регуляторов CO2 (`co2zal3`, `co2cab3`, +`co2bedr3`), `431/432/433` — item'ы PID-регуляторов увлажнения +(`humzal3`, `humcab3`, `humbedr3`). Элемент `"emit"` публикует значение в +MQTT-топик, `"item"` отправляет в локальный item. + +### 5.3 Управление температурой воздуха (батареи + кондиционер) + +Уставка с панели (`settemp`, регистр 40002) расходится на два контура: + +- **PID-термостат батарей** (`tzal3`, `tcab3`, `tbedr3` — тип 13): уставка + через `"item": "tzal3/set"`, вход — 1-Wire датчик температуры помещения + (`p_zal3/ch_temp` → `tzal3`), выход — slow-PWM реле термоклапана + (`rzal3` — тип 16, RELAYPWM). +- **Кондиционер** (`ac_zal3`, `ac_cab3` — тип 10, ACHAIER): уставка + `ac_zal3/set` берётся из `acsettemp` панели, а `settemp` одновременно + обновляет её — стрелки на главном экране меняют температуру и батарей, + и кондиционера. + +Текущая температура кондиционера (`actemp`, регистр 40016) передаётся в +`ac_zal3/temp` и дальше в Home Assistant как `current_temperature`. + +### 5.4 Управление тёплым полом + +Режим тёплого пола на панели (регистры 39995/39996) связан с локальными +PID-регуляторами пола: `setfloor` → `tfl31/set` (туалет), `tfl32/set` +(ванна), `tbath3/set` (ванная при спальне). Температура пола приходит +обратно в регистр 40012 через 1-Wire датчики (`p_zal3/floor_temp` ← +`tfl31` и т.д.). + +### 5.5 Вентиляция и увлажнение (контроллер air) + +Приточная вентиляция и увлажнение живут на отдельном контроллере `air` +(CAN-адрес 15), панель ими управляет через CAN-маршрутизацию (см. 5.2): + +- **Приточная вентиляция** — item `vents` (тип 18, MULTIVENT): зоны + `zal3`, `cab3`, `bedr3` с задвижками; центральная установка `vent` + (тип 14, MBUS, шаблон `airset`) — приточный вентилятор, нагреватели, + насос. Запросы воздуха в зоны формируют PID-регуляторы CO2 + (`co2zal3` и т.д., тип 13, вход — датчик Sensair S8, выход — `/fan` + зоны). Панель через `fanspeed` (S\_FAN, CAN item 3 — центральная + установка) и `setvoc`/`fanauto` (CAN item 331/332/333 — CO2-PID зоны) + задаёт интенсивность и режим «авто по CO2». Статус скорости главной + установки возвращается в панель через регистр 40017 (`fanlvl`). +- **Увлажнение** — item `hum` (тип 21, HUMIDIFIER) на контроллере `air`: + насос, промывочный клапан, зональные клапаны, датчик давления. Панель + управляет зоной (`humpwr` → вкл/выкл увлажнителя зоны, `sethum` → + уставка) через CAN item'ы `humzal3`/`humcab3`/`humbedr3` (PID, тип 13), + влажность помещения передаётся панелью обратно на `air` и в MQTT + (`${snsr}humzal3/val`). Авария увлажнителя подаётся на панели через + регистр 40005 (`alm17`). + +### 5.6 Home Assistant (MQTT) + +Статусные топики LightHub (`house/s_out/...`) и командные топики +(`house/house3/...`, `house/air/...`) подключаются к HA через +`mqtt.yaml`. Примеры сущностей, связанных с панелями: + +```yaml +# Кондиционер зала (панель p_zal3, item ac_zal3) +climate: + - name: "Кондиционер Зал 3" + modes: [off, heat, auto, cool, fan_only] + fan_modes: [auto, high, medium, low] + mode_state_topic: "house/s_out/ac_zal3/cmd" + mode_command_topic: "house/house3/ac_zal3/cmd" + temperature_low_command_topic: "house/house3/ac_zal3/set" + temperature_high_command_topic: "house/house3/tzal3/set" # уставка батарей + current_temperature_topic: "house/s_out/ac_zal3/temp" # actemp (reg 40016) + fan_mode_command_topic: "house/house3/ac_zal3/fan" + +# Увлажнитель зала (контроллер air) +humidifier: + - name: "Увлажнитель зал 3-й этаж" + command_topic: "house/air/humzal3/cmd" + state_topic: "house/s_out/humzal3/cmd" + target_humidity_command_topic: "house/air/humzal3/set" + target_humidity_state_topic: "house/s_out/humzal3/set" + current_humidity_topic: "house/snsr/humzal3/val" + +# Приток зала (multivent + CO2-PID, preset auto/manual) +fan: + - name: "Приток зал 3эт" + state_topic: "house/s_out/vents/zal3/cmd" + command_topic: "house/air/vents/zal3/cmd" + percentage_state_topic: "house/s_out/vents/zal3/fan" + percentage_command_topic: "house/air/vents/zal3/fan" + preset_mode_state_topic: "house/s_out/co2zal3/ctrl" + preset_mode_command_topic: "house/air/co2zal3/ctrl" + +# Климат (батареи, PID термостат) + - name: "Климат Зал" + mode_command_topic: "house/house3/tzal3/cmd" + temperature_command_topic: "house/house3/tzal3/set" + current_temperature_topic: "house/s_out/t_zal3" + action_topic: "house/s_out/rzal3/action" + +# Тёплый пол + - name: "Теплый пол туалет" + mode_command_topic: "house/house3/tfl31/cmd" + temperature_command_topic: "house/house3/tfl31/set" + current_temperature_topic: "house/s_out/t_fl31" + +# Аварии на панелях +sensor: + - name: "Увлажнитель авария" + state_topic: "house/in/panels/alm17/set" + - name: "Вентиляция авария" + state_topic: "house/in/panels/alm01/set" + - name: "Вентилятор" # скорость главной вентустановки (reg 40017) + state_topic: "house/in/panels/fanlvl/set" + unit_of_measurement: '%' +``` + +Групповой item `panels` (`[7, 210]`, члены `p_zal3`, `p_cab3`, +`p_bedr3`) даёт единые топики `house/in/panels/<параметр>/set` для +широковещательного управления всеми панелями сразу (используется для `alm01`, +`alm17`, `fanlvl`). + +## 6. Замечания по эксплуатации + +- Панель синхронизирует время по Modbus (регистры 65512–65518) — при + подключении к LightHub время ведёт контроллер. +- Не пишите в ПЗУ-регистры (40000/40001/40002/40007/40008) чаще, чем это + делает человек с панели; `prefetch: true` в шаблоне защищает от + избыточных записей. +- Уставка VOC задаётся в LightHub в ppm CO2 (400–2000) и масштабируется в + проценты панели (0–100 %; 50 % ≈ 1000 ppm). +- Код «АВАРИЯ LN» на панели означает отсутствие Modbus-запросов — + проверяйте линию и контроллер. + +--- + +**Источник данных**: документ «Стандартное программное обеспечение панели +P190919 LH, адаптированное под систему умного дома LightHub» (D190919LH), +драйверы `lighthub/modules/out_modbus.*` +(CH\_MBUS), `out_multivent.*` (CH\_MULTIVENT), `out_humidifier.*` +(CH\_HUMIDIFIER), `out_ac.*` (CH\_AC), `out_pid.*` (CH\_PID). diff --git a/documentation/modules/Sprinkler_HomeAssistant.md b/documentation/modules/Sprinkler_HomeAssistant.md index d2d1487..ed831b6 100644 --- a/documentation/modules/Sprinkler_HomeAssistant.md +++ b/documentation/modules/Sprinkler_HomeAssistant.md @@ -52,229 +52,229 @@ mqtt: switch: - name: "Полив" - state_topic: "edem/s_out/sprinkler/cmd" - command_topic: "edem/air/sprinkler/cmd" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/cmd" + command_topic: "house/air/sprinkler/cmd" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив север" - state_topic: "edem/s_out/sprinkler/nord/cmd" - command_topic: "edem/air/sprinkler/nord/cmd" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/nord/cmd" + command_topic: "house/air/sprinkler/nord/cmd" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив юг" - state_topic: "edem/s_out/sprinkler/south/cmd" - command_topic: "edem/air/sprinkler/south/cmd" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/south/cmd" + command_topic: "house/air/sprinkler/south/cmd" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив капельный" - state_topic: "edem/s_out/sprinkler/trees/cmd" - command_topic: "edem/air/sprinkler/trees/cmd" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/trees/cmd" + command_topic: "house/air/sprinkler/trees/cmd" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив розетки" - state_topic: "edem/s_out/sprinkler/outlets/cmd" - command_topic: "edem/air/sprinkler/outlets/cmd" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/outlets/cmd" + command_topic: "house/air/sprinkler/outlets/cmd" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" button: - name: "Полив сброс" - command_topic: "edem/air/sprinkler/cmd" + command_topic: "house/air/sprinkler/cmd" payload_press: "RESET" - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив блокировка" - command_topic: "edem/air/sprinkler/cmd" + command_topic: "house/air/sprinkler/cmd" payload_press: "FREEZE" - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив разблокировка" - command_topic: "edem/air/sprinkler/cmd" + command_topic: "house/air/sprinkler/cmd" payload_press: "UNFREEZE" - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив разрешить" - command_topic: "edem/air/sprinkler/cmd" + command_topic: "house/air/sprinkler/cmd" payload_press: "ENABLE" - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив запретить" - command_topic: "edem/air/sprinkler/cmd" + command_topic: "house/air/sprinkler/cmd" payload_press: "DISABLE" - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив осушение бака" - command_topic: "edem/air/sprinkler/cmd" + command_topic: "house/air/sprinkler/cmd" payload_press: "DRY" - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" number: - name: "Полив юг" - state_topic: "edem/s_out/sprinkler/south/set" - command_topic: "edem/air/sprinkler/south/set" + state_topic: "house/s_out/sprinkler/south/set" + command_topic: "house/air/sprinkler/south/set" min: 0 max: 6000 - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив север" - state_topic: "edem/s_out/sprinkler/nord/set" - command_topic: "edem/air/sprinkler/nord/set" + state_topic: "house/s_out/sprinkler/nord/set" + command_topic: "house/air/sprinkler/nord/set" min: 0 max: 6000 - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив капельный" - state_topic: "edem/s_out/sprinkler/trees/set" - command_topic: "edem/air/sprinkler/trees/set" + state_topic: "house/s_out/sprinkler/trees/set" + command_topic: "house/air/sprinkler/trees/set" min: 0 max: 6000 - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив юг выполнено" - state_topic: "edem/s_out/sprinkler/south/val" - command_topic: "edem/air/sprinkler/south/val" + state_topic: "house/s_out/sprinkler/south/val" + command_topic: "house/air/sprinkler/south/val" min: 0 max: 60000 mode: slider icon: "mdi:timer-sand" unit_of_measurement: 'sec' - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив север выполнено" - state_topic: "edem/s_out/sprinkler/nord/val" - command_topic: "edem/air/sprinkler/nord/val" + state_topic: "house/s_out/sprinkler/nord/val" + command_topic: "house/air/sprinkler/nord/val" min: 0 max: 60000 mode: slider icon: "mdi:timer-sand" unit_of_measurement: 'sec' - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив капельный выполнено" - state_topic: "edem/s_out/sprinkler/trees/val" - command_topic: "edem/air/sprinkler/trees/val" + state_topic: "house/s_out/sprinkler/trees/val" + command_topic: "house/air/sprinkler/trees/val" min: 0 max: 60000 mode: slider icon: "mdi:timer-sand" unit_of_measurement: 'sec' - availability_topic: "edem/air/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" sensor: - name: "Полив бак Макс" - state_topic: "edem/s_out/sprinkler/$wMax" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/$wMax" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив бак Мin" - state_topic: "edem/s_out/sprinkler/$wMin" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/$wMin" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив водопровод" - state_topic: "edem/s_out/sprinkler/$rVIN" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/$rVIN" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив дренаж вкл" - state_topic: "edem/s_out/sprinkler/$rDren" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/$rDren" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив дренаж качает" - state_topic: "edem/s_out/sprinkler/$fbDren" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/$fbDren" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив насос вкл" - state_topic: "edem/s_out/sprinkler/$rPump" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/$rPump" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив насос качает" - state_topic: "edem/s_out/sprinkler/$fbPump" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/$fbPump" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив состояние" - state_topic: "edem/s_out/sprinkler/$state" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив ошибка" - state_topic: "edem/s_out/sprinkler/$fault" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/$fault" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Поливаем юг" - state_topic: "edem/s_out/sprinkler/south/$state" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/south/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Поливаем север" - state_topic: "edem/s_out/sprinkler/nord/$state" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/nord/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Поливаем капельно" - state_topic: "edem/s_out/sprinkler/trees/$state" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/trees/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив розетка статус" - state_topic: "edem/s_out/sprinkler/outlets/$state" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/outlets/$state" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" - name: "Полив блокировки" - state_topic: "edem/s_out/sprinkler/ctrl" - availability_topic: "edem/air/$state" + state_topic: "house/s_out/sprinkler/ctrl" + availability_topic: "house/air/$state" payload_available: "ready" payload_not_available: "disconnected" ``` @@ -850,8 +850,8 @@ views: ## 6. Как пользоваться панелью -![sprinkler_1.jpeg](../reference/images/sprinkler_1.jpeg) -![sprinkler_2.jpeg](../reference/images/sprinkler_2.jpeg) +![sprinkler\_1.jpeg](../reference/images/sprinkler_1.jpeg) +![sprinkler\_2.jpeg](../reference/images/sprinkler_2.jpeg) - **Общее состояние:** Отображает статус системы и режим (заморозка/разрешено/запрещено). Ошибка не показывается, но иконка станет красной при неисправности. - **Бак:** Иконка батарейки меняет цвет и текст в зависимости от уровня воды (пусто/наполовину/полный). Нажатие открывает историю уровня. - **Водопровод и насосы:** Показывают текущий статус (Выкл/Вкл/Качает) с цветовой индикацией. Клик – история соответствующего датчика. diff --git a/documentation/modules/Sprinkler_module.md b/documentation/modules/Sprinkler_module.md index 85f1582..feb8252 100644 --- a/documentation/modules/Sprinkler_module.md +++ b/documentation/modules/Sprinkler_module.md @@ -1,4 +1,4 @@ -# LightHub: Модуль многоканальной системы полива (out_sprinkler) +# LightHub: Модуль многоканальной системы полива (out\_sprinkler) Данный модуль реализует многозональную систему полива ## Система состоит из следующих компонент: @@ -19,9 +19,9 @@ * SP\_DREN\_EMPTY - дренажный насос выключился встроенным поплавком - колодец пуст * SP\_VIN - включено наполнение из водопровода * SP\_FULL - бак наполнен -* SP\_DRYING - режим осушения системы: налив перекрыт, работает насос полива для слива бака (SP\_DRYING=7, out_sprinkler.h:34) +* SP\_DRYING - режим осушения системы: налив перекрыт, работает насос полива для слива бака (SP\_DRYING=7, out\_sprinkler.h:34) -Строковые значения, публикуемые в топик `$state` (out_sprinkler.cpp:263-308): `OFF`, `DREN_ON`, `DREN_OPERATE`, `DREN_EMPTY`, `VIN`, `FULL`, `DRYING`, `FAULT_VIN`, `FAULT_DREN`, `UNKNOWN`. +Строковые значения, публикуемые в топик `$state` (out\_sprinkler.cpp:263-308): `OFF`, `DREN_ON`, `DREN_OPERATE`, `DREN_EMPTY`, `VIN`, `FULL`, `DRYING`, `FAULT_VIN`, `FAULT_DREN`, `UNKNOWN`. граф переходов конечного автомата системы налива воды @@ -38,7 +38,7 @@ VIN|fbDren|DREN\_OPERATE|вылючить клапан vIN для набора VIN, DREN\_OPERATE|vMax|FULL | выключить vIN, rDren - бак полон| VIN|таймаут 1200 сек | FAULT\_VIN| выключить vIN - бак так и не наполнился| DREN\_OPERATE|fbPump (качает основной насос)|DREN\_OPERATE|сброс таймера (@timer = now) — не считать ошибку, пока качает основной насос (L562)| -DREN\_OPERATE|таймаут 4000 сек |FAULT_DREN|выключить rDren - не смотря на продолжительную работу насоса бак не наполнен| +DREN\_OPERATE|таймаут 4000 сек |FAULT\_DREN|выключить rDren - не смотря на продолжительную работу насоса бак не наполнен| FULL|! wMax|DREN\_ON|дренаж перезапускается при опустошении бака (L609-617)| FAULT\_VIN, FAULT\_DREN|wMax|FULL|сброс ошибки при наполнении бака (L619-635)| @@ -195,7 +195,7 @@ root/name/sprinkler/val -> -1 //система перейдет в режим FR Дополнительно к перекрытию поступления воды в бак (заблокирован автомат пополнения бака из дренажного насоса и водопровода) данная команда включает помпу. -- DRY переопределяет ON: если система находится в режиме `@state==SP_DRYING` и приходит команда ON, она исполняется как CMD_DRY, а не ON (out_sprinkler.cpp:837-841). +- DRY переопределяет ON: если система находится в режиме `@state==SP_DRYING` и приходит команда ON, она исполняется как CMD\_DRY, а не ON (out\_sprinkler.cpp:837-841). - Режим DRY персистентен: `@state=SP_DRYING` хранится в конфиге и переживает перезагрузку контроллера; реле восстанавливаются из `@lastVals`, после рестарта в топик публикуется `DRYING`. Далее, требуется слить бак включением выбранных зон полива или через водяные розетки. @@ -207,7 +207,7 @@ root/name/sprinkler/val -> -1 //система перейдет в режим FR При старте (первый Poll) контроллер принудительно публикует все ключевые статусы: `$wMax`/`$wMin`/`$fbDren`/`$fbPump`/`$rPump`/`$rDren`/`$rVIN` + `$state`/`$fault` (L474-487). Повторно `$state`/`$fault` публикуются при командах ON/OFF (L842, L848). -**Ошибки (onFault / $fault):** при каждом переходе состояния публикуется код ошибки в топик `$fault`: 0 — без ошибки, 1 — FAULT_VIN, 2 — FAULT_DREN (L311-315). Вместо публикации в `$fault` можно задать EXEC-объект `onFault` в корневом (`""`) объекте — в этом случае при срабатывании ошибки исполняется он с кодом ошибки аргументом (L260-262, L311-314). +**Ошибки (onFault / $fault):** при каждом переходе состояния публикуется код ошибки в топик `$fault`: 0 — без ошибки, 1 — FAULT\_VIN, 2 — FAULT\_DREN (L311-315). Вместо публикации в `$fault` можно задать EXEC-объект `onFault` в корневом (`""`) объекте — в этом случае при срабатывании ошибки исполняется он с кодом ошибки аргументом (L260-262, L311-314). **Примеры выдачи в топики:** @@ -267,7 +267,7 @@ sensor: state_topic: "root/s_out/sprinkler/nord/val" - name: "Полив капельный выполнено" - state_topic: "edem/s_out/sprinkler/trees/val" + state_topic: "house/s_out/sprinkler/trees/val" - name: "Поливаем юг" state_topic: "root/s_out/sprinkler/south/$state" diff --git a/documentation/modules/multivent_module_description.md b/documentation/modules/multivent_module_description.md index f0011e1..05ab908 100644 --- a/documentation/modules/multivent_module_description.md +++ b/documentation/modules/multivent_module_description.md @@ -1,7 +1,9 @@ -# LightHub: Модуль многоканального кондиционера и вентиляции (out_Multivent) +# LightHub: Модуль многоканального кондиционера и вентиляции (out\_Multivent) > Документ описывает назначение, архитектуру и конфигурирование модуля управления многозональными системами кондиционирования и вентиляции LightHub. > Предназначен для инженеров HVAC-систем, интеграторов и разработчиков. +> Верифицирован по исходному коду `lighthub/modules/out_multivent.cpp` и +> рабочим конфигурациям. --- @@ -29,19 +31,12 @@ ### 1.3 Ключевые возможности -✅ **Балансировка воздушного потока** — автоматическое распределение производительности между зонами - -✅ **PID-регулирование температуры** — независимая стабилизация для каждой зоны - -✅ **Интеллектуальное переключение режимов** — автоматическое определение HEAT/COOL по текущей температуре - -✅ **Агрегация команд** — управление центральной установкой на основе суммарного спроса от зон - -✅ **Каскадное управление** — возможность передачи команд на внешние системы (например, отображение режимов на стеновых панеляж управления) - -✅ **Отслеживание прямого управления основным кондиционером** — система понимает, явились ли изменения режима работы основного кондиционера причиной ее управляющих воздействий. И если обнаруживает, что режим поменялся вручную, при помощи пульта управления центральной установкой, принимает это изменение как инструкцию к действию. А именно: при выключении основного блока с пульта - все виртуальные зоны выключаются. (чтобы предотвратить немедленное автоматическое обратное включение) При обратном включении - их состояние восстанавливается. Также, можно определить какую либо из виртуальных зон для управления с пульта главного кондиционера. - -❌ **Ограничения**: ? +- **Балансировка воздушного потока** — автоматическое распределение производительности между зонами +- **PID-регулирование температуры** — независимая стабилизация для каждой зоны +- **Интеллектуальное переключение режимов** — автоматическое определение HEAT/COOL по температуре воздуха в канале центральной установки +- **Агрегация команд** — управление центральной установкой на основе суммарного спроса от зон (boost) +- **Каскадирование** — передача состояний зон и центральной установки на внешние системы (панели, MQTT) +- **Отслеживание ручного управления центральной установкой** — если режим/уставка центрального кондиционера изменены с пульта, модуль принимает это как инструкцию: выключение установки останавливает все зоны (чтобы исключить немедленный автореверс), повторное включение восстанавливает их состояние --- @@ -51,10 +46,9 @@ ``` ┌────────────────────────────────────────────┐ -│ Центральная установка (AC) │ +│ Центральная установка (AC-узел, "") │ │ (компрессор, вентилятор, датчик temp) │ -│ │ -│ Управляется через S_MODE и S_FAN │ +│ Управляется по S_MODE / S_FAN / S_SET │ └──────────────┬─────────────────────────────┘ │ ┌─────┴─────┐ @@ -62,52 +56,73 @@ ┌────▼─────┐ ┌─▼─────────┐ │ Зона 1 │ │ Зона N │ │ Задвижка1│ │ ЗадвижкаN │ - │ Датчик1 │ │ ДатчикN │ + │ PID, V │ │ PID, V │ └──────────┘ └───────────┘ ``` -### 2.2 Логика работы +### 2.2 Логика работы (Poll) -#### Фаза 1: Опрос и сбор информации -1. Модуль считывает текущий режим центральной установки (`mode`) -2. Определяет текущую функцию (HEAT, COOL, FAN) -3. Собирает команды от всех зон +#### Фаза 1: Определение режима центральной установки +Модуль определяет режим AC по температуре воздуха в канале (`""/val`): +- `val < 15 °C` → COOL +- `15 °C ≤ val ≤ 30 °C` → FAN +- `val > 30 °C` → HEAT -#### Фаза 2: PID-расчёты -Если в зоне определён PID-контроллер: +Если температура не поступала более 60 секунд, значение инвалидируется, +и режим берётся из последнего известного режима AC (`""/mode`). + +#### Фаза 2: PID-расчёты по зонам +Для зон в режиме HEAT/COOL с активным PID: - Вход PID: текущая температура зоны (`val`) - Установка: требуемая температура зоны (`set`) -- Выход PID: регулировочный сигнал (`po`, от 0 до 255) +- Выход PID: `po` (0…255) -#### Фаза 3: Балансировка +Направление PID задаётся автоматически по режиму AC: HEAT → DIRECT, +COOL → REVERSE. Знак коэффициента `kP` в конфигурации задаёт направление +по умолчанию (положительный — DIRECT, отрицательный — REVERSE). + +В режимах FAN/AUTO ("слабые" режимы) и в пассивном режиме PID +принудительно включается, как только AC переходит в HEAT/COOL. Пока AC +вентилятирует, PID переводится в MANUAL, и запросы воздуха в зоны +берутся из последнего внешнего значения `/fan` зоны (`fan_in`). + +#### Фаза 3: Балансировка (только для зон с активным PID в HEAT/COOL) ``` -balance = Σ(po_zone) где cmd=HEAT -balance = Σ(-po_zone) где cmd=COOL +balance = Σ(po_zone) для зон в HEAT +balance -= Σ(po_zone) для зон в COOL ``` -#### Фаза 4: Управление центральной установкой -- **|balance| > boost** (по умолчанию 230) → boost: уставка AC принудительно поднимается до 30 °C (HEAT) / опускается до 17 °C (COOL) -- **|balance| < 10** (deadband) → активность PID сбрасывается — запрос от активных зон отсутствует (L387-392) -- **FAN/AUTO** — отправляются только при запросе зоны и lastACfan > 0, иначе команда AC не шлётся (L401-403) -- **else** → OFF +#### Фаза 4: Boost центральной установки +- `balance > boost` (по умолчанию 230) → уставка AC принудительно + поднимается до 30 °C (HEAT) / опускается до 17 °C (COOL), прежняя + уставка запоминается в `@preset` +- `|balance| < 10` (deadband) → активный PID-запрос считается + отсутствующим, boost сбрасывается -#### Фаза 5: Распределение производительности +#### Фаза 5: Выбор команды центральной установки +- Если активных PID-запросов нет (`pidActive == false`): boost + сбрасывается; если хотя бы одна зона в AUTO (`autoRequested`) или + FAN (`ventRequested`) и вентилятор уже ненулевой (`lastACfan > 0`), + на AC уходит соответствующая команда. Если запросов нет — на AC + команда не отправляется вовсе (экономия) +- Итоговый уровень вентилятора (`lastACfan` от PID зон) отправляется + на AC + +#### Фаза 6: Распределение производительности по задвижкам Для каждой зоны пересчитывается выходной сигнал задвижки: -$$out = \frac{(V_{requested} \times 255) \times V_{max}}{V \times P_{max}}$$ +$$out = \frac{(V\_{zone} \times fan\_{zone}) \times 255}{V\_{zone}} \times \frac{V\_{max}}{V\_{max} \times fan\_{max}} = fan\_{zone} \times \frac{V\_{max}}{fan\_{max} \times V\_{zone}} \times 255$$ -где: - -- $V_{requested}$ — требуемый объём воздуха для зоны -- $V$ — номинальный объём воздуха зоны -- $V_{max}$ — объём максимально требующей зоны -- $P_{max}$ — максимальный процент открытия требующей зоны +практически: относительный запрос зоны нормируется на самую требующую +зону, итоговый `out` в диапазоне 0…255 отправляется в item задвижки +(поле `item` зоны или каскад). Если суммарный запрос равен нулю, задвижки +не трогаются (остаются в текущем положении). --- ## 3. Структура JSON-конфигурации -### 3.1 Формат item типа 18 (Multivent) +### 3.1 Формат item типа VENTS (18) ```json "item_name": [ @@ -120,23 +135,32 @@ $$out = \frac{(V_{requested} \times 255) \times V_{max}}{V \times P_{max}}$$ ] ``` -- Объект маршрутизации содержит **именованные зоны** + **пустую строку** `""` для центральной установки и общих настроек +Объект маршрутизации содержит **именованные зоны** + **пустую строку** `""` +для центральной установки. + +ВАЖНО: поля `fan`, `cmd`, `out` зоны и центральной установки — это +**числовые** ячейки внутреннего состояния, а не маршрутизация. Если вместо +числа записать объект `{"emit": ...}`, зона будет **проигнорирована +целиком** (драйвер проверяет `fan` и `cmd` на целочисленность). Маршрутизация +значений наружу делается полями `item` и `cas` (см. ниже). ### 3.2 Структура зоны ```json "zone_name": { - "fan": 0, - "cmd": 2, - "out": 255, "V": 60, - "pid": [1.0, 0.1, 0.05, 5.0], + "pid": [-1.0, 0.1, 0.05, 5.0], "set": 21.0, "val": 21.0, - "cas":{ - "fan":{"item":"panel1${sfx},"emit":"f_room1${sfx}","map":{"cmd":"fan"}}, - "set":{"item":"panel1${sfx}}, - "cmd":{"item":"panel1${sfx}}}} + "fan": -1, + "cmd": 1, + "out": -1, + "item": "damper_zal1/set", + "cas": { + "fan": {"emit": "house/f_room1/fan"}, + "cmd": {"can": [15, 331, "cmd"]}, + "set": {"item": "panel1/settemp"} + } } ``` @@ -144,296 +168,236 @@ $$out = \frac{(V_{requested} \times 255) \times V_{max}}{V \times P_{max}}$$ | Поле | Тип | Назначение | |------|-----|-----------| -| `fan` | int (0-255) | Текущий запрос в воздухе для зоны. Этот параметр устанавливается как встроенным PID регулятором так и при помощи суффикса /fan данной зоны (изменение запускает процесс пере-балансировки зон, в результате формируется параметр out, который уже подается на задвижки | -| `cmd` | int | Текущая команда (OFF/ON/HEAT/COOL и т.д. в числовом виде) | -| `out` | int (0-255) | Финальный выходной сигнал задвижки (пересчитанный) | -| `V` | int | Номинальный объём воздуха для этой зоны (м³/ч) | -| `pid` | массив ≥3 | Коэффициенты PID: [kP, kI, kD, dT(сек)] (позиционные) | -| `set` | float | Требуемая температура (установка) | -| `val` | float | Текущая температура зоны. Передается через суффикс /val данной зоны | -| `cas` | object | Каскадирование полученной команды на другие обьекты. Полезно, если изменение статуса зоны надо, наример, отразить на климатической панели. Или если скорость вентилятора надо преобразовать в дискретный вид (LOW,MEDIUM,HIGH) и передать в отдельный топик (как в примере) для отображения в интерфейсе Home Assistant. У обьекта cas может быть три под-обьекта: fan, set, cmd которые могут отдельно транслировать скорость вентилятора, команду (режим) зоны и уставку температуры. Следует заметить, что даже без использования данной настройки, изменения зоны передаются в статусный топик зоны (для восстановления состояния при перезапуске и отражения в интерфейсе HA, так что дублировать это в данной настройке не требуется. Но данная настройка крайне полезна именно для дублирования состояния на внешние устройства а также на внутренние обьекты контроллера (отрабатывается весь синтаксис EXEC обьекта, включая возможность передачи по MQTT, CAN, локальные items) | +| `fan` | int (0-255, инициализируется -1) | Текущий запрос воздуха зоны. Управляется суффиксом `/fan` зоны или встроенным PID (в активных режимах). Значение хранится в конфиге и переживает перезагрузку | +| `cmd` | int (код CMD\_*) | Текущий режим зоны (ON/OFF/HEAT/COOL/FAN/AUTO/HEATCOOL/DRY). Инициализируется CMD\_OFF (2) | +| `out` | int (0-255, инициализируется -1) | Финальный выходной сигнал задвижки после балансировки | +| `V` | int | Номинальный объём воздуха зоны (в относительных единицах), по умолчанию 60 | +| `pid` | объект или массив ≥3 | ПИД-регулятор: `[kP, kI, kD, dT(сек, по умолчанию 5)]` либо `{"kP":..,"kI":..,"kD":..,"dT":..}`. Знак kP задаёт направление: `>0` — DIRECT (нагрев), `<0` — REVERSE (охлаждение). При наличии `pid` создаются числовые ячейки `set` (по умолчанию 20.0), `val` (NaN), `po` (-2.0) | +| `set` | float | Уставка температуры зоны (вход PID) | +| `val` | float | Текущая температура зоны (вход PID, суффикс `/val`) | +| `AlarmTime` | сек | Время устаревания данных PID (по умолчанию 120 с) | +| `AlarmValue` | float | Порог аварии PID (по умолчанию 0.0) | +| `item` | строка | Item-цель по умолчанию для выходного сигнала задвижки (`out`). При изменении `out` в item отправляется значение 0-255 | +| `cas` | объект | Каскадирование изменений зоны на внешние объекты. Под-объекты `fan`, `cmd`, `set` — обычные EXEC-объекты (`item`/`emit`/`can`/`map`), исполняются при изменении соответствующего свойства зоны | ### 3.3 Центральная установка (пустая зона `""`) -``` -"":{"item":"ac_2", - "turnbyfan":0, - "boost":200, - "supress":7, - "onextcmd":{"emit":"${sout}/vac/extcmd","item":"vac/zal"} - } +```json +"": { + "item": "ac_2", + "turnbyfan": 15, + "boost": 200, + "supress": 7, + "overridecmd": 1, + "onextcmd": {"emit": "house/vent/extcmd"} +} ``` #### Поля: | Поле | Назначение | |------|-----------| -|`turnbyfan`|Команда (CMD\_), генерируемая при подаче ненулевого /fan в зону, если зона в CMD\_OFF (L527, L676-683); при /fan=0 зона автоматически переводится в CMD\_OFF (L686-691). 0 — отключено | -|`boost`|Порог |balance| (по умолчанию 230, AC\_BOOST\_TRESHOLD). При превышении модуль принудительно поднимает/опускает уставку AC (set) до 30/17 °C, чтобы усилить нагрев/охлаждение (L387-388, L1102-1123) | -|`supress`|Битмаска подавления повторной отправки на AC: 1=FAN, 2=SET, 4=CMD (по умолчанию 0xF, AC\_SUPPRESS\_\*). **Прим.: в коде ключ «supress» (одна s)** | -|`overridecmd`|Подмена уходящей на AC команды любой другой, кроме CMD\_OFF (L1044-1045) | -|`onextcmd`|EXEC-объект, исполняемый при ручном (внешнем) изменении команды/уставки AC с пульта | -| `set` | Уставка температуры AC (float); сохраняется при получении /set с AC (L582-591), читается при boost (L1106) | -| `val` | Температура воздуха от AC (или текущее состояние) | -| `mode` | Текущий режим AC (CMD\_HEAT/CMD\_COOL/CMD\_FAN/CMD\_OFF) | -| `@lastCmd` | Последняя отправленная команда (служебное) | -| `@lastFan` | Последнее отправленное значение вентилятора AC (служебное) | -| `@lastSet` | Последнее отправленное значение уставки AC (служебное) | -| `@preCmd` | Режим AC до останова вентилятора, восстанавливается при повторном запуске (L1078-1084) | -| `@preset` | Уставка AC, сохранённая перед boost, восстанавливается при resetBoost (L1107, L1118) | -| `roomtemp` | Дополнительный датчик комнатной температуры (**не читается** — обработчик S\_TEMP закомментирован, L620-623) | +|`item`| Item центральной установки (обычно MBUS-канал кондиционера/вентустановки). Команды AC (mode/fan/set) отправляются в него | +|`turnbyfan`| Команда (код CMD\_), генерируемая при подаче ненулевого `/fan` в зону, если зона в CMD\_OFF; при `/fan=0` зона автоматически переводится в CMD\_OFF. 0 — отключено | +|`boost`| Порог \|balance\| (по умолчанию 230). При превышении модуль принудительно поднимает/опускает уставку AC (set) до 30/17 °C | +|`supress`| Битмаска подавления повторной отправки на AC: 1=FAN, 2=SET, 4=CMD (по умолчанию 0xF — всё). **В коде ключ пишется «supress» (одна s)** | +|`overridecmd`| Подмена команды, уходящей на AC, любой другой, кроме CMD\_OFF | +|`onextcmd`| EXEC-объект (с опциональной `map`), исполняемый при **ручном** изменении режима или уставки AC на пульте/извне | +| `val` | Температура воздуха в канале AC (вход `/val` центрального item; определяет HEAT/COOL/FAN) | +| `mode` | Текущий режим AC (вход `/cmd` или `/mode` центрального item) | +| `set` | Уставка температуры AC (сохраняется при получении `/set`) | +| `@lastCmd`, `@lastFan`, `@lastSet`, `@preCmd`, `@preset` | Служебные: последнее отправленное состояние, состояние до останова вентилятора, уставка до boost | --- -\ + ## 4. Детальная конфигурация компонентов ### 4.1 PID-контроллер -#### Включение PID - -```json -"pid": [1.0, 0.1, 0.05, 5.0] -``` - -**Формат**: `[kP, kI, kD, dT]` — массив из ≥3 позиционных элементов (L61-69). Параметры аларма `AlarmTime` (сек, по умолчанию 120) и `AlarmValue` (по умолчанию 0.0) задаются **отдельными полями объекта зоны**, а не внутри `pid` (L71-72). - -- **kP** (пропорциональный коэффициент): 0.5—2.0 - -- **kI** (интегральный коэффициент): 0.0—0.2 - - Устраняет постоянное отклонение - -- **kD** (дифференциальный коэффициент): 0.01—0.1 - - Снижает колебания - -- **dT** (период сэмплирования, сек): по умолчанию 5 сек - - -#### Пример для зоны, заданный в виде массива: +#### Формат ```json "pid": [1.0, 0.05, 0.02, 5.0] ``` -#### Пример для зоны, заданный в виде обьекта (AlarmTime/AlarmValue — поля зоны, а не pid): +или объектом: ```json -"zone_name": { - "pid": {"kP":-1.0,"kI":0.05,"kD":0.02,"dT":50}, - "AlarmTime":240, - "AlarmValue":128 +"pid": {"kP": -1.0, "kI": 0.05, "kD": 0.02, "dT": 50}, +"AlarmTime": 240, +"AlarmValue": 128 +``` + +- **kP** (пропорциональный коэффициент): 0.5—2.0. Знак задаёт направление + регулятора: положительный — DIRECT (растёт при set > val, нагрев), + отрицательный — REVERSE (растёт при set < val, охлаждение) +- **kI** (интегральный): 0.0—0.2 — устраняет постоянное отклонение +- **kD** (дифференциальный): 0.01—0.1 — снижает колебания +- **dT** (период сэмплирования, сек): по умолчанию 5 + +`AlarmTime` и `AlarmValue` — поля зоны, а не `pid`. + +### 4.2 Объём воздуха (V) + +Указывается в **относительных единицах** (не обязательно м³/ч), по +умолчанию 60. Используется для пропорционального распределения между +зонами. + +### 4.3 Каскадные команды (`cas`) + +`cas` — обычный EXEC-объект с тремя под-объектами: `fan`, `cmd`, `set`. +Каждый исполняется (с полным синтаксисом `item`/`emit`/`can`/`map`) при +изменении соответственно вентилятора, режима или уставки зоны. Полезен +для дублирования состояния зоны на климатическую панель, другой +контроллер по CAN или в MQTT-топик для Home Assistant. + +```json +"cas": { + "fan": {"emit": "house/f_room1/fan", "map": {"cmd": "fan"}}, + "cmd": {"item": "panel1/mode"}, + "set": {"item": "panel1/settemp"} } ``` -## 4.2 Объём воздуха (V) - -Указывается в **относительных единицах** (не обязательно м³/ч): - -```json -"V": 60 -``` - -Используется для **пропорционального распределения** между зонами. - -**Рекомендуемые значения:** -- Спальня: 30—50 -- Гостиная: 60—100 -- Офис: 40—80 -- Кухня: 80—150 (если есть вентиляция) - -### 4.3 Маршрутизация MQTT - -tbd - -### 4.4 Каскадные команды - -Возможность передачи команды на другие устройства (например, открыть задвижку, вывести на панель): - -```json - "cas":{ - "fan":{"item":"panel1${sfx},"emit":"f_room1${sfx}","map":{"cmd":"fan"}}, - "set":{"item":"panel1${sfx}}, - "cmd":{"item":"panel1${sfx}}}} -``` +Без `cas` изменения зоны всё равно публикуются в статусные топики item'а +(`/cmd`, `/fan`, `/set` зоны) — каскад нужен именно для внешних адресатов. --- ## 5. Режимы работы модуля -### 5.1 Режимы команд для зон +### 5.1 Команды зон -| CMD | Назначение | -|-----|-----------| -| `OFF` | Задвижка закрыта, зона отключена | -| `ON` | Зона активна (используется последний процент) | -| `HEAT` | Зона требует нагрева (минимум 30% вентилятора: при fan < 20 принудительно выставляется 30, L805-810) | -| `COOL` | Зона требует охлаждения | -| `FAN` | Только вентиляция (без нагрева/охлаждения) | -| `AUTO` | Пассивный режим (зависит от AC) | -| `HEATCOOL` | Автоматическое переключение по PID | -| `DRY` | Осушение | -| `FREEZE` | Заморозка зоны: блокирует /fan, ON и OFF (L763-769; проверка в L661, L717, L735) | -| `UNFREEZE` | Разморозка зоны (L767-769) | -| `HIGH`/`MEDIUM`/`LOW` | Уровни вентилятора через /fan: HIGH→255, MEDIUM→128, LOW→64 (L533-546) | +Команды задаются в `/cmd` зоны (или через `/fan`): -### 5.2 Режимы работы центральной установки +| Команда | Код | Поведение | +|-----|-----|-----------| +| `ON` | 1 | Включить зону с последним режимом (из `@precmd`, по умолчанию FAN) и последним уровнем вентилятора | +| `OFF` | 2 | Выключить зону (PID в MANUAL, вентилятор 0); предыдущий режим сохраняется в `@precmd` | +| `HEAT` | 0x14 | Нагрев: PID в DIRECT, вентилятор минимум 30 % | +| `COOL` | 0x15 | Охлаждение: PID в REVERSE, вентилятор минимум 30 % | +| `HEATCOOL` | 0x13 | Автовыбор HEAT/COOL по уставке и текущей температуре с гистерезисом 1 °C | +| `FAN` (FAN\_ONLY) | 0xF | Только вентиляция с текущим уровнем `/fan` | +| `AUTO` | 0xE | Пассивный режим: запрос воздуха берётся из внешних значений `/fan` (например, от CO2-PID) | +| `DRY` | 0x16 | Осушение (PID в REVERSE, как COOL) | +| `FREEZE` | 0xD | Заморозка зоны: блокирует `/fan`, ON и OFF | +| `UNFREEZE` | 0xC | Разморозка зоны | -Модуль автоматически определяет режим AC по текущей температуре воздуха в канале кондиционера, которую надо направить в /val: +Уровни вентилятора через `/fan` зоны: `HIGH` → 255, `MEDIUM` → 128, +`LOW` → 64; либо число 0-255; `OFF` → 0. + +### 5.2 Определение режима центральной установки ``` -AC temp < 15°C → CMD_COOL (переоборудование в холод) -15°C ≤ AC temp ≤ 30°C → CMD_FAN (вентиляция) -AC temp > 30°C → CMD_HEAT (переоборудование в тепло) +AC temp < 15°C → CMD_COOL +15°C ≤ AC temp ≤ 30°C → CMD_FAN +AC temp > 30°C → CMD_HEAT ``` -Если температура от AC не поступила (NaN), режим берётся из текущего режима AC (`mode`) (L228). +Температура подаётся на `/val` корневого item (без subitem). Если данные +от AC не поступали более 60 секунд, режим берётся из `""/mode`. -Важно: при обнаружении холода или тепла автоматичесуки активируются PID регуляторы зон. Их выходы направляются на вход блока балансировки зон. Таким образом, система ререходит в режим нагрева или охлаждения зон с контролем температуры. А прямое управление по входу /fan зон блокируется, (но последее переданное в зону значение запоминается). После того как система обнаруживает переход установки из режима нагрева либо охлаждения в режим вентиляции, она использует последнее полученное на вход /fan зоны значение для балансировки воздушного потока в каждую зону. И система переходит в режим вентиляции. В этом режиме, используются поступающие извне на вход /fan сигналы запросов воздуха в каждую зону (например, от PID регулятора уровня CO2) +При обнаружении тепла или холода PID регуляторы зон автоматически +активируются, их выходы направляются в балансировщик, а прямое управление +`/fan` зон блокируется (последнее внешнее значение запоминается в +`fan_in`). При переходе установки обратно в режим вентиляции используется +последнее значение `fan_in` каждой зоны, и система возвращается в режим +распределения воздуха по внешним запросам `/fan`. -### 5.3 PID-режимы +### 5.3 Поведение в режимах зон -#### DIRECT (Kp > 0) -- Выход растёт при увеличении отклонения (set > val) -- Используется для режима HEAT - -#### REVERSE (Kp < 0) -- Выход растёт при уменьшении отклонения (set < val) -- Используется для режима COOL - -режим работы регуляторв переключается автоматически в зависимости от температуры воздуха в канале. При нагреве включается прямой режим. При охлаждении - обратный. - -**Автоматическое переключение в режиме CMD_AUTO:** -``` -AC в HEAT → PID в DIRECT -AC в COOL → PID в REVERSE -``` +- **HEAT/COOL (активный режим)**: вентилятор зоны задаётся выходом PID. + Если при этом фактический режим воздуха противоположный (AC дует + холодом, а зона просит HEAT), задвижка зоны закрывается (`fan = 0`). +- **FAN/AUTO (пассивный режим)**: PID работает только когда AC реально + греет/охладит; в остальное время уровень зоны берётся из `fan_in`. + Пассивный режим включается командой `/fan AUTO` (статус публикуется + как `AUTO`), снимается любой явной командой или `/fan <уровень>`. --- ## 6. Примеры конфигурации -### 6.1 Простая двухзональная система +### 6.1 Минимальный рабочий пример: приточная вентиляция на 2 зоны -**Сценарий**: кондиционер на два помещения, каждое с вентилятором и датчиком температуры. +Центральная установка — Modbus-вентустановка (`vent`), зоны открываются +PWM-каналами. Запросы воздуха в зоны приходят по MQTT (`/fan`). ```json { "mqtt": ["lh1", "192.168.1.10"], - "topics": {"root": "home"}, - + "topics": {"root": "house"}, + "items": { "ac_multizone": [ [18, 5], { "bedroom": { - "fan": {"emit": "home/bedroom/fan"}, - "cmd": {"emit": "home/bedroom/cmd"}, - "out": {"emit": "home/bedroom/out"}, "V": 40, "pid": [1.0, 0.05, 0.02, 5.0], - "set": {"emit": "home/bedroom/setpoint"}, - "val": {"emit": "home/bedroom/temp"} + "set": 21.0, + "cmd": 15, + "fan": -1, + "out": -1, + "item": "damper_bedroom/set", + "cas": { "fan": {"emit": "house/climate/bedroom/fan"} } }, "living_room": { - "fan": {"emit": "home/living/fan"}, - "cmd": {"emit": "home/living/cmd"}, - "out": {"emit": "home/living/out"}, "V": 80, "pid": [1.0, 0.05, 0.02, 5.0], - "set": {"emit": "home/living/setpoint"}, - "val": {"emit": "home/living/temp"} - }, - "": { - "val": {"emit": "home/ac/indoor_temp"}, - "mode": {"emit": "home/ac/mode"} - } - } - ] - } -} -``` - -### 6.2 Трёхзональная система с разными объёмами - -```json -{ - "mqtt": ["lh2", "broker.local"], - "topics": {"root": "climate"}, - - "items": { - "ventilation": [ - [18, 5], - { - "zone_a": { - "fan": {"emit": "climate/a/fan"}, - "cmd": {"emit": "climate/a/cmd"}, - "out": {"emit": "climate/a/out"}, - "V": 50, - "pid": [-1.5, 0.08, 0.03, 5.0], "set": 22.0, - "val": {"emit": "climate/a/temp"} - }, - "zone_b": { - "fan": {"emit": "climate/b/fan"}, - "cmd": {"emit": "climate/b/cmd"}, - "out": {"emit": "climate/b/out"}, - "V": 100, - "pid": [-1.5, 0.08, 0.03, 5.0], - "set": 24.0, - "val": {"emit": "climate/b/temp"} - }, - "zone_c": { - "fan": {"emit": "climate/c/fan"}, - "cmd": {"emit": "climate/c/cmd"}, - "out": {"emit": "climate/c/out"}, - "V": 30, - "pid": [-1.5, 0.08, 0.03, 5.0], - "set": 20.0, - "val": {"emit": "climate/c/temp"} + "cmd": 15, + "fan": -1, + "out": -1, + "item": "damper_living/set", + "cas": { "fan": {"emit": "house/climate/living/fan"} } }, "": { - "val": {"emit": "climate/central/temp"}, - "mode": {"emit": "climate/central/mode"} + "item": "vent", + "turnbyfan": 15, + "val": -1, + "mode": 2 } } - ] + ], + + "damper_bedroom": [3, 5, null, null], + "damper_living": [3, 6, null, null], + + "vent": [14, [4, "airset", { + "tset": {"emit": "house/vent/set", "@V": null}, + "pmode": {"emit": "house/vent/cmd", "@V": null}, + "fanspeed": {"emit": "house/vent/fan", "@V": null}, + "on": {"emit": "house/vent/oncmd", "@V": null}, + "$temp": {"item": "ac_multizone/val", "@S": null} + }], null, 8192, 0] } } ``` -### 6.3 Система с каскадным управлением задвижками +Здесь `cmd: 15` (FAN\_ONLY) — зоны стартуют в режиме вентиляции; +`turnbyfan: 15` — подача ненулевого `/fan` в выключенную зону сама +переводит её в FAN\_ONLY. Температура воздуха в канале (`$temp` из Modbus) +заводится на `/val` корневого item — модуль по ней определяет HEAT/COOL. -```json -"zone_main": { - "fan": {"emit": "hvac/main/fan"}, - "cmd": {"emit": "hvac/main/cmd"}, - "out": {"emit": "hvac/main/out"}, - "V": 60, - "pid": [0.8, 0.04, 0.01, 5.0], - "set": {"emit": "hvac/main/setpoint"}, - "val": {"emit": "hvac/main/temp"}, - "cas": { - "emit": "hvac/main/damper_cmd" - } -} -``` +### 6.2 Многозональный кондиционер Haier + CO2-вентиляция (рабочая схема) -### 6.4 Реальная система: Haier с четырьмя зонами - -**Сценарий**: кондиционер Haier с управлением через Modbus, 4 комнаты с независимыми задвижками и датчиками 1-Wire. +Полный пример рабочей системы: центральный кондиционер Haier по Modbus, +зоны с задвижками на мотор-приводах, температуры зон — по 1-Wire, +запросы воздуха — от PID-регуляторов CO2. ```json { - "mqtt": ["ac", "192.168.1.4"], - "syslog": ["192.168.1.4"], - "topics": {"root": "home"}, - + "mqtt": ["lh2", "192.168.1.4"], + "topics": {"root": "house"}, + "ow": { - "283A3F81E3503CC8": {"emit": "t_ac2", "item": "vac"}, - "286C3381E3823CBC": {"emit": "t_zal", "item": "vac/zal"}, + "283A3F81E3503CC8": {"emit": "t_ac2", "item": "vac"}, + "286C3381E3823CBC": {"emit": "t_zal", "item": "vac/zal"}, "28B41581E3563CDE": {"emit": "t_bedr21", "item": "vac/bedr21"}, "28C1A581E3563C2D": {"emit": "t_bedr22", "item": "vac/bedr22"} }, - + "modbus": { "haier": { "baud": 9600, @@ -447,7 +411,7 @@ AC в COOL → PID в REVERSE "par": { "pwr": { "coil": 0, - "map": {"cmd": [1, ["OFF", 0]], "val": null, "def": "acmode"}, + "map": {"cmd": [1, ["OFF", 0]], "def": 40001}, "id": 1 }, "acmode": { @@ -482,42 +446,42 @@ AC в COOL → PID в REVERSE } } }, - + "items": { "ac_2": [ 14, [ "haier", { - "pwr": {"emit": "home/ac/cmd", "item": "vac/mode", "@V": null}, - "$temp": {"emit": "home/ac/temp", "item": "vac/temp", "@S": null}, - "set": {"emit": "home/ac/setpoint", "item": "vac/set"}, - "acmode": {"emit": "home/ac/mode", "@V": null}, - "fan": {"emit": "home/ac/fan", "@V": null} + "pwr": {"emit": "house/ac/cmd", "item": "vac/mode", "@V": null}, + "$temp": {"emit": "house/ac/temp", "item": "vac/temp", "@S": null}, + "set": {"emit": "house/ac/setpoint", "item": "vac/set"}, + "acmode":{"emit": "house/ac/mode", "@V": null}, + "fan": {"emit": "house/ac/fan", "@V": null} } ] ], - + "vac": [ [18, 5], { "": {"item": "ac_2"}, "zal": { - "pid": [490, 100, 9879, 40], + "pid": {"kP": 490, "kI": 100, "kD": 9879, "dT": 40}, "set": 21.0, "fan": 0, "cmd": 14, "item": "acgzal/set" }, "bedr21": { - "pid": [490, 100, 9879, 40], + "pid": {"kP": 490, "kI": 100, "kD": 9879, "dT": 40}, "set": 21.0, "fan": 0, "cmd": 14, "item": "acgbedr21/set" }, "bedr22": { - "pid": [490, 100, 9879, 40], + "pid": {"kP": 490, "kI": 100, "kD": 9879, "dT": 40}, "set": 21.0, "fan": 0, "cmd": 14, @@ -525,15 +489,15 @@ AC в COOL → PID в REVERSE } } ], - - "acgzal": [7, ["ig2", "og1"]], - "acgbedr22": [7, ["ig1", "og2"]], + + "acgzal": [7, ["ig2", "og1"]], "acgbedr21": [7, ["ig4", "og3"]], - + "acgbedr22": [7, ["ig1", "og2"]], + "og1": [12, [4, 33, 58, 629, 289, 5000]], "og2": [12, [5, 32, 59, 631, 296, 5000]], "og3": [12, [6, 31, 60, 627, 289, 5000]], - + "ig1": [12, [8, 29, 62, 623, 286, 5000]], "ig2": [12, [7, 30, 63, 634, 296, 5000]], "ig4": [12, [11, 27, 65, 620, 289, 5000]] @@ -541,205 +505,224 @@ AC в COOL → PID в REVERSE } ``` -**Пояснение примера:** +**Как это работает:** -- **AC (ac_2)**: контроллер Haier, управляется через Modbus (скорость 9600, опрос каждые 10 сек) -- **Зоны** (zal, bedr21, bedr22): каждая имеет PID [490, 100, 9879, 40] — агрессивные коэффициенты для точного контроля -- **1-Wire датчики**: подключены четыре датчика температуры -- **Задвижки**: управляются через цифровые выходы (og1-og3) с припасовкой через item [12, ...] -- **Входы**: чтение датчиков через item [12, ...] для каждой зоны +- **`ac_2`** (тип MBUS): кондиционер Haier. Опрос 10 сек. Параметр `pwr` + (coil 0) — питание: `map.cmd` по умолчанию (первый элемент) означает + «команда OFF → значение 0», запись 1 включает; `def` подставляет + значение регистра `acmode` при записи питания + питания. `acmode` и `fan` маппят текстовые команды HA в коды регистров. +- **`vac`** (тип VENTS): модуль мультизоны. Корневой AC-узел `""` + связан с `ac_2` (`"item": "ac_2"`): температура из `$temp` идёт на + `/val` (определение HEAT/COOL), команды режима/вентилятора/уставки + уходят обратно в `ac_2`. +- **Зоны**: `cmd: 14` (HEATCOOL) — автопереключение нагрев/охлаждение. + Температура зоны — 1-Wire в `/val` зоны (через item `vac/zal` и т.п.), + уставка `/set` зоны. Выход PID идёт в `fan` зоны, а итоговый `out` + отправляется в item группы (`acgzal` — группа задвижки-вход этой зоны). +- **Задвижки**: тип MOTOR (12) с припасовкой (позиция по резистору + обратной связи), группы `acg*` объединяют мотор задвижки и мотор + привода заслонки. + +### 6.3 Каскадирование состояния зоны на панель и CAN (фрагмент) + +```json +"zal3": { + "V": 200, + "can": [13, 41, "set"], + "cas": { + "fan": { "can": [13, 31, "fan"] }, + "cmd": { "can": [13, 31, "cmd"] } + }, + "cmd": 1, + "fan": -1, + "out": -1 +} +``` + +- `"can": [13, 41, "set"]` в теле зоны — target по умолчанию: сигнал + `out` (0-255, положение задвижки) уходит на CAN-устройство 13, item 41, + суффикс `set` (аналогично работает поле `item` для локальных items). +- `cas.fan` / `cas.cmd` — дублирование режима и уровня вентилятора зоны + на другой item/устройство (например, на климатическую панель на + контроллере 13). --- ## 7. Протокол управления через MQTT -### 7.1 Отправка значений на контроллер +Топики статусов: `/s_out//...`. Команды: `///...` +(контроллер здесь — имя MQTT-подключения, см. конфигурацию `mqtt`). + +### 7.1 Отправка команд -#### Установка команды для зоны ``` -Публикуй в: home/bedroom/cmd -Сообщение: 1 (CMD_ON) +# Команда зоны +house/lh2/vac/zal/cmd <- HEAT | COOL | FAN_ONLY | AUTO | ON | OFF + +# Уровень вентилятора зоны (число 0-255 или HIGH/MEDIUM/LOW) +house/lh2/vac/zal/fan <- 128 + +# Уставка температуры зоны +house/lh2/vac/zal/set <- 22.5 + +# Текущая температура зоны (вход PID) +house/lh2/vac/zal/val <- 21.8 ``` -#### Установка процента вентилятора +### 7.2 Получение статусов + ``` -Публикуй в: home/bedroom/fan -Сообщение: 128 +house/s_out/vac/zal/cmd <- HEAT / COOL / FAN_ONLY / OFF +house/s_out/vac/zal/fan <- 0-255 (текущий запрос зоны) +house/s_out/vac/zal/out <- 0-255 (положение задвижки) +house/s_out/vac/zal/set <- уставка зоны +house/s_out/ac_2/cmd <- режим центральной установки +house/s_out/ac_2/fan <- вентилятор центральной установки +house/s_out/ac_2/temp <- температура в канале AC ``` -#### Установка требуемой температуры -``` -Публикуй в: home/bedroom/setpoint -Сообщение: 22.5 -``` - -#### Установка текущей температуры (от датчика) -``` -Публикуй в: home/bedroom/temp -Сообщение: 21.8 -``` - -### 7.2 Получение значений от контроллера - -#### Выходной сигнал задвижки -``` -Подпишись на: home/bedroom/out -Значение: 0—255 (0=закрыто, 255=открыто) -``` - -#### Режим работы центральной установки -``` -Подпишись на: home/ac/mode -Значения: коды команд из itemCmd.h — ON=1, OFF=2, FAN_ONLY=15, HEAT=20, COOL=21; фактические значения в топике зависят от modbus-мапы (пример §6.4: HEAT=2, COOL=1, FAN_ONLY=4, DRY=3, AUTO=5) -``` +Фактические значения в статусных топиках зависят от `map` шаблона +Modbus-устройства (в примере §6.2: HEAT=2, COOL=1, FAN\_ONLY=4, DRY=3, AUTO=5). --- ## 8. Алгоритм балансировки воздушного потока -### 8.1 Принцип работы +### 8.1 Принцип -Модуль обеспечивает **пропорциональное распределение** воздуха между зонами в зависимости от их требований. +Модуль распределяет воздух пропорционально запросам зон, нормируя на +самую требующую зону. ### 8.2 Пример расчёта -**Исходные данные:** -- Зона 1: V=40 м³/ч, fan=100%, po=200 → требуемый поток = 40×100% = 40 -- Зона 2: V=80 м³/ч, fan=80%, po=180 → требуемый поток = 80×80% = 64 -- Макс требуемый поток: 64 (зона 2) +Исходные данные (fan в диапазоне 0…255): +- Зона 1: V=40, fan=200 → запрос = 40 × 200 = 8000 +- Зона 2: V=80, fan=180 → запрос = 80 × 180 = 14400 (максимальная) -**Расчёт выходов:** -- Зона 1: $out_1 = \frac{40 \times 255 \times 80}{40 \times 80} = 255$ -- Зона 2: $out_2 = \frac{64 \times 255 \times 80}{80 \times 80} = 204$ +Расчёт выходов: +- Зона 1: `out = (8000 × 255 / 40) × 80 / 14400 ≈ 283 → 255 (кап)` +- Зона 2: `out = (14400 × 255 / 80) × 80 / 14400 = 255` -**Результат:** -- Зона 1: открыта на 255 (100%) -- Зона 2: открыта на 204 (80%) +Результат: обе задвижки полностью открыты, поскольку суммарная +производительность не избыточна. Если бы запросы были меньше (например, +fan=50 и fan=60), вторая зона получила бы 255, а первая пропорционально +меньшую долю — так достигается баланс. --- -## 9. Специальные параметры и флаги - -### 9.1 Служебные поля +## 9. Служебные поля (в конфиг-дереве) ```json -"@lastCmd": -1, // Последняя отправленная AC команда -"roomtemp": 0.0, // Дополнительный датчик комнаты (не читается — S_TEMP закомментирован) -"po": -2.0, // Выход PID (внутренне) -"fan_in": 0, // Последнее внешнее значение /fan, восстанавливается после выхода из пассивного режима (L667) -"@pasv": 0, // Флаг пассивного режима зоны (L284) -"@precmd": 15, // Предыдущий режим зоны до OFF, восстанавливается при ON (L723, L736) -"@preHaltcmd": 0 // Команда зоны до глобального останова (stopAllzones), восстанавливается при повторном включении AC (L177, L196) +"@lastCmd": -1, // Последняя отправленная AC команда +"@lastFan": -1, // Последнее отправленное значение вентилятора AC +"@lastSet": -1, // Последняя отправленная уставка AC +"@preCmd": 15, // Режим AC до останова вентилятора, восстанавливается при повторном запуске +"@preset": 21, // Уставка AC, сохранённая перед boost +"@precmd": 15, // Режим зоны до OFF, восстанавливается при ON +"@preHaltcmd": 0, // Команда зоны до глобального останова (stopAllzones) +"@pasv": 0, // Флаг пассивного режима зоны +"fan_in": 0, // Последнее внешнее значение /fan зоны +"po": -2.0 // Выход PID (внутреннее) ``` -### 9.2 Таймаут неактивности - -Если текущая температура от AC не обновлялась 60 секунд, модуль очищает её. - ---- - ## 10. Интеграция с внешними системами -### 10.1 Подключение задвижек +### 10.1 Задвижки + +Выход `out` зоны направляется через `item` зоны (или `can`/`cas`) в +PWM-канал, мотор-привод или группу: ```json -"zone_name": { - "out": { - "emit": "building/room1/damper_position" - } +"damper": [3, 5, null, null] // PWM-выход +"damper": [12, [4, 33, 58, 629, 289, 5000]] // мотор-привод с обратной связью +``` + +### 10.2 Датчики температуры + +Текущая температура зоны подаётся на `/val` зоны (1-Wire, Modbus, MQTT): + +```json +"ow": { + "283A3F81E3503CC8": {"emit": "t_ac2", "item": "vac"} // корневой item - на AC-узел } ``` -Затем в другом item'е (например, цифровой выход): +### 10.3 Центральная установка через Modbus -```json -"damper": [ - 3, - ["GPIO_PIN_5", {"emit": "building/room1/damper_position"}] -] -``` - -### 10.2 Подключение датчиков температуры - -```json -"zone_name": { - "val": { - "emit": "sensors/room1/temperature" - } -} -``` - -### 10.3 Управление центральным AC через Modbus - -```json -"": { - "val": { - "emit": "ac_unit/room_temp" - }, - "mode": { - "emit": "ac_unit/operation_mode" - } -} -``` +AC-узел `""` связывается с Modbus-каналом через `item` и получает +телеметрию через параметры шаблона (`item`/`emit` в описании параметров): +`$temp` → `/val` корневого item, `acmode` → `/mode`, `fan` → `/fan`, +`set` → `/set`. --- ## 11. Рекомендации по эксплуатации -### 11.1 Настройка PID-контроллеров +### 11.1 Настройка PID -1. **Начальные значения:** Kp=1.0, Ki=0.05, Kd=0.02, dT=5сек -2. **Тестирование:** постепенно увеличивайте Kp до появления колебаний -3. **Стабилизация:** добавляйте Ki для устранения постоянного смещения -4. **Демпфирование:** добавляйте Kd для снижения колебаний +1. Начальные значения: kP=1.0, kI=0.05, kD=0.02, dT=5 с +2. Постепенно увеличивайте kP до появления колебаний, затем снижайте +3. Добавьте kI для устранения постоянного отклонения +4. Добавьте kD для демпфирования +5. В рабочих конфигурациях LightHub используются короткие импульсные + исполнительные механизмы, поэтому встречаются сильно форсированные + коэффициенты (например, kP в сотни единиц) с большой dT — не + копируйте их в другую систему без настройки ### 11.2 Распределение объёмов (V) -- Убедитесь, что сумма V соответствует производительности центральной установки +- Сумма V должна соответствовать производительности центральной установки - Для равномерного распределения: V ≈ площадь помещения - Для приоритизации: увеличьте V критичным зонам -### 11.3 Мониторинг системы +### 11.3 Мониторинг -- Отслеживайте `balance` в логах (должен быть близко к нулю в установившемся режиме) -- Проверяйте `out` для каждой зоны (не должны быть постоянно на 0 или 255) -- Контролируйте переходы режимов (HEAT↔COOL) — не должны быть частыми +- Следите за `balance` в логах (`VENT: Chan balance=`) — в установившемся + режиме должен быть близок к нулю +- Проверяйте `out` зон — не должны постоянно висеть на 0 или 255 +- Контролируйте переходы HEAT↔COOL — они не должны быть частыми ### 11.4 Диагностика проблем | Проблема | Причина | Решение | |----------|---------|---------| -| Задвижки не реагируют | `out` зоны = 0 | Повысить fan или cmd | -| Колебания температуры | PID слишком агрессивен | Снизить Kp | -| Не достигается setpoint | PID недостаточен | Увеличить Ki | -| AC часто переключается | balance скачет | Увеличить dT в PID | +| Зона игнорируется целиком (нет в статусах) | `fan` или `cmd` зоны заданы объектом вместо числа | Поля `fan`/`cmd`/`out` — только числовые; маршрутизация через `item`/`cas` | +| Задвижка не реагирует | `out` зоны = 0 | Зона в OFF или фактический режим AC противоположен запросу зоны — проверьте `/cmd` зоны и режим AC | +| Вентилятор AC не включается от запроса зоны | Вентилятор уже был 0 и нет активного PID | Подайте ненулевой `/fan` или настройте `turnbyfan` | +| Колебания температуры | PID слишком агрессивен | Снизьте kP | +| Не достигается setpoint | PID недостаточен | Увеличьте kI | +| AC часто переключается | balance скачет | Увеличьте dT в PID | --- ## 12. Ограничения и известные особенности -⚠️ **Важно:** - -1. **Автономный dT:** у каждого PID-регулятора зон свой период сэмплирования dT (L69), задаётся отдельно для каждой зоны через SetSampleTime (L75) -2. **Порядок обработки:** сначала зоны, потом центральная установка -3. **Гистерезис режимов:** автоматическое переключение AC может быть медленным (до 60 сек при отсутствии данных) -4. **Отсутствие истории:** модуль не сохраняет историю команд между перезагрузками +1. **Автономный dT**: у каждого PID-регулятора зон свой период + сэмплирования dT, задаётся отдельно для каждой зоны +2. **Порядок обработки**: сначала зоны, потом центральная установка +3. **Гистерезис режимов**: автоматическое переключение AC может быть + медленным (до 60 сек при отсутствии данных о температуре канала) +4. **Состояние хранится в конфиге**: значения `fan`/`cmd`/`out` зон + сохраняются в JSON-конфиге и переживают перезагрузку (в отличие от + истории команд) +5. **Поля-числа**: `fan`, `cmd`, `out` зон и AC-узла — числовые ячейки; + объектная запись в них ломает обработку зоны --- ## 13. Заключение -Модуль `out_Multivent` предоставляет **промышленную-grade** решение для управления многозональными системами климатизации. +Модуль `out_Multivent` предоставляет полнофункциональное решение для +управления многозональными системами климатизации: -Ключевые преимущества: - -- ✅ Интеллектуальная балансировка воздушного потока -- ✅ Независимое PID-регулирование для каждой зоны -- ✅ Автоматическая агрегация команд -- ✅ Каскадное управление внешними системами +- Автоматическая балансировка воздушного потока +- Независимое PID-регулирование для каждой зоны +- Автоматическая агрегация команд (boost) +- Каскадирование состояния на внешние системы --- -**Версия документа:** 1.0 -**Дата:** 2026-01-21 -**Статус:** Утверждено +**Версия документа:** 2.0 +**Дата:** 2026-10-11 +**Статус:** Верифицировано по исходному коду diff --git a/documentation/reference/CHANGELOG_docsv2.md b/documentation/reference/CHANGELOG_docsv2.md index 3fdd621..b3433ac 100644 --- a/documentation/reference/CHANGELOG_docsv2.md +++ b/documentation/reference/CHANGELOG_docsv2.md @@ -6,7 +6,7 @@ ## 🆕 Новые документы -### 1. **mqtt_api_reference.md** (900+ строк) +### 1. **mqtt\_api\_reference.md** (900+ строк) Полный справочник MQTT API и структуры топиков LightHub **Содержание:** @@ -26,7 +26,7 @@ - Объяснение механизма восстановления состояния - Полная документация HTTP API -### 2. **suffixes_reference_v2.md** (800+ строк) +### 2. **suffixes\_reference\_v2.md** (800+ строк) Исправленный справочник суффиксов MQTT согласно официальной wiki **Содержание:** @@ -48,7 +48,7 @@ - Правильные диапазоны значений - Примеры на реальных сценариях -### 3. **mqtt_quick_reference.md** (350+ строк) +### 3. **mqtt\_quick\_reference.md** (350+ строк) Быстрая шпаргалка часто используемых MQTT команд **Содержание:** @@ -81,19 +81,19 @@ - ✅ Добавлены MQTT примеры в быстрый старт - ✅ Указано на правильность согласно wiki.lazyhome.ru -### 2. **START_HERE.md** — Стартовая точка +### 2. **START\_HERE.md** — Стартовая точка **Изменения:** - ✅ Новые документы поднялись в начало списка -- ✅ Добавлена шпаргалка mqtt_quick_reference.md -- ✅ Подчеркнута новизна mqtt_api_reference.md -- ✅ Указано на исправления в suffixes_reference_v2.md +- ✅ Добавлена шпаргалка mqtt\_quick\_reference.md +- ✅ Подчеркнута новизна mqtt\_api\_reference.md +- ✅ Указано на исправления в suffixes\_reference\_v2.md --- ## ❌ Устаревшие документы -### suffixes_reference.md (архив) -- Заменен на: **suffixes_reference_v2.md** +### suffixes\_reference.md (архив) +- Заменен на: **suffixes\_reference\_v2.md** - Причина: Неправильная структура суффиксов (не согласовывалась с wiki) - Оставлен для истории @@ -165,38 +165,38 @@ ## 📚 Как использовать обновленную документацию ### Для новых пользователей: -1. Начните с [mqtt_quick_reference.md](mqtt_quick_reference.md) (шпаргалка) -2. Затем изучите [mqtt_api_reference.md](mqtt_api_reference.md) (полный справочник) -3. Используйте примеры из [configuration_examples.md](configuration_examples.md) +1. Начните с [mqtt\_quick\_reference.md](mqtt_quick_reference.md) (шпаргалка) +2. Затем изучите [mqtt\_api\_reference.md](mqtt_api_reference.md) (полный справочник) +3. Используйте примеры из [configuration\_examples.md](configuration_examples.md) ### Для опытных пользователей: -1. Обновите топики согласно [mqtt_api_reference.md](mqtt_api_reference.md) -2. Изучите новые суффиксы в [suffixes_reference_v2.md](suffixes_reference_v2.md) +1. Обновите топики согласно [mqtt\_api\_reference.md](mqtt_api_reference.md) +2. Изучите новые суффиксы в [suffixes\_reference\_v2.md](suffixes_reference_v2.md) 3. Используйте HTTP API для альтернативного управления ### Для интеграций (Home Assistant, Node-Red, etc.): 1. Изучите структуру топиков: `root/[id или bcst или out]/item/[subitem]/suffix` -2. Используйте примеры из [mqtt_api_reference.md](mqtt_api_reference.md) -3. Используйте [mqtt_quick_reference.md](mqtt_quick_reference.md) как шпаргалку +2. Используйте примеры из [mqtt\_api\_reference.md](mqtt_api_reference.md) +3. Используйте [mqtt\_quick\_reference.md](mqtt_quick_reference.md) как шпаргалку --- ## ✅ Валидация Все документы проверены согласно официальной wiki: -- ✅ https://www.lazyhome.ru/dokuwiki/doku.php?id=%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_mqtt +- ✅ https://www.lazyhome.ru/dokuwiki/doku.php?id=%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0\_%D1%81\_mqtt - ✅ https://www.lazyhome.ru/dokuwiki/doku.php?id=api --- ## 🔗 Навигация -- **Быстрый старт**: [START_HERE.md](START_HERE.md) +- **Быстрый старт**: [START\_HERE.md](START_HERE.md) - **Полный индекс**: [README.md](README.md) -- **Шпаргалка**: [mqtt_quick_reference.md](mqtt_quick_reference.md) -- **MQTT справочник**: [mqtt_api_reference.md](mqtt_api_reference.md) -- **Суффиксы**: [suffixes_reference_v2.md](suffixes_reference_v2.md) -- **Конфигурация**: [light_hub_полное_инженерное_описание_json_конфигурации_v2.md](light_hub_полное_инженерное_описание_json_конфигурации_v2.md) +- **Шпаргалка**: [mqtt\_quick\_reference.md](mqtt_quick_reference.md) +- **MQTT справочник**: [mqtt\_api\_reference.md](mqtt_api_reference.md) +- **Суффиксы**: [suffixes\_reference\_v2.md](suffixes_reference_v2.md) +- **Конфигурация**: [light\_hub\_полное\_инженерное\_описание\_json\_конфигурации\_v2.md](light_hub_полное_инженерное_описание_json_конфигурации_v2.md) --- diff --git a/documentation/reference/config_samples/multiac.json b/documentation/reference/config_samples/multiac.json index f42da30..c271ab8 100644 --- a/documentation/reference/config_samples/multiac.json +++ b/documentation/reference/config_samples/multiac.json @@ -32,13 +32,13 @@ "ac_2":[14,[128, "haier", { - "pwr":{"emit":"edem/s_out/ac_2/cmd","item":"vac/mode","@V":null}, - "$temp":{"emit":"edem/s_out/ac_2/$temp","item":"vac/temp","@S":null}, - "$fault":{"emit":"edem/s_out/ac_2/$fault"}, - "set":{"emit":"edem/s_out/ac_2/set","item":"vac/set"}, - "acmode":{"emit":"edem/s_out/ac_2/$mode","@V":null}, - "fan":{"emit":"edem/s_out/ac_2/fan","@V":null}, - "lock":{"emit":"edem/s_out/ac_2/lock","@V":null}, + "pwr":{"emit":"house/s_out/ac_2/cmd","item":"vac/mode","@V":null}, + "$temp":{"emit":"house/s_out/ac_2/$temp","item":"vac/temp","@S":null}, + "$fault":{"emit":"house/s_out/ac_2/$fault"}, + "set":{"emit":"house/s_out/ac_2/set","item":"vac/set"}, + "acmode":{"emit":"house/s_out/ac_2/$mode","@V":null}, + "fan":{"emit":"house/s_out/ac_2/fan","@V":null}, + "lock":{"emit":"house/s_out/ac_2/lock","@V":null}, "fanoff":{} } ] diff --git a/documentation/reference/dokuwiki-2026-10-02/конфигурирование.txt b/documentation/reference/dokuwiki-2026-10-02/конфигурирование.txt index 55687ab..8b77d47 100644 --- a/documentation/reference/dokuwiki-2026-10-02/конфигурирование.txt +++ b/documentation/reference/dokuwiki-2026-10-02/конфигурирование.txt @@ -35,7 +35,7 @@ Примеры: -{"emit":"edem/edem3/p_zal3/mode"} +{"emit":"house/house3/p_zal3/mode"} [{"emit":"t_bath3","item":"tbath3"},{"item":"p_bedr3/floor_temp","can":[0,206,"val"]] diff --git a/documentation/reference/dokuwiki-2026-10-02/настройка_modbus.txt b/documentation/reference/dokuwiki-2026-10-02/настройка_modbus.txt index 999d573..bbe433f 100644 --- a/documentation/reference/dokuwiki-2026-10-02/настройка_modbus.txt +++ b/documentation/reference/dokuwiki-2026-10-02/настройка_modbus.txt @@ -327,18 +327,18 @@ NB. Не надо именовать данные параметры имена items:{ "p_zal3":[14,[2,"panel", { - "fan" :{"emit":"edem/air/vents/zal3/fan"}, - "mode":{"emit":"edem/air/vents/zal3/mode"}, - "pwr" :{"emit":"edem/air/vents/zal3/pwr"}, + "fan" :{"emit":"house/air/vents/zal3/fan"}, + "mode":{"emit":"house/air/vents/zal3/mode"}, + "pwr" :{"emit":"house/air/vents/zal3/pwr"}, - "sethum":{"emit":"edem/air/humzal3/set"}, - "hum" :{"emit":"edem/air/humzal3/val","@S":null}, + "sethum":{"emit":"house/air/humzal3/set"}, + "hum" :{"emit":"house/air/humzal3/val","@S":null}, - "setvoc":{"emit":"edem/air/voczal3/set"}, - "voc" :{"emit":"edem/air/voczal3/val"}, + "setvoc":{"emit":"house/air/voczal3/set"}, + "voc" :{"emit":"house/air/voczal3/val"}, "settemp" :{"item":"tzal3/set"}, - "roomtemp" :{"emit":"edem/fl2/term_bedr/1/val"}, + "roomtemp" :{"emit":"house/fl2/term_bedr/1/val"}, "ch_temp":{}, "ch_hum":{}, "ext_temp":{}, @@ -358,7 +358,7 @@ NB. Не надо именовать данные параметры имена Данную фильтрацию можно отменить, если в настройке параметра добавить переменную @V типа, отличного от целого. Например так: -"fan" :{"emit":"edem/air/vents/zal3/fan","@V":null}, +"fan" :{"emit":"house/air/vents/zal3/fan","@V":null}, В этом случае, после того, как мы что-то записали в регистр, при следующем же опросе устройства, это будет обнаружено (если значение изменилось) и будут предприняты настроенные действия (например, значение будет отправлено по MQTT и отобразится в мобильном приложении Home Assistant) @@ -432,12 +432,12 @@ RAW 14 "vent":[14,[247,"airset", { - "tset":{"emit":"edem/s_out/vent/tset/set","@V":null}, - "pmode":{"emit":"edem/s_out/vent/pmode/set","@V":null}, - "fanspeed":{"emit":"edem/s_out/vent/fanspeed/set","@V":null}, - "on":{"emit":"edem/s_out/vent/on/set","@V":null}, + "tset":{"emit":"house/s_out/vent/tset/set","@V":null}, + "pmode":{"emit":"house/s_out/vent/pmode/set","@V":null}, + "fanspeed":{"emit":"house/s_out/vent/fanspeed/set","@V":null}, + "on":{"emit":"house/s_out/vent/on/set","@V":null}, - "rtemp":{"emit":"edem/s_out/vent/rtemp"}, + "rtemp":{"emit":"house/s_out/vent/rtemp"}, "fanmin":{}, "fanmax":{} @@ -519,20 +519,20 @@ RAW 14 "vent":[14,[247,"airset", { - "tset":{"emit":"edem/s_out/vent/set","@V":null}, - "pmode":{"emit":"edem/s_out/vent/cmd","@V":null}, - "fanspeed":{"emit":"edem/s_out/vent/fan","@V":null}, - "on":{"emit":"edem/s_out/vent/oncmd","@V":null}, + "tset":{"emit":"house/s_out/vent/set","@V":null}, + "pmode":{"emit":"house/s_out/vent/cmd","@V":null}, + "fanspeed":{"emit":"house/s_out/vent/fan","@V":null}, + "on":{"emit":"house/s_out/vent/oncmd","@V":null}, - "ruheat":{"emit":"edem/s_out/vent/ruheat"}, - "ruslow":{"emit":"edem/s_out/vent/rupump"}, - "ramode":{"emit":"edem/s_out/vent/ramode"}, - "rfanspd":{"emit":"edem/s_out/vent/rfanspd"}, - "rfanlvl":{"emit":"edem/s_out/vent/rfanlvl"}, - "rpumpon":{"emit":"edem/s_out/vent/rpumpon"}, - "rtemp":{"emit":"edem/s_out/vent/rtemp"}, - "rtempset":{"emit":"edem/s_out/vent/rtempset"}, - "fault":{"emit":"edem/s_out/vent/fault"}, + "ruheat":{"emit":"house/s_out/vent/ruheat"}, + "ruslow":{"emit":"house/s_out/vent/rupump"}, + "ramode":{"emit":"house/s_out/vent/ramode"}, + "rfanspd":{"emit":"house/s_out/vent/rfanspd"}, + "rfanlvl":{"emit":"house/s_out/vent/rfanlvl"}, + "rpumpon":{"emit":"house/s_out/vent/rpumpon"}, + "rtemp":{"emit":"house/s_out/vent/rtemp"}, + "rtempset":{"emit":"house/s_out/vent/rtempset"}, + "fault":{"emit":"house/s_out/vent/fault"}, "tautoheat":{}, "tautocool":{}, @@ -546,7 +546,7 @@ RAW 14 "twaterstart":{}, "twatershut":{}, "twateridle":{}, - "fanauto":{"emit":"edem/s_out/vent/fanauto/set","@V":null}, + "fanauto":{"emit":"house/s_out/vent/fanauto/set","@V":null}, "numspeed":{}, "offbyfan":{} }