Modbus/Database/Items: различия между версиями

Материал из HOMEd Wiki
(Новая страница: «{{DISPLAYTITLE:Custom: Биндинги}} {{Breadcrumbs|Custom > База данных > Биндинги}} == Общие сведения == Биндинги позволяют связывать сторонние MQTT-топики и их данные с устройством HOMEd Custom. Биндинги описываются как JSON-обект, ключами которого являются имена описываем...»)
 
мНет описания правки
Строка 1: Строка 1:
{{DISPLAYTITLE:Custom: Биндинги}}
{{DISPLAYTITLE:Modbus: Карта регистров}}
{{Breadcrumbs|[[Custom]] > [[Custom/Database|База данных]] > Биндинги}}
{{Breadcrumbs|[[Modbus]] > [[Modbus/Database|База данных]] > Карта регистров}}


== Общие сведения ==
== Общие сведения ==
Строка 29: Строка 29:
{{Warning|Биндинги работают только в случае, когда в настройках устройства включен параметр <code>real</code>.}}
{{Warning|Биндинги работают только в случае, когда в настройках устройства включен параметр <code>real</code>.}}


== Параметры биндингов ==
== Параметры регистров ==


=== <code>inTopic</code> ===
=== <code>inTopic</code> ===
Строка 43: Строка 43:
Шаблон для передечи состояния описываемого свойства в топик <code>outTopic</code>. В случае отсутствия этого параметра данные будут опубликованы без изменений. Подробнее в разделе [[Custom/Database/Bindings#Шаблоны|шаблоны]].
Шаблон для передечи состояния описываемого свойства в топик <code>outTopic</code>. В случае отсутствия этого параметра данные будут опубликованы без изменений. Подробнее в разделе [[Custom/Database/Bindings#Шаблоны|шаблоны]].


== Шаблоны ==
[[Category:Modbus]]
Шаблон это простая строка, которая может содержать части текста, обернутые двойными фигурными скобками <code><nowiki>{{ ... }}</nowiki></code>. Эти части теста будут автоматически заменяться на значение, зависящее от набора элементов шаблона.
 
{{Warning|Парсер шаблонов находит элементы, разделяя исходную строку по пробелам, поэтому, при составлении шаблонов, необходимо обосабливать каждый элемент пробелами, если он не находится в начале или в конце строки.}}
 
=== <code>json</code> ===
Этот элемент шаблона применим к случаям, когда устройство публикует свое состояние в виде JSON-объекта, и позволяет получать из этого объекта необходимые параметры. Примеры использования элемента приведены ниже.
 
Получение параметра <code>pressure</code>:
{{#tag:pre|<nowiki>{{ json.pressure }}</nowiki>}}
 
Получение параметра из объекта, вложенного в массив:
{{#tag:pre|<nowiki>{{ json.values[2].status }}</nowiki>}}
 
Получение параметра c ключом, содержащим пробелы:
{{#tag:pre|<nowiki>{{ 'json.some key with spaces' }}</nowiki>}}
 
=== <code>value</code> ===
Этот элемент шаблона применим к случаям, когда необходимо передать на устройство значение свойства, вложив его некую текстовую конструкцию, например, в JSON-объект. Пример использования элемента:
{{#tag:pre|<nowiki>{\"setStatus\":\"{{ value }}\"}</nowiki>}}
 
=== <code>if/else</code> ===
Этот элемент шаблона является условным и его итоговое значение зависит от других элементов. Элемент поддерживает следующие условные операторы:
* <code class="value">is defined</code> (левая часть выражения не является пустой)
* <code class="value">is undefined</code> (левая часть выражения является пустой)
* <code class="value">==</code> (левая часть выражения равна правой части)
* <code class="value">!=</code> (левая часть выражения не равна правой части)
* <code class="value">></code> (левая часть выражения больше правой части)
* <code class="value">>=</code> (левая часть выражения больше или равна правой части)
* <code class="value"><</code> (левая часть выражения меньше правой части)
* <code class="value"><=</code> (левая часть выражения меньше или равна правой части)
 
{{Warning|Условные операторы <code>></code>, <code><nowiki>>=</nowiki></code>, <code><</code> и <code><nowiki><=</nowiki></code> применимы только к числовым значениям, в противном случае результат может оказаться непредсказуемым.}}
 
Примеры использования:
{{#tag:pre|<nowiki>
{{ json.value if json.value is defined else NULL }}
{{ on if json.status == true else off }}
{{ false if value <= 20 else true }}
</nowiki>}}
 
В случае, если сравниваемые или итоговые значения содержат пробелы, они ''должны'' быть обернуты в одинарные кавычки:
{{#tag:pre|<nowiki>{{ 'some value' if json.value == 'few words string' else 'other result' }}</nowiki>}}
 
Данный элемент так же может быть рекурсивным, что позволяет проверить несколько условий сразу:
{{#tag:pre|<nowiki>{{ 1 if value == 2 else 3 if value != 4 else 5 }}</nowiki>}}
 
== Математические выражения ==
Помимо описанных выше элементов, в шаблонах так же могут быть применены математические выражения. В этом случае соответсвующая часть текста будет заменена числовым результатом вычислений. Например:
{{#tag:pre|<nowiki>
{{ value * 4.815162342 }}
{{ ( value + 2 ) / 10 }}
</nowiki>}}
 
В случае, если необходимо использовать математическоие выражения совместно другими элементами шаблонов, каждый элемент ''должен'' быть обернут в собственные двойные фигурные скобки. Например:
{{#tag:pre|<nowiki>
{{ true if {{ value * 10 }} < 50 else false }}
{{ json.number * {{ 10 if json.number > 20 else 100 }}}}
{{ round( value ) }}
</nowiki>}}
 
Список досутпных функций можно посмотреть [https://github.com/u236/homed-service-common/blob/master/parser.cpp#L95-L120 здесь].
 
== Экранирование ==
В случае, когда нужно использовать элементы шаблона в качестве простого текста, их необходимо экранировать двумя обратными слэшами, например:
{{#tag:pre|<nowiki>{{ json.value if json.value is defined else '\\json.value is undefined' }}</nowiki>}}
 
 
[[Category:Custom]]

Версия от 11:06, 24 марта 2025

HOMEd > Modbus > База данных > Карта регистров

Общие сведения

Биндинги позволяют связывать сторонние MQTT-топики и их данные с устройством HOMEd Custom. Биндинги описываются как JSON-обект, ключами которого являются имена описываемых свойств. Структура описания биндингов выглядит так:

{
  ...
  "real": true,
  "exposes": ["switch", "temperature"],
  "bindings":
  {
    "status":
    {
       "inTopic": "switch/status/topic",
       "inPattern": "{{ on if json.switch == true else off }}",
       "outTopic": "switch/command/topic",
       "outPattern": "{\"switch\":{{ true if value == on else false }}}"
    },
    "temperature":
    {
       "inTopic": "temperature/status/topic",
       "inPattern": "{{ json.temperature }}"
    }
  }
  ...
}

Биндинги работают только в случае, когда в настройках устройства включен параметр real.

Параметры регистров

inTopic

MQTT-топик, в который устройство публикует состояние описываемого свойства. Является обязательным в случае, если отсутствует параметр outTopic.

inPattern

Шаблон для получения состояния описываемого свойства из топика inTopic. В случае отсутствия этого параметра, данные будут использованы без изменений. Подробнее в разделе шаблоны.

outTopic

MQTT-топик, который необходимо опубликовать для изменения состояния описываемого свойства. Является обязательным в случае, если отсутствует параметр inTopic.

outPattern

Шаблон для передечи состояния описываемого свойства в топик outTopic. В случае отсутствия этого параметра данные будут опубликованы без изменений. Подробнее в разделе шаблоны.