Сделал скрипт для телеуправления с ключом блокировки:
telecontrol.schema.json
{
"type":"object",
"title": "Телеуправление",
"description": "Настройка телеуправления выключателями",
"configFile": {
"path": "/etc/telecontrol.conf",
"service": "wb-rules"
},
"definitions": {
"tc_point":{
"type":"object",
"title":"Точка управления",
"headerTemplate": "{{self.name}}",
"properties": {
"enabled": {
"type": "boolean",
"title": "Акт.",
"propertyOrder": 1,
"_format": "checkbox"
},
"name":{
"type":"string",
"title":"Наименование",
"propertyOrder": 2,
"default":"ВВ 10 кВ ф.1"
},
"ts":{
"type":"string",
"title":"ТС состояния выключателя",
"propertyOrder":3,
"default":"wb-gpio/EXT2_IN1"
},
"time":{
"type": "integer",
"title": "Длительность, мс",
"propertyOrder": 4,
"min":100,
"max":10000,
"default":1000
},
"on":{
"type":"string",
"title":"Реле на Включение",
"propertyOrder": 5,
"default":"wb-gpio/EXT1_R3A1"
},
"off":{
"type":"string",
"title":"Реле на Отключение",
"propertyOrder": 6,
"default":"wb-gpio/EXT1_R3A2"
}
}
}
},
"properties":{
"use_key":{
"type":"boolean",
"title":"Использовать ключ блокировки телеуправления",
"propertyOrder": 1,
"default":false,
"_format": "checkbox"
},
"key":{
"type": "string",
"title": "Ключ блокировки ТУ",
"propertyOrder": 2,
"default":"Вход 14",
"enum":["wb-gpio/EXT2_IN12","wb-gpio/EXT2_IN13","wb-gpio/EXT2_IN14"],
"options": {"enum_titles": ["Вход 12","Вход 13","Вход 14"]}
},
"points": {
"type": "array",
"title": "Точки телеуправления",
"description": "Список точек телеуправления и назначенных им выходов",
"propertyOrder": 3,
"_format": "table",
"items": {
"$ref": "#/definitions/tc_point"
},
"options": {
"disable_collapse": true
}
}
}
}
telecontrol-rule.js
log("Модуль телеуправление загружен");
var config = readConfig("/etc/telecontrol.conf");
var tu_points = {};
config.points.forEach(function(point,n){
if(point.enabled){
tu_points[point.name]={type: "switch",value: dev[point.ts]};
defineRule("wb-telecontrol"+n, {
whenChanged: "wb-telecontrol/"+point.name,
then: function(newValue, devName, cellName) {
if((config.use_key&&!dev[config.key])||!config.use_key){
//if(newValue!=dev[point.ts])
(function(x){log("Телеуправление {} выполнено переведен в [{}]",point.name,newValue?"Включено":"Отключено");dev[x]=true;setTimeout(function(){dev[x]=false;},point.time);})(newValue?point.on:point.off);
}else{
//if(newValue!=dev[point.ts])dev[devName][cellName] = dev[point.ts];
log("Телеуправление {} не выполнено, активна блокировка.",point.name);
}
}
});
}
});
defineVirtualDevice("wb-telecontrol", {title: "Телеуправление",cells: tu_points});
Но правило whenChanged имеет особенность - нельзя послать 2 команды одного типа подряд.
какое еще можно использовать правило чтобы обработать данные пришедшие по МЭК104?
Нужно обрабатывать все команды пришедшие по МЭК104, в том числе и повторные - запись 1 - должна активировать реле включения столько раз, сколько будет послана комманда записи. Если по изменениям - то только чередовать команды записи 0 и 1.