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

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


== Общие сведения ==
== Общие сведения ==
Биндинги позволяют связывать сторонние MQTT-топики и их данные с устройством HOMEd Custom. Биндинги описываются как JSON-обект, ключами которого являются имена описываемых свойств. Структура описания биндингов выглядит так:
Карта регистров позволяет описывать схему данных для любых устройств, не выходящих за рамки стандарта Modbus. Карта регистров описывается как массив JSON-объектов, каждый элемент которого добавляет соответствующую [[Common/Exposes|способность]]. Структура описания карты регистров выглядит так:
<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
{
{
   ...
   ...
   "real": true,
   "type": "customController",
  "exposes": ["switch", "temperature"],
   "items":
   "bindings":
   [
   {
    "status":
     {
     {
      "inTopic": "switch/status/topic",
      "address": 110,
      "inPattern": "{{ on if json.switch == true else off }}",
      "registerType": "holding",
      "outTopic": "switch/command/topic",
      "dataType": "u16",
      "outPattern": "{\"switch\":{{ true if value == on else false }}}"
      "byteOrder": "be",
      "divider": 0.01,
      "expose": "myMumber",
      "type": "value",
      "read": true
     },
     },
    "temperature":
     {
     {
      "inTopic": "temperature/status/topic",
      "address": 2,
      "inPattern": "{{ json.temperature }}"
      "registerType": "status",
      "expose": "myBinarySensor",
      "type": "enum",
      "read": true
     }
     }
   }
   ]
   ...
   ...
}
}
</syntaxhighlight>
</syntaxhighlight>
{{Warning|Биндинги работают только в случае, когда в настройках устройства включен параметр <code>real</code>.}}
{{Warning|Карта регистров работает только для устройств типа <code>"customController"</code>. Карта регистров поддерживает только [[Common/Exposes#Типовые способности|типовые]] способности устройств. Специальные способности не поддерживаются.}}


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


=== <code>inTopic</code> ===
=== <code> address </code> ===
MQTT-топик, в который устройство публикует состояние описываемого свойства. Является обязательным в случае, если отсутствует параметр <code>outTopic</code>.
Адрес регистра в десятичном формате.


=== <code>inPattern</code> ===
=== <code>registerType</code> ===
Шаблон для получения состояния описываемого свойства из топика <code>inTopic</code>. В случае отсутствия этого параметра, данные будут использованы без изменений. Подробнее в разделе [[Custom/Database/Bindings#Шаблоны|шаблоны]].
Тип регистра. Возможные значения:
* <code class="value">coil</code> (функции 1 и 5)
* <code class="value">discrete</code> (функция 2)
* <code class="value">holding</code> (функции 3, 6 и 16)
* <code class="value">input</code> (функция 4)


=== <code>outTopic</code> ===
=== <code>dataType</code> ===
MQTT-топик, который необходимо опубликовать для изменения состояния описываемого свойства. Является обязательным в случае, если отсутствует параметр <code>inTopic</code>.
Тип данных. Актуально только для регистров типа <code class="value">"holding"</code> или <code class="value">"input"</code>. Возможные значения:
* <code class="value">i16</code>
* <code class="value">u16</code>
* <code class="value">i32</code>
* <code class="value">u32</code>
* <code class="value">i64</code>
* <code class="value">u64</code>
* <code class="value">f32</code>
* <code class="value">f64</code>


=== <code>outPattern</code> ===
=== <code>byteOrder</code> ===
Шаблон для передечи состояния описываемого свойства в топик <code>outTopic</code>. В случае отсутствия этого параметра данные будут опубликованы без изменений. Подробнее в разделе [[Custom/Database/Bindings#Шаблоны|шаблоны]].
Порядок следования байтов. Актуально только для регистров типа <code class="value">"holding"</code> или <code class="value">"input"</code>. Возможные значения:
* <code class="value">be</code>
* <code class="value">le</code>
* <code class="value">mixed</code>


== Шаблоны ==
=== <code>divider</code> ===
Шаблон это простая строка, которая может содержать части текста, обернутые двойными фигурными скобками <code><nowiki>{{ ... }}</nowiki></code>. Эти части теста будут автоматически заменяться на значение, зависящее от набора элементов шаблона.
Делитель итогового значения. Актуально только для регистров типа <code class="value">"holding"</code> или <code class="value">"input"</code>.


{{Warning|Парсер шаблонов находит элементы, разделяя исходную строку по пробелам, поэтому, при составлении шаблонов, необходимо обосабливать каждый элемент пробелами, если он не находится в начале или в конце строки.}}
=== <code>expose</code> ===
Название соответствующей [[Common/Exposes|способности]] устройства.


=== <code>json</code> ===
=== <code>type</code> ===
Этот элемент шаблона применим к случаям, когда устройство публикует свое состояние в виде JSON-объекта, и позволяет получать из этого объекта необходимые параметры. Примеры использования элемента приведены ниже.
Способ предоставления данных. Возможные значения:
* <code class="value">bool</code>
* <code class="value">value</code>
* <code class="value">emum</code>


Получение параметра <code>pressure</code>:
=== <code>read</code> ===
{{#tag:pre|<nowiki>{{ json.pressure }}</nowiki>}}
Разрешение чтения регистра.


Получение параметра из объекта, вложенного в массив:
[[Category:Modbus]]
{{#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]]

Текущая версия от 05:36, 9 апреля 2025

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

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

Карта регистров позволяет описывать схему данных для любых устройств, не выходящих за рамки стандарта Modbus. Карта регистров описывается как массив JSON-объектов, каждый элемент которого добавляет соответствующую способность. Структура описания карты регистров выглядит так:

{
  ...
  "type": "customController",
  "items":
  [
    {
      "address": 110,
      "registerType": "holding",
      "dataType": "u16",
      "byteOrder": "be",
      "divider": 0.01,
      "expose": "myMumber",
      "type": "value",
      "read": true
    },
    {
      "address": 2,
      "registerType": "status",
      "expose": "myBinarySensor",
      "type": "enum",
      "read": true
    }
  ]
  ...
}

Карта регистров работает только для устройств типа "customController". Карта регистров поддерживает только типовые способности устройств. Специальные способности не поддерживаются.

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

address

Адрес регистра в десятичном формате.

registerType

Тип регистра. Возможные значения:

  • coil (функции 1 и 5)
  • discrete (функция 2)
  • holding (функции 3, 6 и 16)
  • input (функция 4)

dataType

Тип данных. Актуально только для регистров типа "holding" или "input". Возможные значения:

  • i16
  • u16
  • i32
  • u32
  • i64
  • u64
  • f32
  • f64

byteOrder

Порядок следования байтов. Актуально только для регистров типа "holding" или "input". Возможные значения:

  • be
  • le
  • mixed

divider

Делитель итогового значения. Актуально только для регистров типа "holding" или "input".

expose

Название соответствующей способности устройства.

type

Способ предоставления данных. Возможные значения:

  • bool
  • value
  • emum

read

Разрешение чтения регистра.