Это старая версия документа!
Внутри контроллера команды и значения между каналами передаются в унифицированном виде (см itemCmd) Но для управления реальными устройствами, данные необходимо конвертировать из унифицированного вида в формат, который понимает устройство и наоборот
Для этого существует механизм преобразований, который может производить как конвертацию значений так и переобразования между командами и значениями
Первое место, где используются преобразования - это интеграция Modbus v2. это обьясняется тем, что в Modbus все взаимодействие с устройством происходит через регистры, в которые пишутся, либо, из которых считываются числовые значения.
Предусмотрено два типа преобразований - преобразования команды и преобразование значения Также, два направления преобразования - прямое (когда из унифицированного вида создается значение для записи в устройство) и обратное - когда считанное из устройства значение преобразуется в унифицированный вид
Преобразование определяется при помощи JSON обьекта «map» который добавляется в описание регистра устройства в разделе конфигурирования modbus. Разберем на примерах:
"fanspeed" :{"reg":40000,"map":{"val":[1,255,1,5],"cmd":[["OFF",0]]},"id":7},
При управлении fanspeed (напрямую, в нотации <item>/fanspeed/set или через суффикс №7 (fan) в нотации <item>/fan), сперва произойдет попытка преобразования команды
прямое преобразование:
В случае, если передана команда OFF, в регистр 40000 будет записано значение 0 В противном случае, осуществляется попытка преобразовать переданное значение, конвертировав его из шкалы 1-255 в шкалу 1-5 если в результате преобразований будет получено число - произойдет запись в указанный регистр модбас.
при считывании значения из регистра, будет происходить обратное преобразование
При этом, те же правила применяются в обратном направлении. Сначала производится попытка преобразовать полученное из регистра значение в команду. В случае неуспеха - в число.
В примере выше - если считано значение 0 - оно будет преобразовано в команду OFF в случае не успешного преобразования в команду будет осуществлено обратное преобразование значения из шкалы 1-5 в шкалу 1-255
Следует отметить, что если преобразование типа «val» не указано, то число, прочитанное из регистра, будет передано на выход без преобразования - именно в том виде, как оно было прочитано из регистра.
Данное поведение можно отменить, задав null для преобразования значения, как указано в примере ниже.
"acon":{"reg":40003,"map":{"cmd":[1,["OFF",0]],"val":null,"def":40001},"id":8},
Для этого примера преобразования будут действовать следующим образом:
Прямое:
Команда OFF приведет к записи 0 в регистр 40003 Любая длугая команда или значение будут проигнорированы
Обратное:
Если из регистра 40003 считан ноль, он будет преобразован в команду OFF.
любые другие значения будут проигнорированы.
Отдельно следует отметить параметр «def» обьекта «map». Этот параметр (используется только для обратных преобразований modbus) применяется в том случае, если для считанного из регистра значения не удалось применить преобразование. В этом случае, можно использовать значение, считанное из иного регистра.
"acmode" :{"reg":40001,"map":{"cmd":[["FAN_ONLY",1],["HEAT",4],["COOL",2],["AUTO",8]]},"id":8},
"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"}},
"$rain":{"reg":67,"type":"u8l", "map":{"cmd":[null,["OFF",10],["ON",11]],"val":null}},
"pwr":{"coil":0,"map":{"cmd":[1,["OFF",0]],"val":null, "def":"acmode"},"id":1}, "fanoff":{"coil":0,"map":{"cmd":[1,["OFF",0]],"val":[0,0,0,0,1,1,null,null], "id":7}}, "acmode":{"reg":1,"map":{"cmd":[["FAN_ONLY",4],["HEAT",2],["COOL",1],["DRY",3],["AUTO",5]],"val":null},"id":1},