| Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
использование_преобразований_map [2025/04/06 14:41] Admin |
использование_преобразований_map [2025/04/06 23:02] (текущий) Admin [Шаблон "cmd":"fan"] |
| Для этого существует механизм преобразований, который может производить как конвертацию значений так и переобразования между командами и значениями | Для этого существует механизм преобразований, который может производить как конвертацию значений так и переобразования между командами и значениями |
| |
| Первое место, где используются преобразования - это интеграция Modbus v2. это обьясняется тем, что в Modbus все взаимодействие с устройством происходит через регистры, в которые пишутся, либо, из которых считываются числовые значения. | Первое место, где используются преобразования - это интеграция Modbus v2. см [[настройка_modbus]] это обьясняется тем, что в Modbus все взаимодействие с устройством происходит через регистры, в которые пишутся, либо, из которых считываются числовые значения. |
| |
| Предусмотрено два типа преобразований - преобразования команды и преобразование значения | ==== Типы преобразований ==== |
| Также, два направления преобразования - прямое (когда из унифицированного вида создается значение для записи в устройство) и обратное - когда считанное из устройства значение преобразуется в унифицированный вид | Предусмотрено два типа преобразований - **преобразования команды** и **преобразование значения** |
| | |
| | |
| | Также, существуют два направления преобразования - **прямое** (когда из унифицированного вида создается значение для записи в устройство) и **обратное** - когда считанное из устройства значение преобразуется в унифицированный вид |
| |
| Преобразование определяется при помощи JSON обьекта "map" который добавляется в описание регистра устройства в разделе конфигурирования modbus. Разберем на примерах: | Преобразование определяется при помощи JSON обьекта "map" который добавляется в описание регистра устройства в разделе конфигурирования modbus. Разберем на примерах: |
| "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 |
| В противном случае, осуществляется попытка преобразовать переданное значение, конвертировав его из шкалы 1-255 в шкалу 1-5 | В противном случае, осуществляется попытка преобразовать переданное значение, конвертировав его из шкалы 1-255 в шкалу 1-5 |
| | если в результате преобразований будет получено число - произойдет запись в указанный регистр модбас. |
| |
| при считывании значения из регистра, будет происходить обратное преобразование | при считывании значения из регистра, будет происходить **обратное преобразование** |
| |
| Если считано значение 0 - оно будет преобразовано в команду OFF | При этом, те же правила применяются в обратном направлении. |
| в случае не успешного преобразования в команду (?) будет осуществлено обратное преобразование значения из шкалы 1-5 в шкалу 1-255 | Сначала производится попытка преобразовать полученное из регистра значение в команду. В случае неуспеха - в число. |
| |
| | В примере выше - если считано значение 0 - оно будет преобразовано в команду OFF |
| | в случае не успешного преобразования в команду будет осуществлено обратное преобразование значения из шкалы 1-5 в шкалу 1-255 |
| |
| | Следует отметить, что если преобразование типа "val" не указано, то число, прочитанное из регистра, будет передано на выход без преобразования - именно в том виде, как оно было прочитано из регистра. При этом, преобразование считается выполненным успешно и "сценарий по умолчанию" (def) выполнен не будет. |
| | |
| | Данное поведение можно отменить, задав 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}, |
| </code> | </code> |
| | Для этого примера преобразования будут действовать следующим образом: |
| |
| | Прямое: |
| | |
| | Команда OFF приведет к записи 0 в регистр 40003 |
| | Любая другая команда или значение будут проигнорированы |
| | |
| | Обратное: |
| | |
| | Если из регистра 40003 считан ноль, он будет преобразован в команду OFF. |
| | |
| | любые другие значения будут проигнорированы. Преобразование при этом будет считаться не успешным. и будет выполнен "сценарий по умолчанию", заданный в параметре "def" обьекта "map". |
| | |
| | ==== Сценарии преобразования по умолчанию ==== |
| | Этот параметр (используется только для обратных преобразований 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":[1, 5, 1, 255] |
| </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":[1, 5, 1, 255, 0, 0] |
| | </code> |
| | |
| | Параметры подставляемые при срабатывании ограничений не обязательны. Если какие-то требуется пропустить - можно указать null |
| | |
| | ===== Предопределенные шаблоны преобразований ===== |
| | |
| | ==== Шаблон "cmd":"fan" ==== |
| | |
| | данный шаблон в случае прямого преобразования позволяет провести трансляцию стандартных команд OFF, LOW, MEDIUM, HIGH в значения 0, 20, 128, 255 соответственно |
| | |
| | Для обратного преобразования: |
| | Значения 0, 1-127, 128-254, 255 преобразуются в OFF, LOW, MEDIUM, HIGH |
| | |
| | |
| | |
| | <code> |
| | "fanspeed":{"reg":42,"type":"u8l","id":7,"map":{"cmd":"fan"}}, |
| </code> | </code> |
| |