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

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


== Общие сведения ==
== Общие сведения ==
Биндинги позволяют связывать сторонние MQTT-топики и их данные с устройством HOMEd Custom. Биндинги описываются как JSON-обект, ключами которого являются имена связываемых свойств, например:
Биндинги позволяют связывать сторонние MQTT-топики и их данные с устройством HOMEd Custom. Биндинги описываются как JSON-обект, ключами которого являются имена описываемых свойств. Структура описания биндингов выглядит так:
<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
{
{
   ...
   ...
  "real": true,
  "exposes": ["switch", "temperature"],
   "bindings":
   "bindings":
   {
   {
Строка 12: Строка 14:
     {
     {
       "inTopic": "switch/status/topic",
       "inTopic": "switch/status/topic",
       "inPattern": "{{ on if json.switch is true else off }}",
       "inPattern": "{{ on if json.switch == true else off }}",
       "outTopic": "switch/command/topic",
       "outTopic": "switch/command/topic",
       "inPattern": "{\"switch":{{ true if value is on else false }}}"
       "outPattern": "{\"switch\":{{ true if value == on else false }}}"
     },
     },
     "temperature":
     "temperature":
Строка 25: Строка 27:
}
}
</syntaxhighlight>
</syntaxhighlight>
{{Warning|Биндинги работают только в случае, когда в настройках устройства включен параметр <code>real</code>.}}
== Параметры биндингов ==
=== <code>inTopic</code> ===
MQTT-топик, в который устройство публикует состояние описываемого свойства. Является обязательным в случае, если отсутствует параметр <code>outTopic</code>.
=== <code>inPattern</code> ===
Шаблон для получения состояния описываемого свойства из топика <code>inTopic</code>. В случае отсутствия этого параметра, данные будут использованы без изменений. Подробнее в разделе [[Custom/Database/Bindings#Шаблоны|шаблоны]].
=== <code>outTopic</code> ===
MQTT-топик, который необходимо опубликовать для изменения состояния описываемого свойства. Является обязательным в случае, если отсутствует параметр <code>inTopic</code>.
=== <code>outPattern</code> ===
Шаблон для передечи состояния описываемого свойства в топик <code>outTopic</code>. В случае отсутствия этого параметра данные будут опубликованы без изменений. Подробнее в разделе [[Custom/Database/Bindings#Шаблоны|шаблоны]].
== Шаблоны ==
Шаблон это простая строка, которая может содержать части текста, обернутые двойными фигурными скобками <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]]
[[Category:Custom]]

Текущая версия от 16:10, 8 марта 2025

HOMEd > Custom > База данных > Биндинги

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

Биндинги позволяют связывать сторонние 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. В случае отсутствия этого параметра данные будут опубликованы без изменений. Подробнее в разделе шаблоны.

Шаблоны

Шаблон это простая строка, которая может содержать части текста, обернутые двойными фигурными скобками {{ ... }}. Эти части теста будут автоматически заменяться на значение, зависящее от набора элементов шаблона.

Парсер шаблонов находит элементы, разделяя исходную строку по пробелам, поэтому, при составлении шаблонов, необходимо обосабливать каждый элемент пробелами, если он не находится в начале или в конце строки.

json

Этот элемент шаблона применим к случаям, когда устройство публикует свое состояние в виде JSON-объекта, и позволяет получать из этого объекта необходимые параметры. Примеры использования элемента приведены ниже.

Получение параметра pressure:

{{ json.pressure }}

Получение параметра из объекта, вложенного в массив:

{{ json.values[2].status }}

Получение параметра c ключом, содержащим пробелы:

{{ 'json.some key with spaces' }}

value

Этот элемент шаблона применим к случаям, когда необходимо передать на устройство значение свойства, вложив его некую текстовую конструкцию, например, в JSON-объект. Пример использования элемента:

{\"setStatus\":\"{{ value }}\"}

if/else

Этот элемент шаблона является условным и его итоговое значение зависит от других элементов. Элемент поддерживает следующие условные операторы:

  • is defined (левая часть выражения не является пустой)
  • is undefined (левая часть выражения является пустой)
  • == (левая часть выражения равна правой части)
  • != (левая часть выражения не равна правой части)
  • > (левая часть выражения больше правой части)
  • >= (левая часть выражения больше или равна правой части)
  • < (левая часть выражения меньше правой части)
  • <= (левая часть выражения меньше или равна правой части)

Условные операторы >, >=, < и <= применимы только к числовым значениям, в противном случае результат может оказаться непредсказуемым.

Примеры использования:

{{ json.value if json.value is defined else NULL }}
{{ on if json.status == true else off }}
{{ false if value <= 20 else true }}

В случае, если сравниваемые или итоговые значения содержат пробелы, они должны быть обернуты в одинарные кавычки:

{{ 'some value' if json.value == 'few words string' else 'other result' }}

Данный элемент так же может быть рекурсивным, что позволяет проверить несколько условий сразу:

{{ 1 if value == 2 else 3 if value != 4 else 5 }}

Математические выражения

Помимо описанных выше элементов, в шаблонах так же могут быть применены математические выражения. В этом случае соответсвующая часть текста будет заменена числовым результатом вычислений. Например:

{{ value * 4.815162342 }}
{{ ( value + 2 ) / 10 }}

В случае, если необходимо использовать математическоие выражения совместно другими элементами шаблонов, каждый элемент должен быть обернут в собственные двойные фигурные скобки. Например:

{{ true if {{ value * 10 }} < 50 else false }}
{{ json.number * {{ 10 if json.number > 20 else 100 }}}}
{{ round( value ) }}

Список досутпных функций можно посмотреть здесь.

Экранирование

В случае, когда нужно использовать элементы шаблона в качестве простого текста, их необходимо экранировать двумя обратными слэшами, например:

{{ json.value if json.value is defined else '\\json.value is undefined' }}