Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
настройка_modbus [2020/06/12 11:07] Sanch-KK |
настройка_modbus [2023/10/25 01:56] (текущий) Admin [раздел par] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ** Данная статья формируется в процессе написания кода ** | + | |
+ | ====== Функциональность | ||
LightHub можно настроить на работу в качестве шлюза с фактически любым устройством, | LightHub можно настроить на работу в качестве шлюза с фактически любым устройством, | ||
+ | |||
+ | В отличии от v1, драйвер можно настроить на работу в качестве шлюза с фактически любым устройством, | ||
+ | Поддерживается как чтение так и запись в modbus устройства | ||
+ | |||
===== Раздел " | ===== Раздел " | ||
Строка 18: | Строка 24: | ||
В примере выше: | В примере выше: | ||
- | * " | + | |
- | * " | + | * " |
- | * " | + | |
- | * " | + | |
+ | * " | ||
Возможные варианты типов: | Возможные варианты типов: | ||
- | * i16 - знаковый 16-ти битный регистр (по умолчанию) | + | |
- | * i32 - знаковый 32-ти битный регистр (первый регистр - младшие биты, следующий - старшие) | + | * i32 - знаковый 32-ти битный регистр (первый регистр - младшие биты, следующий - старшие) |
- | * u16 - беззнаковый 16-ти битный регистр | + | * u16 - беззнаковый 16-ти битный регистр |
- | * u32 - беззнаковый 32-ти битный регистр (первый регистр - младшие биты, следующий - старшие) | + | * u32 - беззнаковый 32-ти битный регистр (первый регистр - младшие биты, следующий - старшие) |
- | * i8h - старшие 8 бит регистра (при записи значения, | + | * i8h - старшие 8 бит регистра (при записи значения, |
- | * i8l - старшие 8 бит регистра (при записи значения, | + | * i8l - старшие 8 бит регистра (при записи значения, |
+ | * x10 - дробное число с точностью до 0.1 полученное путем деления значения 16 битного регистра со знаком на 10 (часто используется в разных устройствах для кодирования температуры, | ||
+ | * 100 - дробное число с точностью до 0.01 полученное путем деления значения 16 битного регистра со знаком на 100 | ||
- | (знаковые и беззнаковые варианты пока не отличаются в реализации, | ||
==== раздел poll ==== | ==== раздел poll ==== | ||
Строка 46: | Строка 54: | ||
Обозначает, | Обозначает, | ||
- | * Команда чтения группы из 15-ти регистров с 40000 по 40014 | + | |
- | * Команда чтения группы из 3-x регистров с 30000 по 30002 | + | * Команда чтения группы из 3-x регистров с 30000 по 30002 |
- | * Команда чтения одиночного регистра 40099 | + | * Команда чтения одиночного регистра 40099 |
- | Для каждого из успешно прочитанных регистров, | + | Для каждого из успешно прочитанных регистров, |
Если есть запись, | Если есть запись, | ||
- | ===== Разделы baud и serial | + | Отправка происходит, |
+ | кроме regs допустимы irs и coils | ||
+ | |||
+ | Или вот пример для сенсора Sensair S8 | ||
+ | Опрашиваем INPUT REGISTERS 0-3, | ||
+ | < | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | |||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | А вот пример подключения Modbus адаптера кондиционера Haier | ||
+ | < | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | }, | ||
+ | |||
+ | " | ||
+ | |||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ] | ||
+ | ] | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== Разделы baud и serial ==== | ||
Пример: | Пример: | ||
< | < | ||
Строка 66: | Строка 139: | ||
===== Раздел " | ===== Раздел " | ||
- | В данном разделе задаются конкретные modbus устройства | + | В данном разделе задаются конкретные modbus устройства |
< | < | ||
Строка 83: | Строка 156: | ||
</ | </ | ||
- | В данном примере, | + | В данном примере, |
Устройство опрашивается согласно настройкам в библиотеке. А вот результаты опроса используются согласно настройкам в items. | Устройство опрашивается согласно настройкам в библиотеке. А вот результаты опроса используются согласно настройкам в items. | ||
В данном примере, | В данном примере, | ||
- | " | + | * " |
- | " | + | |
- | " | + | |
- | " | + | |
+ | |||
+ | |||
+ | Строки ch1 - ch4 в данном примере, | ||
+ | |||
+ | Имена этих параметров используются для доступа на запись в modbus | ||
+ | Для данного примера, | ||
+ | < | ||
+ | myhome/ | ||
+ | </ | ||
+ | (Здесь и далее для простоты предполагаем что mqtt префикс по-умолчанию myhome и обращение через broadcast имя устройства in) | ||
+ | |||
+ | " | ||
+ | |||
+ | таким образом обеспечивается индивидуальный доступ к каждому описанному в настройках регистру modbus устройства из mqtt/ | ||
+ | |||
+ | NB. Не надо именовать данные параметры именами стандартных суффиксов (set, cmd, fan и пр) (см. полный перечень стандартных суффиксов) | ||
+ | |||
+ | Также, возможно управлять не отдельными subItem - ами modbus устройства, | ||
+ | |||
+ | Для этого в разделе шаблона устройства, | ||
Далее, соберем фрагменты в более полный пример: | Далее, соберем фрагменты в более полный пример: | ||
Строка 117: | Строка 210: | ||
} | } | ||
}, | }, | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | | ||
" | " | ||
" | " | ||
Строка 157: | Строка 272: | ||
] | ] | ||
] | ] | ||
- | } | + | }, |
+ | " | ||
+ | " | ||
+ | {" | ||
+ | ] | ||
+ | ] | ||
+ | } | ||
+ | |||
+ | } | ||
</ | </ | ||
+ | |||
+ | ===== Подавление повторных значений ===== | ||
+ | В процессе опроса устройств, | ||
+ | |||
+ | Если значение не изменилось с последнего считывания - операция по отправки значения в modbus или локальному обьекту не производится | ||
+ | |||
+ | Данное поведение можно отменить. Если данную переменную определить в конфиге и ее тип будет отличен от целого значения, | ||
+ | |||
+ | Пример - панель управления климатом Zentec. Измерения влажности передаются каждый раз: | ||
+ | |||
+ | < | ||
+ | |||
+ | " | ||
+ | { | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | } | ||
+ | }, | ||
+ | | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ]] | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | Также, по-умолчанию, | ||
+ | |||
+ | Например, | ||
+ | |||
+ | Данную фильтрацию можно отменить, | ||
+ | Например так: | ||
+ | < | ||
+ | " | ||
+ | </ | ||
+ | В этом случае, | ||
+ | |||
+ | < | ||
+ | |||
+ | ===== Запись в Modbus устройство ===== | ||
+ | Параметры Модбас устройства можно записывать аналогично, | ||
+ | |||
+ | |||
+ | Рассмотрим на примере вентустановки: | ||
+ | |||
+ | Скорость можно поменять, | ||
+ | // | ||
+ | Для обращения через MQTT топик будет выглядеть как myhome/ | ||
+ | |||
+ | Внимание, | ||
+ | |||
+ | |||
+ | Параметры fanmin и fanmax доступны только на запись (контроллер не будет отслеживать изменение их значений) | ||
+ | |||
+ | |||
+ | также, есть возможность " | ||
+ | |||
+ | Перечень суффиксов: | ||
+ | < | ||
+ | CMD 1 | ||
+ | SET 2 | ||
+ | HSV 5 | ||
+ | RGB 6 | ||
+ | FAN 7 | ||
+ | MODE 8 | ||
+ | HUE 9 | ||
+ | SAT 10 | ||
+ | TEMP 11 | ||
+ | VAL 12 | ||
+ | DELAYED 13 | ||
+ | RAW 14 | ||
+ | </ | ||
+ | |||
+ | в примере ниже, это значит, | ||
+ | // | ||
+ | |||
+ | А при записи в vent/cmd это значение установится как в регистр 41 (параметр on) так и в регистр 43 (параметр pmode) так как у них указан одинаковый id=1, соответствующий суффиксу /cmd | ||
+ | |||
+ | < | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | }, | ||
+ | |||
+ | | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | |||
+ | } | ||
+ | ]], | ||
+ | | ||
+ | } | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ===== Mapping значений и команд контроллера в регистры Modbus ===== | ||
+ | |||
+ | Рассмотрим на примере вентустановки | ||
+ | Допустим, | ||
+ | * AUTO | ||
+ | * ON | ||
+ | * HEAT | ||
+ | * FAN_ONLY | ||
+ | Для команды OFF записываем 0 | ||
+ | |||
+ | Это реализуется строкой | ||
+ | " | ||
+ | |||
+ | наличие " | ||
+ | |||
+ | Соответственно, | ||
+ | |||
+ | В нашей вентустановке за переключение режима работы (нагрев-вентиляция-авто) отвечает отдельный регистр 43 | ||
+ | |||
+ | настроим отображение режима работы на требуемые значения данного регистра и, также, привяжем это отображение к командному топику (" | ||
+ | |||
+ | " | ||
+ | |||
+ | теперь при переключении режимов в регистр 43 будет записываться 3 для Авторежима, | ||
+ | |||
+ | Еще лайфхак: | ||
+ | < | ||
+ | " | ||
+ | </ | ||
+ | В примере выше, в значения регистра будет маппироваться только команда, | ||
+ | |||
+ | первый null перед массивом соответствия команда -> значение по умолчанию, | ||
+ | Если не подобрали - пытаемся преобразовать по значению | ||
+ | |||
+ | Если не использовать " | ||
+ | |||
+ | (описание не завершено) | ||
+ | |||
+ | < | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | |||
+ | " | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | }, | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | ]] | ||
+ | } | ||
+ | </ | ||
+ |