Skip to content

Hardware plugins manifest

nimargolis edited this page Mar 8, 2018 · 9 revisions

Манифест плагина для связи с оборудованием

Описание каналов в манифесте.

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

Стандартный канал - это объект с двумя свойствами:

id - строка - идентификатор канала

desc - строка - "группа" канала. Это может быть просто класс устройства (дискретный датчик), или тип (датчик движения), или даже тип с привязкой с производителю или физическому свойству (вход с подтяжкой Pull_UP)

Эта группировка ничем не ограничена и определяется плагином. Затем в манифест включается список всех возможных "desc" и как они связаны с классификацией intraHouse.

Для этого служит объект манифеста genrules.

В простейшем случае указывается класс ("cl":"SensorD"|"SensorA"|"ActorD"|"ActorA"|"Meter"), но можно указать тип (если предполагается автоматическая генерация устройств), а также массив дополнительных свойств ("ext"), который есть у канала этой группы.

"genrules":{ 
   desc1:{"cl":".."}, 
   desc2:{"type":xx} },
   desc3:{"type":yy},
          "ext":[{ "name":"..",  "note":"..","type":"..", "op": "r"|"w"|"rw" }]
}

Пример: плагин работает с дискретными ("desc":"DI") и аналоговыми датчиками ("desc":"AI"):

"genrules": {"AI": {"cl": "SensorA"}, "DI": {"cl": "SensorD"}}

Пример: плагин Xiaomi описывает датчики движения ("desc":"motion"), которые имеют индикатор уровеня зарядки

"genrules": { "motion": { "type": "110", "ext": [{ "name": "voltage", "note": "Зарядка", "type": "number", "op": "r" }] }, ...

Формирование каналов

Рассмотрим варианты формирования каналов и какие свойства при этом включаются в манифест.

  1. Каналы и их свойства фиксированы и полностью описаны в манифесте. Пользователем не редактируются.

    Заполняется массив каналов channels:

    channels:[{"id":"TEMP1", "desc":"AI"}, {"id":"DD1", "desc":"motion"}]

    Примеры: метеостанция, Laurent

  2. Каналы фиксированы и описаны в манифесте, но свойства могут изменяться

    Пример: Raspberry GPIO. В качестве desc выбран физический тип канала: OUT, IN_DN, IN_UP, который может изменяться

    Заполняется массив channels:

    "channels": [ {"id":"GPIO05", "desc":"IN_DN"}, {"id":"GPIO06", "desc":"IN_DN"},...

Заполняется массив chpattern, который определяет, как редактировать каналы

"chpattern": [{ "name": "desc", "note": "GPIO type", "type": "droplist", "data":[ {"id":"IN_UP", "name":"Input Pull-Up"}, {"id":"IN_DN", "name":"Input Pull-Down"}, {"id":"OUT", "name":"Output "} ] }]

  1. Каналы определяются плагином динамически и передаются на сервер В этом случае массива channels в манифесте быть не должно.

Каналы, полученные от плагина, сохраняются в проекте в папке jbase/channels/id плагина

Примеры: Wago TCP, 1-Wire, Jerome, беспроводные системы (Xiaomi,...)

  1. Каналы вводятся пользователем, плагин определяет только структуру канала В этом случае также массива channels в манифесте быть не должно.

Заполняется массив chpattern, который определяет, как редактировать каналы

"chpattern": [{
  "name": "desc",
  "note": "Тип порта",
  "type": "droplist",
  "data":[
    {"id":"DI", "name":"DI - Digital Input (IN)"},
    {"id":"DO", "name":"DO - Digital Output(OUT)"},
    {"id":"AI", "name":"AI - Analog Input (ADC, Dsen)"},
    {"id":"AO", "name":"AO - Analog Output (PWM)"},
    {"id":"Meter", "name":"Meter - (IN)"}
  ]
 },
 {
  "name": "reqsek",
  "note": "Период опроса(сек), 0-не опрашивать",
  "type": "number"
 },
 {
  "name": "req",
  "note": "Строка запроса состояния",
  "type": "string",
  "visible":"data.reqsek>0"
 },
 {
    "name": "weight",
    "note": "Вес импульса счетчика",
    "type": "string",
    "visible":"data.desc==\"Meter\""
 }]

И дается образец канала chdefault, который используется при добавлении новой строки

"chdefault": {
   "chan": "0",
  "desc": "DI",
  "reqsek": 0,
  "req": "/%pwd%/?pt=%adr%&cmd=get",
  "weight":1
}

Примеры: MegaD, универсальные плагины (MQTT, HTTP-клиент)