| Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
настройка_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 обеспечивает игнорирование значений (не команд) |
| |
| (описание не завершено) | (описание не завершено) |