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

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


использование_преобразований_map

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
использование_преобразований_map [2025/04/06 16:52]
Admin
использование_преобразований_map [2025/04/06 23:02] (текущий)
Admin [Шаблон "cmd":"fan"]
Строка 7: Строка 7:
 Для этого существует механизм преобразований, который может производить как конвертацию значений так и переобразования между командами и значениями Для этого существует механизм преобразований, который может производить как конвертацию значений так и переобразования между командами и значениями
  
-Первое место, где используются преобразования - это интеграция Modbus v2. это обьясняется тем, что в Modbus все взаимодействие с устройством происходит через регистры, в которые пишутся, либо, из которых считываются числовые значения.+Первое место, где используются преобразования - это интеграция Modbus v2. см [[настройка_modbus]] это обьясняется тем, что в Modbus все взаимодействие с устройством происходит через регистры, в которые пишутся, либо, из которых считываются числовые значения.
  
-Предусмотрено два типа преобразований - преобразования команды и преобразование значения +==== Типы преобразований ==== 
-Также, два направления преобразования - прямое (когда из унифицированного вида создается значение для записи в устройство) и обратное - когда считанное из устройства значение преобразуется в унифицированный вид+Предусмотрено два типа преобразований - **преобразования команды** и **преобразование значения** 
 + 
 + 
 +Также, существуют два направления преобразования - **прямое** (когда из унифицированного вида создается значение для записи в устройство) и **обратное** - когда считанное из устройства значение преобразуется в унифицированный вид
  
 Преобразование определяется при помощи JSON обьекта "map" который добавляется в описание регистра устройства  в разделе конфигурирования modbus. Разберем на примерах: Преобразование определяется при помощи JSON обьекта "map" который добавляется в описание регистра устройства  в разделе конфигурирования modbus. Разберем на примерах:
Строка 16: Строка 19:
 "fanspeed"  :{"reg":40000,"map":{"val":[1,255,1,5],"cmd":[["OFF",0]]},"id":7}, "fanspeed"  :{"reg":40000,"map":{"val":[1,255,1,5],"cmd":[["OFF",0]]},"id":7},
 </code> </code>
-При управлении fanspeed (напрямую, в нотации  <item>/fanspeed/set или через суффикс №7 (fan) в нотации <item>/fan), сперва произойдет попытка преобразования команды 
- 
 **прямое преобразование:** **прямое преобразование:**
 +
 +При управлении fanspeed (напрямую, в нотации  <item>/fanspeed/set или через суффикс №7 (fan) в нотации <item>/fan), сперва произойдет попытка преобразования команды
  
 В случае, если передана команда OFF, в регистр 40000 будет записано значение 0 В случае, если передана команда OFF, в регистр 40000 будет записано значение 0
Строка 32: Строка 35:
 в случае не успешного преобразования в команду  будет осуществлено обратное преобразование значения из шкалы 1-5 в шкалу 1-255 в случае не успешного преобразования в команду  будет осуществлено обратное преобразование значения из шкалы 1-5 в шкалу 1-255
  
-Следует отметить, что если преобразование типа "val" не указано, то число, прочитанное из регистра, будет передано на выход без преобразования - именно в том виде, как оно было прочитано из регистра.+Следует отметить, что если преобразование типа "val" не указано, то число, прочитанное из регистра, будет передано на выход без преобразования - именно в том виде, как оно было прочитано из регистра. При этом, преобразование считается выполненным успешно и "сценарий по умолчанию" (def) выполнен не будет.
  
 Данное поведение можно отменить, задав null для преобразования значения, как указано в примере ниже.  Данное поведение можно отменить, задав null для преобразования значения, как указано в примере ниже. 
 +Это приведет к тому, что при невозможности преобразовать полученное значение в команду, преобразование в число производиться не будет и отработает "сценарий по умолчанию" (def)
 <code> <code>
 "acon":{"reg":40003,"map":{"cmd":[1,["OFF",0]],"val":null,"def":40001},"id":8}, "acon":{"reg":40003,"map":{"cmd":[1,["OFF",0]],"val":null,"def":40001},"id":8},
Строка 43: Строка 47:
  
 Команда OFF приведет к записи 0 в регистр 40003 Команда OFF приведет к записи 0 в регистр 40003
-Любая длугая команда или значение будут проигнорированы+Любая другая команда или значение будут проигнорированы
  
 Обратное: Обратное:
Строка 49: Строка 53:
 Если из регистра 40003 считан ноль, он будет преобразован в команду OFF. Если из регистра 40003 считан ноль, он будет преобразован в команду OFF.
  
-любые другие значения будут проигнорированы.+любые другие значения будут проигнорированы. Преобразование при этом будет считаться не успешным. и будет выполнен "сценарий по умолчанию", заданный в параметре "def" обьекта "map"
  
-Отдельно следует отметить параметр "def" обьекта "map"Этот параметр (используется только для обратных преобразований modbus) применяется в том случае, если для считанного из регистра значения не удалось применить преобразование. В этом случае, можно использовать значение, считанное из иного регистра. +==== Сценарии преобразования по умолчанию ==== 
 +Этот параметр (используется только для обратных преобразований modbus) применяется в том случае, если для считанного из регистра значения не удалось применить преобразование. В этом случае, можно использовать значение, считанное из иного регистра. 
  
 +Параметр def может иметь либо цифровое либо строковое значение. В случае цифрового значения - задается номер регистра. в случае строкового значения - задается имя параметра. Логика работы сценария по умолчанию немного разная для данных двух случаев. 
  
 +**цифровое значение:**
 +
 +Контроллер пытается найти считанное из modbus значение в текущем буфере (на тот случай, если данное значение было считано в одном цикле опроса командой чтения нескольких последовательных регистров)
 +
 +Если значение не было считано, регистр считывается отдельно.
 +Для примера выше, требуется, чтобы номер регистра (40001), также, был определен. Например, таким образом:
 <code> <code>
 "acmode" :{"reg":40001,"map":{"cmd":[["FAN_ONLY",1],["HEAT",4],["COOL",2],["AUTO",8]]},"id":8}, "acmode" :{"reg":40001,"map":{"cmd":[["FAN_ONLY",1],["HEAT",4],["COOL",2],["AUTO",8]]},"id":8},
 </code> </code>
 +Соответственно, в случае если значение регистра 40003 не нулевое (сработал "сценарий по умолчанию") - будет прочитан регистр 40001, полученное из него значение будет преобразовано к соответствующей команде, результат данного преобразования будет возвращен как результат преобразования первого параметра (acon)
 +
 +Данное поведение, тем не менее, не отменяет стандартной логики того, что когда произойдет опрос регистра 40001 (если его опрос задан в параметре poll устройства) - будут произведены все преобразования из параметра acmode, которые будут переданы на обработку, если acmode описан в разделе items файла конфигурации.
 +
 +
 +**строковое значение:**
 +
 +В этом случае, используется последнее, ранее считанное, значение, сохраненное в параметре, имя которого указано в параметре def. Для данного значения, производятся преобразования, определенные для данного параметра и их результат возвращается как результат преобразования первого параметра.
 +
 +В примере ниже, если значение coil 0 равно нулю - обратное преобразование сразу вернет команду OFF
 +
 +Иначе, так как преобразование в число отменено (val=null), преобразование для параметра pwr будет считаться не успешным и контроллер посмотрит ранее считанное значение регистра 1, из параметра описанного в acmode, применит все указанные для регистра acmode преобразования и их результат вернет для параметра pwr  
 +
 +важно: параметр acmode должен быть описан в разделе items, даже если сам по себе он ни для каких действий более не используется. достаточно в данном описании поставить пустой JSON обьект - именно в нем контроллер сохраняет ранее считанные значения)
 +
 +  
  
 <code> <code>
-"on":{"reg":41,"type":"u8l","id":1,"map":{"cmd":[["OFF",0],["ON",1],["AUTO",1],["HEAT",1],["FAN_ONLY",1]]}},+"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},
 </code> </code>
 +
 +
 +===== Ограничения диапазона при линейном преобразовании значений =====
 +
 +В простейшем случае, в параметре val задается массив, содержащий 4 значения
  
 <code> <code>
-"fanspeed":{"reg":42,"type":"u8l","id":7,"map":{"cmd":"fan"}}+"val":[вход_минвход_максвыход_минвыход_макс]
 </code> </code>
  
-<code>   +например 
-"$rain":{"reg":67,"type":"u8l", "map":{"cmd":[null,["OFF",10],["ON",11]],"val":null}},                         + 
 +<code> 
 +"val":[151255]
 </code> </code>
 +В случае прямого преобразования, числа 1,2,3,4,5 будут преобразованы к 1, 64, 128, 195, 255
 +В случае обратного - числа из интервала 1-64 к 1, 65-128 к 2, 129-195 к 3, 196-254 к 4 и 255 к 5
 +
 +NEW
 +если входное значение не укладывается в указанные границы - преобразование считается не успешным. То есть в примере выше, если на вход преобразования придет число 0 или 6 то оно не сработает.
 +
 +можно определить значения, которые будут являться результатом преобразования если. входное значение меньше минимума или больше максимума диапазона преобразования 
  
 <code> <code>
-"pwr":{"coil":0,"map":{"cmd":[1,["OFF",0]],"val":null"def":"acmode"},"id":1}, +"val":[вход_минвход_максвыход_мин, выход_макс, вход<мин_прямое, вых<мин_обратное, вход>макс_прямое, вых>макс_обратное] 
-"fanoff":{"coil":0,"map":{"cmd":[1,["OFF",0]],"val":[0,0,0,0,1,1,null,null]"id":7}}+</code> 
-"acmode":{"reg":1,"map":{"cmd":[["FAN_ONLY",4],["HEAT",2],["COOL",1],["DRY",3],["AUTO",5]],"val":null},"id":1},+ 
 +соответственноиспользуя данный синтаксис, можно доработать пример выше таким образом, что значение 0 будет транслироваться в 0 как в прямом так и в обратном направлении  
 + 
 + 
 +<code> 
 +"val":[15, 1, 255, 0, 0] 
 +</code> 
 + 
 +Параметры подставляемые при срабатывании ограничений не обязательны. Если какие-то требуется пропустить - можно указать null 
 + 
 +===== Предопределенные шаблоны преобразований ===== 
 + 
 +==== Шаблон "cmd":"fan==== 
 + 
 +данный шаблон в случае прямого преобразования позволяет провести трансляцию стандартных команд OFF, LOWMEDIUMHIGH в значения 0, 20128, 255 соответственно  
 + 
 +Для обратного преобразования:  
 +Значения 0, 1-127128-254255 преобразуются в OFFLOWMEDIUMHIGH 
 + 
 + 
 + 
 +<code> 
 +"fanspeed":{"reg":42,"type":"u8l","id":7,"map":{"cmd":"fan"}}, 
 </code> </code>
  
использование_преобразований_map.1743947527.txt.gz · Последнее изменение: 2025/04/06 16:52 — Admin