-
Notifications
You must be signed in to change notification settings - Fork 1
Hardware plugins manifest
В зависимости от оборудования и алгоритма плагина существует несколько вариантов формирования каналов, от которых зависит способ описания каналов в манифесте. Каналы могут быть фиксированы, формироваться пользователем или плагином. Также сам канал может включать любое число дополнительных свойств, это определяется при разработке плагина и отражается в манифесте.
Стандартный канал - это объект с двумя свойствами:
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" }] }, ...
Рассмотрим варианты формирования каналов и какие свойства при этом включаются в манифест.
-
Каналы и их свойства фиксированы и полностью описаны в манифесте. Пользователем не редактируются.
Заполняется массив каналов channels:
channels:[{"id":"TEMP1", "desc":"AI"}, {"id":"DD1", "desc":"motion"}]
Примеры: метеостанция, Laurent
-
Каналы фиксированы и описаны в манифесте, но свойства могут изменяться
Пример: 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 "} ] }]
- Каналы определяются плагином динамически и передаются на сервер В этом случае массива channels в манифесте быть не должно.
Каналы, полученные от плагина, сохраняются в проекте в папке jbase/channels/id плагина
Примеры: Wago TCP, 1-Wire, Jerome, беспроводные системы (Xiaomi,...)
- Каналы вводятся пользователем, плагин определяет только структуру канала В этом случае также массива 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-клиент)