Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
настройка_modbus [2022/10/07 16:39] Sanch-KK |
настройка_modbus [2025/04/06 10:48] (текущий) Admin [Mapping значений и команд контроллера в регистры Modbus] |
* "t_heat" - имя параметра устройства. | * "t_heat" - имя параметра устройства. |
* "reg" - регистр (или стартовый HOLDING REGISTER) параметра | * "reg" - регистр (или стартовый HOLDING REGISTER) параметра |
* "ir: - INPUT REGISTER | * "ir: - INPUT REGISTER или "reg"- HOLDING REGISTER или "coil": COIL или "din" - DISCRETE INPUT |
* "map" - правила преобразования (TBD) | * "map" - правила преобразования (TBD) |
* "type":"i16" - указывает, что значение - 16-ти битное число со знаком | * "type":"i16" - указывает, что значение - 16-ти битное число со знаком |
| |
Отправка происходит, если с момента последнего опроса значение регистра изменилось | Отправка происходит, если с момента последнего опроса значение регистра изменилось |
| кроме regs допустимы irs и coils |
| |
Или вот пример для сенсора Sensair S8 | Или вот пример для сенсора Sensair S8 |
} | } |
</code> | </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 ==== | ==== Разделы baud и serial ==== |
В этом случае, после того, как мы что-то записали в регистр, при следующем же опросе устройства, это будет обнаружено (если значение изменилось) и будут предприняты настроенные действия (например, значение будет отправлено по MQTT и отобразится в мобильном приложении Home Assistant) | В этом случае, после того, как мы что-то записали в регистр, при следующем же опросе устройства, это будет обнаружено (если значение изменилось) и будут предприняты настроенные действия (например, значение будет отправлено по MQTT и отобразится в мобильном приложении Home Assistant) |
| |
И еще один фильтр: при попытке записать в регистр значение, не отличающееся от последнего полученного при опросе, такая попытка будет проигнорирована. Такое поведение отключить нельзя. | <del>И еще один фильтр: при попытке записать в регистр значение, не отличающееся от последнего полученного при опросе, такая попытка будет проигнорирована. Такое поведение отключить нельзя.</del> |
| |
===== Запись в Modbus устройство ===== | ===== Запись в Modbus устройство ===== |
| |
===== Mapping значений и команд контроллера в регистры Modbus ===== | ===== Mapping значений и команд контроллера в регистры Modbus ===== |
| Более подробно настройка преобразований описана в отдельном разделе [[использование_преобразований_map]] |
| |
| Далее, разобраны примеры применения |
Рассмотрим на примере вентустановки | Рассмотрим на примере вентустановки |
Допустим, регистр 41 отвечает за включение установки. Соответственно, в него надо записать "1" для всех рабочих режимов: | Допустим, регистр 41 отвечает за включение установки. Соответственно, в него надо записать "1" для всех рабочих режимов: |
| |
Это реализуется строкой | Это реализуется строкой |
| <code> |
"on":{"reg":41,"type":"u8l","id":1,"map":{"cmd":[["OFF",0],["ON",1],["AUTO",1],["HEAT",1],["FAN_ONLY",1]]}} | "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) но и привязать его к командному суффиксу канала | наличие "id"=1 позволяет не только напрямую управлять данным регистром при помощи именованного параметра "on" (топика air/on/set) но и привязать его к командному суффиксу канала |
| |
| |
настроим отображение режима работы на требуемые значения данного регистра и, также, привяжем это отображение к командному топику ("id":1) | настроим отображение режима работы на требуемые значения данного регистра и, также, привяжем это отображение к командному топику ("id":1) |
| <code> |
"pmode":{"reg":43,"type":"u8l","id":1,"map":{"cmd":[["AUTO",3],["HEAT",2],["FAN_ONLY",1]]}}, | "pmode":{"reg":43,"type":"u8l","id":1,"map":{"cmd":[["AUTO",3],["HEAT",2],["FAN_ONLY",1]]}}, |
| </code> |
теперь при переключении режимов в регистр 43 будет записываться 3 для Авторежима, 2 - для режима нагрева, 1 - для режима вентиляции | теперь при переключении режимов в регистр 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 обеспечивает игнорирование значений (не команд) |
| |
(описание не завершено) | (описание не завершено) |