# LightHub: Полное инженерное описание JSON‑конфигурации контроллера

> **Документ актуален для ядра LightHub с типами каналов CH_DIMMER (0) - CH_MERCURY (22)**
> 
> Предназначен для инженеров автоматизации, интеграторов и разработчиков.
> Основан **строго** на официальной документации LazyHome / LightHub и исходном коде.
> Описывает реальный формат конфигурации, без абстракций и допущений.

---

## Содержание

1. [Назначение конфигурационного файла](#назначение)
2. [Общая структура JSON](#структура)
3. [Секция `mqtt`](#mqtt)
4. [Секция `topics`](#topics)
5. [Секция `syslog`](#syslog)
6. [Секция `ow` (1-Wire)](#1wire)
7. [Секция `modbus` (КЛЮЧЕВАЯ)](#modbus)
8. [Секция `items` (ЛОГИКА)](#items)
9. [Секция `in` (входы)](#in)
10. [Полный пример](#пример)
11. [Справочники и ссылки](#справочники)

---

## Назначение конфигурационного файла {#назначение}

JSON‑конфигурация LightHub — это **единственный источник описания системы**. Она определяет:

- **Сетевую интеграцию** (MQTT, syslog)
- **Подключённые физические интерфейсы** (DMX, RS485, GPIO, 1-Wire)
- **Библиотеки Modbus‑устройств** (шаблоны с параметрами)
- **Логические объекты (items)** — каналы управления (0-22 типов)
- **Маршрутизацию данных и команд** между MQTT и локальными объектами

❗ **В LightHub нет runtime‑конфигурации** — всё задаётся декларативно при загрузке файла.

---

## Общая структура JSON {#структура}

Корневой объект конфигурации содержит **независимые секции**:

```json
{
  "mqtt": [],
  "topics": {},
  "syslog": [],
  "dmx": [],
  "ow": {},
  "modbus": {},
  "in": {},
  "items": {}
}
```

**Любая секция может отсутствовать**, если функциональность не используется.

---

## Секция `mqtt` {#mqtt}

### Назначение

Определяет **MQTT‑клиент LightHub**. Контроллер всегда работает как клиент.

### Формат

```json
"mqtt": [
  "client_id",
  "broker_host",
  1883,
  "username",
  "password"
]
```

### Параметры (позиционные!)

| № | Назначение | Тип | Обязателен | Пример |
|--|--|--|--|--|
| 0 | MQTT Client ID | string | **✓** | `"lighthub-07"` |
| 1 | DNS‑имя или IP брокера | string | **✓** | `"192.168.88.2"` |
| 2 | Порт | int | - | `1883` |
| 3 | Логин | string | - | `"mqtt_user"` |
| 4 | Пароль | string | - | `"pass123"` |

### Примеры

```json
"mqtt": ["lighthub", "m2m.eclipse.org"]

"mqtt": ["lh1", "192.168.1.10", 1883, "user", "pass"]

"mqtt": ["abc3", "192.168.88.2"]
```

⚠️ **Безопасность**: пароль рекомендуется задавать через CLI, а не хранить в JSON.

---

## Секция `topics` {#topics}

### Назначение

Глобальные настройки MQTT‑топиков.

### Формат

```json
"topics": {
  "root": "myhome",
  "in": "in",
  "out": "out"
}
```

### Параметры

| Ключ | Назначение | По умолчанию |
|--|--|--|
| `root` | Корневой префикс всех топиков | `"myhome"` |
| `in` | Входящие команды | `"in"` |
| `out` | Исходящие статусы | `"out"` |

### Поведение

Все MQTT‑топики, создаваемые LightHub, будут иметь вид:

```
<root>/<item>/<parameter>
```

**Пример**:
```
myhome/dev/lamp1/val         # статус яркости
myhome/dev/lamp1/cmd         # последняя команда
myhome/s_out/lamp1/hue       # текущий оттенок RGB лампы
```

---

## Секция `syslog` {#syslog}

### Назначение

Передача логов контроллера на удалённый syslog‑сервер (UDP).

### Формат

```json
"syslog": ["192.168.1.10", 514]
```

### Параметры

| № | Параметр | Тип | По умолчанию |
|--|--|--|--|
| 0 | IP адрес сервера | string | - |
| 1 | UDP порт | int | `514` |

---

## Секция `dmx` {#dmx}

### Назначение

Конфигурация DMX 512 выхода (для работы с LED декодерами).

### Форматы

**Простой** (для всех плат):
```json
"dmx": [512]   // 512 DMX каналов
```

**Расширенный** (для Arduino Mega):
```json
"dmx": [3, 512]  // GPIO pin 3, 512 каналов
```

### Параметры

| Параметр | Описание |
|--|--|
| GPIO pin | Пин TXD для DMX выхода |
| Кол-во каналов | Число DMX каналов (обычно 512) |

---

## Секция `ow` (1‑Wire) {#1wire}

### Назначение

Подключение датчиков 1‑Wire (DS18B20 и совместимые).

### Формат

```json
"ow": {
  "28FF641D2A1603B1": {
    "emit": "temp/outdoor",
    "item": "t_out"
  },
  "284811170400005B": {
    "emit": "temp/indoor"
  }
}
```

### Параметры

| Ключ | Назначение |
|--|--|
| Ключ объекта | **ROM‑код датчика** (уникальный адрес, HEX) |
| `emit` | MQTT‑топик публикации (опционально) |
| `item` | Привязка к локальному объекту (опционально) |

### Поведение

- Датчик автоматически опрашивается по расписанию
- Температура публикуется в MQTT топик `root/emit_name`
- Если задан `item`, значение передаётся в локальный объект

---

## Секция `modbus` — КЛЮЧЕВАЯ {#modbus}

### Назначение

Раздел `modbus` — это **библиотека описаний Modbus‑устройств**.

❗ **Здесь НЕ задаются реальные адреса устройств**, только **шаблоны**.
Реальные адреса и параметры задаются в секции `items` при использовании шаблонов.

### Общая структура

```json
"modbus": {
  "device_template_name": {
    "baud": 9600,
    "serial": "8N1",
    "poll": {},
    "par": {}
  }
}
```

### Параметры линии

#### `baud`
Скорость RS‑485: `9600`, `19200`, `38400`, `115200`

#### `serial`
Формат кадра:
- `8N1` — 8 бит, без чётности, 1 стоп-бит (стандарт)
- `8E1` — 8 бит, чётность even, 1 стоп-бит
- `8O1` — 8 бит, чётность odd, 1 стоп-бит

### Раздел `poll` — стратегия опроса

```json
"poll": {
  "regs": [[0, 40], [100, 20]],
  "irs": [300, 301],
  "coils": [0, 1],
  "delay": 2000
}
```

#### Интерпретация

- **`regs`** — Holding Registers (блоки для чтения/записи)
  - Формат: `[начальный_адрес, кол-во]`
  - Пример: `[[0, 40], [100, 20]]` = два блока: 0-39 и 100-119
  
- **`irs`** — Input Registers (только чтение, статус)
  - Формат: массив адресов
  - Пример: `[300, 301]`

- **`coils`** — Coil Registers (логические выходы)
  - Формат: массив адресов
  - Пример: `[0, 1]`

- **`delay`** — Задержка между циклами опроса (мс)
  - Пример: `2000` = опрашивать каждые 2 секунды

**LightHub автоматически объединяет регистры в минимальное число Modbus‑запросов**.

### Раздел `par` — параметры устройства

```json
"par": {
  "power": {
    "reg": 41,
    "type": "u16",
    "map": {"cmd": [["OFF", 0], ["ON", 1]]}
  },
  "temperature": {
    "ir": 5,
    "type": "i16",
    "scale": 0.1
  }
}
```

#### Поля параметра

| Поле | Назначение | Тип |
|--|--|--|
| `reg` | Holding Register (R/W) | int |
| `ir` | Input Register (R only) | int |
| `coil` | Coil Register | int |
| `type` | Тип данных | string |
| `map` | Преобразование значений | object |
| `scale` | Множитель масштабирования | float |

#### Типы данных (`type`)

| Тип | Значение | Диапазон |
|--|--|--|
| `u8` | uint8 | 0 - 255 |
| `i8` | int8 | -128 - 127 |
| `u16` | uint16 | 0 - 65535 |
| `i16` | int16 | -32768 - 32767 |
| `u32` | uint32 | 0 - 4294967295 |
| `i32` | int32 | -2147483648 - 2147483647 |
| `f32` | float32 | IEEE 754 |
| `u8h` | uint8 high byte | старший байт u16 |
| `u8l` | uint8 low byte | младший байт u16 |

### Пример Modbus шаблона (реальный)

```json
"modbus": {
  "haier_ac": {
    "baud": 9600,
    "serial": "8N1",
    "poll": {
      "regs": [[1, 30]],
      "delay": 1000
    },
    "par": {
      "power": {
        "reg": 1,
        "type": "u16",
        "map": {"cmd": [["OFF", 0], ["ON", 1]]}
      },
      "mode": {
        "reg": 2,
        "type": "u16",
        "map": {"cmd": [["COOL", 0], ["HEAT", 1], ["DRY", 2], ["FAN", 3], ["AUTO", 4]]}
      },
      "temperature": {
        "reg": 3,
        "type": "u16",
        "scale": 0.1
      }
    }
  }
}
```

---

## Секция `items` — ЛОГИКА {#items}

### Назначение

`items` — это **логические объекты (каналы) LightHub**.

Они связывают:
- Физические интерфейсы (GPIO, DMX, RS485)
- Modbus параметры
- MQTT топики
- входы (кнопки, датчики)

### Общий формат

```json
"item_name": [
  TYPE,
  CONFIG,
  initial_value,    // опционально
  initial_command   // опционально
]
```

### Параметры

| Элемент | Назначение | Обязателен | Тип |
|--|--|--|--|
| 0 | **TYPE** — тип канала (0-22) | **✓** | int или string |
| 1 | **CONFIG** — конфигурация (зависит от типа) | **✓** | int, string, или array |
| 2 | Начальное значение (preset) | - | int или array |
| 3 | Начальная команда | - | int |

### Типы каналов (0-22)

**Полный справочник типов каналов см. в [channel_types_reference.md](channel_types_reference.md)**

| Код | Тип | Описание | Конфигурация |
|--|--|--|--|
| **0** | `DMX` | DMX выход с регулировкой | DMX канал или массив каналов |
| **1** | `DMXRGBW` | DMX RGB+White | Стартовый DMX канал |
| **2** | `DMXRGB` | DMX RGB | Стартовый DMX канал |
| **3** | `PWM` | GPIO PWM | GPIO пин или массив пинов |
| **4** | `MBUSDIM` | Modbus AC Dimmer (Legacy) | `[адрес, регистр, маска, макс]` |
| **5** | `THERMO` | ON/OFF термостат | `[GPIO_pin, целевая_T°C]` |
| **6** | `RELAY` | GPIO реле | GPIO пин |
| **7** | `GROUP` | Группа каналов | Массив имён каналов |
| **8** | `VCTEMP` | Vacom PID терморегулятор | `[Modbus_адрес, экземпляр]` |
| **9** | `MBUSVC` | Vacom мотор | `[адрес, конфиг]` |
| **10** | `ACHAIER` | Кондиционер Haier | `[порт, параметры]` |
| **11** | `SPILED` | SPI LED лента | `[CLK_pin, DATA_pin]` |
| **12** | `MOTOR` | Шаговый двигатель | `[PWM_pin, open_pin, close_pin, ...]` |
| **13** | `PID` | PID регулятор | `[[Kp, Ki, Kd, ...], execObj, ...]` |
| **14** | `MBUS` | Universal Modbus | `[адрес, шаблон, параметры]` |
| **15** | `UARTBRDG` | UART мост | Конфигурация портов |
| **16** | `RELAYX` | Медленный PWM | `[GPIO_pin, период_сек]` |
| **17** | `DMXRGBWW` | DMX RGBWW | Стартовый DMX канал |
| **18** | `VENTS` | Многозональная вентиляция | `[адрес, конфиг_зон]` |
| **19** | `ELEVATOR` | Лифт | TBD |
| **20** | `COUNTER` | Счётчик импульсов | `[коэфф, масштаб]` |
| **21** | `HUM` | Увлажнитель | Конфигурация |
| **22** | `MERCURY` | Счётчик энергии Mercury | `[адрес, baudrate, ...]` |

### Примеры конфигурации items

#### CH_RELAY (6) — Простое реле

```json
"relay1": [6, 23],              // Реле на GPIO 23
"relay2": ["RELAY", 28],        // Текстовое обозначение типа
"relay3": [6, 28, 1, 1]         // С начальным значением и командой
```

#### CH_DMX (0) — DMX выход

```json
"lamp1": [0, 5],                // DMX канал 5
"lamp2": [0, [10, 11, 12]],     // Массив DMX каналов
"dmx_4ch": ["DMX", [1, 2, 3, 4]]  // 4-х канальный диммер
```

#### CH_RGBW (1) — RGB+White

```json
"rgb_light": [1, 10]            // RGB+W на DMX 10-13
```

#### CH_PWM (3) — GPIO PWM

```json
"pwm1": [3, 9],                 // PWM на GPIO 9
"pwm_4ch": [3, [11, 12, 13, 14]] // 4-х канальный PWM
```

#### CH_GROUP (7) — Группа каналов

```json
"lights_all": [7, [
  "lamp1", "lamp2", "lamp3",
  "rgb1", "rgb2"
]],
"lights_bedroom": [7, ["lamp1", "rgb1", "relay1"]]
```

#### CH_THERMO (5) — Термостат

```json
"thermo_bath": [5, 24, 33]      // GPIO 24, уставка 33°C
```

#### CH_MBUS (14) — Universal Modbus

```json
"ac_haier": [14, ["haier_ac", {
  "power": {"emit": "ac/power"},
  "mode": {"emit": "ac/mode"},
  "temperature": {"emit": "ac/temp"}
}]]
```

#### CH_COUNTER (20) — Счётчик энергии

```json
"energy": [20, [0.02, 1.2]],     // коэффициент, масштаб
"gas": [20, 0]                   // без калибровки
```

#### CH_MULTIVENT (18) — Многозональная вентиляция

```json
"multivent": [18, [96, {
  "": {
    "val": {"emit": "main/temp"}
  },
  "bedroom": {
    "val": {"emit": "bedroom/temp"},
    "fan": {"emit": "bedroom/fan"},
    "set": 22,
    "pid": [1.0, 0.05, 0.02, 5.0]
  },
  "living_room": {
    "val": {"emit": "living/temp"},
    "set": 21
  }
}]]
```

---

## Секция `in` (входы) {#in}

### Назначение

Связывает физические входы (GPIO, кнопки) с логикой.

### Формат

```json
"in": {
  "37": {
    "T": 0,
    "item": "light",
    "scmd": "TOGGLE",
    "rcmd": "TOGGLE"
  }
}
```

### Параметры

| Параметр | Назначение | Описание |
|--|--|--|
| Ключ | GPIO пин | Номер пина входа |
| `T` | Тип входа | 0 = нормальный, 1 = кнопка |
| `emit` | MQTT топик | Куда публиковать (опционально) |
| `item` | Локальный объект | Какой канал управлять |
| `scmd` | Short command | Команда при нажатии (T=0) |
| `rcmd` | Release command | Команда при отпускании (T=0) |

### Пример

```json
"in": {
  "37": {
    "T": 0,
    "emit": "/myhome/in/all",
    "scmd": "HALT",
    "rcmd": "REST"
  },
  "38": {
    "item": "spots",
    "scmd": "TOGGLE",
    "rcmd": "TOGGLE"
  },
  "39": {
    "emit": "/myhome/s_out/water_leak"
  }
}
```

---

## Полный пример конфигурации {#пример}

```json
{
  "mqtt": ["lighthub-07", "192.168.88.2"],
  "topics": {"root": "myhome"},
  "syslog": ["192.168.88.2", 514],
  "dmx": [512],
  
  "modbus": {
    "haier_ac": {
      "baud": 9600,
      "serial": "8N1",
      "poll": {
        "regs": [[1, 30]],
        "delay": 1000
      },
      "par": {
        "power": {
          "reg": 1,
          "type": "u16",
          "map": {"cmd": [["OFF", 0], ["ON", 1]]}
        },
        "mode": {
          "reg": 2,
          "type": "u16",
          "map": {"cmd": [["COOL", 0], ["HEAT", 1], ["DRY", 2]]}
        },
        "temperature": {
          "reg": 3,
          "type": "i16",
          "scale": 0.1
        }
      }
    }
  },
  
  "items": {
    "lights_all": [7, [
      "lamp_bedroom",
      "lamp_kitchen",
      "lamp_hall",
      "rgb_living"
    ]],
    
    "lamp_bedroom": [0, 1],
    "lamp_kitchen": [0, 2],
    "lamp_hall": [0, 3],
    
    "rgb_living": [1, 10],
    
    "relay_water": [6, 23],
    "relay_heat": [6, 24],
    
    "ac_main": [14, ["haier_ac", {
      "power": {"emit": "ac/power"},
      "mode": {"emit": "ac/mode"},
      "temperature": {"emit": "ac/temp"}
    }]],
    
    "thermo_bath": [5, 35, 33],
    
    "energy_meter": [20, [0.02, 1.2]]
  },
  
  "in": {
    "37": {
      "item": "lights_all",
      "scmd": "TOGGLE",
      "rcmd": "TOGGLE"
    },
    "38": {
      "item": "relay_water",
      "scmd": "OFF"
    }
  }
}
```

---

## Справочники и ссылки {#справочники}

### Основные справочники

- **[Справочник типов каналов](channel_types_reference.md)** — коды, текстовые обозначения, синтаксис конфигурации
- **[Справочник суффиксов](suffixes_reference.md)** — параметры (/cmd, /val, /set, /hue, /sat, /temp и др.)
- **[Описание модулей](modules_description.md)** — подробная документация по каждому типу

### Дополнительная информация

- [Исходный код item.h](../lighthub/item.h) — определения типов и констант
- [Исходный код item.cpp](../lighthub/item.cpp) — реализация логики
- Репозиторий: https://github.com/anklimov/lighthub

---

## Инженерные принципы конфигурирования

1. **Сначала描述 Modbus устройства** в секции `modbus`
2. **Затем создаются items** в секции `items` с использованием шаблонов
3. **Затем подключается MQTT** через `emit` параметры
4. **Минимизировать `poll` задержку** (не ниже 100 мс для RS485)
5. **Использовать `topics.root`** для всех MQTT топиков

---

## Заключение

LightHub использует **жёстко структурированную, декларативную модель конфигурации**.

Это даёт:
- **Предсказуемость** — структура всегда одинакова
- **Надёжность** — явное лучше неявного
- **Промышленный стиль** — как в PLC системах
- **Масштабируемость** — легко добавлять новые устройства

**Вся логика контроллера полностью определяется конфигурацией, без необходимости перекомпиляции кода.**

---

**Версия документа**: 2.0  
**Дата обновления**: 2025-01-24  
**Актуально для**: LightHub с CH_DIMMER (0) - CH_MERCURY (22)  
**Источник**: [item.h](../lighthub/item.h), [item.cpp](../lighthub/item.cpp)
