mirror of
https://github.com/anklimov/lighthub
synced 2026-10-28 11:15:00 +00:00
Cross-checked all channel types, suffixes, commands, JSON config formats, HTTP/MQTT API examples and driver docs with the actual code; fixed the discrepancies (channel numbers 0..23, real command set, real suffix handling, CAN 50 kbit/s, DRY/Freeze sprinkler semantics, AC subitems, multivent zones, Mercury/Motor/Counter configs, etc.)
1003 lines
36 KiB
Markdown
1003 lines
36 KiB
Markdown
# LightHub: Описание модулей и компонентов
|
||
|
||
> Полное инженерное описание всех основных модулей LightHub с примерами конфигурации и протоколами управления.
|
||
> Предназначено для разработчиков, интеграторов и системных инженеров.
|
||
|
||
---
|
||
|
||
## Содержание
|
||
|
||
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-мост)
|
||
|
||
2. [Входные модули (In)](#входные-модули)
|
||
- [in_CCS811_HDC1080](#in_ccs811_hdc1080---датчик-качества-воздуха)
|
||
|
||
---
|
||
|
||
# Выходные модули
|
||
|
||
## out_Multivent — Многоканальный кондиционер/вентиляция
|
||
|
||
### Описание
|
||
|
||
Модуль управления многозональными системами кондиционирования воздуха и центральной вентиляции.
|
||
|
||
**Основные функции:**
|
||
- Управление центральной установкой (компрессор, вентилятор)
|
||
- Независимое регулирование температуры для каждой зоны/комнаты
|
||
- PID-контроллеры для стабилизации микроклимата
|
||
- Автоматическая балансировка воздушного потока между зонами
|
||
- Каскадное управление задвижками и затворами
|
||
|
||
### Тип в JSON
|
||
```
|
||
[18, {zones_and_settings}]
|
||
```
|
||
Рабочая форма: `[[18, 5], {зоны}]` (itemArg должен быть объектом, иначе «VENT: config failed»).
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"vac": [
|
||
[18, 5],
|
||
{
|
||
"": {
|
||
"val": {"emit": "home/ac/temp"},
|
||
"mode": {"emit": "home/ac/mode"}
|
||
},
|
||
"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"}
|
||
}
|
||
}
|
||
]
|
||
```
|
||
|
||
Ключ `""` — AC-узел (центральная установка). Ключ «supress» пишется с одной «s».
|
||
|
||
### Ключевые параметры
|
||
|
||
| Параметр | Тип | Описание |
|
||
|----------|-----|---------|
|
||
| `V` | int | Номинальный объём воздуха (м³/ч) |
|
||
| `pid` | массив ≥3 | [kP, kI, kD, dT] (ключи строчные), dT — деф 5 |
|
||
| `AlarmTime` | float | Таймаут аларма (с), деф 120 |
|
||
| `AlarmValue` | float | Значение при аларме, деф 0 |
|
||
| `set` | float | Требуемая температура |
|
||
| `val` | float | Текущая температура |
|
||
| `fan` | int (0-255) | Открытие вентилятора |
|
||
| `cmd` | int | Команда (коды см. ниже) |
|
||
| `out` | int (0-255) | Выход задвижки |
|
||
|
||
### Режимы команд (коды itemCmd)
|
||
|
||
| Команда | Код |
|
||
|---------|-----|
|
||
| ON | 1 |
|
||
| OFF | 2 |
|
||
| REST | 3 |
|
||
| TOGGLE | 4 |
|
||
| HALT | 5 |
|
||
| XON | 6 |
|
||
| XOFF | 7 |
|
||
| AUTO | 0xE (14) |
|
||
| FAN_ONLY | 0xF (15) |
|
||
| HIGH | 0x10 (16) |
|
||
| MEDIUM | 0x11 (17) |
|
||
| LOW | 0x12 (18) |
|
||
| HEAT | 0x14 (20) |
|
||
| COOL | 0x15 (21) |
|
||
| DRY | 0x16 (22) |
|
||
|
||
### Примеры
|
||
|
||
Полное описание с примерами: [multivent_module_description.md](../modules/multivent_module_description.md)
|
||
|
||
---
|
||
|
||
## out_AC — Управление кондиционером
|
||
|
||
### Описание
|
||
|
||
Управление одиночным кондиционером через проприетарный UART-протокол Haier (9600, кадры 13 байт — команда / 37 байт — ответ). НЕ Modbus.
|
||
|
||
**Основные функции:**
|
||
- Управление режимом (HEAT, COOL, FAN_ONLY, DRY, AUTO)
|
||
- Управление скоростью вентилятора (LOW, MEDIUM, HIGH, OFF или число)
|
||
- Управление температурой
|
||
- Поддержка качания жалюзей (SWING)
|
||
- Блокировка пульта
|
||
- Режим QUIET (тихий режим)
|
||
|
||
### Тип в JSON
|
||
```
|
||
[10, portNum(0-3)]
|
||
```
|
||
Опционально — emit-объект (arg[1]) с ключами `fan`, `set`, `cmd`, `temp`.
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"air_conditioner": [
|
||
10,
|
||
[
|
||
0,
|
||
{
|
||
"set": {"emit": "home/ac/setpoint"},
|
||
"fan": {"emit": "home/ac/fan_speed"},
|
||
"cmd": {"emit": "home/ac/mode"},
|
||
"temp": {"emit": "home/ac/temp"}
|
||
}
|
||
]
|
||
]
|
||
```
|
||
|
||
### Параметры управления
|
||
|
||
| Параметр | Значение | Описание |
|
||
|----------|----------|---------|
|
||
| `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) | Режим |
|
||
| `/lock` | ON/OFF | Блокировка пульта |
|
||
| `/swing` | ON/OFF | Качание жалюзей |
|
||
| `/queit` | ON/OFF | Тихий режим (опечатка в прошивке! Статус публикуется в `/quiet`) |
|
||
| `/raw` | - | Сырой кадр протокола |
|
||
|
||
---
|
||
|
||
## out_PID — PID-регулятор
|
||
|
||
### Описание
|
||
|
||
Универсальный PID-контроллер для стабилизации любых процессов (температура, влажность, давление и т.д.).
|
||
|
||
**Основные функции:**
|
||
- Независимое PID-регулирование с тремя коэффициентами
|
||
- Регулируемый период сэмплирования
|
||
- Будильник при выходе за пределы диапазона
|
||
- Защита от интегральной раскрутки
|
||
|
||
### Тип в JSON
|
||
```
|
||
[13, [[kP, kI, kD, dT, alarmTO, alarmVal, outMin, outMax]], outputExecObj, cascadeExecObj], setpoint
|
||
```
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"temperature_controller": [
|
||
13,
|
||
[
|
||
[1.0, 0.05, 0.02, 5, 600000, 0, 0, 255],
|
||
{"emit": "heating/power"},
|
||
{"emit": "cascade/out"}
|
||
],
|
||
21.5
|
||
]
|
||
```
|
||
|
||
### Параметры
|
||
|
||
| Параметр | Тип | Описание |
|
||
|----------|-----|---------|
|
||
| `kP` | float | Пропорциональный коэффициент (деф 1.0) |
|
||
| `kI` | float | Интегральный коэффициент (деф 0.0) |
|
||
| `kD` | float | Дифференциальный коэффициент (деф 0.0) |
|
||
| `dT` | float | Период сэмплирования (сек), деф 5 |
|
||
| `alarmTO` | int | Таймаут (деф 600*1000 мс) |
|
||
| `alarmVal` | float | Принудительное значение выхода при аларме |
|
||
| `outMin` | float | Мин. выход, деф 0 |
|
||
| `outMax` | float | Макс. выход, деф 255 |
|
||
|
||
Вход регулятора — `/val`, setpoint задаётся как 3-й элемент item (начальное значение). Диапазоны kP/kI/kD/dT кодом не валидируются. Допускается и массив из 6 элементов: `[kP, kI, kD, dT, alarmTO, alarmVal]`.
|
||
|
||
---
|
||
|
||
## out_Relay — Электромагнитное реле
|
||
|
||
### Описание
|
||
|
||
Управление электромагнитными реле через цифровой выход микроконтроллера.
|
||
|
||
**Основные функции:**
|
||
- Включение/отключение нагрузки
|
||
- Поддержка инвертированной логики
|
||
- Управление периодом переключения
|
||
|
||
### Тип в JSON
|
||
```
|
||
RELAY: [6, pin, val, cmd]
|
||
RELAYX: [16, [pin, period_сек], val, cmd]
|
||
```
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"pump_relay": [6, 33]
|
||
```
|
||
|
||
### Параметры
|
||
|
||
| Параметр | Тип | Описание |
|
||
|----------|-----|---------|
|
||
| `pin` | int | Номер GPIO-пина; инверсия логики — отрицательный пин |
|
||
| `period` | int | Только RELAYX: период срабатывания (секунды, в коде умножается на 1000), деф 5000 мс |
|
||
|
||
### Управление
|
||
|
||
```
|
||
Отправить: home/pump_relay
|
||
Значение: 0 (OFF) или 1 (ON)
|
||
```
|
||
|
||
---
|
||
|
||
## out_PWM — Широтно-импульсная модуляция
|
||
|
||
### Описание
|
||
|
||
Управление PWM для регулирования яркости светодиодов, скорости двигателей, интенсивности нагрузок.
|
||
|
||
**Основные функции:**
|
||
- Регулирование от 0% до 100%
|
||
- Поддержка RGB-управления (в base-классе colorChannel)
|
||
- Число пинов (1-5) определяет режим: CH_PWM / RGB / RGBW / RGBWW
|
||
|
||
### Тип в JSON
|
||
```
|
||
[3, [pin0, pin1, ...]]
|
||
```
|
||
Частота из конфигурации не читается.
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"led_brightness": [
|
||
3,
|
||
[5]
|
||
]
|
||
```
|
||
|
||
### Управление
|
||
|
||
```
|
||
Отправить: home/led/brightness
|
||
Значение: 0-255 (0=0%, 255=100%)
|
||
```
|
||
|
||
---
|
||
|
||
## out_DMX — DMX512 управление светом
|
||
|
||
### Описание
|
||
|
||
Управление световыми приборами по протоколу DMX512 (театральное и архитектурное освещение).
|
||
|
||
**Основные функции:**
|
||
- Поддержка до 512 каналов
|
||
- Управление цветом и интенсивностью
|
||
- Синхронизированное обновление
|
||
|
||
### Тип в JSON
|
||
```
|
||
[0, [addr1, addr2, ...]]
|
||
```
|
||
Список адресов DMX-каналов (1-5); объекта `{settings}` нет.
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"stage_lighting": [
|
||
0,
|
||
[1, 2, 3, 4]
|
||
]
|
||
```
|
||
|
||
### Управление
|
||
|
||
```
|
||
Отправить: home/lighting/color
|
||
Значение: {"r":255, "g":128, "b":0}
|
||
```
|
||
|
||
---
|
||
|
||
## out_Motor — Управление двигателем
|
||
|
||
### Описание
|
||
|
||
Управление моторами с обратной связью по положению (рольставни, жалюзи, шторы).
|
||
|
||
**Основные функции:**
|
||
- Управление направлением (вверх/вниз)
|
||
- Обратная связь по положению
|
||
- Защита от перегрузки по времени
|
||
- Плавное позиционирование
|
||
|
||
### Тип в JSON
|
||
```
|
||
[12, [pinUp, pinDown, pinFeedback, fbOpen, fbClosed, maxOnTime_ms]]
|
||
```
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"roller_blind": [
|
||
12,
|
||
[
|
||
32,
|
||
33,
|
||
34,
|
||
0,
|
||
1023,
|
||
10000
|
||
]
|
||
]
|
||
```
|
||
|
||
### Параметры
|
||
|
||
| Параметр | Тип | Описание |
|
||
|----------|-----|---------|
|
||
| `pinUp` | int | GPIO для движения вверх (инверсия — отрицательный пин) |
|
||
| `pinDown` | int | GPIO для движения вниз |
|
||
| `pinFeedback` | int | GPIO обратной связи (аналоговый) |
|
||
| `fbOpen` | int | Значение обратной связи (открыто) |
|
||
| `fbClosed` | int | Значение обратной связи (закрыто) |
|
||
| `maxOnTime_ms` | int | Макс. время работы (мс), деф 10000 |
|
||
|
||
### Команды
|
||
|
||
Позиционное управление: цель — значение 0-255. `ON` → движение к заданной позиции, `OFF`/`HALT` → 0. Команд UP/DOWN/STOP нет.
|
||
|
||
---
|
||
|
||
## out_Elevator — Управление лифтом
|
||
|
||
### Описание
|
||
|
||
Управление лифтом через UART или интерфейс вызова. Синхронизация между контроллерами через сетевой мост.
|
||
|
||
**Основные функции:**
|
||
- Управление вызовом лифта
|
||
- Передача команды на нужный этаж
|
||
- Контроль состояния лифта
|
||
- Дублирование по UART
|
||
|
||
### Тип в JSON
|
||
```
|
||
[19, {"serial": "8N1", "baud": 19200, "log": ...}]
|
||
```
|
||
Реализован (компилируется с ELEVATOR_ENABLE). itemArg — объект. Порты фиксированные (MODULE_UATRBRIDGE_UARTA/B).
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"elevator": [
|
||
19,
|
||
{
|
||
"serial": "8N1",
|
||
"baud": 19200,
|
||
"log": true
|
||
}
|
||
]
|
||
```
|
||
|
||
### Параметры
|
||
|
||
| Параметр | Значение | Описание |
|
||
|----------|----------|---------|
|
||
| `serial` | "8N1" | Параметры кадра (строка, деф "8N1") |
|
||
| `baud` | 19200 | Скорость UART (деф 19200) |
|
||
| `log` | bool | Логирование |
|
||
|
||
---
|
||
|
||
## out_Humidifier — Управление увлажнителем
|
||
|
||
### Описание
|
||
|
||
Управление промышленным ультразвуковым или парогенерирующим увлажнителем с контролем давления и защитой от отказов.
|
||
|
||
**Основные функции:**
|
||
- Контроль давления в баке
|
||
- Управление электромагнитными клапанами
|
||
- Защита от перепада давления
|
||
- Автоматическая очистка (FLUSH)
|
||
- Состояния готовности и отказа
|
||
|
||
### Тип в JSON
|
||
```
|
||
[21, [[pumpPin, flushPin, pressurePin, maxPumpTime, idleTime, capacity, minLevel, startLevel], {зоны-краны}, motorCmdExecObj, faultCmdExecObj]]
|
||
```
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"mist_humidifier": [
|
||
21,
|
||
[
|
||
[25, 26, 35, 300, 60000, 50, 10, 20],
|
||
{
|
||
"gate1": 27
|
||
}
|
||
]
|
||
]
|
||
```
|
||
|
||
Константы (не настраиваются из конфигурации): `MIN_OPERATION_PRESSURE` = 400, `MAX_OPERATION_PRESSURE` = 600, `FLUSH_TIMEOUT` = 125000 мс.
|
||
|
||
### Состояния
|
||
|
||
| Состояние | Код | Описание |
|
||
|-----------|-----|---------|
|
||
| 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 — Автосуммирующий счётчик
|
||
|
||
### Описание
|
||
|
||
Периодический автосуммированный счётчик: каждые `period` секунд к значению прибавляется `impulse` (контроль расхода воды, газа или подсчёт событий). Не является счётчиком GPIO-импульсов.
|
||
|
||
**Основные функции:**
|
||
- Периодическое прибавление импульса
|
||
- Накопление значений
|
||
|
||
### Тип в JSON
|
||
```
|
||
[20, [impulse, periodSec], val]
|
||
```
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"water_meter": [
|
||
20,
|
||
[0.02, 60]
|
||
]
|
||
```
|
||
|
||
### Параметры
|
||
|
||
| Параметр | Тип | Описание |
|
||
|----------|-----|---------|
|
||
| `impulse` | float | Значение, прибавляемое за период (arg[0]) |
|
||
| `periodSec` | int | Период суммирования (секунды, arg[1]) |
|
||
|
||
---
|
||
|
||
## out_SPILed — Управление светодиодами
|
||
|
||
### Описание
|
||
|
||
Управление адресуемыми RGB-светодиодами (WS2812, APA102) через SPI или GPIO.
|
||
|
||
**Основные функции:**
|
||
- Независимое управление каждым светодиодом
|
||
- RGB-цветовая палитра
|
||
- Эффектов/анимаций нет — только установка цвета/вкл-выкл по диапазону светодиодов
|
||
|
||
### Тип в JSON
|
||
```
|
||
[11, [data_pin, numLeds, ledsType]]
|
||
```
|
||
Объект `{settings}` не читается.
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"led_strip": [
|
||
11,
|
||
[
|
||
13,
|
||
43
|
||
]
|
||
]
|
||
```
|
||
|
||
### Параметры
|
||
|
||
| Параметр | Тип | Описание |
|
||
|----------|-----|---------|
|
||
| `data_pin` | int | GPIO пин (данные) |
|
||
| `numLeds` | int | Количество светодиодов, деф 43 |
|
||
| `ledsType` | int | Код NeoPixel (NEO_BRG+NEO_KHZ800 и т.п.) |
|
||
|
||
### Управление
|
||
|
||
```
|
||
Отправить: home/leds/color
|
||
Значение: {"r":255, "g":0, "b":128}
|
||
|
||
Отправить: home/leds/brightness
|
||
Значение: 0-255
|
||
```
|
||
|
||
---
|
||
|
||
## out_Mercury — Счётчик Меркурий
|
||
|
||
### Описание
|
||
|
||
Управление и опрос электросчётчиков серии Меркурий через UART Modbus RTU.
|
||
|
||
**Основные функции:**
|
||
- Чтение энергопотребления (активная/реактивная)
|
||
- Контроль связи и состояния счётчика
|
||
- Тарифные (пиковое/полупиковое/ночное) данные НЕ читаются — только M_NOW
|
||
|
||
### Тип в JSON
|
||
```
|
||
[22, [addr, baud, serialParam, accessLevel, password, pollingInterval_ms]]
|
||
```
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"electricity_meter": [
|
||
22,
|
||
[
|
||
1,
|
||
9600,
|
||
"8N1",
|
||
2,
|
||
"123456",
|
||
10000
|
||
]
|
||
]
|
||
```
|
||
|
||
### Параметры
|
||
|
||
| Параметр | Значение | Описание |
|
||
|----------|----------|---------|
|
||
| `addr` | int | Адрес Modbus |
|
||
| `baud` | 9600 | Скорость UART (деф 9600) |
|
||
| `serialParam` | "8N1" | Формат кадра (строка) |
|
||
| `accessLevel` | int | Уровень доступа |
|
||
| `password` | string(6) или массив 6 цифр | Пароль |
|
||
| `pollingInterval_ms` | мс | Интервал опроса (деф 10000) |
|
||
|
||
### Публикуемые топики
|
||
|
||
```
|
||
/voltage/A, /voltage/B, /voltage/C - Напряжения по фазам
|
||
/current/A, /current/B, /current/C - Токи по фазам
|
||
/angles/A, /angles/B, /angles/C - Углы по фазам
|
||
/counters/Active - Активная энергия
|
||
/counters/Reactive - Реактивная энергия
|
||
/power/A, /power/B, /power/C - Мощности по фазам
|
||
/cosf/... - Коэффициенты мощности
|
||
```
|
||
|
||
---
|
||
|
||
---
|
||
|
||
## out_Sprinkler — Система полива
|
||
|
||
### Описание
|
||
|
||
Модуль управления многозональной системой автоматического полива с независимым управлением каждой зоной, таймерами и мониторингом.
|
||
|
||
**Основные функции:**
|
||
- Управление несколькими зонами полива независимо
|
||
- Установка длительности полива для каждой зоны
|
||
- Таймеры и расписания для автоматизации
|
||
- Мониторинг прогресса выполнения
|
||
- Поддержка ручного управления и автоматических режимов
|
||
- Контроль состояния клапанов и электромагнитных выключателей
|
||
|
||
### Тип в JSON
|
||
```
|
||
[23, {конфиг}]
|
||
```
|
||
Корневой объект `""`: `vIn, rDren, rPump, wMax, wMin, fbDren, fbPump, wCtr, onFault(execObj)`; зоны — `pin`.
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"irrigation_system": [
|
||
23,
|
||
{
|
||
"": {
|
||
"vIn": 5,
|
||
"rDren": 6,
|
||
"rPump": 7,
|
||
"wMax": 8,
|
||
"wMin": 9,
|
||
"fbDren": 10,
|
||
"fbPump": 11,
|
||
"wCtr": 12,
|
||
"onFault": {"emit": "sprinkler/fault"}
|
||
},
|
||
"north_zone": {
|
||
"pin": 21
|
||
},
|
||
"south_zone": {
|
||
"pin": 22
|
||
},
|
||
"drip_zone": {
|
||
"pin": 23
|
||
}
|
||
}
|
||
]
|
||
```
|
||
|
||
Зона описывается ключом `pin`; ключи `cmd`/`val`/`set`/`@active` создаются автоматически. Ключей `enabled`/`time`/`progress`/`cycle` нет.
|
||
|
||
### Компоненты системы
|
||
|
||
| Компонент | Выход/Вход | Назначение |
|
||
|-----------|-----------|-----------|
|
||
| **Бак полива** | wMax, wMin | Поплавки макс/мин уровня воды |
|
||
| **Основной насос** | rPump, fbPump | Реле включения, датчик тока |
|
||
| **Клапаны зон** | pin (для каждой зоны) | Оптореле открытия клапана |
|
||
| **Клапан налива** | vIn | Оптореле подачи воды из водопровода |
|
||
| **Дренажный насос** | rDren, fbDren | Реле включения, датчик тока |
|
||
| **Водосчётчик** | wCtr (опционально) | Счётчик объёма воды |
|
||
|
||
### Параметры конфигурации
|
||
|
||
| Параметр | Тип | Описание |
|
||
|----------|-----|---------|
|
||
| `vIn` | int | GPIO клапана налива из водопровода |
|
||
| `wMax` | int | GPIO поплавка максимума в баке |
|
||
| `wMin` | int | GPIO поплавка минимума в баке |
|
||
| `rDren` | int | GPIO реле дренажного насоса |
|
||
| `fbDren` | int | GPIO датчика дренажного насоса |
|
||
| `rPump` | int | GPIO реле основного насоса полива |
|
||
| `fbPump` | int | GPIO датчика основного насоса |
|
||
| `wCtr` | int | GPIO счётчика воды (опционально) |
|
||
|
||
### Параметры зоны полива
|
||
|
||
| Параметр | Тип | Описание |
|
||
|----------|-----|---------|
|
||
| `pin` | int | GPIO клапана зоны |
|
||
|
||
`cmd`/`val`/`set`/`@active` создаются автоматически. `set` = требуемый объём полива или время (сек), 0 = неограниченно.
|
||
|
||
### Состояния системы налива
|
||
|
||
| Состояние | Код | Описание |
|
||
|-----------|-----|---------|
|
||
| `SP_UNKNOWN` | 0 | Неизвестное состояние |
|
||
| `SP_OFF` | 1 | Система выключена |
|
||
| `SP_DREN_ON` | 2 | Дренажный насос включен |
|
||
| `SP_DREN_OPERATE` | 3 | Дренажный насос работает |
|
||
| `SP_DREN_EMPTY` | 4 | Дренажный колодец пуст |
|
||
| `SP_VIN` | 5 | Наполнение из водопровода |
|
||
| `SP_FULL` | 6 | Бак наполнен |
|
||
| `SP_DRYING` | 7 | Осушение системы |
|
||
| `SP_FAULT_VIN` | -1 | Ошибка: бак не наполнился из водопровода |
|
||
| `SP_FAULT_DREN` | -2 | Ошибка: бак не наполнился из дренажа |
|
||
|
||
### MQTT топики управления
|
||
|
||
#### Управление циклом полива (команды)
|
||
```
|
||
root/name/sprinkler/cmd ← ON # Запустить цикл полива
|
||
root/name/sprinkler/cmd ← OFF # Остановить цикл полива
|
||
root/name/sprinkler/cmd ← DRY # Режим осушения системы
|
||
root/name/sprinkler/cmd ← RESET # Сбросить счётчики всех зон
|
||
```
|
||
XON/XOFF/FREEZE/UNFREEZE через `/cmd` не обрабатываются. FREEZE — через `/val < 0`.
|
||
|
||
#### Управление конкретной зоной (например, "north")
|
||
```
|
||
root/name/sprinkler/north/cmd ← ON # Включить полив зоны
|
||
root/name/sprinkler/north/cmd ← OFF # Выключить полив зоны
|
||
root/name/sprinkler/north/set ← 60 # Требуемый объём/время полива (секунды или единицы счётчика)
|
||
```
|
||
|
||
#### Режимы системы (установка в /ctrl)
|
||
```
|
||
root/name/sprinkler/ctrl ← ENABLE # Разрешить полив
|
||
root/name/sprinkler/ctrl ← DISABLE # Запретить полив (например, после дождя)
|
||
root/name/sprinkler/ctrl ← FREEZE # Полная блокировка на зиму
|
||
root/name/sprinkler/ctrl ← UNFREEZE # Снять блокировку зимы
|
||
```
|
||
|
||
#### Автоматическая блокировка по температуре
|
||
```
|
||
root/name/sprinkler/val ← -1 # При температуре < 0 система автоматически переходит в FREEZE
|
||
```
|
||
|
||
### MQTT топики мониторинга (статус)
|
||
|
||
```
|
||
root/s_out/sprinkler/$state # Состояние системы налива воды (SP_*)
|
||
root/s_out/sprinkler/$fault # Код ошибки (если есть)
|
||
root/s_out/sprinkler/$wMax # ON/OFF - бак полный (поплавок макс)
|
||
root/s_out/sprinkler/$wMin # ON/OFF - бак пуст (поплавок мин)
|
||
root/s_out/sprinkler/$rPump # ON/OFF - реле основного насоса включено
|
||
root/s_out/sprinkler/$fbPump # ON/OFF - основной насос работает (датчик тока)
|
||
root/s_out/sprinkler/$rDren # ON/OFF - реле дренажного насоса включено
|
||
root/s_out/sprinkler/$fbDren # ON/OFF - дренажный насос работает (датчик тока)
|
||
root/s_out/sprinkler/$rVIN # ON/OFF - клапан налива из водопровода открыт
|
||
root/s_out/sprinkler/set # Текущее значение счётчика воды
|
||
|
||
root/s_out/sprinkler/north/$state # ON/OFF - зона поливается в настоящее время
|
||
root/s_out/sprinkler/north/cmd # ON/OFF - состояние команды включения зоны
|
||
root/s_out/sprinkler/north/set # Требуемый объём/время полива
|
||
root/s_out/sprinkler/north/val # Текущий выполненный объём/время полива зоны
|
||
|
||
root/s_out/sprinkler/south/$state # ON/OFF - зона поливается
|
||
root/s_out/sprinkler/south/cmd # ON/OFF - состояние команды
|
||
root/s_out/sprinkler/south/set # Требуемый объём/время
|
||
root/s_out/sprinkler/south/val # Выполненный объём/время
|
||
|
||
# Аналогично для остальных зон (например, "trees", "outlets" и т.д.)
|
||
```
|
||
|
||
### Особенности
|
||
|
||
| Особенность | Описание |
|
||
|-----------|---------|
|
||
| **Динамическое управление** | Все параметры можно изменять через MQTT в реальном времени |
|
||
| **Восстановление состояния** | Значения `set` и `val` восстанавливаются из топиков `s_out` при перезагрузке |
|
||
| **Водяная розетка** | Зона с `set=0` работает неограниченно (используется для розеток с шлангом) |
|
||
| **Приоритет дренажа** | Система сначала пытается наполнить бак из дренажного колодца, затем из водопровода |
|
||
| **Автозащита от мороза** | Значение `/val < 0` автоматически активирует режим FREEZE |
|
||
| **Двухступенчатая блокировка** | DISABLE блокирует команды, FREEZE полностью заморозит систему |
|
||
|
||
---
|
||
|
||
## out_UARTBridge — UART мост
|
||
|
||
### Описание
|
||
|
||
Создание прозрачного двунаправленного моста между двумя UART портами с сохранением данных и логированием.
|
||
|
||
**Основные функции:**
|
||
- Прозрачная маршрутизация UART↔UART
|
||
- Буферизация пакетов (MAX_PDU = 64 байт)
|
||
- Логирование трафика
|
||
- Одна скорость на оба порта. Порты фиксированные: Serial1/Serial2
|
||
|
||
### Тип в JSON
|
||
```
|
||
[15, {"serial": "8N1", "baud": 9600, "ip": ..., "port": ..., "hd": ..., "log": ..., "bond": ...}]
|
||
```
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"uart_gateway": [
|
||
15,
|
||
{
|
||
"serial": "8N1",
|
||
"baud": 9600
|
||
}
|
||
]
|
||
```
|
||
|
||
### Параметры
|
||
|
||
| Параметр | Тип | Описание |
|
||
|----------|-----|---------|
|
||
| `serial` | string | Формат кадра (8N1, 8E1, 8O1) |
|
||
| `baud` | int | Скорость UART (одна на оба порта) |
|
||
| `ip` | string | IP (мост через сеть) |
|
||
| `port` | int | Порт |
|
||
| `hd` | - | Опциональный ключ конфигурации |
|
||
| `log` | bool | Логирование |
|
||
| `bond` | - | Опциональный ключ конфигурации |
|
||
|
||
---
|
||
|
||
# Входные модули
|
||
|
||
## in_CCS811_HDC1080 — Датчик качества воздуха
|
||
|
||
### Описание
|
||
|
||
Комбинированный датчик для измерения качества воздуха с использованием:
|
||
- **HDC1080** — датчик температуры и влажности (I2C)
|
||
- **CCS811** — датчик CO₂ и TVOC (I2C)
|
||
|
||
**Основные функции:**
|
||
- Измерение температуры (-40...125°C)
|
||
- Измерение влажности (0-100%)
|
||
- Измерение eCO₂ (400-8192 ppm)
|
||
- Измерение TVOC (0-1187 ppb)
|
||
- Температурная компенсация
|
||
|
||
### Тип в JSON
|
||
|
||
Это ДВА ВХОДА: `IN_CCS811` (T=5) и `IN_HDC1080` (T=6), конфигурируются как объекты входов в секции `"in"`.
|
||
|
||
### Формат конфигурации
|
||
|
||
```json
|
||
"in": {
|
||
"10": {
|
||
"T": 5,
|
||
"emit": "home/sensors/air"
|
||
},
|
||
"20": {
|
||
"T": 6,
|
||
"emit": "home/sensors/room"
|
||
}
|
||
}
|
||
```
|
||
|
||
Адреса I2C захардкожены (CCS811 — 0x5A, HDC1080 — 0x40) и не настраиваются. Смещений и pollInterval в конфигурации нет.
|
||
|
||
### Выводимые параметры
|
||
|
||
| Параметр | Единица | Диапазон | Описание |
|
||
|----------|---------|----------|---------|
|
||
| `temperature` | °C | -40...125 | Температура воздуха |
|
||
| `humidity` | % | 0...100 | Относительная влажность |
|
||
| `eCO2` | ppm | 400...8192 | Эквивалентный CO₂ |
|
||
| `TVOC` | ppb | 0...1187 | Летучие органические соединения |
|
||
|
||
### Адреса I2C
|
||
|
||
| Устройство | Адрес | Описание |
|
||
|-----------|-------|---------|
|
||
| CCS811 | 0x5A | По умолчанию (WAK на GND) |
|
||
| CCS811 | 0x5B | Альтернативный (WAK на VDD) |
|
||
| HDC1080 | 0x40 | Всегда фиксирован |
|
||
|
||
### MQTT маршрутизация
|
||
|
||
Публикуется: `/T`, `/H`, `/CO2`, `/TVOC`, `/base`.
|
||
|
||
```json
|
||
{
|
||
"temp": {"emit": "home/sensors/air/temperature"},
|
||
"hum": {"emit": "home/sensors/air/humidity"},
|
||
"co2": {"emit": "home/sensors/air/co2"},
|
||
"tvoc": {"emit": "home/sensors/air/tvoc"}
|
||
}
|
||
```
|
||
|
||
### Примеры использования
|
||
|
||
#### Мониторинг качества воздуха (CCS811) и температуры/влажности (HDC1080)
|
||
|
||
```json
|
||
"in": {
|
||
"10": {
|
||
"T": 5,
|
||
"emit": "home/sensors/living_room/air"
|
||
},
|
||
"20": {
|
||
"T": 6,
|
||
"emit": "sensors/hvac/inlet"
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Сводная таблица типов модулей
|
||
|
||
| Модуль | Тип | Назначение | Управление |
|
||
|--------|-----|-----------|-----------|
|
||
| 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 |
|
||
|
||
---
|
||
|
||
## Общие принципы конфигурации
|
||
|
||
### 1. Подключение MQTT
|
||
|
||
Все параметры с полем `emit` автоматически публикуются в MQTT:
|
||
|
||
```json
|
||
"parameter": {
|
||
"emit": "home/device/parameter"
|
||
}
|
||
```
|
||
|
||
### 2. Управление из MQTT
|
||
|
||
Отправка значения:
|
||
```
|
||
mqtt publish home/device/parameter 128
|
||
```
|
||
|
||
### 3. Использование массивов
|
||
|
||
Для нескольких параметров:
|
||
```json
|
||
[
|
||
{"emit": "topic1"},
|
||
{"emit": "topic2"},
|
||
{"emit": "topic3"}
|
||
]
|
||
```
|
||
|
||
### 4. Служебные параметры
|
||
|
||
- `@V` (null) — не публиковать значения
|
||
- `@S` (null) — не публиковать при сохранении
|
||
- `@C` — служебное, не использовать
|
||
|
||
---
|
||
|
||
## Диагностика проблем
|
||
|
||
### Модуль не инициализируется
|
||
|
||
Проверить:
|
||
1. Конфигурация JSON синтаксически корректна
|
||
2. GPIO-пины не конфликтуют
|
||
3. I2C/UART устройства подключены
|
||
4. Библиотеки установлены
|
||
|
||
### Нет связи с устройством
|
||
|
||
1. Проверить скорость UART (baud)
|
||
2. Проверить подключение TX/RX
|
||
3. Проверить адрес Modbus/I2C
|
||
4. Посмотреть лог сообщений
|
||
|
||
### Неустойчивые значения PID
|
||
|
||
1. Снизить Kp (коэффициент пропорциональности)
|
||
2. Увеличить dT (период сэмплирования)
|
||
3. Добавить Kd (демпфирование)
|
||
|
||
---
|
||
|
||
**Версия документа:** 1.0
|
||
**Дата:** 2026-01-21
|
||
**Статус:** Утверждено
|