Это старая версия документа!
Данная статья формируется в процессе написания кода
LightHub можно настроить на работу в качестве шлюза с фактически любым устройством, поддерживающим Modbus RTU и работающем в режиме Slave
В корневом разделе modbus конфигурации описывается библиотека используемых типов устройств.
Для каждого устройства в библиотеки возможно задать такие параметры как скорость обмена (раздел baud) /параметры четности (раздел serial), назначение и тип регистров (раздел par), а также, интервал и параметры опроса этих регистров (раздел poll)
Данный раздел содержит информацию о назначении каждого опрашиваемого или управляемого регистра (или групп регистров) используемого устройства. Раздел состоит из JSON объектов следующего формата:
"t_heat":{"reg":8,"map":[0,1024,0,1024],"type":"i16"},
В примере выше:
* «t_heat» - имя параметра устройства. * «reg»:8 - регистр (или стартовый регистр) параметра * «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)
задает интервал и параметры опроса регистров устройства
Причем, в целях оптимизации обмена, можно опрашивать устройство командой чтения группы регистров. Пример:
"poll":{"regs":[[40000,40014],[30000,30002],40099],"delay":10000}
Обозначает, что с интервалом 10 сек будут произведены следующие три опроса:
* Команда чтения группы из 15-ти регистров с 40000 по 40014 * Команда чтения группы из 3-x регистров с 30000 по 30002 * Команда чтения одиночного регистра 40099
Для каждого из успешно прочитанных регистров, проводится поиск соответствия в разделе par Если есть запись, соответствующая данному регистру, прочитанные значения преобразовываются (см описание map) и направляются в MQTT и/или локальным объектам контроллера
Пример:
"baud":9600, "serial":"8E1"
Соответственно, скорость обмена (по умолчанию, 9600) и параметр четности порта Параметр четности - одно из значений ниже. По умолчанию 8N1
«8E1»,«8N1»,«8E2», «8N2», «8O1», «8O2», «8M1», «8S1», «7E1», «7N1», «7E2», «7N2», «7O1», «7O2», «7M1», «7S1»
В данном разделе задаются конкретные modbus устройства
"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"}] } ] ],
В данном примере, создается item (объект) dimer1 с адресом 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 объектов)
Далее, соберем фрагменты в более полный пример:
"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} } }, "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"}] } ] ] }