Инструменты пользователя

Инструменты сайта


настройка_modbus

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
настройка_modbus [2022/09/15 20:11]
Sanch-KK [Подавление повторных значений]
настройка_modbus [2023/10/25 01:56] (текущий)
Admin [раздел par]
Строка 1: Строка 1:
-** Данная статья формируется в процессе написания кода ** 
  
-Далее описана функциональность драйвера Modbus v2+====== Функциональность драйвера Modbus v2 ====== 
  
 LightHub можно настроить на работу в качестве шлюза с фактически любым устройством, поддерживающим Modbus RTU и работающем в режиме Slave LightHub можно настроить на работу в качестве шлюза с фактически любым устройством, поддерживающим Modbus RTU и работающем в режиме Slave
Строка 26: Строка 26:
   *  "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-ти битное число со знаком
Строка 62: Строка 62:
  
 Отправка происходит, если с момента последнего опроса значение регистра изменилось Отправка происходит, если с момента последнего опроса значение регистра изменилось
 +кроме 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 ==== ==== Разделы baud и serial ====
Строка 298: Строка 361:
 "fan" :{"emit":"edem/air/vents/zal3/fan","@V":null}, "fan" :{"emit":"edem/air/vents/zal3/fan","@V":null},
 </code> </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 ===== 
 + 
 +Рассмотрим на примере вентустановки 
 +Допустим, регистр 41 отвечает за включение установки. Соответственно, в него надо записать "1" для всех рабочих режимов: 
 +  * AUTO 
 +  * ON 
 +  * HEAT 
 +  * FAN_ONLY 
 +Для команды OFF записываем 0 
 + 
 +Это реализуется строкой  
 +"on":{"reg":41,"type":"u8l","id":1,"map":{"cmd":[["OFF",0],["ON",1],["AUTO",1],["HEAT",1],["FAN_ONLY",1]]}} 
 + 
 +наличие "id"=1 позволяет не только напрямую управлять данным регистром при помощи именованного параметра "on" (топика air/on/set) но и привязать его к командному суффиксу канала 
 + 
 +Соответственно, доступно управление по командному топику air/cmd 
 + 
 +В нашей вентустановке за переключение режима работы (нагрев-вентиляция-авто) отвечает отдельный регистр 43 
 + 
 +настроим отображение режима работы на требуемые значения данного регистра и, также, привяжем это отображение к командному топику ("id":1) 
 + 
 +"pmode":{"reg":43,"type":"u8l","id":1,"map":{"cmd":[["AUTO",3],["HEAT",2],["FAN_ONLY",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 обеспечивает игнорирование значений (не команд) 
 + 
 +(описание не завершено) 
 + 
 +<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>
  
настройка_modbus.1663261885.txt.gz · Последнее изменение: 2022/09/15 20:11 — Sanch-KK