docs: add dokuwiki snapshot 2026-10-02 as verification baseline

Frozen copy of the official wiki (lazyhome.ru) used as the audit reference
while the repo documentation is brought in line with the code.
This commit is contained in:
2026-10-03 00:41:24 +03:00
parent 693de4da42
commit 718e6cb603
31 changed files with 3510 additions and 0 deletions
@@ -0,0 +1,10 @@
# Снапшот Wiki LightHub (lazyhome.ru/dokuwiki) — 2026-10-02
Замороженное зеркало исходного текста (dokuwiki raw) всех страниц официальной Wiki:
https://www.lazyhome.ru/dokuwiki/doku.php?id=start
Назначение:
- эталон (источник истины уровня 2, после исходного кода) при верификации и переводе документации;
- baseline для будущего этапа двуязычной документации.
Файлы хранятся в исходной dokuwiki-разметке, имя файла = id страницы.
@@ -0,0 +1,29 @@
====http API====
Сервис предоставляется по протоколу http на статическом или динамическом IP адресе контроллера при определении опции компиляции OTA (в builds_flags_* для соответствующей HW архитектуры добавляется строка)
<code>-DOTA</code>
По умолчанию, добавлено для архитектур DUE/Lighthub, ESP*, Mega2560Slim*, mega2560-optiboot
Осуществляется анонсирование контроллера через сервис MDNS для простого обнаружения в локальной сети по имени <имя-контроллера-из-конфигурации-mqtt>.local
(Если конфигурация еще не загружена - lighthub.local)
Анонсирование включается при использовании опции компиляции MDNS. Пример:
<code>-DMDNS</code>
TCP port для доступа к API: 80 (можно переопределить при компиляции при помощи директивы OTA_PORT)
Поддерживаемые endpoint - ы и методы:
^endpoint|Methods|Description|
|/sketch|POST,OPTIONS|Загрузка прошивки контроллера|
|/config.json|POST,GET,OPTIONS|Загрузить или прочитать JSON конфиг в/из NVRAM контроллера|
|/ram/[itemname]|POST,GET,OPTIONS|Загрузить или прочитать JSON конфиг (по указанному item, если он указан, или все дерево )в/из RAM контроллера - используется непосредственно слепок конфига в оперативной памяти|
|/config.bin|POST,GET,OPTIONS|Загрузить или прочитать системный конфиг в/из NVRAM контроллера (содержит MAC,IP параметры и прочие системные настройки)|
|/<произвольное имя>.<bin/json/gif/jpg/html>|POST,GET,OPTIONS|Загрузить или прочитать произвольный файл с/на флэш контроллера|
|/command/<command_name>|POST,OPTIONS|выполнить консольную команду контроллера (reboot, save, get, load, mac, ip etc). Параметры передаются в теле POST запроса)|
|/item/<item_name>[/subitem][/suffix]|POST,GET,OPTIONS|выполнить команду либо прочитать статус соответствующего item. Смысл subitem и suffix а также, синтаксис команды (передается в теле POST запроса) абсолютно идентичны MQTT API|
|/|GET,OPTIONS|переадресация на страницу PWA приложения (по умолчанию http://lazyhome.ru/pwa) с передачей параметров mac и ip|
@@ -0,0 +1,68 @@
=====Command Line Interface=====
Иначе, интерфейс командной строки.
Служит для настройки системных параметров контроллера (при необходимости)
Команды можно подать как подключившись к контроллеру на отладочный последовательный порт, так и при помощи MQTT (см [[работа_с_mqtt#служебные_топики]]) или HTTP [[api]]
===Перечень команд===
* 'help' - this text
* 'mac de:ad:be:ef:fe:00' set and store MAC-address in EEPROM
* 'ip [ip[,dns[,gw[,subnet]]]]' - set static IP
* 'save' - save current config in NVRAM; ON|OFF - enable/disable autosave
* 'get' [config addr]' - get config from pre-configured URL and store addr, ON|OFF - enable/disable download on startup
* 'load' - load config from NVRAM
* 'pwd' - define and store MQTT password
* 'otapwd' - define and store HTTP API password
* 'log [serial_loglevel] [udp_loglevel]' - define log level (0..7)
* 'kill' - test watchdog - в норме, приводит к перезапуску
* 'clear' - clear EEPROM
* 'search' - search devices on 1-wire bus
* 'reboot' - reboot controller
===== Подключение по USB =====
==== MAC ====
Подключаем контроллер USB кабелем к ноутбуку. Открываем эмулятор терминала (например для Макбука использую minicom, который устанавливается через homebrew).
Для улучшения читаемости ответов контроллера в minicom нажимаем комбинацию Esc+U
''$ minicom -D /dev/tty.usbmodem14201''
==== Windows ====
Для windows можно использовать putty, терминал, входящий в среду разработки PlatformIO, Arduino IDE
Параметры подключения - 115200 бод, N-8-1
CLI commands must be send via serial port with 115200 baud rate / 8N1 params: 8 data bits, no parity bit, 1 stop bit.
==== Пример исполненения команды при помощи Unix shell: ====
<code>
> stty -f /dev/cu.usbmodem146101 ispeed 115200 ospeed 115200 -parenb cs8 cstopb
> echo "ip" > /dev/cu.usbmodem146101
> cat /dev/cu.usbmodem146101
</code>
==== также, можно использовать Arduino IDE ====
(serial monitor). Serial port must be configured (MacOSX config file ~/Library/Arduino15/preferences.txt)
<code>
serial.databits=8
serial.stopbits=1
serial.parity=N
serial.debug_rate=115200
serial.line_ending=1
</code>
===== Подключение по MQTT =====
Если контроллер уже успешно подключен к MQTT брокеру, то команду CLI можно направить в топик $command.
см [[работа_с_mqtt#служебные_топики]]
===== Подключение по HTTP API =====
Если контроллер уже успешно подключен к локальной сети, то команду CLI можно направить с помощью http [[api]]
@@ -0,0 +1,57 @@
Прошивка может компилироваться и работать на следующих аппаратных платформах:
1. AVR Arduino MEGA 2560 - первая платформа, на которой была реализована. Прошивка оттестирована на этом железе. Но в настоящее время, уже не рекомендуется по причине ограниченной оперативной памяти. (не получится использовать всю периферию, но для небольших инсталляций подойдет)
2. Arduino DUE - в настоящее время, базовая платформа. Используется в контроллерах LightHub. Прошивка тщательно оттестирована на этом железе. Все новые функции изначально внедряются под эту платформу.
3. ESP8266 - Достаточно полнофункциональная стабильная сборка.
4. ESP32 - Достаточно полнофункциональная стабильная сборка.
5. NRF52840 - пилотная сборка, поддерживающая базовый функционал
6. STM32 - сборка с ограниченной функциональностью, является базовой для устройства LightSpot (минимальное LightHub устройство без IP стека, которое взаимодействует с внешним миром через полноценные устройства LightHub по шинне CAN)
Базовые возможности прошивки LightHUB поддерживаются на любом железе. К ним относится:
* Единообразное конфигурирование с использованием JSON
* Поддержка MQTT и интеграция, фактически, с любой системой Умного Дома, поддерживающей данный протокол, включая, сенсоры, выключатели, термостаты(теплые полы), кондиционеры.
* Поддержка всего расширенного набора команд, группы каналов, сохранение цвета/яркости и пр
* Восстановление состояния контроллера и каналов при перезапуске из MQTT
* Локальное управление каналами (даже при отсутствии сетевого соединения)
* Термостаты (до 20-ти, в пределах кол-ва дискретных выходов)
* Гибкая настройка работы с выключателями/кнопками, включая распознавание одинарного, двойного, тройного нажатия, длительного нажатия, кратковременного выключения
Возможности прошивки, зависящие от железа:
^Возможность^Mega2560^DUE^ESP8266^ESP32^NRF52840^STM32^CONTROLLINO^
|DMX512 In|+|+|-|-|-|-|-|
|DMX512 Out|+|+|+|+|-|-|-|
|Artnet|+|+|+|-|?|?|+|
|1-Wire software|+|+|+|+|+|?|+|
|1-Wire DS2482-100|+|+|+|+|+|+|+|
|MCP23017 - I2C расширитель портов|+|+|+|?|?|?|?|
|Wiznet 5100 Ethernet|+|+|+|+|-|+|+|
|Wiznet 5500 Ethernet|+|+|+|+|+|+|-|
|Wi-Fi|-|-|+|+|-|-|-|
|Modbus Master|+|+|+|+|+|+|+|
|DHT-22|+|+|+|+|+|?|+|
|CCS811 & HDC1080 - сенсоры влажности и eCO2|+|+|+|+|+|?|+|
|Управление кондиционерами Haier через UART|+|+|+|+|+|+|+|
|Управление задвижками вентиляции с резистором ОС|+|+|+|+|?|?|+|
|SPI-LED адресные ленты|+|+|+|+|+|+|+|
|Watchdog|+|+|?|?|?|?|+|
|Сохранение конфигурации во FLASH|+|+|+|+|-|?|+|
|CAN|-|+|-|+|-|+|-|
|Дискретных входов||||||||
|Аналоговых входов||||||||
|Дискретных выходов||||||||
|PWM выходов||||||||
|OTA|+-Optiboot bootloader|+|+|+|-|-|-|
|Плавное управление DMX|-|+|-|-|-|-|-|
@@ -0,0 +1,74 @@
====== LightServ ======
Это компактный сервер под управлением OS Ubuntu 18
Идеален в качестве домашнего сервера. Не имеет движущихся частей, бесшумен, мощность более чем достаточна для быстрой работы всех серверных приложений, обслуживающих дом.
[[http://ali.pub/488bry|NUC мини-ПК Celeron J3160 комппактный Четырехъядерный безвентиляторный Intel i210AT c поддержкой AES шифрования]] пригодится, если на нем планируете запустить мощный роутер/файрволл с поддержкой VPN
[[http://ali.pub/488cbs|Celeron J1800 J1900 4 ядра 4 Gigabit LAN]] (вариант попроще)
Рекомендуемая конфигурация: 8Gb RAM, 64Gb SSD
В представленном образе предустановлены следующие компоненты:
* Web cервер Apache
* PHP7
* VirtualBox
* Web консоль под VirtualBox
* Images файрволов pfSence, Mikrotik Cloud Hosted Router (без лицензии)
* Image контроллера беспроводного Wifi Cambium
* Docker
* Консоль управления Docker-ом Portainer
* Hassio (Home Assistant, развернутый в докере)c плагином Web Configurator
* NodeRed
* MQTT брокер Mosquitto
* Контроллер беспроводного WiFi TPLink (omada), развернутый как Docker контейнер
Минимальные требования: 2Cores Celeron 1600 64 bit с поддержкой VT-x, 4Gb Ram, 32Gb HDD/SDD
После заливки, сервер готов к использованию совместно с контроллером LightHub
Для заливки сервера необходимо:
* [[https://www.clonezilla.org/downloads/download.php?branch=stable|Скачать образ Clonezilla]]
* Записать его на Flash (min 1Gb) (для windows пользователей можно исп. ПО rufus)
* Загрузить сервер с данной флеш
* Выбрать режим восстановления диска с WebDav сервера (ответы на некоторые вопросы можно найти [[https://any-key.net/clonezilla-instrukciya-na-russkom/]])
* В качестве URL сервера ввести https://files.lazyhome.ru/remote.php/webdav
* Логин - lightserv
* Пароль - спрашивайте в группе телеграм
* Имя образа: 2019-12-12-lightserv
После завершения заливки, попробуйте перезагрузить сервер
После успешной загрузки, зайдите на страницу http://<IP-адрес-сервера>
(IP адрес выдается динамически вашим роутером и его можно посмотреть в настройках DHCP сервера вашего роутера. И тут же привязать к MAC адресу, чтобы он более не менялся. Учтите, что DHCP работает только для порта LAN1)
Если все хорошо, вы увидите такой экран:
{{:screen_shot_2019-12-13_at_2.03.33_am.png?600|}}
----
Далее, он будет являться точкой входа в ваш сервер
после заливки, каждая из программ, требующая авторизации, по-умолчанию, имеет пользователя admin с паролем admin (или admin123 там, где политики требуют более длинного пароля)
Также, данный логин-пароль используется для доступа по ssh
Первое, что необходимо, заменить пароли во всех системах на свои собственные
Также, надо заменить пароль пользователя virtualbox и указать его в /var/www/html/phpvirtualbox/config.php
''nano /var/www/html/phpvirtualbox/config.php''
Для замены паролей вебинтерфейсов - используйте соответствующие настройки этих интерфейсов
Для замены паролей пользователей Linux используйте команду passwd
@@ -0,0 +1,25 @@
Важно, чтобы у вашего контроллера был уникальный MAC адрес.
Это важно не только потому, что в пределах одной локальной сети два контроллера с одинаковыми MAC не могут работать но еще и потому, что при старте, контроллер загружает с сервера конфигураций или с других контроллеров по шине CAN свою настройку, используя MAC как свой уникальный ключ.
У разных аппаратных платформ ситуация с MAC адресами разная:
* ESP8266 и ESP32 и так имеют уникальные адреса, тут ничего мудрить не надо
* DUE и STM имеют уникальный ID каждого чипа, из которого прошивка генерирует уникальный MAC
* Mega2560 не имеет такого ID, но, зато, имеет честный EEPROM, в который при первом запуске этот адрес можно записать и он сохранится на всю жизнь, даже если контроллеру обновлять прошивку
Кроме этого, при компиляции прошивки, можно задать опцию <code>CUSTOM_FIRMWARE_MAC</code> - в этом случае, у прошивки будет такой MAC адрес, как вы задали
Также, MAC адрес можно заменить командой <code>mac DE:22:33:11:22:33</code>, подключившись к контроллеру через [[cli_интерфейс]] (вместо DE:22:33:11:22:33 - ваш адрес)
В случае Mega2560 это будет запомнено навсегда, в случае DUE - до следующей загрузки прошивки.
Замену MAC через опцию либо через команду не тестировал на ESP - там это совсем не нужно.
Для того, чтобы самостоятельно сгенерировать MAC - прочитайте [[https://ru.wikipedia.org/wiki/MAC-%D0%B0%D0%B4%D1%80%D0%B5%D1%81#.D0.A1.D1.82.D1.80.D1.83.D0.BA.D1.82.D1.83.D1.80.D0.B0_MAC-.D0.B0.D0.B4.D1.80.D0.B5.D1.81.D0.B0|Википедию]]
Если коротко, то у самой первой цифры, два младших бита должны быть "10", что соответствует не Multicast адресу, отвязанному от производителя
Если лень считать, возьмите первую цифру Макадреса, например, DE или 02, остальное - придумывайте как хотите
Посмотреть MAC адрес вашего контроллера проще всего, подключившись по USB - он будет выведен при перезагрузке контроллера
См. [[как_lighthub_работает_с_файлом_конфигурации#подключение_по_usb]]
@@ -0,0 +1,57 @@
Initially, LightHub was developed taking in the mind integration with Openhub. Thus that might be cinfigured easy.
All integration done, using MQTT broker as extension of OpenHab's message bus.
First of all, you need to install MQTT binding via "Paper UI" and then configure broker connection for your OpenHab.
The followed examples are for OpenHab 2.
The patch of your configuration files is system-depended.
For examples, for UNIX installations from repository configuration path is /etc/openhab2/
File: services/mqtt.cfg
<code>
# URL to the MQTT broker, e.g. tcp://localhost:1883 or ssl://localhost:8883
mqtt.url=tcp://192.168.88.2:1883
# Optional. User id to authenticate with the broker.
mqtt.user=<user>
# Optional. Password to authenticate with the broker.
mqtt.pwd=<password>
</code>
then configure openhab message bus
File: services/mqtt-eventbus.cfg
<code>
# Name of the broker from mqtt.cfg
broker=mqtt
# Publish command
commandPublishTopic=/myhome/in/${item}
# Receive status
stateSubscribeTopic=/myhome/s_out/${item}
</code>
after such kind of configuring, you can use same items name between OpenHab and LightHub
Example:
File items/demo.item (sor sitemap demo)
<code>
Dimmer bth2 "Ванная люстра [%d %%]" <slider> (gBath,Lights) ["Lighting"]
Color kuh "RGB Вся Кухня" <slider> (gKitchen,Lights) ["Lighting"]
Switch h_entr "Corridor" <heating> (gEntr, Heating) ["Switchable"]
</code>
And appropriate configuration of LightHub items
<code>
{
"dmx":[3,60], //Init 60 channels dmx out on pin 3 (pin def for Mega only)
"items": {
"bth1":[4,[96,0,0]],
"bth2":[4,[96,0,1]], // 4=Modbus dimmer on modbus address 96, Register 0, subchannel 1
"kuh":[1,5], // 1=RGBW DMX channel with base address 5
"h_entr":[5,39,32] //5=thermostat with relay on pin 39 and default temperature preset = 32 degrees Celsium
}
}
</code>
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
@@ -0,0 +1,50 @@
==== OTA ====
Контроллер имеет возможность обновлять свою прошивку "по воздуху" через http [[api]]
Данная возможность доступна для следующих вариантов прошивки:
* due
* lighthub21
* esp32-wifi
* esp8266-wifi
* mega2560-optiboot
* m5stack
Прошивка должна быть скомпилирована с опцией OTA (предкомпилированные версии прошивок для указанных выше окружений уже скомпилированы с такой опцией)
=== Управление размером/опциями прошивки ===
Чтобы прошивка могла успешно обновиться, она должна занимать строго не более 50% flash памяти. Это не является проблемой для всех архитектур, исключая MEGA2560. Данный контроллер имеет очень скромные характеристики, поэтому приходится ужиматься. В пред-компилированной версии для этой архитектуры отключены почти все опциональные модули (DMX, Modbus, 1-wire). Но перекомпилировав проект, можно подключить нужные опции, пожертвовав чем-то еще (например, MDNS)
См файл build-flags/build_flags_mega2560-optiboot с опциями по умолчанию, которые можно переопределить в custom-build-flags/build_flags_mega2560-optiboot
Подробнее про опции компиляции в разделе [[опции_компиляции]]
=== OptiBoot ===
Для того, чтобы Mega2560 имела возможность обновлять сама себе прошивку, необходимо заменить ее штатный кривой бутлоадер на optiboot. Кроме всего прочего, этот загрузчик занимает намного меньше места, чем штатный. Поэтому, если вы зачем-то до сих пор используете Mega - загрузчик лучше обновить (тем более, что у старых штатных загрузчиков не работает watchdog)
Проект Optiboot живет здесь: https://github.com/Optiboot/optiboot
Конкретно вариант для Mega2560 тут: https://github.com/MCUdude/MegaCore
Инструкция для загрузки там имеется. Шить проще всего "штатным" Arduino IDE, используя любую другую AVR Arduino в качестве программатора.
Как ее приспособить для этого, описано тут https://docs.arduino.cc/built-in-examples/arduino-isp/ArduinoISP/
=== Где что лежит ===
Компилированные образы прошивок доступны в папке compiled
Там же размещены примеры скриптов, прошивающих образ (как по кабелю так и OTA)
Тулзы для этого выложены в папке compiled/tools
Пример прошивки по воздуху:
<code>
arduinoOTA -address 192.168.1.2 -port 80 -username arduino -password password -sketch firmware.bin -b -upload /sketch
</code>
В примере приведены username и password по-умолчанию
Пароль необходимо сменить на свой
Задать пароль и сохранить его в NVRAM можно при помощи команды otapwd [[cli_интерфейс]]
для коммита прошивки от 20/05/24 и позднее, можно воспользоваться опциями компиляции DEFAULT_OTA_USERNAME и DEFAULT_OTA_PASSWORD
@@ -0,0 +1,47 @@
В этой Wiki собирается информация по созданию и настройке Умного Дома на основе LightHub
----
Запуск и настройка
* Первое включение или [[как_lighthub_работает_с_файлом_конфигурации]]
* [[интерфейс_настройки]]
* [[конфигурирование]]
* [[примеры_конфигураций]]
* [[аналоговые_входы]]
* [[работа_с_mqtt]]
* [[CLI интерфейс]]
* [[api]]
* [[двойные_тройные_длительные_нажатия]]
* [[несколько_кнопок_на_одном_входе]]
* [[криптоподпись_команды]]
* [[ota_обновление_прошивки_по_воздуху]]
----
Аппаратная часть и сборка
* [[lighthub_на_разном_железе]]
* [[mac_адрес]]
* [[входы_выходы]]
* [[заливка_прошивки]]
* [[опции_компиляции]]
----
Интеграции
* [[openhab|интеграция с OpenHab]]
* [[интеграция_с_homeassistant]]
* [[подключение_1-wire_датчиков]]
* [[настройка_modbus]]
* [[использование_преобразований_map]]
* [[использование_сенсоров_co2_sensair_s8]]
* [[прошивка_для_sonoff]]
----
Прочее
* [[режим_шлюза_ip_modbus]]
* [[пошаговый пример]]
* [[работаем_дистанционно]]
* [[lightserv_заливка_из_образа]]
Каждый зарегистрированный пользователь может внести свой вклад в развитие системы, улучшая и пополняя эту документацию. Присоединяйтесь!
[[как_авторизоваться_в_этой_wiki]] для внесения изменений
@@ -0,0 +1,78 @@
===== Общая информация =====
На разьем X36 контроллера LightHub выведены 12 аналоговых входов и 4 дискретных.
Аналоговые входы: A0-A11, Дискретные - DA12-DA15
Каждый из данных входов защищен от статического электричества и импульсных помех мощным TWS диодом, защищающий вход процессора как от отрицательного напряжения так и от напряжения более 5В
В случае использования процессорной платы DUE на 3,3 Вольт, автоматически, используется дополнительный диод, ограничивающий потенциал на входе процессора до допустимой величины в 3,5В
При необходимости, каждый из данных входов, может быть использован как слаботочный низковольтный выход.
===== Аппаратное конфигурирование =====
Каждый вход может быть настроен для работы в разных режимах путем запаивания специальных контактных дорожек (перемычек) на плате
Для каждого входа предусмотрено две перемычки: подтяжка к GND и подтяжка к VCC (в зависимости от типа процессора, 5 или 3,3 В)
* Вход 0-10 В: запаяна перемычка GND. В этом случае, образуется делитель, при котором максимум значения ADC соответствует, примерно, 10В входного напряжения. В плавающем режиме на входе низкий уровень.
* Датчик протечки: запаяна перемычка VCC. В плавающем режиме, на входе высокий уровень. Между входом и нулем можно подключить проводной датчик протечки. В случае попадания влаги, на входе образуется низкий уровень.
* Плавающий высокоомный вход или выход: перемычки не запаяны. При этом вход измеряет напряжение от 0 до VCC, при более высоком напряжении - входит в насыщение, оставаясь при этом электрически защищенным от перенапряжения.
Также, к данным входам можно подключать датчики типа DHT22 или внешний CAN адаптер
Максимальное напряжение на входе - 24В (уточнить)
===== Программное конфигурирование =====
Входы настраиваются в секции in конфигурации контроллера
Формат:
<code>
"in":{
"pin#": { "T":<type>, "emit":"<emit>", item:"<item>", "scmd": "ON|OFF|TOGGLE|HALT|REST|XON|XOFF", "rcmd": "ON|OFF|TOGGLE|HALT|REST|XON|XOFF", "map":[<in_min>,<in_max>,<out_min>,<out_max>,<noize>]}
}
</code>
== Типы входов ==
- pin# - номер входа ([[входы_выходы|входы-выходы]] , столбец "MPU PIN #")
- <type> - целое число, побитно кодирующее тип входа. (значение по-умолчанию 0):
Для //аналоговых входов//, допустимы следующие значения:
* 66 - Аналоговый вход без встроенной подтяжки
* 64 - Аналоговый вход с подключением встроенного подтягивающего резистора
Для //дискретных входов// применимы следующие значения:
* 0 - дискретный вход с подключением встроенного подтягивающего резистора, **низкий** уровень соответствует значению ON
* 2 - дискретный вход без подключения встроенного подтягивающего резистора, **высокий** уровень соответствует значению ON
* 1 - дискретный вход с подключением встроенного подтягивающего резистора, вход меняет значение между ON и OFF по низкому уровню входного напряжения
* 3 - дискретный вход без подключения встроенного подтягивающего резистора,, вход меняет значение между ON и OFF по высокому уровню входного напряжения
* 4 - датчик температуры и влажности DHT22
* 5 - датчик качества воздуха CCS811
* 6 - датчик температуры и влажности HDC1080
* 8 - COUNTER вход
* 16 - UPTIME вход
==Действия при срабатывании входа (старый метод настройки) ==
- <emit> - имя MQTT топика в который будет выводиться значение при изменениях на входе. Если имя не содержит символа "/",то слева от значения будет автоматически подставлен префикс статусного топика (см. раздел [[работа_с_mqtt]])
- <scmd> - значение, передаваемое в топик при переключении входа в состояние ON (по-умолчанию, ON)
- <rcmd> - значение, передаваемое в топик при переключении входа в состояние OFF (по-умолчанию, OFF)
- <item> - имя канала из секции items которому локально на вход будет передано значение при изменении состояния входа
- <map> - параметр, который позволяет преобразовывать диапазон получаемых значений на аналоговом порту к иному диапазону или к дискретным значениям ON/OFF, подавлять шумы.
Примеры:
<code>
"map":[0,850,0,100] - при получении значения 850 преобразование выдаст на выходе число 100
"map":[100,500,0,256,10] - при изменении входного значения от 100 до 500 преобразование выдаст на выходе число от 0 до 256, флуктуации в пределах 10 единиц между замерами (после преобразования) , будут игнорироваться.
При выходе величины изменения между текущим и предыдущим учтенным замером за пределы шумоподавления, шумоподавление отключается для нескольких последовательных замеров.
"map":[100,500] - при понижении значения ниже 100 будет предприняты действия, аналогично дискретному входу, состояние OFF, при повышении значения выше 500 будет предприняты действия, аналогично дискретному входу, состояние ON
</code>
См. также [[несколько_кнопок_на_одном_входе]]
@@ -0,0 +1,214 @@
===== Электропитание =====
Контроллер имеет на борту DCDC преобразователь, который может обеспечивать питание устройства, а также, воспомогательных приборов от напряжения в диапазоне 12-29В
(Только v2.2) При превышении напряжения 30В, а также, при переполюсовке, сработает защитный TWS диод, замкнув цепь питания, что приведет к отключению самовосстанавливающегося предохранителя контроллера, рассчитанного на ток 1,2А либо к срабатыванию защиты используемого блока питания.
DCDC преобразователь может работать в двух режимах, выбираемых джампером JХ (серый на рисунке ниже)
Если джампер замкнут - выходное напряжение преобразователя составляет 5В, если разомкнут - 7В (на более ранних версиях железа было 9В, но мы уменьшили это значение для меньшего тепловыделения на линейном стабилизаторе устройства)
<del>Процессорная плата Ардуино может питаться как с выхода DCDC преобразователя так и непосредственно от входного питания устройства.
Режим питания платы Ардуино выбирается джампером J4 (желто-фиолетовый на рисунке ниже)
В "желтом" режиме, Ардуино питается с выхода DCDC, в фиолетовом - от входного питания.
_Важно: при использовании второго (фиолетового) режима, контроллер следует питать от источника 12В. Использование источника 24В выведет процессорную плату из строя_
</del>
Внимание: Используйте контроллер версии 2.2 ТОЛЬКО в режиме, когда плата Ардуино питается от DCDC преобразователя. (J4 в Желтом режиме). Испытания показали, что DCDC преобразователь в ином случае работает нестабильно.
Если выбран режим питания Ардуино от DCDC преобразователя, преобразователь должен быть настроен на напряжение 7В (джампер JX разомкнут), так как 5В, в большинстве случаев, недостаточно для стабильной работы Ардуино.
Соответственно, единственное допустимое расположение джамперов: J4 - Желтый режим, JX-разомкнут
В этом режиме напряжение 7В с выхода DCDC преобразователя можно использовать для питания внешних цепей до 2А
<del>Режим преобразователя 5В может быть использован для питания внешней нагрузки током до 2,5А подключенной к винтовым клеммам X24 в том случае, если контроллер запитан от внешнего источника 12В</del>
В данном режиме, входное напряжение питания контроллера: 12-24В
(рекомендуется 12В для уменьшения нагрузки на линейный стабилизатор опорного напряжения 10В)
<del>Возможные конфигурации электропитания
^Входной диапазон ^J4 ^JX ^ Макс. ток UEXT 3.3V ^ Макс. ток UEXT 5V ^Примечание^
|12-24В| DCDC (желтый)| OPEN (9V)|100mA|600mA|На клеммах X24 напряжение 9В|
|12В| Vin (фиолетовый)| OPEN (9В)|100mA|300mA|На клеммах X24 напряжение 9В|
|12В| Vin (фиолетовый)| CLOSED (5В)|300mA|300mA|На клеммах X24 напряжение 5В|</del>
Джампером J2 можно задать напряжение, подаваемое на переферийный разъем стандарта UEXT
Возможны варианты 3,3В (стандартное напряжение UEXT) и 5В (нестандартное, но требуемое для ряда модулей)
См. рисунок ниже.
Контроллер поставляется с перемычками, установленными для работе в диапазоне питающих напряжений 12-24В и UEXT 3,3В
_Внимание: логические уровни сигналов на разъеме UEXT соответствуют применяемой процессорной плате: 5В для MEGA2560 и 3,3В для DUE_
_Подача уровней, превышающие данные значения, могут вывести процессор из строя._
===== Версия платы 2.2 =====
==== Разьемы и джамперы ====
{{ :инфографика.pdf |В PDF}}
{{:lighthub22_pinout.png?600|}}
В этой таблице приведено соответствие физических PIN-ов Arduino Mega/DUE и входов/выходов платы LightHub 2.2
**В конфигурации контроллера пока можно использовать только цифровое значение из столбца MPU PIN**
Выберете по таблице интересующий вход или выход, найдите в таблице номер MPU PIN, его используйте в конфиге
Также, таблица пригодится чтобы преобразовать названия аналоговых каналов в цифровой номер PIN
_Внимание: максимальные уровни сигналов на клеммниках PWM 0-3, PWM 10, и разъеме RJ-45 (UNPROT 0-7) соответствуют применяемой процессорной плате: 5В для MEGA2560 и 3,3В для DUE_
_Подача на данные разъемы напряжений, превышающие данные значения, могут вывести процессор из строя._
_Данные входы не защищены. Подключайте к ним только локальную слаботочную нагрузку_
^Mnenonic ^MPU PIN # ^Plug ^Plug PIN ^Gnd ^Comment ^
|A0|54|X36 (IDC)|3|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A1|55|X36 (IDC)|4|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A2|56|X36 (IDC)|5|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A3|57|X36 (IDC)|6|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A4|58|X36 (IDC)|7|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A5|59|X36 (IDC)|8|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A6|60|X36 (IDC)|9|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A7|61|X36 (IDC)|10|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|-|-|X36 (IDC)|17|13,14,15,16|CAN H - (Начиная с V3.0)|
|-|-|X36 (IDC)|18|13,14,15,16|CAN L - (Начиная с V3.0)|
|A8|62|X36 (IDC)|19|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A9|63|X36 (IDC)|20|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A10|64|X36 (IDC)|21|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A11|65|X36 (IDC)|22|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|DA12|66|X36 (IDC)|23|13,14,15,16|Дискретный защищенный вход (слаботочный выход)|
|DA13|67|X36 (IDC)|24|13,14,15,16|Дискретный защищенный вход (слаботочный выход)- не использовать в случае использования CAN (начиная с V3.0)|
|DA14|68|X36 (IDC)|25|13,14,15,16|Дискретный защищенный вход (слаботочный выход) - не использовать в случае использования CAN (начиная с V3.0)|
|DA15|69|X36 (IDC)|26|13,14,15,16|Дискретный защищенный вход (выход)|
|+10V|-|X36 (IDC26)|2|1|Опорное напряжение 10В|
|POUT0|22|X15||X14|Мощный дискретный выход|
|POUT1|23|X16|||Мощный дискретный выход|
|POUT2|24|X17|||Мощный дискретный выход|
|POUT3|25|X18|||Мощный дискретный выход|
|POUT4|9|X19|||Мощный PWM выход. Продублирован слаботочным на X11|
|POUT5|8|X20|||Мощный PWM выход. Продублирован слаботочным на X10|
|POUT6|11|X21|||Мощный PWM выход. Продублирован слаботочным на X12|
|POUT7|12|X22|||Мощный PWM выход. Продублирован слаботочным на X13|
|PWM0|4|X7|||Незащищенный PWM вход/выход |
|PWM1|5|X6|||Незащищенный PWM вход/выход |
|PWM2|6|X8|||Незащищенный PWM вход/выход |
|PWM3|7|X9|||Незащищенный PWM вход/выход |
|PWM10|10|X414|||Незащищенный PWM вход/выход |
|UNPROT0|33|X35 (RJ45)|1|Shield|Незащищенный дискретный вход/выход|
|UNPROT1|32|X35 (RJ45)|2||Незащищенный дискретный вход/выход |
|UNPROT2|31|X35 (RJ45)|3||Незащищенный дискретный вход/выход |
|UNPROT3|30|X35 (RJ45)|4||Незащищенный дискретный вход/выход |
|UNPROT4|29|X35 (RJ45)|5||Незащищенный дискретный вход/выход |
|UNPROT5|28|X35 (RJ45)|6||Незащищенный дискретный вход/выход |
|UNPROT6|27|X35 (RJ45)|7||Незащищенный дискретный вход/выход |
|UNPROT7|26|X35 (RJ45)|8||Незащищенный дискретный вход/выход |
|IN0|42|X27 (IDC26)|14|13|Опторазвязанный вход двухпроводный|
|IN1|44|X27 (IDC26)|12|11|Опторазвязанный вход двухпроводный|
|IN2|46|X27 (IDC26)|10|9|Опторазвязанный вход двухпроводный|
|IN3|48|X27 (IDC26)|8|7|Опторазвязанный вход двухпроводный|
|IN4|43|X27 (IDC26)|6|1|Опторазвязанный вход|
|IN5|45|X27 (IDC26)|5|1|Опторазвязанный вход|
|IN6|47|X27 (IDC26)|4|1|Опторазвязанный вход|
|IN7|49|X27 (IDC26)|3|1|Опторазвязанный вход|
|IN8|34|X27 (IDC26)|22|21|Опторазвязанный вход двухпроводный|
|IN9|36|X27 (IDC26)|20|17|Опторазвязанный вход двухпроводный|
|IN10|38|X27 (IDC26)|18|19|Опторазвязанный вход двухпроводный|
|IN11|40|X27 (IDC26)|16|15|Опторазвязанный вход двухпроводный|
|IN12|35|X27 (IDC26)|26|1|Опторазвязанный вход|
|IN13|37|X27 (IDC26)|25|1|Опторазвязанный вход|
|IN14|39|X27 (IDC26)|24|1|Опторазвязанный вход|
|IN15|41|X27 (IDC26)|23|1|Опторазвязанный вход|
|+10V|-|X27 (IDC26)|2|1|Опорное напряжение 10В|
==== Варианты подключения к дискретным входам ====
Для гальванической развязки дискретных входов, использованы симметричные оптроны. Симметричные - это значит они открываются либо положительным либо отрицательным потенциалом (3-12В).
Это позволяет использовать фактически любые контактные или потенциальные датчики, соединенные как с плюсом питания так и с нулем.
8 из 16-ти оптронов (IN4-IN7, IN12-IN15) соединены одним общим проводом, который выведен на pin1 разьема Х27
Другие 8 оптронов (IN0-IN3, IN8-IN11) выведены обоими контактами на соответствующие выходы разьема X27, согласно таблице выше
Последовательно с входом оптрона установлен токоограничивающий резистор
Опционально, может быть запаян резистор "0 ом" с нижней стороны платы, который соединит Pin1 с общим проводом контроллера, но в стандартной поставке это не делается для сохранения универсальности.
Соответственно:
* Pin1 нужно самостоятельно подключить к общему нулю системы вовне контроллера - тогда входы (IN4-IN7, IN12-IN15) будут активироваться подачей напряжения 3-12В на соответствующие контакты X27 (например, на контакт 6 для активации входа IN4)
* Либо Pin1 можно подключить к источнику опорного напряжения 10В (Pin2) а соответствующий вход активировать соединением его с нулем. (Внимание, сначала при помощи омметра убедитесь что не впаян опциональный резистор, соединяющий Pin0 с нулем контроллера)
Для работы со входами (IN0-IN3, IN8-IN11) обратный контакт этих входов надо, также, подключить либо к нулю либо к опорному напряжению (X27 Pin 13, 11, 9, 7, 21, 17, 19, 15) по аналогии с Pin1
Это можно сделать как при помощи перемычек на клеммнике, так и запаивая специально выведенные джамперы на верхней стороне платы (возле оптронов)
Запаивание джампера подключает обратный вход соответствующего оптрона к Pin1, обьединяя его с общей группой входов
Возможность полностью гальванически изолировать контролируемый сигнал от контура LightHub бывает очень важна для обеспечения безопасности или помехозащищенности. Например, вы контролируете цепи, гальванически связанные с электросетью или удаленные обьекты, обьединение нулевых проводов которых с нулем контроллера крайне нежелательно (концевики ворот, например)
В этом случае, используйте входы (IN0-IN3, IN8-IN11) не подключая обратный контакт входа к цепям контроллера. Используйте два выделенных провода, чтобы подключить вход к контролируемому устройству.
===== Версия платы 2.0 (устаревшая) =====
==== Разьемы и джамперы ====
{{:lighthub2pinout.jpeg|}}
В этой таблице приведено соответствие физических PIN-ов Arduino Mega/DUE и входов/выходов платы LightHub 2.0
**В конфигурации контроллера пока можно использовать только цифровое значение из столбца MPU PIN**
Выберете по таблице интересующий вход или выход, найдите в таблице номер MPU PIN, его используйте в конфиге
Также, таблица пригодится чтобы преобразовать названия аналоговых каналов в цифровой номер PIN
====Таблица контактов====
^Mnenonic ^MPU PIN # ^Plug ^Plug PIN ^Gnd ^Comment ^
|A0|54|X36 (IDC)|1|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A1|55|X36 (IDC)|2|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A2|56|X36 (IDC)|3|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A3|57|X36 (IDC)|4|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A4|58|X36 (IDC)|5|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A5|59|X36 (IDC)|6|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A6|60|X36 (IDC)|7|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A7|61|X36 (IDC)|8|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A8|62|X36 (IDC)|19|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A9|63|X36 (IDC)|20|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A10|64|X36 (IDC)|21|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|A11|65|X36 (IDC)|22|13,14,15,16|Аналоговый защищенный вход (слаботочный выход)|
|DA12|66|X36 (IDC)|23|13,14,15,16|Дискретный защищенный вход (слаботочный выход)|
|DA13|67|X36 (IDC)|24|13,14,15,16|Дискретный защищенный вход (слаботочный выход)|
|DA14|68|X36 (IDC)|25|13,14,15,16|Дискретный защищенный вход (слаботочный выход)|
|DA15|69|X36 (IDC)|26|13,14,15,16|Дискретный защищенный вход (выход)|
|POUT0|22|X15||X14|Мощный дискретный выход|
|POUT1|23|X16|||Мощный дискретный выход|
|POUT2|24|X17|||Мощный дискретный выход|
|POUT3|25|X18|||Мощный дискретный выход|
|POUT4|9|X19|||Мощный PWM выход. Продублирован слаботочным на X11|
|POUT5|8|X20|||Мощный PWM выход. Продублирован слаботочным на X10|
|POUT6|11|X21|||Мощный PWM выход. Продублирован слаботочным на X12|
|POUT7|12|X22|||Мощный PWM выход. Продублирован слаботочным на X13|
|PWM0|4|X7|||Незащищенный PWM вход/выход |
|PWM1|5|X6|||Незащищенный PWM вход/выход |
|PWM2|6|X8|||Незащищенный PWM вход/выход |
|PWM3|7|X9|||Незащищенный PWM вход/выход |
|UNPROT0|33|X35 (RJ45)|1|Shield|Незащищенный дискретный вход/выход|
|UNPROT1|31|X35 (RJ45)|2||Незащищенный дискретный вход/выход |
|UNPROT2|32|X35 (RJ45)|3||Незащищенный дискретный вход/выход |
|UNPROT3|30|X35 (RJ45)|4||Незащищенный дискретный вход/выход |
|UNPROT4|29|X35 (RJ45)|5||Незащищенный дискретный вход/выход |
|UNPROT5|28|X35 (RJ45)|6||Незащищенный дискретный вход/выход |
|UNPROT6|27|X35 (RJ45)|7||Незащищенный дискретный вход/выход |
|UNPROT7|26|X35 (RJ45)|8||Незащищенный дискретный вход/выход |
|IN0|42|X27 (IDC26)|12|11|Опторазвязанный вход двухпроводный|
|IN1|44|X27 (IDC26)|10|9|Опторазвязанный вход двухпроводный|
|IN2|46|X27 (IDC26)|8|7|Опторазвязанный вход двухпроводный|
|IN3|49|X27 (IDC26)|6|5|Опторазвязанный вход двухпроводный|
|IN4|43|X27 (IDC26)|4|25,26|Опторазвязанный вход|
|IN5|45|X27 (IDC26)|3|25,26|Опторазвязанный вход|
|IN6|47|X27 (IDC26)|2|25,26|Опторазвязанный вход|
|IN7|48|X27 (IDC26)|1|25,26|Опторазвязанный вход|
|IN8|34|X27 (IDC26)|20|19|Опторазвязанный вход двухпроводный|
|IN9|36|X27 (IDC26)|18|15|Опторазвязанный вход двухпроводный|
|IN10|38|X27 (IDC26)|16|17|Опторазвязанный вход двухпроводный|
|IN11|40|X27 (IDC26)|14|13|Опторазвязанный вход двухпроводный|
|IN12|35|X27 (IDC26)|24|25,26|Опторазвязанный вход|
|IN13|37|X27 (IDC26)|23|25,26|Опторазвязанный вход|
|IN14|39|X27 (IDC26)|22|25,26|Опторазвязанный вход|
|IN15|41|X27 (IDC26)|21|25,26|Опторазвязанный вход|
@@ -0,0 +1,94 @@
Начиная с [[https://github.com/anklimov/lighthub/commit/0044b741ac9f6fb8fc4b1ff8388e47c8bb8efd9b|этого коммита]] у прошивки появилась возможность отслеживать одинарные, двойные, тройные, долгие нажатия
Конечный автомат, согласно которому реализован алгоритм, приведен на рисунке
{{ :btnautomate_2_.png?800 |}}
Фрагмент конфига (раздел in, на примере pin 68), который задает обработчики для нажатий, приведен ниже.
Каждое событие описывается JSON объектом или массивом JSON обьектов.
Внутри объекта, возможны следующие строковые параметры:
==Типы нажатий==
* scmd - начало первого нажатия
* rcmd - конец первого нажатия
* lcmd - первое длительное нажатие
* click - одиночное нажатие
* dclick - двойное нажатие
* tclick - тройное нажатие
* scmd2 - начало двойного нажатия
* scmd3 - начало тройного нажатия
* lcmd2 - второе длительное нажатие
* lcmd3 - третье длительное нажатие
* rpcmd - цикл первого длительного нажатия
* rpcmd2 - цикл второго длительного нажатия
* rpcmd3 - цикл третьего длительного нажатия
==Параметры обработчика нажатий==
* emit - MQTT топик в который отправить значение из параметра ecmd (если в параметре отсутствует / он будет дополнен слева префиксом статусного топика)
* ecmd - MQTT payload
* erev - если параметр задан, значения ecmd и erev будут подставляться попеременно для каждого нажатия. Позволяет обеспечить, например, увеличение и уменьшение яркости лампы одной клавишей.
* item - имя локального устройства из items (может содержать суффикс для указания того, какое именно свойство объекта надо изменить. Например: "lamp/hue" или "lamp/sat")
* icmd - команда для локального устройства (ON | OFF | HALT | REST | XON | XOFF | INCREASE | DECREASE | %<цифра> и т.д)
* irev - если параметр задан, значения icmd и irev будут подставляться попеременно для каждого нажатия. Позволяет обеспечить, например, увеличение и уменьшение яркости лампы одной клавишей.
<code>
"68":{"T":0,
"scmd":{"emit":"cmd","ecmd":"scmd"},
"rcmd":{"emit":"cmd","ecmd":"rcmd"},
"lcmd":{"emit":"cmd","ecmd":"lcmd"},
"click":{"emit":"cmd","ecmd":"click","item":"a_bedr","icmd":"TOGGLE"},
"dclick":[{"emit":"myhome/in/bedr","ecmd":"TOGGLE"},{"emit":"myhome/in/bedrspot","ecmd":"TOGGLE"}],
"tclick":{"item":"spi","icmd":"TOGGLE"},
"scmd2":{"emit":"cmd","ecmd":"scmd2"},
"scmd3":{"emit":"cmd","ecmd":"scmd3"},
"lcmd2":{"emit":"cmd","ecmd":"lcmd2"},
"lcmd3":{"emit":"cmd","ecmd":"lcmd3"},
"rpcmd":{"item":"a_bedr","icmd":"INCREASE"},
"rpcmd2":{"item":"a_bedr","icmd":"DECREASE"},
"rpcmd3":{"emit":"cmd","ecmd":"rpcmd3"}
},
</code>
Еще пример:
* Длительное нажатие через раз увеличивает или уменьшает яркость группы ligth (суффикс set позволяет менять яркость не включая канал, если он выключен)
* Соответственно, длительное нажатие через двойной или тройной клик позволяет так же управлять цветом и насыщенностью
* Двойное и тройное нажатие без удерживания включают/выключают группы kuhktc и gstall соответственно
* Команда %-Х уменьшает параметр на Х пунктов, соответственно %+Х увеличивает
<code>
"63":{"T":2,
"click":{"item":"light","icmd":"TOGGLE"},
"rpcmd":{"item":"light/set","icmd":"%+5","irev":"%-5"},
"rpcmd2":{"item":"light/hue","icmd":"%+5","irev":"%-5"},
"rpcmd3":{"item":"light/sat","icmd":"%+5","irev":"%-5"},
"dclick":{"item":"kuhktc/cmd","icmd":"TOGGLE"},
"tclick":{"item":"gstall","icmd":"TOGGLE"}},
</code>
Еще пара полезных примеров для обычных (не кнопочных) выключателей
В первом - кратковременное выключение выключателя включает белый свет на полную (повторное - включает максимально насыщенный цвет и яркость 30%)
Во втором - совсем упрощенный вариант - для одноцветных ламп - лампа через раз включается на 30 и на 100 процентов яркости
<code>
"56":{"T":2,
"scmd":{"item":"bedr","icmd":"ON"},
"scmd2":[{"item":"bedr","icmd":"100","irev":"30"},{"item":"bedr/sat","icmd":"0","irev":"100"}],
"rcmd":{"item":"bedr","icmd":"OFF"}},
"60":{"T":2,
"scmd":{"item":"bedrspot","icmd":"100","irev":"30"},
"rcmd":{"item":"bedrspot","icmd":"OFF"}},
</code>
@@ -0,0 +1,177 @@
===== Заливка уже откомпилированной прошивки =====
В первую очередь необходимо скачать сам проект.
Это можно сделать либо с использованием утилиты git:
<code>
git clone https://github.com/anklimov/lighthub.git
</code>
Либо, если у вас она не установлена - открываем [[https://github.com/anklimov/lighthub]]
Далее, нажимаем зеленую кнопку "Clone or download"
Выбираем пункт "Download ZIP", скачиваем и распаковываем архив
Переходим в директорию lighthub-master/compiled/<требуемая_платформа> (список платформ выше)
Подключаете плату USB кабелем к компьютеру (кроме платформы NRF52 - там программирование только при помощи специального устройства JLink, об этом позже)
В диспетчере устройств находите порт, на который села плата (например, com3)
корректируете номер порта в файле upload.bat, который находится в директории, в которую вы вошли
Запускаете файл на выполнение (если выдается запрос "нажмите любую клавишу" - нажимаете)
Прошивка должна загрузиться в ваш контроллер.
===== Компиляция и заливка с использованием platformio + Atom или VSC =====
Проект создан с использование Platformio , аналога Arduino IDE.
Сперва необходимо скачать Visual Studio Code или Atom, установить Platformio в качестве плагина. В интернете много материалов и видеоуроков на эту тему. Скорее всего потребуется установить клиент Git (Для Windows https://git-scm.com/download/win).
Далее, как и в предыдущем случае, необходимо скачать сам проект.
Проект создан с использование Platformio , аналога Arduino IDE.
Это можно сделать либо с использованием утилиты git:
<code>
git clone https://github.com/anklimov/lighthub.git
</code>
Либо, если у вас она не установлена - открываем [[https://github.com/anklimov/lighthub]]
Далее, нажимаем зеленую кнопку "Clone or download"
Выбираем пункт "Download ZIP", скачиваем и распаковываем архив
В Atom или VSC выбираем пункт "Открыть директорию" (Open Folder), и указываем директорию lighthub.master (или в директорию lighthub если использовался git)
Далее, выбираем файл platformio.ini и раскомментариваем в нем нужный вам вариант платформы (платы) в пункте env_default (убираем ; перед строкой, содержащей нужную платформу, добавляем - перед строкой, содержащей ненужные платформы)
NEW - если используете среду VSC (рекомендуется) - то можете ничего не комментировать/раскомментировать а просто выбрать нужную платформу в меню "switch PlatformIO Project environment" (нажмите на Default (lighthub) в самом ннизу экрана)
**Для платформы DUE:** обязательно придется найти фаил variant.cpp по пути
<nowiki>
.platformio/packages/framework-arduinosam/variants/arduino_due_x
</nowiki>
и вставить в него __последней строкой__ следующую строку
<code>
void USART0_Handler(void) __attribute__((weak));
</code>
сохранить.
(К сожалению, внести это простое изменение в штатный репозиторий arduino не удалось никому из тех, кто создавал Pull request)
Нажимаем кнопку "Build"
Platformio скачивает все нужные библиотеки и компилирует код. Возможно придется несколько раз повторить эту операцию, так как по непонятным причинам, platformio может выдавать ошибки, не скачав какую-то библиотеку.
Если компиляция прошла успешно, можно подключить плату USB кабелем и нажать кнопку Upload
===== Компиляция и заливка с использованием platformio. Вариант командная строка =====
Для того что бы прошить плату в первую очередь необходимо скачать сам проект [[https://github.com/anklimov/lighthub]] и установить Platformio
* Если Вы считатет себя джедаем и не ищете легких путей то работать с платформио можно через командную строку. Для этого нужно:
- установить Python 2.7,
- установить git.
* Модифицировать PATH. идем: мой компьютер->правой кнопокой мыши вызываем контекстное меню->свойства->в появившемся окне "переменные среды"-> в окне "Системные переменные" выбираем переменную Path ->изменить->добавляем строку
<code>
;C:\Python27;C:\Python27\Scripts
</code>
* Установить Platformio открываем командную строку (поиск в "Пуске" cmd.exe) вводим команду
<code> pip install -U platformio </code>
Учтите, что Platformio установится по умолчанию в папку пользователя <code> С:\Пользователи\Имя пользователя\.platformio</code> Python 2.7 не поддерживает кириллицу, если имя пользователя написано кириллицей, необходимо скопировать папку Platformio в корень диска C:\ и изменить путь к рабочему каталогу в фале platformio.ini (который находится в ранее скачанной папке lighthub-master), указав после строки [platformio] следующую строку: <code>home_dir = C:\.platformio</code>
Сохраняем файл.
Открываем папку lighthub-master, в строке отображающей путь вводим cmd и нажимаем enter или же выбираем папку в командной строке любым другим способом.
**Для платформы DUE:** обязательно придется найти фаил variant.cpp по пути
<nowiki>
.platformio/packages/framework-arduinosam/variants/arduino_due_x
</nowiki>
и вставить в него __последней строкой__ следующую строку
<code>
void USART0_Handler(void) __attribute__((weak));
</code>
сохранить.
Далее вводим <code>pio run -e <платформа></code>
Вариант <платформа> выберете в зависимости от используемой аппаратной платформы.
<code>
; Arduino Mega (without one-wire driver) + Ethernet shield Wiznet 5100
; Компактная сборка для Mega2560
; mega2560slim-5100
; Arduino Mega + Ethernet shield Wiznet 5100
; mega2560-5100
; Arduino Mega + Ethernet shield Wiznet 5500
; mega2560-5500
; LightHub controller HW revision 2.1 and above (Wiznet 5500 CS on pin 53)
; Если у вас плата LightHub версии 2.1 или более новая + DUE - используйте эту конфигурацию
; **lighthub21**
; Arduino DUE + Ethernet shield Wiznet 5100 or 5200 or 5500
; Предпочтительный вариант для DUE с Ethernet Shield (не для платы LightHub), базированный на универсальном драйвере
; **due**
; Arduino DUE + Ethernet shield Wiznet 5100
; вариант для DUE с Ethernet Shield 5100 (старый драйвер, будет убран в следующем релизе)
; due-5100
; Arduino DUE + Ethernet shield Wiznet 5500
; вариант для DUE с Ethernet Shield 5500 (старый драйвер, будет убран в следующем релизе)
; due-5500
; ESP 8266
; **esp8266-wifi**
; ESP-32
; **esp32-wifi**
; M5Stack core (ESP32 based)
; m5stack
; Controllino
; controllino
; STM32 board + ENC28j60 network
; stm32-enc2860
; NRF52 board + Wiznet 5500 network
; nrf52840-5500
</code>
Пример: "due-5100" - это плата Arduino DUE + Ethernet Shield v1 на чипе Wiznet-5100
**В общем случае, используйте варианты без указания 5100 или 5500 - в этом случае будет использован универсальный драйвер Wiznet**
Если плата LightHub версии 2.1 или выше то используйте опцию "lighthub21"
Проект должен скомпилироваться без ошибок.
**ЧАСТО Platformio выдает ошибки на ровном месте (не находит какие-либо файлы). В этом случае, повторный запуск компиляции часто решает эту проблему**
Если ошибок нет вводим <code>pio run -e <платформа> -t upload</code>
Программа должна залиться в аппаратную платформу.
Если возникли ошибки:
Попробовать очистить папку с библиотеками .piolibdeps и .pioenv удалив все их содержимое
===== Использование Arduino IDE для компиляции и заливки прошивки =====
Это достаточно трудоемкий процесс, который требует, чтобы вы вручную установили массу библиотек в IDE.
platformio - намного более гибкое и профессиональное средство - лучше и проще использовать его.
Если для кого-то будет важно освоить именно этот метод - пишите, мы пополним инструкцию.
Если возникают проблемы - пишите на форуме или в [[https://t.me/lighthub|группу Телеграмм]]
(Вы, также, можете улучшать эту инструкцию)
@@ -0,0 +1,352 @@
Контроллер LightHub прекрасно интегрируется в систему Home Assistant с использованием MQTT
В настоящее время, реализованы и используются следующие интеграции:
* Реле и дискретные выключатели
* Диммируемые одноцветные светильники
* Диммируемые цветные светильники (RGB/RGBW/RGBWW)
* Термостаты теплого пола, помещений
* Кондиционер
* Увлажнитель
* Сенсоры температуры
* Сенсоры влажности
* Сенсоры CO2
* Любые устройства, управляемые по протоколу Modbus
Документация скорректирована, так как HA внес большие изменения в компонент MQTT в 2023 году
Параметры брокера теперь настраиваются только через пользовательский интерфейс в разделе Настройки/Интеграции и в файле конфигурации настройки следует убрать
Теперь предполагается, что настройки MQTT вынесены в отдельный файл mqtt.yaml
который подгружается директивой
<code>
mqtt: !include mqtt.yaml
</code>
В файле configuration.yaml
Это, действительно, удобнее.
Далее, даны примеры разделов файла mqtt.yaml, которые можно скорректировать и использовать для своих нужд
===== Сенсоры =====
В примерах ниже:
Имя контроллера: light-d2
Предположим, что к этому контроллеру подключен датчик качества воздуха CCS811 и HDC1080 и в конфиге контроллера для этого заданы такие вот настройки:
"98":{"T":5,"emit":"myhome/sensor/airq"},
"99":{"T":6,"emit":"myhome/sensor/humidity"}
Также, на pin3 подключен сенсор температуры и влажности dht-22, расположенный в ванной, с такой вот настройкой в JSON конфиге контроллера:
"3":{"T":4,"emit":"dht"},
ну и к шине 1-wire подключен термометр в прихожей
"ow":{"28EEA76713160204":{"emit":"t_aentr"}
}
В этом случае, конфигурация HomeAssistant будет выглядеть вот таким образом:
<code>
sensor:
- name: "CO2"
icon: "mdi:periodic-table-co2"
expire_after: 600
state_topic: "myhome/sensor/airq/CO2"
unit_of_measurement: 'ppm'
availability_topic: "myhome/light-d2/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "TVOC"
expire_after: 600
state_topic: "myhome/sensor/airq/TVOC"
unit_of_measurement: 'ppm'
availability_topic: "myhome/light-d2/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Влажность"
icon: "mdi:water-percent"
expire_after: 600
state_topic: "myhome/sensor/humidity/H"
unit_of_measurement: '%'
availability_topic: "myhome/light-d2/$state"
payload_available: "ready"
payload_not_available: "disconnected"
- name: "Влажность ванная DHT"
icon: "mdi:water-percent"
expire_after: 600
state_topic: "myhome/s_out/dhtH"
unit_of_measurement: '%'
- name: "Воздух ванная DHT"
icon: "mdi:thermometer"
expire_after: 600
state_topic: "myhome/s_out/dhtT"
unit_of_measurement: '°C'
- name: "Воздух прихожая DS"
icon: "mdi:thermometer"
expire_after: 600
state_topic: "myhome/s_out/t_aentr"
unit_of_measurement: '°C'
</code>
===== Светильники =====
<code>
light:
# дискретный выключатель света (вкл-выкл)
- name: "Прихожая"
state_topic: "myhome/s_out/spots_en"
command_topic: "myhome/in/spots_en"
qos: 1
# Диммируемый одноцветный светильник
- name: Кухня точки
command_topic: "myhome/in/ktc/cmd"
state_topic: "myhome/s_out/ktc/cmd"
# brightness_scale: 100 - начиная с версии 3.0.0 контроллера, настройка не нужна
brightness_command_topic: "myhome/in/ktc/set"
brightness_state_topic: "myhome/s_out/ktc/set"
# Цветной LED светильник
- name: Кухня LED
command_topic: "myhome/in/kuh/cmd"
state_topic: "myhome/s_out/kuh/cmd"
hs_command_topic: "myhome/in/kuh/set"
hs_state_topic: "myhome/s_out/kuh/set"
hs_value_template: "{%set a=value.split(',')%}
{% if a[1] -%}
{{a[0]+','+a[1]}}
{%- endif %}"
brightness_command_topic: "myhome/in/kuh/set"
brightness_state_topic: "myhome/s_out/kuh/set"
brightness_value_template: "{{ value.split(',')[2] }}"
color_temp_value_template: "{{ value.split(',')[3] }}" # Опционально
color_temp_command_topic: "myhome/in/kuh/temp" # Опционально
color_temp_state_topic: "myhome/s_out/kuh/set" # Опционально
#Новая версия интеграции. Поддерживает не только HSV но и RGBW нотацию цвета.
#Полезно, если на DMX вход контроллера подключена сенсорная панель, которая выдает значения каждого из каналов в отдельности
#- то есть RGBW. В этом случае контроллер прозрачно транслирует такой цвет в статусный топик, добавляя признак RGB в начало payload
# предполагается имя контроллера light
- name: Кухня по новому LED
command_topic: "myhome/light/kuh/cmd"
state_topic: "myhome/s_out/kuh/cmd"
hs_command_topic: "myhome/light/kuh/set"
hs_state_topic: "myhome/s_out/kuh/set"
brightness_command_topic: "myhome/light/kuh/set"
brightness_state_topic: "myhome/s_out/kuh/set"
color_temp_command_topic: "myhome/light/kuh/temp"
color_temp_state_topic: "myhome/s_out/kuh/set"
rgbw_state_topic: "myhome/s_out/kuh/set"
hs_value_template: "{%if not value is match('RGB')%}
{%set a=value.split(',')%}
{%if a[1]%}
{{a[0]+','+a[1]}}
{%endif%}
{% endif %}"
brightness_value_template: "{%if not value is match('RGB')%}
{%set a=value.split(',')%}
{% if a[2] %}
{{ a[2] }}
{% endif %}
{% endif %}"
color_temp_value_template: "{%if not value is match('RGB')%}
{%set a=value.split(',')%}
{% if a[3] %}
{{ a[3] }}
{% endif %}
{% endif %}"
rgbw_value_template: "{%if value is match('RGB')%}
{{value.split()[1]}}
{% endif %}"
</code>
===== Выключатели =====
<code>
switch:
- name: "Air heat"
icon: "mdi:radiator"
state_topic: "myhome/s_out/fm_t/cmd"
command_topic: "myhome/in/fm_t/cmd"
- name: "Air auto"
icon: "mdi:auto-fix"
state_topic: "myhome/s_out/fm_auto"
command_topic: "myhome/in/fm_auto"
- name: "Перекрыть воду"
icon: "mdi:water-off"
state_topic: "myhome/s_out/alock_leak"
command_topic: "myhome/in/alock"
qos: 1
- name: "Сушилки"
icon: "mdi:radiator"
state_topic: "myhome/s_out/h_polotenc"
command_topic: "myhome/in/h_polotenc"
qos: 1
- name: "Бойлер большой"
state_topic: "myhome/s_out/h_boil1"
command_topic: "myhome/in/h_boil1"
qos: 1
- name: "Бойлер малый"
state_topic: "myhome/s_out/h_boil2"
command_topic: "myhome/in/h_boil2"
qos: 1
</code>
===== Климат и термостаты =====
<code>
climate:
- name: Кондиционер
modes:
- "off"
- "cool"
- "fan_only"
- "heat"
- "auto"
fan_modes:
- "auto"
- "high"
- "medium"
- "low"
swing_modes:
- "on"
- "off"
swing_mode_state_topic: "myhome/s_out/ac/swing"
swing_mode_command_topic: "myhome/in/ac/swing"
swing_mode_state_template: "{{value|lower()}}"
mode_command_topic: "myhome/in/ac/cmd"
mode_state_topic: "myhome/s_out/ac/cmd"
mode_state_template: "{{value|lower()}}"
temperature_command_topic: "myhome/in/ac/set"
temperature_state_topic: "myhome/s_out/ac/set"
fan_mode_command_topic: "myhome/in/ac/fan"
fan_mode_state_topic: "myhome/s_out/ac/fan"
fan_mode_state_template: "{{value|lower()}}"
current_temperature_topic: "myhome/s_out/ac/temp"
- name: "Теплый пол душ"
modes:
- "off"
- "heat"
- "auto"
mode_command_topic: "myhome/in/h_bath1/cmd"
temperature_command_topic: "myhome/in/h_bath1/set"
mode_state_topic: "myhome/s_out/h_bath1/cmd"
mode_state_template: "{{value|lower()}}"
temperature_state_topic: "myhome/s_out/h_bath1/set"
current_temperature_topic: "myhome/s_out/t_bath1"
- name: "Климат спальня"
modes:
- "off"
- "heat"
- "auto"
- "cool"
- "fan_only"
mode_command_topic: "myhome/in/c_bedr/cmd"
temperature_command_topic: "myhome/in/c_bedr/set"
mode_state_topic: "myhome/s_out/c_bedr/cmd"
mode_state_template: "{{value|lower()}}"
temperature_state_topic: "myhome/s_out/c_bedr/set"
current_temperature_topic: "myhome/s_out/t_bedr"
</code>
===== Увлажнитель =====
<code>
humidifier:
- name: "Увлажнитель пар"
command_topic: "myhome/plug00/reghum/cmd"
state_topic: "myhome/s_out/reghum/cmd"
target_humidity_command_topic: "myhome/plug00/reghum/set"
target_humidity_state_topic: "myhome/s_out/reghum/set"
current_humidity_topic: "myhome/s_out/plughum"
max_humidity: 60
min_humidity: 20
</code>
===== Приточка =====
<code>
climate:
- name: Вентиляция
modes:
- "off"
- "fan_only"
- "heat"
- "auto"
mode_command_topic: "myhome/in/fm/cmd"
mode_state_topic: "myhome/s_out/fm/cmd"
mode_state_template: "{{value|lower()}}"
temperature_command_topic: "myhome/in/fm_t/set"
temperature_state_topic: "myhome/s_out/fm_t/set"
current_temperature_topic: "myhome/s_out/fm_stat"
current_temperature_template: "{{ value_json.t }}"
sensor:
- name: "Heater power"
state_topic: "myhome/s_out/fm_stat"
icon: "mdi:radiator"
unit_of_measurement: '%'
value_template: "{{ value_json.pwr }}"
- name: "Fan RPM"
icon: "mdi:fan"
state_topic: "myhome/s_out/fm_stat"
unit_of_measurement: 'RPM'
value_template: "{{ value_json.RPM }}"
- name: "Fan Current"
icon: "mdi:current-ac"
state_topic: "myhome/s_out/fm_stat"
unit_of_measurement: 'A'
value_template: "{{ value_json.I }}"
- name: "Fan Fault"
icon: "mdi:alert"
state_topic: "myhome/s_out/fm_stat"
value_template: "{{ value_json.flt }}"
# - platform: mqtt
# name: "Fan Temp"
# state_topic: "myhome/s_out/fm_stat"
# unit_of_measurement: '°C'
# value_template: "{{ value_json.t }}"
# - platform: mqtt
# name: "Fan Temp set"
# state_topic: "myhome/s_out/fm_stat"
# unit_of_measurement: '°C'
# value_template: "{{ value_json.set }}"
</code>
@@ -0,0 +1,78 @@
==== Интерфейс настройки контроллера ====
Постоянная память контроллера слишком мала, чтобы на ней можно было разместить полноценный интерфейс по его настройке.
Точнее, это можно сделать, но в ущерб функциональности, занимая ценную память и ресурсы для веб содержимого, совершенно бесполезного, когда контроллер уже настроен и просто работает
Поэтому Страница настройки изначально отсутствовала, вместо этого конфигурацию можно задавать через "портал" - https://lazyhome.ru/portal - Это описано тут [[как_lighthub_работает_с_файлом_конфигурации#простой_метод_настройки_-_через_портал_lazyhomeru]]
Но это не единственный способ
После того, как у контроллера появился HTTP API, стало возможным использование браузера для настройки
Для настройки контроллера, можно обратиться на его адрес. Например
* http://192.168.1.55
* http://lighthub.local
контроллер отрабатывая этот запрос, подгрузит страницу управления с публичного ресурса, а уже она будет использовать [[API]] контроллера в вашей локальной сети
* Первый недостаток - адрес надо знать и помнить
* Второй - зависимость от интернета и внешнего ресурса
* Главный недостаток: Начиная с последних версий браузера chrome данный способ перестал работать, так как google ужесточила требования к безопасности и запретила страницам, загруженным из интернета, обращаться к ресурсам локальной сети
Тем не менее, метод продолжает работать на браузере fireFox
Недавно я исследовал еще одну возможность сделать удобной настройку контроллеров в локальной сети - установив плагин для браузера chrome (для fireFox, также, это возможно)
===== Плагин для браузера =====
Преимущества:
* Весь веб-контент лежит внутри плагина, в вашем браузере. Кроме того, что не требуется доступ в интернет, решается и вопрос безопасности - chrome позволяет браузеру использовать [[API]] контроллера в локальной сети
* Появляется возможность поиска контроллеров в вашей локальной сети, так как в них давно реализован протокол MDNS
Недостаток тут только один - надо потратить 5 минут на установку этого плагина.
Так как браузер не имеет прав просканировать локальную сеть на предмет наличия контроллеров, плагин использует утилиту zeroconf_lookup которая была разработана в рамках открытого проекта https://github.com/railduino/zeroconf-lookup
На базе этого проекта, я сделал прототип плагина для конфигурирования контроллеров lighthub
https://github.com/anklimov/zeroconf-lighthub
Плагин состоит из двух частей:
* Собственно плагин браузера
* Утилита поиска zeroconf-lookup
==== Скачивание проекта ====
Скачивание и разархивирование надо сделать перед началом всех последующих действий
- На странице проекта https://github.com/anklimov/zeroconf-lighthub скачиваем архив (нажать зеленую кнопку Code и выбрать download ZIP)
- Разархивируем в какую-либо папку, которую вы в дальнейшем не будете удалять (например \Users\youName\plugin)
- (если вы разработчик - вместо предыдущих двух пунктов, вы, конечно, предпочтете использовать утилиту git)<code>git clone https://github.com/anklimov/zeroconf-lighthub</code>
==== Как установить плагин: ====
* Установить из магазина приложений Chrome (чуть позже выложу)
* Установить из папки, скачанной с ГитХаб в режиме разработчика. Это не сильно сложнее, но позволит дорабатывать плагин (очень надеюсь на то, что кто-то будет его дорабатывать, я не веб разработчик).
* Для этого открываем браузер chrome, в меню "расширения" выбираем "управление расширениями".
* Включаем переключатель "режим разработчика",
* нажимаем кнопку"Загрузить распакованное расширение".
* Выбираем папку __zeroconf-lighthub-master/Chrome__ в распакованном на предыдущем этапе архиве
* Расширение устанавливается, заглядываем на страницу его свойств и копируем идентификатор расширения (например gepnlbipogackhpjkojhkonkijdgpgji ) это нам пригодится чуть позже
==== Как установить утилиту: ====
==== Windows ====
- Переходите в каталог __zeroconf-lighthub-master\Windows_Go__
- Из командной строки запускаете - <code>zeroconf_lookup.exe -i -с gepnlbipogackhpjkojhkonkijdgpgji</code> (тут укажите ваш идентификатор расширения, скопированный на предыдущем этапе)
- После этого переносить данный файл с этого места или удалять папку нельзя
- Если ставили плагин из магазина приложений - можно при запуске не указывать идентификатор расширения. <code>zeroconf_lookup.exe -i</code>
===== MacOS =====
то же самое, только выполнимый файл лежит в директории __zeroconf-lighthub/Apple_Go__
==== Использование ====
Теперь все просто - нажимаем на иконку расширения - оно сканирует сеть и выдает перечень всех контроллеров онлайн в локальной сети (и не только контроллеров - любых устройств, которые заявляют о себе)
Для входа в настройки контроллера надо нажать Edit напротив него в списке
@@ -0,0 +1,141 @@
====== Использование преобразований map ======
Внутри контроллера команды и значения между каналами передаются в унифицированном виде (см itemCmd)
Но для управления реальными устройствами, данные необходимо конвертировать из унифицированного вида в формат, который понимает устройство и наоборот
Для этого существует механизм преобразований, который может производить как конвертацию значений так и переобразования между командами и значениями
Первое место, где используются преобразования - это интеграция Modbus v2. см [[настройка_modbus]] это обьясняется тем, что в Modbus все взаимодействие с устройством происходит через регистры, в которые пишутся, либо, из которых считываются числовые значения.
==== Типы преобразований ====
Предусмотрено два типа преобразований - **преобразования команды** и **преобразование значения**
Также, существуют два направления преобразования - **прямое** (когда из унифицированного вида создается значение для записи в устройство) и **обратное** - когда считанное из устройства значение преобразуется в унифицированный вид
Преобразование определяется при помощи JSON обьекта "map" который добавляется в описание регистра устройства в разделе конфигурирования modbus. Разберем на примерах:
<code>
"fanspeed" :{"reg":40000,"map":{"val":[1,255,1,5],"cmd":[["OFF",0]]},"id":7},
</code>
**прямое преобразование:**
При управлении fanspeed (напрямую, в нотации <item>/fanspeed/set или через суффикс №7 (fan) в нотации <item>/fan), сперва произойдет попытка преобразования команды
В случае, если передана команда OFF, в регистр 40000 будет записано значение 0
В противном случае, осуществляется попытка преобразовать переданное значение, конвертировав его из шкалы 1-255 в шкалу 1-5
если в результате преобразований будет получено число - произойдет запись в указанный регистр модбас.
при считывании значения из регистра, будет происходить **обратное преобразование**
При этом, те же правила применяются в обратном направлении.
Сначала производится попытка преобразовать полученное из регистра значение в команду. В случае неуспеха - в число.
В примере выше - если считано значение 0 - оно будет преобразовано в команду OFF
в случае не успешного преобразования в команду будет осуществлено обратное преобразование значения из шкалы 1-5 в шкалу 1-255
Следует отметить, что если преобразование типа "val" не указано, то число, прочитанное из регистра, будет передано на выход без преобразования - именно в том виде, как оно было прочитано из регистра. При этом, преобразование считается выполненным успешно и "сценарий по умолчанию" (def) выполнен не будет.
Данное поведение можно отменить, задав null для преобразования значения, как указано в примере ниже.
Это приведет к тому, что при невозможности преобразовать полученное значение в команду, преобразование в число производиться не будет и отработает "сценарий по умолчанию" (def)
<code>
"acon":{"reg":40003,"map":{"cmd":[1,["OFF",0]],"val":null,"def":40001},"id":8},
</code>
Для этого примера преобразования будут действовать следующим образом:
Прямое:
Команда OFF приведет к записи 0 в регистр 40003
Любая другая команда или значение будут проигнорированы
Обратное:
Если из регистра 40003 считан ноль, он будет преобразован в команду OFF.
любые другие значения будут проигнорированы. Преобразование при этом будет считаться не успешным. и будет выполнен "сценарий по умолчанию", заданный в параметре "def" обьекта "map".
==== Сценарии преобразования по умолчанию ====
Этот параметр (используется только для обратных преобразований modbus) применяется в том случае, если для считанного из регистра значения не удалось применить преобразование. В этом случае, можно использовать значение, считанное из иного регистра.
Параметр def может иметь либо цифровое либо строковое значение. В случае цифрового значения - задается номер регистра. в случае строкового значения - задается имя параметра. Логика работы сценария по умолчанию немного разная для данных двух случаев.
**цифровое значение:**
Контроллер пытается найти считанное из modbus значение в текущем буфере (на тот случай, если данное значение было считано в одном цикле опроса командой чтения нескольких последовательных регистров)
Если значение не было считано, регистр считывается отдельно.
Для примера выше, требуется, чтобы номер регистра (40001), также, был определен. Например, таким образом:
<code>
"acmode" :{"reg":40001,"map":{"cmd":[["FAN_ONLY",1],["HEAT",4],["COOL",2],["AUTO",8]]},"id":8},
</code>
Соответственно, в случае если значение регистра 40003 не нулевое (сработал "сценарий по умолчанию") - будет прочитан регистр 40001, полученное из него значение будет преобразовано к соответствующей команде, результат данного преобразования будет возвращен как результат преобразования первого параметра (acon)
Данное поведение, тем не менее, не отменяет стандартной логики того, что когда произойдет опрос регистра 40001 (если его опрос задан в параметре poll устройства) - будут произведены все преобразования из параметра acmode, которые будут переданы на обработку, если acmode описан в разделе items файла конфигурации.
**строковое значение:**
В этом случае, используется последнее, ранее считанное, значение, сохраненное в параметре, имя которого указано в параметре def. Для данного значения, производятся преобразования, определенные для данного параметра и их результат возвращается как результат преобразования первого параметра.
В примере ниже, если значение coil 0 равно нулю - обратное преобразование сразу вернет команду OFF
Иначе, так как преобразование в число отменено (val=null), преобразование для параметра pwr будет считаться не успешным и контроллер посмотрит ранее считанное значение регистра 1, из параметра описанного в acmode, применит все указанные для регистра acmode преобразования и их результат вернет для параметра pwr
важно: параметр acmode должен быть описан в разделе items, даже если сам по себе он ни для каких действий более не используется. достаточно в данном описании поставить пустой JSON обьект - именно в нем контроллер сохраняет ранее считанные значения)
<code>
"pwr":{"coil":0,"map":{"cmd":[1,["OFF",0]],"val":null, "def":"acmode"},"id":1},
"acmode":{"reg":1,"map":{"cmd":[["FAN_ONLY",4],["HEAT",2],["COOL",1],["DRY",3],["AUTO",5]],"val":null},"id":1},
</code>
===== Ограничения диапазона при линейном преобразовании значений =====
В простейшем случае, в параметре val задается массив, содержащий 4 значения
<code>
"val":[вход_мин, вход_макс, выход_мин, выход_макс]
</code>
например
<code>
"val":[1, 5, 1, 255]
</code>
В случае прямого преобразования, числа 1,2,3,4,5 будут преобразованы к 1, 64, 128, 195, 255
В случае обратного - числа из интервала 1-64 к 1, 65-128 к 2, 129-195 к 3, 196-254 к 4 и 255 к 5
NEW
если входное значение не укладывается в указанные границы - преобразование считается не успешным. То есть в примере выше, если на вход преобразования придет число 0 или 6 то оно не сработает.
можно определить значения, которые будут являться результатом преобразования если. входное значение меньше минимума или больше максимума диапазона преобразования
<code>
"val":[вход_мин, вход_макс, выход_мин, выход_макс, вход<мин_прямое, вых<мин_обратное, вход>макс_прямое, вых>макс_обратное]
</code>
соответственно, используя данный синтаксис, можно доработать пример выше таким образом, что значение 0 будет транслироваться в 0 как в прямом так и в обратном направлении
<code>
"val":[1, 5, 1, 255, 0, 0]
</code>
Параметры подставляемые при срабатывании ограничений не обязательны. Если какие-то требуется пропустить - можно указать null
===== Предопределенные шаблоны преобразований =====
==== Шаблон "cmd":"fan" ====
данный шаблон в случае прямого преобразования позволяет провести трансляцию стандартных команд OFF, LOW, MEDIUM, HIGH в значения 0, 20, 128, 255 соответственно
Для обратного преобразования:
Значения 0, 1-127, 128-254, 255 преобразуются в OFF, LOW, MEDIUM, HIGH
<code>
"fanspeed":{"reg":42,"type":"u8l","id":7,"map":{"cmd":"fan"}},
</code>
@@ -0,0 +1,72 @@
====== Сенсоры Sensair S8 ======
Сенсоры Sensair S8 достаточно компактны, точны, и удобны в использовании в качестве датчиков CO2 в воздухе
Кроме этого, они оборудованы встроенным интерфейсом Modbus RTU, а значит их легко подключить на общую шину и опрашивать контроллером LightHub
Сенсор можно напрямую подключить к UART контроллера (с уровнями 3.3 В) но это не слишком целесообразно. В этом случае, один сенсор занимает один порт UART (к которому более ничего не подключишь) и длина проводов для такого подключения ограничена несколькими метрами
Целесообразнее использовать шину RS-485. На контроллерах LightHub уже установлен драйвер этой шины. Одна и та же шина может использоваться как для опроса сенсоров так и для управления совместимыми устройствами (диммерами, реле, вентиляцией) а также, взаимодействия с настенными панелями управления.
Аналогичный драйвер надо установить у каждого сенсора Sensair. Для электрического сопряжения выходов Sensair с шиной.
Для тех, кому не хочется это делать самостоятельно - на Али есть [[http://alli.pub/6gk062|готовая конструкция]]
===== Изменение Slave ID =====
Также, для того, чтобы собрать несколько сенсоров Sensair на одну шину, им надо задать разный Slave ID
Это представляет собой некоторый квест, но ознакомившись с материалом ниже, его можно пройти:
The default address of the module is 254(0xFE) and the baud rate is 9600 bps. Please refer to the manual below.
https://rmtplusstoragesenseair.blob.core.windows.net/docs/Dev/publicerat/TDE2067.pdf
Senseair provides UIP5 software for demo purposes. You can download it if needed.
https://senseair.com/products/size-counts/s8-lp/
You need to change the slave Modbus address with the non-standard command if multiple sensors would be connected to the same RS485 bus.
https://github.com/letscontrolit/ESPEasy/issues/1475
====== Далее, пример конфига LightHub ======
Пример использует общий широковещательный адрес 254, на который откликается каждое Modbus устройство. Поэтому будет работать только если кроме одного Sensair на шине ничего нет
После того, как по инструкции выше (на GitHub) запрограммируете индивидуальный адрес устройства - его надо указать вместо 254
<code>
{
"mqtt":["esp32","m2m.eclipse.org"],
"items": {
"sensair1":[14,[254,
"sensair",
{"co2":{"emit":"co2"}}
]
]
},
"modbus":
{
"sensair":{"baud":9600,
"poll":{"irs":[[0,3],21,[25,30]],"regs":[0,1,31],"delay":5000},
"par":{
"co2":{"ir":3},
"meterStat":{"ir":0},
"alarmStat":{"ir":1},
"outStat":{"ir":0},
"pwm":{"ir":21},
"typeid":{"ir":25,"type":"u32"},
"mapver":{"ir":27},
"fwver":{"ir":28},
"sensorid":{"ir":29,"type":"u32"},
"ack":{"reg":0},
"command":{"reg":1},
"abc":{"reg":31}
}
}
}
}
</code>
@@ -0,0 +1,107 @@
===== Первое включение =====
По-умолчанию, контроллер получает динамический адрес локальной сети по DHCP
При этом, он записывает его в энергонезависимую память. И если при очередном перезапуске, DHCP сервер не доступен - он будет использовать последний известный IP адрес.
Если надо определить статический адрес (а, также, GW, DNS, NetMask), это можно сделать при помощи команды ip в [[cli_интерфейс]]
Адрес будет сохранен в энергонезависимую память контроллера.
При включении, контроллер сначала проверяет наличие записанного в памяти конфигурационного файла. (У нового контроллера, а также, после перезаливки прошивки, конфигурационный файл отсутствует (кроме mega2560, в случае этого контроллера, конфигурация не утрачивается в процессе перепрошивки)). Затем контроллер поднимает сетевые интерфейсы, подключается к интернету, идет на сайт lazyhome.ru и пытается скачать конфигурационный файл JSON для своего МАС-адреса. (данное поведение можно отключить при помощи cli команды get OFF)
====Создание конфигурационного файла ====
Для того чтобы начать, можете просто использовать примеры [[https://www.lazyhome.ru/dokuwiki/doku.php?id=примеры_конфигураций]], а затем доработать их по своему усмотрению
Чтобы загрузить/отредактировать конфигурацию контроллера есть несколько методов:
==== Простой метод настройки - через портал lazyhome.ru ====
Для создания конфигурационного файла заходим на lazyhome.ru в свой аккаунт (после регистрации на сайте) и на странице [[https://www.lazyhome.ru/portal|Личный Кабинет]] создаем конфигурационный файл для своего контроллера, нажав кнопку "создать" и указав его [[mac_адрес]] Тогда контроллер при перезагрузке получит настройку и сможет начать работать в этой конфигурации.
Далее, надо просто подключить контроллер к роутеру, имеющему выход в Интернет. После перезапуска, контроллер загрузит настройки с сайта lazyhome.ru.
Для того, чтобы быстро начать работу, этого достаточно.
В дальнейшем, Автоматическую загрузку конфига можно отменить при помощи команды <code>get OFF</code> в [[cli_интерфейс]] или изменив конфиг через web интерфейс контроллера
==== Автономный метод настройки - веб интерфейс/плагин браузера ====
Также, редактировать конфигурацию, управлять режимами, перегружать контроллер можно, зайдя в веб интерфейс на адрес контроллера по http через браузер (рекомендован firefox) или установив плагин браузера Chrome (рекомендуется)
Подробности тут: [[интерфейс_настройки]]
==== Дополнительные возможности ====
Также можно разместить настройки на своем собственном http сервере, в папке cnf. Формат имени файла: http://MY_CONFIG_SERVER/cnf/12-12-12-12-12-12.config.json (вместо 12-12-12-12-12-12 ваш mac адрес)
После этого выполнить через CLI команду <code>get <MY_CONFIG_SERVER></code>
Контроллер запомнит ваш сервер и далее, будет загружать обновление конфига из этого источника. (на платформах STM, NRF пока не сохраняется)
===== Сохранение настроек в постоянную память контроллера =====
По-умолчанию, успешно загруженный конфиг автоматически сохраняется в энергонезависимую память контроллера.
После этого контроллер готов к автономной работе.
При загрузке конфигурации проверяется наличие изменений - если в памяти сохранен тот же конфиг, что имеется на портале, повторная загрузка и сохранение не происходит.
Данное поведение можно изменить при помощи команды save в [[cli_интерфейс]]
<code>
save ON - включить автосохранение конфига (по умолчанию)
save OFF - выключить автосохранение конфига
save - сохранить текущий конфиг
</code>
Есть три способа подключения к контроллеру для управления: по USB, через MQTT и через HTTP [[api]]. Рассмотрим их подробнее.
===== Подключение по USB =====
Подключаем контроллер USB кабелем к ноутбуку. Открываем эмулятор терминала (например для Макбука использую minicom, который устанавливается через homebrew).
Для улучшения читаемости ответов контроллера в minicom нажимаем комбинацию Esc+U
''$ minicom -D /dev/tty.usbmodem14201''
Для windows можно использовать putty или терминал, входящий в среду разработки PlatfrmIO
Параметры подключения - 115200 бод, N-8-1
После подключения, контроллер отвечает:
<code>
Got IP address:192.168.88.44, Default config server used: lazyhome.ru
Config URI: http://lazyhome.ru/cnf/de-71-d5-9a-93-96.config.json
HTTP Status code: 404
Config retrieving failed
Loading Config from EEPROM No stored config </code>
Видим, что контроллер пытается считать конфиг для своего MAC-адреса de-71-d5-9a-93-96.config.json, и его там не находит (404 ошибка).
После того как мы сформировали конфиг на портале lazyhome.ru, контроллер нам ответит что все хорошо и сохранит конфиг.
===== Подключение по MQTT =====
Если контроллер уже успешно подключен к MQTT брокеру, то команду CLI можно направить в топик $command.
см [[работа_с_mqtt#служебные_топики]]
===== Рабочий режим =====
During normal operation, controller:
* Accepting incoming MQTT message flow and retrieving item name from topic name. For example, /myhome/in/item1 will control "item1"
* Controlling items.
* Most commands, accepted on INTOPIC passed throw to OUTTOPIC after interpretation. Interpretation is converting of high level commands like ON OFF HALT REST to low-level commands with real values. OUTTOPIC publishing uses "persistent" flag to allow retrieving recent status from MQTT broker after restart of controller
* Polling: Normally, Modbus devices and 1-wire thermometers are polled with reasonable interval. Retrieved values are publishing to OUTTOPIC
===== Цветовая индикация режимов работы =====
Контроллер LightHub имеет трехцветный светодиод, который наглядно показывает текущий режим работы контроллера
* красный - отсутствует подключение по локальной сети
* желтый - контроллер подключен к локальной сети но не подключен к MQTT брокеру
* зеленый - контроллер подключен к брокеру
* вспышки синего - получены инструкции по MQTT
* вспышки красного - ошибки в процессе работы (изучить отладотчный лог)
* постоянное свечение - конфигурация не загружена
* мигание с интервалом 2-3 секунды - конфигурация загружена и в работе
То есть, например, мигание красным цветом с интервалом 2-3 секунды означает, что контроллер отключен от локальной сети, но продолжает локальную работу по имеющемуся на борту файлу конфигурации
@@ -0,0 +1,16 @@
Каждый зарегистрированный пользователь https://lazyhome.ru может использовать свой логин и пароль для авторизации в этой Wiki
Просто нажмите кнопку "Войти" в правом верхнем углу Wiki и введите логин и пароль от портала LazyHome. По умолчанию, все зарегистрированные пользователи портала могут вносить изменения в Wiki, в том числе, создавать новые статьи
Авторизация позволяет вносить изменения, улучшать материалы, представленные здесь. Это важно. Если вы с чем то разобрались - запишите это на память в Wiki.
Если ваш аккаунт на сайте создан автоматически, например, при первом входе через аккаунт Google - у вас не установлен пароль и залогиниться на Wiki не получится
Обходится проблема легко.
После автологина, надо нажать «показать профиль» возле кнопки «выйти», затем «изменить профиль» и задать произвольный пароль (не надо, чтобы он совпадал с гугловым).
Логин через Гугл будет все равно работать. Обратите внимание на логин (он формируется автоматически как часть email (та что до собаки) и случайное число.
С этим логином и установленным паролем можно нормально залогиниться на wiki. Если поставить галочку «запомнить меня» - больше долго не будет задавать глупых вопросов.
Для добавления новой статьи Wiki просто введите название статьи в строке поиска. Если статья не будет найдена - система предложит ее создать.
@@ -0,0 +1,206 @@
==== Основные разделы конфигурационного файла ====
Конфигурационный файл позволяет настроить контроллер lighthub конкретно для выполнения Вашей задачи. Может быть загружен в контроллер разными способами - портал lazyhome.ru/portal, веб-интерфейс контроллера, http API, плагин браузера.
Подробности тут [[как_lighthub_работает_с_файлом_конфигурации]]
Конфигурационный файл имеет формат JSON. На первом уровне файла конфигурации задаются следующие объекты:
^имя ^ назначений ^ параметры ^ пример ^
|mqtt| настройка параметров MQTT|[имя_контроллера,ip_брокера,логин,пароль] см [[работа_с_mqtt]] NB: пароль, также, может быть определен через [[CLI интерфейс]], чтобы не компрометировать в открытом файле конфигурации|"mqtt":["lighthub-07","m2m.eclipse.org"]|
|ow| настройка сенсоров 1-wire|в качестве параметра - JSON объект, содержащий в качестве ключа адрес термометра а в качестве значения - execObj (см ниже), определяющий куда передать показания термометра| [[конфигурирование#настройка_температурных_датчиков_1-wire]]|
|syslog|Настройка логгирования контроллера через UDP syslog на сторонний сервер|первый элемент массива - ip адрес сервера логгирования, второй (опционально) порт|"syslog":["192.168.88.2"]|
|dmx|Настройка DMX выхода|[кол-во каналов], для mega2560 возможна такая настройка: [выходной_pin_DMX, кл-во-каналов]|"dmx":[80],|
|dmxin|настройка входа DMX|масссив названий каналов типа DMXRGBW|"dmxin":["led5","led6","led7","led8"]|
|artnet|Настройка Artnet шлюза|[начальный DMX канал (соответствует 1-му каналу artnet),конечный DMX канал|"artnet":[48,67]|
|topics|задает настройки топиков MQTT.|root: корневой топик (myhome по умолчанию), bcst: броадкаст топик (in по-умолчанию) | "topics":{"root":"flat2"} см [[работа_с_mqtt#пример_настройки_mqtt_в_json_конфигурации]]|
|modbus|Задает справочник обьектов modbus|описание тут|[[настройка_modbus]]|
|in|задает настройку входов контроллера|описание тут|[[аналоговые_входы]] [[несколько_кнопок_на_одном_входе]]|
|items|Основной раздел конфигурации. Задает список обьектов, их настройку и взаимосвязь||описание ниже|
|can|настройка CAN|addr:адрес контроллера name: имя контроллера conf:набор конфигураций для подчиненных NO-IP устройств||
====Что такое {execObj}====
Прежде чем далее описывать структуру файла настройки, необходимо определить такое понятие как {execObj}, которое довольно часто будет использоваться далее.
Это JSON объект, или массив JSON обьектов, который может принимать на вход какое-либо значение или команду в унифицированном формате контроллера, а далее, предпринимать с этой информацией какие то действия. А именно:
* Выдавать в MQTT на один или несколько топиков
* Передавать на вход другим объектам контроллера
* Передавать по шине CAN
параметры:
* emit - MQTT топик в который отправить значение из параметра ecmd (если в параметре отсутствует / он будет дополнен слева префиксом статусного топика)
* item - имя локального устройства из items (может содержать суффикс для указания того, какое именно свойство объекта надо изменить. Например: «lamp/hue» или «lamp/sat»)
* can - передать команду другому контроллеру, подключенному по шине CAN. Должен быть указан массив, первое значение которого - CAN ID контроллера назначения (или 0 для передачи всем); второе значение - ItemID управляемого обьекта на контроллере назначения, третий (опциональный) - суффикс (например "set", "cmd", "fan"; четвертый (опциональный) - порядковый номер subItem для тех обьектов, которые управляют массивом устройств, например MULTIVENT или HUM
Примеры:
<code>
{"emit":"edem/edem3/p_zal3/mode"}
[{"emit":"t_bath3","item":"tbath3"},{"item":"p_bedr3/floor_temp","can":[0,206,"val"]]
</code>
====Настройка температурных датчиков 1-wire====
формат: "device#":{execObj}
Ниже пример конфигурации (в реальном файле конфигурации комментарии не допускаются)
<code>
{
"mqtt":["mqtt_id","host",port,"user","pass"], //ip address/name and client id of mqtt broker. Port, user, pass - are optional
// 1-Wire configuration chapter. "device#":{"emit":"mqtt topic suffix to report temp. measurements", "item":"local ite$
"ow":{
"284811170400005B":{"emit":"t_entr"}, //reports temp to mqtt /myhome/s_out/t_entr
"28FFF95533160459":{"emit":"t_bath1","item":"h_bath1"},
},
</code>
В данном примере определены два термодатчика. Температура первого будет передаваться в статусный топик myhome/s_out/t_entr, а второго - в топик myhome/s_out/t_bath1 и, кроме того, на внутренний обьект h_bath (по-умолчанию, в суффикс val)
====Настройка объектов (items)====
Каждый объект lightHub описывается в разделе items конфигурационного файла в виде JSON массива
<code>
"itemname":[<#type>,<itemConfig>,<set>,<cmd>]
</code>
Только первые два элемента массива - тип и конфигурация, являются обязательными
^номер элемента массива ^назначение^
|1|тип обьекта. Это может быть как число из таблицы ниже так и строка, содержащая аббревиатуру типа|
|2|конфигурация объекта. В зависимости от его типа это может быть как число так и массив параметров (pins, address etc)|
|3|текущая уставка (int or array of presets)|
|4|текущая команда|
^# типа ^ аббревиатура типа ^ описание ^ конфигурация объекта ^
|0| DMX|DMX out 1-5 ch|стартовый номер DMX канала или массив каналов|
|1| DMXRGBW |DMX out 4 ch|стартовый номер DMX канала|
|2| DMXRGB |DMX out 3 ch||
|3| PWM |PWM output 1-5 каналов|номер пина или массив пинов|
|4| MBUSDIM|Modbus AC Dimmer (legacy)||
|5| THERMO|Simple ON/OFF thermostat|номер пина|
|6| RELAY |ON_OFF relay output|номер пина|
|7| GROUP |Group pseudochannel|массив строк с названиями каналов в группе|
|8| VCTEMP|Vacom PID thermo - regulator (Ventilation set)|"fm_t":[8,"fm"]|
|9| MBUSVC |Vacom modbus motor regulator(legacy)|"fm":[9,[10,"a_ext"]]|
|10|ACHAIER|Air Conditioner Haier|"ac_3":[10,[<port#>,{"mode":{"emit":"mode"},"speed":{"emit":"speed"},"temp":{"emit":"set"}}]]}|
|11|SPILED | SPI LED strip||
|12|MOTOR |Motorized air gateway with feedback resistor|"airgate":[12,[<pwm_pin>,<pin>,<pin_feedback>,<feedbackOffVal>,<feedbackOnVal>,<maxMotorTimeMs>]],|
|13|PID |PID regulator|[ [P,I,D,dT,alarmTO, alarmVal, outMin, outMax],{Output execObj},{Cascade execObj}]|
|14|MBUS |Universal Modbus channel|"t_balk3":[14,[<addr>,<"template">,{<"param1">:{execObj},...}]]|
|15|UARTBRDG |Bridge between 2 UARTS with reporting PDUs to Wireshark via UDP||
|16|RELAYPWM |Slow PWM relay to control objects with inertia| "rbedr21": [16, [<pin>,<cycleSec>], 255, 1]|
|17|DMXRGBWW |DMX RGBWW channel (warm&cold white)||
|18|VENTS |Multiroom ventilation set||
|19|ELEVATOR |Reserved||
|20|COUNTER |Generic counter| "pumpctr":[20,[0.02,1.2]],"gasctr":[20,0]|
|21|HUM |Humidifier (reserved)||
|22|MERCURY|Mercury energy meter/RS485 interface|"merc":[22,[<addr>,9600,"8N1",2,[2,2,2,2,2,2],10000]]|
Address is channel depended. Pin# for relay, DMX address for DMX-512 channel, array for Modbus channel.
In case of DMX item note that addressees are continuous numbering between decoders and start address of each decoders configurable by jumpers. E.g. if you have two 24-ch decoders and want to control all 48 channels then you must set address "1" on the first decoder and "25" on the second.
<code>
"items":{
// Example of array
"all":[7,["h_entr","h_bath1","h_bath2","h_balk1","h_balk2","h_boil1","h_boil2","h_polotenc","spots_en"]]
// Examples of Thermostate items [type,pin,temperatureC]
"h_bath1":[5,24,33],
"h_bath2":[5,34,32],
"h_entr" :[5,35,32],
"h_balk1":[5,25,28],
"h_balk2":["THERMO",27,28],
// Examples of relay items [type, pin, preset, default command]
"h_boil1":[6,23], // simple relay on pin 23
"h_boil2":["RELAY",28,1,1], // relay, turned on by default (after reboot)
"h_polotenc":[6,26,1,1],
"spots_en":[6,22,1,1],
"light_en":[6,29,1,1],
"water":[6,36,1,1]
},
</code>
===== конфигурирование входов =====
<code>
// "in" syntax
// "pin": { "T":type, "emit":"out_emit", item:"out_item", "scmd": "ON,OFF,TOGGLE,INCREASE,DECREASE", "rcmd": "ON,OFF,TO$
//
//Switch/Restore all
//"pin": { "T":1, "emit":"/myhome/in/all", item:"local_all", "scmd": "OFF", "rcmd": "RESTORE"}
//
//Normal (not button) Switch (toggled mode)
//"pin": { "T":1, "emit":"/light1", item:"light1", "scmd": "TOGGLE", "rcmd": "TOGGLE"} //not deployed yet
//Normal (not button) Switch
//"pin": { "T":0, "emit":"/light1", item:"light1", "scmd": "ON", "rcmd": "OFF"}
// or
// "pin": { "T":0, "emit":"/light1", item:"light1"}
//or
// "pin": { "emit":"/light1", item:"light1"}
//1-Button dimmer //not deployed yet
//"pin": { "T":1, "emit":"/light1", item:"light1", "scmd": "ON", srcmd:"INCREASE",rrcmd:"DECREASE", "rcmd": "OFF"}
//2-Buttons dimmer
//"pin1": { "T":0, "emit":"/light1", item:"light1", "scmd": "ON", repcmd:"INCREASE"}
//"pin2": { "T":0, "emit":"/light1", item:"light1", "scmd": "OFF", repcmd:"INCREASE"}
"in":{
"41":{"T":0,"emit":"/myhome/in/all","scmd":"HALT","rcmd":"REST"}, //Emits HALT on close contact, REST on open
"37":{"item":"spots_en","scmd":"TOGGLE","rcmd":"TOGGLE"}, //Toggle on/off local spots every changing state of PIN
"38":{"emit":"/myhome/in/light","scmd":"TOGGLE","rcmd":"TOGGLE"}, //Toggle remote light on local switch
"40":{"T":1,"emit":"/myhome/out/all","scmd":"HALT","rcmd":"REST"}, ////not deployed yet
"39":{"emit":"/myhome/s_out/water_leak"}
}
}
</code>
==== Modbus channel v1 ====
данный тип канала устарел, драйвер modbus v2 дает существенно бОльшую гибкость, см [[настройка_modbus]]
Тем не. менее, этот тип канала может использоваться для простых применений, когда надо сделать простой проброс канала в регистр устройства Modbus с линейным пересчетом значения.
===настройка канала типа №4 - Modbus Dimmer===
If you just need to write some Modbus register on MQTT command & poll it back with simple scaling - you can use item type #4 (Modbus dimmer)
Config example (refer https://github.com/anklimov/lighthub/wiki/Configuring):
<code>
{
"items": {
"bth1":[4,[96,0,0,255]]
},
"mqtt":["lighthub-07","m2m.eclipse.org"]
}
</code>
Note: this config example available at URL http://lazyhome.ru/de-ad-be-ef-fe-07.config.json - so just set mac address of device by command “mac de:ad:be:ef:fe:07” for test.
Item notation:
* 4 - Modbus dimmer item type
* Param1: = 96 - Decimal address of modbus device
* Param2: = 0 - Modbus register to write (and read while polling)
* Param3: = 0 - mask (optional. Default value “-1” - see below for explanations)
* Param4:= 255 - Maximum Value for scaling MQTT input value = 100 to register value (Optional. Default MaxValue 0x3f. It is equivalent of “100" on input. If value == 0 - no scaling)
Mask:
if mask == 1 - Value comes to most significant byte of 16 bit register word, another byte = 0xff
if mask == 0 - Value comes to least significant byte of 16 bit register word, another byte = 0xff
any other mask - put Value as 16 bit word without any modification
if mask == -1 (or parameter omitted) - no register polling
Note: Serial line parameters for itemtype 4 is 9600:8N1 (look for “dimPar" and “MODBUS_SERIAL_BAUD” definitions in compilation options if you need to change it)
=== Vacom 10 frequency driver===
См. также два устаревших типа Modbus каналов:
Vacom 10 frequency driver (from Danfos) via Modbus RTU and allows control frequency (item type = 9) and Vacom internal PID controller (item type = 8 - used for Temperature control)
Additionally, performing polling parameters from Vacom and publishing in JSON format to status MQTT Topic
@@ -0,0 +1,31 @@
В том случае, если надо гарантировать, что, даже получив доступ к локальной сети, MQTT брокеру или HTTP API, потенциальный злоумышленник не сможет выполнить критичную команду (например, открытие ворот), можно использовать механизм цифровой подписи команды.
Для задействования режима, необходимо пересобрать прошивку, добавив в приватный файл опций компиляции ([[опции_компиляции]]) (пример custom-build-flags/build_flags_lighthub21 для сборки под lighthub21) следующие опции (приведен пример):
<code>
-D CRYPT
-D PROTECTED_PINS=16,21
-D SHAREDSECRET=big_secret
</code>
====Как работает режим:====
* Каждый контроллер, один раз в 30 секунд, передает в MQTT топик <mqtt_root>/<controller_name>/$salt случайное число, полученное с истинного датчика случайных чисел. Данное число (далее <Salt>) должно сохраняться авторизованной стороной и использоваться при создании цифровой подписи.
* Авторизованная сторона, желающая выполнить команду, вычисляет SHA256 хэш от строки, содержащей <Salt><SHAREDSECRET><Команда>
* при отправке MQTT команды, авторизованная сторона добавляет в MQTT Payload полученный хэш цифровой подписи ДО команды, отделив подпись от тела команды знаком @
* Контроллер, получив команду с подписью, производит аналогичную операцию по вычислению подписи и, если значения совпали, запрос считается авторизованным
* Если команда направлена на управление пином контроллера, из перечня PROTECTED_PINS, заданного при компиляции прошивки, то она будет выполнена только том случае, если является авторизованной
====Ограничения====
Если пин входит в перечень, заданный при компиляции в опции PROTECTED_PINS, то для него действуют следующие ограничения, смысл которых в том, чтобы сделать крайне сложным подачу высокого логического уровня на выход контроллера (открытие мощных ключей) не имея физического доступа к самому устройству:
* Он не будет работать на канале типа термостат (THERMO)
* Для канала типа RELAY вывод работает только в не инверсном режиме. То есть, настройками не получится добиться перевода в состояние с высоким уровнем по-умолчанию, не получив подписанной команды. Настройки команды по умолчанию в файле конфигурации, также, будут проигнорированы. требуется цифровая подпись команде для управления таким каналом
* Восстановление значения канала при перезагрузке контроллера из статусных топиков MQTT не будет работать
* Форсуночный увлажнитель не будет инициализирован, если хотя бы один защищенный пин присутствует в его настройках (насос, клапана)
* Данные пины не работают для управления моторизированными воздушными заслонками (канал MOTOR)
* При использовании защищенных пинов в канале типа PWM требуется цифровая подпись команде для управления таким каналом
* Канал типа RELAYPWM на этом pin работать не будет
В качестве дополнительной меры защиты, рекомендуется отключить возможность обновления прошивки по-воздуху (OTA)
@@ -0,0 +1,555 @@
====== Функциональность драйвера Modbus v2 ======
LightHub можно настроить на работу в качестве шлюза с фактически любым устройством, поддерживающим Modbus RTU и работающем в режиме Slave
В отличии от v1, драйвер можно настроить на работу в качестве шлюза с фактически любым устройством, поддерживающим Modbus RTU и работающем в режиме Slave
Поддерживается как чтение так и запись в modbus устройства
===== Раздел "modbus" конфигурации =====
В корневом разделе modbus конфигурации описывается библиотека используемых типов устройств.
Для каждого устройства в библиотеки возможно задать такие параметры как скорость обмена (раздел baud) /параметры четности (раздел serial), назначение и тип регистров (раздел par), а также, интервал и параметры опроса этих регистров (раздел poll)
==== раздел par ====
Данный раздел содержит информацию о назначении каждого опрашиваемого или управляемого регистра (или групп регистров) используемого устройства. Раздел состоит из JSON объектов следующего формата:
<code>
"t_heat":{"reg":8,"map":[0,1024,0,1024],"type":"i16"},
</code>
В примере выше:
* "t_heat" - имя параметра устройства.
* "reg" - регистр (или стартовый HOLDING REGISTER) параметра
* "ir: - INPUT REGISTER или "reg"- HOLDING REGISTER или "coil": COIL или "din" - DISCRETE INPUT
* "map" - правила преобразования (TBD)
* "type":"i16" - указывает, что значение - 16-ти битное число со знаком
Возможные варианты типов:
* i16 - знаковый 16-ти битный регистр (по умолчанию)
* i32 - знаковый 32-ти битный регистр (первый регистр - младшие биты, следующий - старшие)
* u16 - беззнаковый 16-ти битный регистр
* u32 - беззнаковый 32-ти битный регистр (первый регистр - младшие биты, следующий - старшие)
* i8h - старшие 8 бит регистра (при записи значения, другие 8 бит будут заполнены значением 0xFF)
* i8l - старшие 8 бит регистра (при записи значения, другие 8 бит будут заполнены значением 0xFF)
* x10 - дробное число с точностью до 0.1 полученное путем деления значения 16 битного регистра со знаком на 10 (часто используется в разных устройствах для кодирования температуры, например, значение 124 в регистре соответствует 12,4)
* 100 - дробное число с точностью до 0.01 полученное путем деления значения 16 битного регистра со знаком на 100
==== раздел poll ====
задает интервал и параметры опроса регистров устройства
Причем, в целях оптимизации обмена, можно опрашивать устройство командой чтения группы регистров.
Пример:
<code>
"poll":{"regs":[[40000,40014],[30000,30002],40099],"delay":10000}
</code>
Обозначает, что с интервалом 10 сек будут произведены следующие три опроса:
* Команда чтения группы из 15-ти регистров с 40000 по 40014
* Команда чтения группы из 3-x регистров с 30000 по 30002
* Команда чтения одиночного регистра 40099
Для каждого из успешно прочитанных регистров, проводится поиск соответствия в разделе par и ir
Если есть запись, соответствующая данному регистру, прочитанные значения преобразовываются (см описание map) и направляются в MQTT и/или локальным объектам контроллера
Отправка происходит, если с момента последнего опроса значение регистра изменилось
кроме regs допустимы irs и coils
Или вот пример для сенсора Sensair S8
Опрашиваем INPUT REGISTERS 0-3,21,25-30 и HOLDING REGISTERS 0,1,31
<code>
"sensair":{"baud":9600,
"poll":{"irs":[[0,3],21,[25,30]],"regs":[0,1,31],"delay":1000},
"par":{
"co2":{"ir":3},
"meterStat":{"ir":0},
"alarmStat":{"ir":1},
"outStat":{"ir":0},
"pwm":{"ir":21},
"typeid":{"ir":25,"type":"u32"},
"mapver":{"ir":27},
"fwver":{"ir":28},
"sensorid":{"ir":29,"type":"u32"},
"ack":{"reg":0},
"command":{"reg":1},
"abc":{"reg":31}
}
</code>
А вот пример подключения Modbus адаптера кондиционера Haier
<code>
"modbus":
{
"haier":{"baud":9600,
"poll":{"regs":[[0,3]],"irs":[[0,1]],"coils":[0],"delay":5000},
"par":{
"pwr":{"coil":0,"map":{"cmd":[1,["OFF",0]],"val":null, "def":"acmode"},"id":1},
"acmode":{"reg":1,"map":{"cmd":[["FAN_ONLY",4],["HEAT",2],["COOL",1],["DRY",3],["AUTO",5]],"val":null},"id":1},
"$temp":{"ir":0},
"$fault":{"ir":1},
"set":{"reg":0,"id":2},
"fan":{"reg":2,"id":7,"map":{"cmd":[["OFF",0],["LOW",1],["HIGH",3],["MEDIUM",2],["AUTO",4]]}},
"lock":{"reg":3,"map":{"cmd":[["OFF",1],["ON",4]]}}
}
}
},
"items": {
"ac_2":[14,[128,
"haier",
{
"pwr":{"emit":"home/s_out/ac_2/cmd","@V":null},
"$temp":{"emit":"home/s_out/ac_2/$temp","@S":null},
"$fault":{"emit":"home/s_out/ac_2/$fault"},
"set":{"emit":"home/s_out/ac_2/set"},
"acmode":{"emit":"home/s_out/ac_2/$mode","@V":null},
"fan":{"emit":"home/s_out/ac_2/fan","@V":null},
"lock":{"emit":"home/s_out/ac_2/lock","@V":null}
}
]
]
}
}
</code>
==== Разделы baud и serial ====
Пример:
<code>
"baud":9600,
"serial":"8E1"
</code>
Соответственно, скорость обмена (по умолчанию, 9600) и параметр четности порта
Параметр четности - одно из значений ниже. По умолчанию 8N1
"8E1","8N1","8E2", "8N2", "8O1", "8O2", "8M1", "8S1", "7E1", "7N1", "7E2", "7N2", "7O1", "7O2", "7M1", "7S1"
===== Раздел "items" конфигурации =====
В данном разделе задаются конкретные modbus устройства по шаблону, определенному в разделе modbus
<code>
"items": {
"dimer1":[14,[1,
"dim4",
{
"ch1":{"emit":"aaa1,"item":"localdimmer1"},
"ch2":{"emit":"abc/aaa2"},
"ch3":{"item":"localdimmer3"},
"ch4":[{"emit":"aaa4,"item":"localdimmer4"},{"emit":"aaa44,"item":"localdimmer44"}]
}
]
],
</code>
В данном примере, создается item (объект) dimer1 с типом 14 (modbus v2) адресом modbus=1, на основе библиотечного устройства "dim4"
Устройство опрашивается согласно настройкам в библиотеке. А вот результаты опроса используются согласно настройкам в items.
В данном примере,
* "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 объектов)
Строки ch1 - ch4 в данном примере, определенные в третем параметре массива конфигурации, далее будем называть "именованными параметрами modbus item"
Имена этих параметров используются для доступа на запись в modbus
Для данного примера, чтобы записать значение в первый канал modbus димера можно использовать mqtt топик:
<code>
myhome/in/dimer1/ch1/set
</code>
(Здесь и далее для простоты предполагаем что mqtt префикс по-умолчанию myhome и обращение через broadcast имя устройства in)
"ch1" используется как subItem устройства (ставится между именем item и суффиксом)
таким образом обеспечивается индивидуальный доступ к каждому описанному в настройках регистру modbus устройства из mqtt/httpApi
NB. Не надо именовать данные параметры именами стандартных суффиксов (set, cmd, fan и пр) (см. полный перечень стандартных суффиксов)
Также, возможно управлять не отдельными subItem - ами modbus устройства, а устройством в целом, по аналогии с тем, как это делается для всех типичных item-ов LightHub. То есть, задавать один общий параметр устройства через суффикс /set, команды через суффикс /cmd и пр (см. полный перечень стандартных суффиксов)
Для этого в разделе шаблона устройства, в описании конкретного параметра modbus можно задать связь параметра с конкретным суффиксом при помощи значения "id"=N, где N - цифровой идентификатор стандартного суффикса (см. полный перечень стандартных суффиксов)
Далее, соберем фрагменты в более полный пример:
<code>
"modbus":
{
"airset":{
"baud":9600,
"serial":"8N1",
"poll":{"regs":[1,[8,24]],"delay":1000},
"par":{
"t_heat":{"reg":8,"map":[0,1024,0,1024],"type":"i16"},
"mode":{"reg":24}
}
},
"dim4":{
"poll":{"regs":[[0,4]],"delay":10000},
"par":{
"ch1":{"reg":0},
"ch2":{"reg":1},
"ch3":{"reg":2},
"ch4":{"reg":3}
}
},
"sensair":{"baud":9600,
"poll":{"irs":[[0,3],21,[25,30]],"regs":[0,1,31],"delay":1000},
"par":{
"co2":{"ir":3},
"meterStat":{"ir":0},
"alarmStat":{"ir":1},
"outStat":{"ir":0},
"pwm":{"ir":21},
"typeid":{"ir":25,"type":"u32"},
"mapver":{"ir":27},
"fwver":{"ir":28},
"sensorid":{"ir":29,"type":"u32"},
"ack":{"reg":0},
"command":{"reg":1},
"abc":{"reg":31}
}
}
},
"panel":{
"poll":{"regs":[[40000,40014],[30000,30002]],"delay":10000},
"par":{
"fan" :{"reg":40000},
"mode" :{"reg":40001},
"set" :{"reg":40002},
"pwr" :{"reg":40003},
"alm01":{"reg":40004},
"alm17":{"reg":40005},
"alm33":{"reg":40006},
"sethum" :{"reg":40007},
"setvoc" :{"reg":40008},
"temp" :{"reg":30000},
"hum" :{"reg":30001},
"voc" :{"reg":30002},
"ch_temp" :{"reg":40009},
"ext_temp" :{"reg":40010},
"out_temp" :{"reg":40011},
"water_temp" :{"reg":40012},
"ch_hum" :{"reg":40013},
"heat_pwr":{"reg":40014}
}
}
},
"items": {
"airset1":[14,[10,"airset",{"t_heat":{"emit":"aaa"}}]],
"panel1":[14,[2,"panel"]],
"dimer1":[14,[1,"dim4",
{
"ch1":{"emit":"aaa1,"item":"localdimmer1"},
"ch2":{"emit":"abc/aaa2"},
"ch3":{"item":"localdimmer3"},
"ch4":[{"emit":"aaa4,"item":"localdimmer4"},{"emit":"aaa44,"item":"localdimmer44"}]
}
]
]
},
"sensair1":[14,[254,
"sensair",
{"co2":{"emit":"co2"}}
]
]
}
}
</code>
===== Подавление повторных значений =====
В процессе опроса устройств, драйвер запоминает последнее считанное из регистра modbus значение во внутреннюю переменную @S внутри именованного параметра item
Если значение не изменилось с последнего считывания - операция по отправки значения в modbus или локальному обьекту не производится
Данное поведение можно отменить. Если данную переменную определить в конфиге и ее тип будет отличен от целого значения, последнее опрошенное значение не будет сохраняться, что приведет к отправке результата каждого опроса в mqtt или локальному обьекту
Пример - панель управления климатом Zentec. Измерения влажности передаются каждый раз:
<code>
"modbus":
{
"panel":{
"serial":"8E1",
"poll":{"regs":[[40000,40014],[30000,30002]],"delay":10000},
"par":{
"fan" :{"reg":40000,"map":[1,[0,7,0,100]],"id":11},
"mode" :{"reg":40001,"mapcmd":[2,[[1,"FAN_ONLY"],[2,"HEAT"],[4,"COOL"],[8,"AUTO"]]]},
"settemp" :{"reg":40002,"id":12},
"pwr" :{"reg":40003,"mapcmd":[2,[[0,2],[1,1]]]},
"alm01":{"reg":40004},
"alm17":{"reg":40005},
"alm33":{"reg":40006},
"sethum" :{"reg":40007,"id":13},
"setvoc" :{"reg":40008,"id":14},
"roomtemp" :{"reg":30000,"type":"x10"},
"hum" :{"reg":30001},
"voc" :{"reg":30002},
"ch_temp" :{"reg":40009,"type":"x10","id":15},
"ext_temp" :{"reg":40010,"type":"x10","id":16},
"out_temp" :{"reg":40011,"type":"x10","id":17},
"water_temp" :{"reg":40012,"type":"x10","id":18},
"ch_hum" :{"reg":40013},
"heat_pwr":{"reg":40014}
}
}
},
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"},
"sethum":{"emit":"edem/air/humzal3/set"},
"hum" :{"emit":"edem/air/humzal3/val","@S":null},
"setvoc":{"emit":"edem/air/voczal3/set"},
"voc" :{"emit":"edem/air/voczal3/val"},
"settemp" :{"item":"tzal3/set"},
"roomtemp" :{"emit":"edem/fl2/term_bedr/1/val"},
"ch_temp":{},
"ch_hum":{},
"ext_temp":{},
"out_temp":{},
"water_temp":{},
"heat_pwr":{}
}
]]
}
</code>
Также, по-умолчанию, контроллер выполняет какие-то действия, только если регистр Модбас устройства поменялся не в результате записи в него со стороны контроллера(такая логика сделана, чтобы избежать зацикливания нотификаций)
Например, если в регистре число 3 а мы записали в него 5 - никаких действий при опросе не произойдет. А вот если значение в регистре изменилось в результате каких-то внутренних процессов устройства (например, пользователь изменил значение температуры на панеле) - это значение будет обработано.
Данную фильтрацию можно отменить, если в настройке параметра добавить переменную @V типа, отличного от целого.
Например так:
<code>
"fan" :{"emit":"edem/air/vents/zal3/fan","@V":null},
</code>
В этом случае, после того, как мы что-то записали в регистр, при следующем же опросе устройства, это будет обнаружено (если значение изменилось) и будут предприняты настроенные действия (например, значение будет отправлено по MQTT и отобразится в мобильном приложении Home Assistant)
<del>И еще один фильтр: при попытке записать в регистр значение, не отличающееся от последнего полученного при опросе, такая попытка будет проигнорирована. Такое поведение отключить нельзя.</del>
===== Запись в Modbus устройство =====
Параметры Модбас устройства можно записывать аналогично, со всеми остальными items контроллера - с использованием MQTT, прямым обращением из других items контроллера, через http API
Рассмотрим на примере вентустановки:
Скорость можно поменять, обращаясь к "суб-топику" fanspeed
//vent/fanspeed/set// (для прямого обращения по api или как к item-у)
Для обращения через MQTT топик будет выглядеть как myhome/devicename/vent/fanspeed/set
Внимание, для названий субтопиков следует избегать стандартных имен суффиксов (cmd,set,hsv,rgb,fan,mode,hue,sat,temp,val,del,raw)
Параметры fanmin и fanmax доступны только на запись (контроллер не будет отслеживать изменение их значений)
также, есть возможность "прикрепить" параметры к стандартным суффиксам item-а (set,cmd,fan и пр), указав числовой параметр id, соответствующий данному стандартному суффиксу в описании этого параметра.
Перечень суффиксов:
<code>
CMD 1
SET 2
HSV 5
RGB 6
FAN 7
MODE 8
HUE 9
SAT 10
TEMP 11
VAL 12
DELAYED 13
RAW 14
</code>
в примере ниже, это значит, что альтернативный описанному метод поменять скорость:
//vent/fan//
А при записи в vent/cmd это значение установится как в регистр 41 (параметр on) так и в регистр 43 (параметр pmode) так как у них указан одинаковый id=1, соответствующий суффиксу /cmd
<code>
"modbus":
{
"airset":{
"baud":9600,
"serial":"8E1",
"poll":{"regs":[[0,60],1008],"delay":2000},
"par":{
"rtemp":{"reg":5,"type":"100", "mode":"r"},
"fanmin":{"reg":50,"type":"u8l"},
"fanmax":{"reg":51,"type":"u8l"},
"on":{"reg":41,"type":"u8l","id":1},
"fanspeed":{"reg":42,"type":"u8l","id":7},
"pmode":{"reg":43,"type":"u8l","id":1,"map":{}},
"tset":{"reg":44,"type":"u8l","id":2},
"numspeed":{"reg":60,"type":"u8l"},
"fault":{"reg":1008}
}
}
},
"items": {
"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},
"rtemp":{"emit":"edem/s_out/vent/rtemp"},
"fanmin":{},
"fanmax":{}
}
]],
}
</code>
===== Mapping значений и команд контроллера в регистры Modbus =====
Более подробно настройка преобразований описана в отдельном разделе [[использование_преобразований_map]]
Далее, разобраны примеры применения
Рассмотрим на примере вентустановки
Допустим, регистр 41 отвечает за включение установки. Соответственно, в него надо записать "1" для всех рабочих режимов:
* AUTO
* ON
* HEAT
* FAN_ONLY
Для команды OFF записываем 0
Это реализуется строкой
<code>
"on":{"reg":41,"type":"u8l","id":1,"map":{"cmd":[["OFF",0],["ON",1],["AUTO",1],["HEAT",1],["FAN_ONLY",1]]}}
</code>
наличие "id"=1 позволяет не только напрямую управлять данным регистром при помощи именованного параметра "on" (топика air/on/set) но и привязать его к командному суффиксу канала
Соответственно, доступно управление по командному топику air/cmd
В нашей вентустановке за переключение режима работы (нагрев-вентиляция-авто) отвечает отдельный регистр 43
настроим отображение режима работы на требуемые значения данного регистра и, также, привяжем это отображение к командному топику ("id":1)
<code>
"pmode":{"reg":43,"type":"u8l","id":1,"map":{"cmd":[["AUTO",3],["HEAT",2],["FAN_ONLY",1]]}},
</code>
теперь при переключении режимов в регистр 43 будет записываться 3 для Авторежима, 2 - для режима нагрева, 1 - для режима вентиляции
Еще лайфхак:
<code>
"humpwr":{"reg":39998,"map":{"cmd":[null,["ON",1],["OFF",0]],"val":null}},
</code>
В примере выше, в значения регистра будет маппироваться только команда, поступающая на humpwr. Команда ON в 1, команда OFF в 0
первый null перед массивом соответствия команда -> значение по умолчанию, которое будет использоваться если не удастся подобрать команду. (null тут можно не указывать)
Если не подобрали - пытаемся преобразовать по значению
Если не использовать "val":null - то значения, отправляемые в humpwr/set будут передаваться в регистр без преобразований. Использование null обеспечивает игнорирование значений (не команд)
(описание не завершено)
<code>
"modbus":
{
"airset":{
"baud":9600,
"serial":"8E1",
"poll":{"regs":[[0,60],1008],"delay":2000},
"par":{
"on":{"reg":41,"type":"u8l","id":1,"map":{"cmd":[["OFF",0],["ON",1],["AUTO",1],["HEAT",1],["FAN_ONLY",1]]}},
"fanspeed":{"reg":42,"type":"u8l","id":7,"map":{"cmd":"fan"}},
"offbyfan":{"reg":41,"type":"u8l","id":7,"map":{"cmd":[1,["OFF",0]]}},
"pmode":{"reg":43,"type":"u8l","id":1,"map":{"cmd":[["AUTO",3],["HEAT",2],["FAN_ONLY",1]]}},
"tset":{"reg":44,"type":"u8l","id":2},
"di":{"reg":47,"type":"u8l"},
"dp":{"reg":48,"type":"u8l"},
"dt":{"reg":49,"type":"u8l"},
"fault":{"reg":1008}
}
}
}
},
"items":
{
"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},
"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"},
"tautoheat":{},
"tautocool":{},
"di":{},
"dp":{},
"dt":{},
"fanmin":{},
"fanmax":{},
"tmreheat":{},
"tairfreeze":{},
"twaterstart":{},
"twatershut":{},
"twateridle":{},
"fanauto":{"emit":"edem/s_out/vent/fanauto/set","@V":null},
"numspeed":{},
"offbyfan":{}
}
]]
}
</code>
@@ -0,0 +1,60 @@
Если в обьекте, определяющем вход, обнаружен массив **"act"** и вход является аналоговым, то каждый элемент массива будет рассматриваться как отдельный вход, для которого возможна такая же обработка как для дискретного (то есть определение даблкликов, долгих нажатий и пр)
При этом анализируется параметр **"map**" у каждого элемента массива, и элемент применяется только если значение аналогового входа находится внутри заданного интервала
Это позволяет на один аналоговый вход подключить несколько кнопок через резисторы.
Важно: в параметре "T" не надо указывать аналоговый тип входа. Используются дискретные типы 0 и 2
Пример: Кнопка выкл/уменьшить яркость подключена к опорному напряжению +10В напрямую, кнопка вкл/увеличить яркость - через резистор 2,2 КОм (на плате должен быть активирован шунт - см [[аналоговые_входы|Общая информация]]
<code>
"in": {
"54":{"T":0,"act":
[
{
"map":[128,640],
"click":{"item":"gr_gost3","icmd":"ON"},
"dclick":{"item":"lampwc3","icmd":"ON"},
"tclick":{"item":"lampbath3","icmd":"ON"},
"rpcmd":{"item":"gr_gost3","icmd":"%+2"}
},
{
"map":[641,1024],
"click":{"item":"gr_gost3","icmd":"OFF"},
"dclick":{"item":"lampwc3","icmd":"OFF"},
"tclick":{"item":"lampbath3","icmd":"OFF"},
"rpcmd":{"item":"gr_gost3","icmd":"%-2"}
}
]}
}
</code>
И тот же самый пример, записанный в новой нотации конфигурирования входов, при которой элемент конфигурации in является массивом, а значит, появилась возможность без костылей настраивать входы, не привязанные напрямую к пинам процессора. Номер пина задается в параметре "#" конфигурации:
<code>
"in": [
"{"T":0,"#":54, "act":
[
{
"map":[128,640],
"click":{"item":"gr_gost3","icmd":"ON"},
"dclick":{"item":"lampwc3","icmd":"ON"},
"tclick":{"item":"lampbath3","icmd":"ON"},
"rpcmd":{"item":"gr_gost3","icmd":"%+2"}
},
{
"map":[641,1024],
"click":{"item":"gr_gost3","icmd":"OFF"},
"dclick":{"item":"lampwc3","icmd":"OFF"},
"tclick":{"item":"lampbath3","icmd":"OFF"},
"rpcmd":{"item":"gr_gost3","icmd":"%-2"}
}
]}
]
</code>
Работают обе нотации. Если номер пина прописан сразу в двух местах, приоритет имеет параметр "#"
@@ -0,0 +1,106 @@
====Расположение опций====
При сборке проекта опции задаются в файлах, лежащих в директориях build-flags и custom-build-flags
В первой директории лежат рекомендованные настройки, входящие в состав дистрибутива, во вторую же пользователь может положить приватные настройки, которые не коммитятся на Github (например, можно жестко задать свой пароль wifi для ESP и отключить
В директории используются файлы вида build_flags_<env>, где <env> - архитектура для которой производится компиляция (due|lighthub21|esp32-wifi|и т.д)
Строка, начинающаяся с # игнорируется
Чтобы задать опцию, используется строка:
-D ИМЯ_ОПЦИИ
или
-D ИМЯ_ОПЦИИ=ЗНАЧЕНИЕ
====Перечень возможных опций====
* MY_CONFIG_SERVER=192.168.1.1 | address of external JSON-config http://192.168.1.1/de-ad-be-ef-fe-00.config.json
* WATCH_DOG_TICKER_DISABLE | disable wdt feature
* USE_1W_PIN=49 | use direct connection to 1W devices on 49 pin, no I2C bridge DS2482-100
* SD_CARD_INSERTED | enable sd-card support (unused)
* SERIAL_BAUD=115200 | set baud rate for console on Serial0
* Wiz5500 |Use Wiznet 5500 library instead universal Wiznet driver
* Wiz5100 |Use Wiznet 5500 library instead universal Wiznet driver
* DISABLE_FREERAM_PRINT | disable printing free Ram in bytes to debugSerial port
* CUSTOM_FIRMWARE_MAC=de:ad:be:ef:fe:00 |set firmware macaddress
* DMX_DISABLE |disable DMX support
* MODBUS_DISABLE | disable old Modbus driver
* MBUS_DISABLE | disable new Modbus driver
* MODBUS_TX_PIN=13 |Transmit enable Pin
* MODBUS_SERIAL_PARAM=SERIAL_8E1 - задать параметры MODBUS v1 и MODBUS IP
* MODBUS_SERIAL_BAUD=9600
* OWIRE_DISABLE | disable OneWire support
* OW_DEVICES_LIMIT
* ARTNET_ENABLE |Enable Artnet protocol support
* AVR_DMXOUT_PIN=18 | Set Pin for DMXOUT on megaatmega2560
* CONTROLLINO |Change Modbus port, direction pins and Wiznet SS pins to be working on [Controllino](http://controllino.biz/)
* LAN_INIT_DELAY=2000 | set lan init delay for Wiznet ethernet shield
* ESP_WIFI_AP=MYAP | esp wifi access point name (used if WiFi manager disabled)
* ESP_WIFI_PWD=MYPWD | esp wifi access point password
* WIFI_MANAGER_DISABLE |Disable wifi manager for esp8266 & ESP32
* COUNTER_DISABLE |disable Counter, Uptime input support (for RAM savings on mega2560)
* DHT_DISABLE |disable DHT input support (for RAM savings on mega2560)
* PID_DISABLE | Disable PID regulator
* STATUSLED | Enable RGB status led on pins 50,51,52 (DUE only)
* DMX_SMOOTH |Smooth transition on DMX channels (DUE only)
* OTA | Enable Other The Air firmware upload/HTTP API
* OTA_PORT
* DEFAULT_OTA_USERNAME - по умолчанию arduino
* DEFAULT_OTA_PASSWORD - по умолчанию password
* W5500_CS_PIN=53 |Defines CS pin for Ethernet adapter (10-th by default, 53 on LightHub shield)
* WIFI_ENABLE |Enable WiFi for ESP (Wiznet by default)
* SPILED_DISABLE |Disable SPI LED library
* AC_DISABLE |Disable UART Hayer Air condition driver
* M5STACK |Logging to M5Stack OLED screen
* NO_HOMIE |Disable HOMIE discovery topics
* BRIGHT_STEP |Scale DMX bright - Table1
* BRIGHT_LOG |Scale DMX bright - Table2
* MCP23017 allow I2C input port extender on MCP23017 chip
* RESTART_LAN_ON_MQTT_ERRORS |reinit LAN if many mqtt errors occured
* DEVICE_NAME short handy device name which is used instead of mac for download config http:/ /{MY_CONFIG_SERVER}/{DEVICE_NAME}_config.json
* SYSLOG_ENABLE |enable UDP SYSLOG support feature(under DEVELOPMENT) that must be configured through config file
* WITH_PRINTEX_LIB use PrintEx library (develop experimental feature)
* CSSHDC_DISABLE |Disable CS811 and HDC1080 sensors support
* FASTLED - using FASTLED library instead default ADAFRUIT_LED
* SCALE_VOLUME_100 using 0..100 scaling in /set topics instead 0.255 (default)
* CORS=\"http://lazyhome.ru\"
* TIMER_INT | использовать прерывание таймера для критичных ко времени исполнения операций дополнительно к кооперативной многозадачности (DUE)
* MODBUS_DEBUG - Выдавать весь Modbus обмен в отладочный порт в HEX виде
* FS_STORAGE | ESP32 - использовать файловую систему для хранения настроек (пока не работает)
* FS_PREPARE | ESP32 - отформатировать файловую систему если она не отформатирована
* MERCURY_ENABLE - активация драйвера счетчика Меркурий
* IPMODBUS - см [[режим_шлюза_ip_modbus]]
* REDIRECTION_URL=\"http://lazyhome.ru/pwa\"
* MDNS_ENABLE
* CONFIG_CLEAN_PIN=2 - при включении данной опции и подключенной кнопке между pin2 (пример) и общим проводом, если контроллер стартует при нажатой кнопке и кнопка удерживается в течение 10 сек - очищается конфигурация из энергонезависимой памяти
* CRYPT - см [[криптоподпись_команды]]
* SHAREDSECRET - см [[криптоподпись_команды]]
* PROTECTED_PINS - см [[криптоподпись_команды]]
* PULSEPIN12 - для интеграции с замком Motura X-Nova при включении данной опции, на pin12 каждые 2,5 сек выдается импульс 100ms для пробуждения замка и постоянного считывания статуса с его выходов (импульсы выдаются аппаратным таймером DUE и их длина/период гарантированы, вне зависимости от режима работы контроллера)
* I2C_CLOCK - частота шины I2C (используется в библиотеке HDC1080, CCS811)
===Возможность переопределить RX-TX пины для ESP32 ===
* MODBUS_UART_RX_PIN=15
* MODBUS_UART_TX_PIN=2
===Опции для перехватчика UART трафика===
* UARTBRIDGE_ENABLE
* MODULE_UATRBRIDGE_UARTA=Serial1
* MODULE_UATRBRIDGE_UARTA_RX_PIN=15
* MODULE_UATRBRIDGE_UARTA_TX_PIN=2
* MODULE_UATRBRIDGE_UARTB=Serial2
* MODULE_UATRBRIDGE_UARTB_RX_PIN=-1
* MODULE_UATRBRIDGE_UARTB_TX_PIN=-1
===Default SerialDebug settings===
* SERIAL_BAUD=115200
* debugSerialPort=Serial
===Назначить в качестве отладочного и CLI порта Native USB Port DUE===
* debugSerialPort=SerialUSB
* SerialPortType=Serial_
* SERIAL_BAUD=0
@@ -0,0 +1,86 @@
===== Подключение к контроллеру =====
Подключение производится к клеммам:
* X5 - +5В
* X4 - GND
* X3 - 1wire
{{:1wire.png|}}
На рисунке снизу вверх черными точками: 5B, gnd , 1wire.
===== Конфигурация контроллера =====
Дополнительная информация по настройке приведена тут [[конфигурирование#что_такое_execobj]]
В корне прописываем:
<code>
"ow":{
"АДРЕС_ДАТЧИКА":{"emit":"Temperature01"}
},
</code>
АДРЕС_ДАТЧИКА в виде: 282DA307D6013C08
===== MQTT =====
Подписываемся на топик "myhome/s_out/Temperature01" и получаем значения температуры.
===== Простой релейный термостат (теплый пол) =====
добавляем
<code>
"items":{
"local_termostat":[5,24,33]
}
</code>
5 - тип релейный термостат
24 - номер пина
33 - (опционально) - температура по-умолчанию
Добавляем связку между термометром и локальным термостатом
<code>
"ow":{
"282DA307D6013C08":{"emit":"Temperature01", "item":"local_termostat/val"}
},
</code>
Настройка завершена
Cуффикс /val при передаче температуры локальным обьектам можно не добавлять
Значение температуры,также, может быть принято с внешних систем или иных контроллеров по MQTT c использованием топика формата /myhome/controller-id/local_termostat/val
При отсутствии показаний в течение 10 мин термостат отключается и переходит в аварийный режим, выдавая аварию в топик /alarm
Термостат принимает значение температуры через суффикс /set
Через командный суффикс /cmd принимаются команды
* ON
* OFF
* AUTO
* HEAT
* HALT
* REST
* XON
* XOFF
Подробнее тут [[работа_с_mqtt#команды_применимые_для_кондиционера_и_термостата]]
===== Поиск устройств на шине =====
Начиная с v4.3 автоматическое периодическое сканирование шины 1-wire отменено. Датчики опрашиваются последовательно, согласно настройкам в разделе ow
Чтобы просканировать шину и узнать адреса вновь подключенных устройств, можно выдать команду search в [[cli_интерфейс]]
Результаты сканирования будут выданы в лог
@@ -0,0 +1,127 @@
Примеры конфигурирования контроллера в связке с OpenHAB https://www.openhab.org/
----
===== Выключатель и лампочка =====
Простое нажатие. Для клавиш с фиксацией.
==Конфигурируем контроллер==
через портал https://www.lazyhome.ru/portal
<code>
{
"topics":{"root":"myhome"},
"mqtt":["wf-home","192.168.137.1",1883],
"items": {
"relay3":[6,22]
},
"in":{
"32":{"T":0,"item":"relay3","emit":"myhome/in/relay3"}
}
}
</code>
Где,
* 6 - тип выхода/item type (([[конфигурирование#Item types:|Конфигурирование]]))
* 22 - номер выхода из столбца "MPU PIN #" из таблицы контактов (([[входы_выходы#Таблица контактов|Входы-выходы]]))
* 32 - номер входа из столбца "MPU PIN #" из таблицы контактов (([[входы_выходы#Таблица контактов|Входы-выходы]]))
* 0 - тип входа (0 - по-умолчанию, можно не прописывать этот элемент) (([[аналоговые_входы#Типы входов|Типы входов]]))
* emit - действие, вызываемое при срабатывании входа (([[аналоговые_входы#Действия при срабатывании входа|Действия при срабатывании входа]]))
==Создаем Канал в OpenHAB==
{{:oh_thing_01.png?nolink&1000|}}
==Указываем настройки MQTT==
{{:oh_channel_01.png?nolink&1000|}}
Добавляем в OpenHAB нашу лампочку (\conf\items\demo.items) (<channel> указываете тот, что был сгенерирован при создании канала):
<code>
Switch Switch1 "Lamp1" {channel="mqtt:topic:44ea0d82:Switch1"}
</code>
Добавляем лампочку в интерфейс(\conf\sitemaps\demo.sitemap)
<code>
sitemap demo label="Main Menu"
{
Frame {
Switch item=Switch1 label="Lamp"
}
}
</code>
----
===== Управление яркостью длительным нажатием =====
Одиночное нажатие включает/выключает канал. Длительное нажатие последовательно увеличивает или уменьшает свечение.
==Конфигурируем контроллер==
<code>
{
"topics":{"root":"myhome"},
"mqtt":["wf-home","192.168.137.1",1883],
"items": {
"dimmer":[3,5]
},
"in":{
"36":{"T":0,
"click":{"item":"dimmer","icmd":"TOGGLE"},
"rpcmd":{"item":"dimmer","icmd":"%+5","irev":"%-5"}
}
}
}
</code>
Где,
* 3 - тип выхода/item type (([[конфигурирование#Item types:|Конфигурирование]]))
* 5 - номер выхода из столбца "MPU PIN #" из таблицы контактов (([[входы_выходы#Таблица контактов|Входы-выходы]]))
* 36 - номер входа из столбца "MPU PIN #" из таблицы контактов (([[входы_выходы#Таблица контактов|Входы-выходы]]))
* 0 - тип входа (0 - по-умолчанию, можно не прописывать этот элемент) (([[аналоговые_входы#Типы входов|Типы входов]]))
* click, **rpcmd** - тип нажатия (([[двойные_тройные_длительные_нажатия#типы нажатий|типы нажатий]]))
* icmd - действие, вызываемое при удержании (([[двойные_тройные_длительные_нажатия#Параметры обработчика нажатий|Параметры обработчика нажатий]]))
* "%-5" - выполняемая команда (([[работа_с_mqtt#Команды и инструкции, которые могут быть переданы в Payload|Команды]]))
==Создаем Канал в OpenHAB==
{{:oh_thing_02.png?nolink&1000|}}
==Указываем настройки MQTT==
{{:oh_channel_02.png?nolink&1000|}}
Добавляем в OpenHAB наш диммируемый канал (\conf\items\demo.items) (<channel> указываете тот, что был сгенерирован при создании канала):
<code>
Dimmer Dimmer1 "Диммер1" {channel="mqtt:topic:44ea0d82:Dimmer1"}
</code>
Добавляем лампочку в интерфейс(\conf\sitemaps\demo.sitemap)
<code>
sitemap demo label="Main Menu"
{
Frame {
Slider item=Dimmer1
}
}
</code>
----
===== Управление яркостью длинным нажатием 2=====
Настраиваем----
===== Управление яркостью длинным нажатием 3=====
Настраиваем----
===== Управление яркостью длинным нажатием 4=====
Настраиваем
@@ -0,0 +1,140 @@
Для того, чтобы настроить Контроллер умного дома LightHub достаточно просто зайти в [[https://www.lazyhome.ru/portal|Личный Кабинет]] (после регистрации на сайте), добавить свой контроллер, используя его MAC адрес и создать его настройку в JSON онлайн-редакторе.
Для того чтобы начать, можете просто использовать примеры ниже, а затем доработать их по своему усмотрению
Далее, надо просто подключить контроллер к роутеру, имеющему выход в Интернет. После перезапуска, контроллер загрузит настройки из Личного Кабинета. После того, как вы убедитесь, что все работает, можно будет сохранить настройки в постоянную память контроллера (команда save в CLI) и сделать его независимым от наличия доступа в интернет.
Для тех, кто не доверяет - можно разместить настройки на своем собственном http сервере, в корне. Формат имени файла: http://MY_CONFIG_SERVER/cnf/12-12-12-12-12-12.config.json
После этого выполнить через CLI команду <code>get <MY_CONFIG_SERVER></code>
Хотя это не так удобно.
Для переключения контроллера на свой собственный MQTT брокер с общедоступного из примера, используйте настройку:
<code>
"mqtt":["controller_name","host",port,"user","pass"]
</code>
controller_name - уникальное имя вашего контроллера. К одному и тому же брокеру не может быть подключено два контроллера с одним и тем же именем
Несмотря на то, что в настройке можно задать пароль вашего брокера, мы не рекомендуем это делать по соображениям безопасности. MQTT пароль желательно задавать через CLI команду pwd
После этого он сохраняется в памяти вашего устройства (на ESP32 пока не сохраняется, но сделаем)
**Пример 1: Плата ESP32-EVB**
При нажатии на кнопку, переключаем оба реле и отправляем команду в MQTT топик __myhome/in/light__
Реле собраны в группу __relays__, но каждое доступно индивидуально
<code>
{
"items": {
"relay1":[6,32],
"relay2":[6,33],
"relays":[7,["relay1","relay2"]]
},
"in":{
"34":{"item":"relays","emit":"myhome/in/light","scmd":"TOGGLE","rcmd":""}
},
"mqtt":["LHexample01","test.mosquitto.org"]
}
</code>
**Пример 2: Сенсор CO2 CCS811 и влажности HD1080 на ESP82**
<code>
{
"in":{
"1":{"T":5,"emit":"myhome/s_out/1"},
"2":{"T":6,"emit":"myhome/s_out/2"}
},
"mqtt":["LHexample02","test.mosquitto.org"]
}
</code>
**Пример 3: Управление диммером, RGBW лентой, реле из Node Red, контроль протечек и счетчик воды**
(Node-Red логика для данного примера [[http://lazyhome.mircloud.ru|развернута тут]]). [[http://lazyhome.mircloud.ru/ui|а тут дашборд]].
Это наиболее сложный пример.
Диммеры света подключены по DMX, Датчик протечки - к аналоговому входу A0 (PIN#54) а шаровый кран перекрытия воды висит на A15 (PIN#69) - (подробнее про то, какие аналоговым входам соответствуют номера PIN указано [[входы_выходы|тут]])
Вход №38 напрямую управляет реле, которое подключено на выход 22
Вход №41 - Master Switch - позволяет выключить сразу все или вернуть в первоначальное положение
Потенциометр, подключенный на аналоговый вход A7 (PIN#61) одновременно с NodeRed управляет DMX диммером (см 5-й параметр массива map - если значение считанное с аналогового входа, изменилось более чем на 10 пунктов, значение преобразовывается из диапазона 0-850 в диапазон 0-100 и передается на диммер)
на PIN#44 и 45 подключены контакты счетчиков воды (дальнейший подсчет потребления происходит в Node Red)
Также, на шину I2C подключены датчики температуры-влажности-CO2-летучих смесей
<code>
{
"dmx":[3,6],
"topics":{"root":"myhome"},
"items": {
"relay":[6,22],
"water":[6,69],
"dimmer":[0,1],
"led":[1,2],
"all":[7,["dimmer","water","relay","led"]]
},
"in":{
"41":{"T":0,"emit":"myhome/in/all","scmd":"HALT","rcmd":"REST"},
"54":{"T":66,"emit":"alock_leak","item":"water","map":[50,800],"scmd":"OFF","rcmd":"ON"},
"38":{"item":"relay"},
"61":{"T":66,"emit":"myhome/in/a07","item":"dimmer","map":[0,850,0,100,10]},
"10":{"T":5,"emit":"myhome/s_out/airq1"},
"20":{"T":6,"emit":"myhome/s_out/humidity1"},
"44":{"emit":"acount_hot"},
"45":{"emit":"acount_cold"}
},
"mqtt":["lighthub-07","m2m.eclipse.org"]
}
</code>
**Пример 4: Два термостата, управляющие реле на выходах 24 и 36**
Предустановлена температура 33 и 32 градуса
Термостаты собраны в группу "__floor__" через которую ими можно управлять одновременно. (И это настроено в Node-Red в зависимости от времени суток)
Третий термометр ничем не управляет, просто передает температуру в MQTT
Также, на PIN29 повешено реле "relay", включаемое сразу после загрузки и управляемое входом #38
А на входе 41 - мастер-выключатель, при переключении которого в топик myhome/in/all передаются команды "HALT" и "REST"
При этом они отработают как на данном контроллере (через MQTT и группу "__all__") так и на всех контроллерах, подписанных на __myhome/in/all__
Настройка topics позволяет определить как формируются MQTT топики у данного контроллера
Например тут:
Топики для управления: **myhome/in/<имя item>** и **myhome/LHexample03/<имя item>**
Топик, в который отправляются статусы: **myhome/s_out/<имя item>**
(это же соответствует настройкам по-умолчанию)
<code>
{
"mqtt":["LHexample03","test.mosquitto.org"],
"topics":{"root":"myhome","bcst":"in","out":"s_out"},
"ow":{
"284811170400005B":{"emit":"t_entr"},
"28FFF95533160459":{"emit":"t_bath1","item":"h_bath1"},
"286164123C776A7D":{"emit":"t_bath2","item":"h_bath2"}
},
"items":{
"floor":[7,["h_bath1","h_bath2"]],
"all":[7,["floor","relay","dimmer"]],
"h_bath1":[5,24,33],
"h_bath2":[5,36,32],
"relay":[6,29,1,1]
},
"in":{
"41":{"T":0,"emit":"myhome/in/all","scmd":"HALT","rcmd":"REST"},
"38":{"item":"relay"},
}
}
</code>
@@ -0,0 +1,132 @@
Гибкость настроек LightHub позволяет настраивать сложные системы регуляции температуры, влажности, CO2 (столько каналов на одном устройстве, сколько уместятся в его памяти). Но для примера проще показать принцип работы LH на чем-то очень простом
В качестве примера, перешьем самую простую WiFi розетку Sonoff-S26
В Интернете масса руководств, как перешить такую розетку под Tasmota или ESPEASY. Тут не буду описывать, как подключить или подпаять к Sonoff TTL-UART - это сделано сотни раз. Просто посмотрите - точно так же зашивается прошивка LightHub.
У нас более интересная задача - сделать гидростат с PID регулятором влажности, поддерживающий влажность в помещении при помощи парового увлажнителя (который многим хорош, но способен сделать из помещения баню, если его не контролировать)
Устройство должно регулировать влажность абсолютно автономно, но дополнительно, хочется управлять этим из привычного HomeAssistant
(Точно также можно сделать на базе такой розетки и калорифера очень точный термостат)
Прошивка LightHub позволяет это сделать "в розетке" ровно так же, как и на любом другом совместимом железе. С одним лишь ограничением - розетка ограничена по ресурсам и очень мало пинов выведено с платы контроллера.
Мой Sonoff содержит контроллер ESP8266EX и всего 1МБ флэш памяти.
Для того, чтобы не разбирая устройство, можно было обновлять прошивку по воздуху, нам надо уместиться в 50% флеш памяти, доступной для кода. Ну и оставить что-то под хранение небольшого файла конфигурации.
Скомпилированную прошивку берем отсюда:
https://github.com/anklimov/lighthub/blob/master/compiled/esp8266-wifi/firmware.bin
(она уже собрана с опциями, приведенными ниже)
Для тех, кто хочет компилировать самостоятельно при помощи PlatformIO - надо создать дополнительный файл
в директории проекта: lighthub\custom-build-flags\build_flags_esp8266-wifi
со следующим содержимым:
<code>
#Disabling debug log and move I2C to 1-3 pins
-DnoSerial
-D TWI_SCL=1
-D TWI_SDA=3
#Slimming firmware to fit 50% of 1m flash
-DDMX_DISABLE
-DMODBUS_DISABLE
-DMBUS_DISABLE
-DOWIRE_DISABLE
-DCOUNTER_DISABLE
-DNO_HOMIE
-DAC_DISABLE
-DSYSLOG_ENABLE
-DOTA
-DMOTOR_DISABLE
-DMULTIVENT_DISABLE
-DHSV_DISABLE
-UMCP23017
-UARTNET_ENABLE
-D BEARSSL_SSL_BASIC
</code>
После чего, надо пересобрать проект, выбрав environment esp8266-wifi
Данные настройки отключают то, что заведомо не требуется розетке. И убирают debug логгирование c Serial порта, выведенного на ноги 1 и 3 процессора.
Теперь эти ноги, которые я ранее вывел на разьем, для того, чтобы была возможность заливать прошивку на ESP можно использовать для чего-то более полезного, пока не заливается эта самая прошивка
Например, I2C. (И настроить прошивку на работу с сенсорами ccs811+hdc1080)
Или как в примере настройки ниже, для подключения сенсора температуры и влажности DHT22 к ноге 3 (RX)
После заливки прошивки, как обычно, подключаемся к появившейся точке доступа и настраиваем подключение к WiFi
(если после подключения к точке, не открылась страница в браузере, заходим на http://192.168.4.1)
После перезапуска, прошивка будет пытаться загрузить конфиг с макадресом контроллера с портала. Проще всего создать его там.
Либо можно поискать новое устройство в сети при помощи любого браузера MDNS (Bonjour search, MDNS discovery, плагин для браузера) и отредактировать конфиг непосредственно на устройстве (скорректировав адрес MQTT брокера на свой)
<code>
{
"syslog":["95.31.43.9"],
"items": {
"ledhum":[6,-13],
"reghum": [13, [
[50, 10, 0, 60, 250, 200], [{"item": "relayhum"}, {"item":"ledhum"}]
], 30, 12],
"relayhum": [16, [12, 1200], 255, 2]
},
"in":{
"0":{"T":0,
"click":{ "item":"reghum","icmd":"TOGGLE"},
"dclick":{ "emit":"myhome/light-d2/light","ecmd":"TOGGLE"}
},
"3":{"T":4,
"temp":{"emit":"plugtemp"},
"hum":{"item":"reghum/val","emit":"plughum"}
}
},
"mqtt":["plug00","192.168.88.2"]
}
</code>
Основные объекты, которые мы настроили:
* PID регулятор reghum. Он получает настройки влажности через топик reghum/set, а текущие показания с сенсора через топик reghum/val, его выход заведен на канал ШИМ реле (relayhum) и LED синего цвета (ledhum). В настройке заданы параметры P,I,D,dT,время перехода регулятора в режим аварии при отсутствии измерения влажности (250 сек) и значение, которое выдаст регулятор на свой выход (200) в режиме аварии
* ШИМ реле relayhum - в зависимости от значения на входе от 0 до 255 (relayhum/set) включает реле (pin 12) на время 0-1200 секунд в интервале 1200 секунд
* собственно, сенсор DHT22, передающий значения температуры и влажности в топики mqtt, значение влажности в PID регулятор (топик reghum/val)
* кнопка на корпусе, включающая-выключающая PID регулятор. (для примера, двойной клик на эту кнопку включает-выключает свет в доме. Просто потому что так можно.)
Теперь как это настроить в HomeAssistant (configuration.yaml)
<code>
humidifier:
- platform: mqtt
name: "Увлажнитель пар"
command_topic: "myhome/plug00/reghum/cmd"
state_topic: "myhome/s_out/reghum/cmd"
target_humidity_command_topic: "myhome/plug00/reghum/set"
target_humidity_state_topic: "myhome/s_out/reghum/set"
max_humidity: 60
min_humidity: 20
sensor:
- platform: mqtt
name: "Влажность пар"
icon: "mdi:water-percent"
expire_after: 600
state_topic: "myhome/s_out/plughum"
unit_of_measurement: '%'
- platform: mqtt
name: "Температура пар"
icon: "mdi:thermometer"
expire_after: 600
state_topic: "myhome/s_out/plugtemp"
unit_of_measurement: '°C'
</code>
После чего, увлажнитель и сенсоры добавляются в панель управления
Осталось только разместить сенсор и подключить его к PIN3, земле и питанию 3.3 В
Внутри розетки сенсор нагревается от реле и сильно занижает значение влажности. Лучше выводить наружу
Профит
@@ -0,0 +1,265 @@
MQTT является, пожалуй, самым общим и распространенным протоколом в IoT
Работа контроллера LightHub полностью управляется при помощи данного протокола.
Прочитать про MQTT, а также, ознакомиться с основными принципами протокола и понятиями, которые используются далее, можно [[https://www.lazyhome.ru/index.php/featurerequest/15-overview/32-mqtt|тут]]
Именно MQTT является протоколом для интеграции контроллера в системы Умного Дома под управлением таких открытых систем автоматизации как [[интеграция_с_homeassistant|HomeAsistant]], [[openhab|OpenHab]], IOBroker, NodeRed и прочих. (по ссылками приведены примеры конфигураций систем Умного дома)
Теперь о том, как MQTT применяется в данном контроллере:
В общем виде, формат топика выглядит следующим образом:
<code>
root/id-устройства_или_bcst_или_out/имя_item-a/[subitem/]suffix
</code>
* **root**: это значение имеет смысл, если один брокер обслуживает много абсолютно независимых систем или пользователей. По умолчанию - myhome
* **id-устройства** - индивидуальное Имя контроллера, задаваемое в его конфигурации (к одному брокеру может быть подключен только один контроллер с конкретным именем. Если подключается второй с тем же именем - первый отключается).
* **bcst** - групповое (широковещательное) имя контроллера. Может быть одинаковое у многих контроллеров, подключенных к одному брокеру. Используя это имя, можно выдавать команду сразу на группу контроллеров (при этом, конечно, требуется чтобы item (устройство или группа устройств), которому адресована данная команда был настроем с одним именем на всех устройствах
* **item** - устройство или группа устройств, обслуживаемое данным контроллером. Настраивается в разделе items конфигурации
* **subitem** - значение, интерпретируемое драйвером устройства. Опционально
Для адресной светодиодной ленты: 10-20 будет значить, что команду надо применить к пикселям в интервале 10-20.
Также, если в качестве subitem указать значения из набора ON,OFF,HALT,AUTO,HEAT,COOL,DRY,FAN_ONLY то команда будет применена только к устройствам, находящимся в указанном состоянии. Очень удобно для управления группой устройств. Например, через топик //myhome/in/floor/AUTO/set// можно дать команду всем теплым полам в группе floor всех контроллеров. Команду выполнят только полы, находящимся в режиме AUTO. Теплые полы в режиме OFF или HEAT эту команду проигнорируют. Очень удобно, чтобы автоматически регулировать температуру в зависимости от времени суток/тарифов электроэнергии. В режиме Авто пол на автопилоте, но его можно или насильственно включить или выключить через тот же интерфейс Home Assistant.
* **suffix** - параметр определяет какое именно свойство объекта меняется. Может быть одним из стандартного набора **cmd,set** или значением, специфичным для конкретного устройства. Например, для кондиционера или термостата **mode,lock,swing,queit,fan** для цветного освещения: **hue,sat,hsv,rgb**. Подробнее - см ниже.
Имеются три типа топиков - командные, статусные и служебные
По командным - объекты контроллера получают инструкции извне, интерпретируют их, выполняют и изменившийся статус направляют в статусные топики.
Программы удаленного доступа используют статусные топики для отображения актуального текущего состояния устройств в своем интерфейсе, вне зависимости от того, как инициировано изменение, контроллер направит информацию об этом изменении в статусные топики. Данная информация публикуется контроллером с ключом PERSISTENT. Это позволяет любой программе управления, подключившись к брокеру и подписавшись на статусные топики, сразу получить от брокера и отобразить весь актуальный статус устройств. Брокер сам вышлет вновь подключившейся программе последний актуальный статус.
Также, в статусные топики направляется информация если состояние объекта контроллера изменилось в связи с локальными процессами (например, объект переключен при помощи локальных входов)
Служебные топики используются для нужд, напрямую не связанных с управлением устройствами. Предназначены для удаленного управления контроллером, для информационных сообщений от контроллера относительно настроенных топиков, времени работы, свободной памяти
===== Пример настройки MQTT в JSON конфигурации: =====
<code>
"mqtt":["LHexample03","test.mosquitto.org",1883,"user","password"],
"topics":{"root":"myhome","bcst":"in","out":"s_out"}
</code>
Настройка mqtt задает (в порядке следования):
* Имя контроллера (к одному брокеру может быть подключен только один контроллер с конкретным именем. Если подключается второй с тем же именем - первый отключается). В данном примере, используется имя **LHexample03**
* IP или доменное имя брокера
* Порт (по умолчанию, 1883)
* Имя пользователя и пароль (по умолчанию, отсутствуют)
===== MQTT топики =====
Настройка topics в примере выше, позволяет определить как формируются MQTT топики у данного контроллера
В данном примере:
**Командные топики (широковещательные):**
* myhome/in/<имя item>
* myhome/in/<имя item>/set
* myhome/in/<имя item>/cmd
**Командные топики (индивидуальные):**
* myhome/LHexample03/<имя item>
* myhome/LHexample03/<имя item>/set
* myhome/LHexample03/<имя item>/cmd
* myhome/LHexample03/<имя item>/<иной специфичный для устройства суффикс>
**Статусные топики:**
* myhome/s_out/<имя item>
* myhome/s_out/<имя item>/set
* myhome/s_out/<имя item>/cmd
(Именно это соответствует настройкам по-умолчанию, если вообще не указан раздел topics в конфигурации)
Зачем два типа командных топиков:
Через индивидуальный, можно управлять каждым контроллером домена в отдельности. Через общий широковещательный - выдавать команды сразу всем контроллерам, с одинаковым параметром //bcst//, если они подключены к одному брокеру и имеют одинаковый //root//
В старой версии контроллера, имя топика завершалось именем item для управления
В данный //совмещенный// топик можно отправлять как команды ON OFF HALT REST и прочие (см. ниже), так и установки канала (яркость, температура и пр.)
Отличительная особенность - запись в такой совмещенный топик ненулевого значения включает канал, запись нулевого - выключает канал;
Топики данного типа используются для интеграции с системой OpenHab
**Внимание, начиная с версии ПО 3.0.0 появилось различие:**
Топики с суффиксом /set и /hsv оперируют значениями 0..255 для настройки яркости/уровня PWM, одновременно с этим, в топиках без суффикса сохранена старая нотация 0..100 для совместимости с OpenHAB
===== Суффиксы =====
В последних версиях введено понятие "суффикс" (или окончание). Это значение, которое может находиться в конце топика и определяет то свойство канала, к которому надо применить параметр, полученный в Payload
В первую очередь, остановимся на суффиксах /set и /cmd
Использование их позволяет полностью разнести логику подачи команд каналу и логику установки параметров канала
Например, если канал диммера выключен, запись в топик с окончанием /set значения 60 не включит его, а задаст значение яркости 60 (из 255). Если следом отправить ON в топик с окончанием /cmd, диммер включится на заранее установленное значение (из 255) яркости. Данные топики крайне полезны для интеграции LightHub системами HomeAssistant, HomeBridge.
Кроме окончаний /cmd и /set возможны окончания, специфичные для того или иного типа устройства:
например, окончания
Кондиционер:
* /fan (значения HIGH, MEDIUM, LOW)
* /mode
* /lock (ON,OFF)
* /swing (ON,OFF)
* /quiet (ON,OFF)
Цветное освещение:
* /hue - цвет. Шкала 0-365
* /sat - насыщенность цвета. 0 - белый, 100 - максимально насыщенный
* /hsv - цвет в нотации hue,saturation,volume (три параметра через запятую). Также, этот формат принимается по-умолчанию при записи в иные топики
* /rgb - Цвет в нотации RGB или RGBW. (3 или 4 цифры, разделенные запятыми). В отличии от HSV нотации, формат не позволяет менять яркость канала путем передачи значения 0.255 в топик с окончанием /set. Но, как и в случае HSV, цвет сохраняется в MQTT брокере на случай перезапуска, работают команды ON, OFF, XON, XOFF, HALT, REST
===== Служебные топики =====
LightHub (во многом) руководствуется конвенцией [[https://homieiot.github.io/|homie]] для формирования структуры топиков MQTT. (Пока еще не полная поддержка, но основные моменты соблюдены)
В частности, контроллер использует топик $state, чтобы отражать текущее состояние ("ready" или "disconnected"), а в топик $stats, раз в 30 секунд передает uptime и размер доступной памяти
В командный топик $command (например, myhome/controllerName/$command можно записывать CLI команды, и они будут выполняться таким же образом, как и в случае получения через последовательный порт (см. [[cli_интерфейс]])
===== Важные для понимания моменты =====
При старте контроллер сам подписывается на свои статусные топики на период 5 секунд. Таким образом, он получает от MQTT брокера последнее состояние всех своих обьектов (items) и восстанавливает их значения на момент до старта
Принимая в качестве команд расширенный набор команд, контроллер интерпретирует их и в статусный топик передает уже интерпретированные значения.
Например, контроллер получил команду "ON" для RGB канала. Он восстанавливает из памяти последнее значения цвета, насыщенности и яркости (HSV) и в статусный топик передает уже эти значения
===== Команды и инструкции, которые могут быть переданы в Payload =====
=== Базовый набор команд (совместим с OpenHab):===
* ON - Включить канал. Если сохранились предыдущие значения (яркость, температура и пр) то эти значения будут восстановлены. (Исключение - если яркость была менее 30% то будет установлена яркость 30%). Если предыдущие значения не найдены, будут заданы значения по-умолчанию: Для света - белый, яркостью 100%, для термостата - 20 градусов цельсия
* OFF - Выключить канал
* <Numeric value 0..100 или 0..255> - Задает яркость для света (с сохранением цвета), Температуру для термостата, уровень для PWM
* <Numeric 0..365>,<Numeric 0..100>,<Numeric 0..100 или 0..255> - Color notation in Hue,Saturation,Volume
* <Numeric 0..365>,<Numeric 0..100> - Color notation in Hue,Saturation. Яркость остается неизменной. Сделано для простой интеграции с HomeAssistant, в котором разнесены установки яркости и цвета
=== Расширенный набор команд (также, данные команды работают для групп каналов):===
* HALT - выключить канал(группу)
* REST - включить канал(группу), канал будет включен только если он был успешно выключен перед этим командой HALT (крайне удобно для Master выключателей. Контроллер умеет включать только то, что было выключено при уходе)
* XON - включить канал (группу) (если это не запрещено командой DISABLE). Также см. [[работа_с_mqtt#команды_включаемые_на_время]]
* XOFF - выключить (но только при условии что канал был включен командой XON) - идеально для временного включения освещения по детектору движения
* TOGGLE: Переключать из состояния ON в OFF. Если применяется для группы - то принимается что если хоть один канал, входящий в группу включен - она активна и при получении TOGGLE произойдет выключение того, что включено. Последующая команда TOGGLE включит все каналы, входящие в группу.
* #AABBCC: Color notation in RGB - Home Remote app color picker compatible
* %-N : Уменьшить значение (яркость, уровень и пр) канала на N пунктов
* %+N : Увеличить значение (яркость, уровень и пр) канала на N пунктов
==== Команды, применимые для кондиционера и термостата:====
* AUTO
* HEAT
* COOL
* FAN_ONLY
* DRY
* HIGH
* MED
* LOW
Соответственно, данное значение может быть записано в командный топик термостата или кондиционера hbath1. Например: в "myhome/in/h_bath1/cmd"
Температура - в топик "myhome/in/hbath1/set"
Соответственно, термостат или кондиционер hbath1 свое состояние будет отражать в следующих статусных топиках:
* Режим работы: "myhome/s_out/hbath1/cmd"
* Установленная температура: "myhome/s_out/hbath1/set"
* Текущая температура: "myhome/s_out/tbath1"
==== Прочие команды: ====
* ENABLE для PID регулятора - разрешить авторегулирование, для всех каналов - разрешить команду XON
* DISABLE для PID регулятора - запретить авторегулирование, для всех каналов - запретить команду XON. Использование данной пары команд очень удобно для разрешения - запрещения сценариев временного включения канала. Например временного включения света по датчику движения.
* FREEZE - заблокировать канал, после этого он игнорирует поступающие команды
* UNFREEZE - разблокировать канал
Последние 4 команды передаются на статусный топик MQTT с суффиксом /ctrl вместо /cmd как для прочих команд. При рестарте контроллера, эти значения, также, считываются из статусных топиков и восстанавливаются. Это позволяет запоминать комбинации состояний канала в брокере. Например, канал может быть одновременно заблокирован и включен
* INCREASE N - увеличить значение канала на N (аналог %N)
* DECREASE N - уменьшить значение канала на N (аналог %-N)
==== Команды с задержкой ====
Команды "ON","OFF","REST","TOGGLE","HALT","XON","XOFF","INCREASE","DECREASE","ENABLE","DISABLE","UNFREEZE","FREEZE","AUTO","FAN_ONLY" могут быть выполнены с задержкой после получения, если вместо командный топик с суффиксом /cmd их направить в топик с суффиксом /del и в Payload после названия команды, через пробел, указать величину задержки в миллисекундах
==== Команды, включаемые на время ====
Если после команды указать целое положительное число, то команда будет выполнена, но спустя указанное время, будет выполнена обратная команда
Взаимно - Обратные Команды
* "ON","OFF",
* "TOGGLE","TOGGLE"
* "REST","HALT",
* "XON","XOFF",
* "INCREASE","DECREASE",
* "ENABLE","DISABLE",
* "UNFREEZE","FREEZE"
==== Команды, с криптографической подписью ====
В том случае, если надо гарантировать, что, даже получив доступ к локальной сети, MQTT брокеру или HTTP API, потенциальный злоумышленник не сможет выполнить критичную команду (например, открытие ворот), можно использовать механизм цифровой подписи команды.
подробное описание тут [[криптоподпись_команды]]
@@ -0,0 +1,41 @@
**ОТА прошивка**
для Windows из папки C:\Program Files (x86)\Arduino\hardware\tools\avr\bin копируем arduinoOTA.exe
в папку с прошивкой (firmware.bin).
Создаем командный файл и указываем адрес вашего контроллера
<code>
arduinoOTA.exe -address 192.168.XXX.XXX -port 80 -username arduino -password password -sketch firmware.bin -b -upload /sketch
</code>
Запускаем!
для Mac
<code>
arduinoOTA -address 192.168.XXX.XXX -port 80 -username arduino -password password -sketch firmware.bin -b -upload /sketch
</code>
password - значение по-умолчанию. Его можно заменить при помощи CLI команды otapwd
**Работа с SYSLOG**
Для Windows устанавливаем Visual Syslog Сервер для Windows [[https://github.com/MaxBelkov/visualsyslog/blob/master/readme_rus.md]]
В корне конфигурационного файлa Lighthub указываем:
<code>
"syslog":["IP"]
</code>
где "IP" - адрес сервера Syslog
**Выполнение CLI команд через MQTT
**
Достаточно в топик myhome/имя_контроллера/$command послать нужную команду [[cli_интерфейс]]
Также, можно воспользоваться http [[api]]
@@ -0,0 +1,15 @@
На контроллере может быть активизирован режим доступа к шине MODBUS через TCP/IP
Данный режим может быть полезен для удаленного управления/перепрошивки устройств, которыми управляет контроллер в режиме Modbus-Master
Доступ обеспечивается как через протокол UDP так и через TCP с использованием стандартного порта 502
Для активации такого шлюза, надо перекомпилировать прошивку со следующими опциями (см [[опции_компиляции]])
<code>
-D IPMODBUS
</code>
Будет использован порт Modbus v1 и его настройки. Изменить настройки можно следующими директивами:
<code>
-D MODBUS_SERIAL_PARAM=SERIAL_8N1
-D MODBUS_SERIAL_BAUD=9600
</code>
В примере выше даны настройки по-умолчанию