Пример скипта:
var ruleName = 'automation_zabor'
var devices = [
'zigbeeRelayOut/zigbee_relay_8_zabor__state_l1',
'zigbeeRelayOut/zigbee_relay_9_stolb__state'
]
var zabor1AutoOff = 15 * 60; // seconds
defineRule("{}/Zabor1 autoOff".format(ruleName), {
whenChanged: devices,
then: function (newValue, devName, cellName) {
// log("{}/{}: {}", devName, cellName, newValue);
timers.zabor1_timer.stop();
if (newValue) {
startTimer("zabor1_timer", zabor1AutoOff * 1000);
}
}
});
defineRule("{}/Zabor1 autoOff timer".format(ruleName), {
when: function () {
return timers.zabor1_timer.firing;
},
then: function () {
for (var i in devices) {
dev[devices[i]] = false;
}
}
});
defineRule("{}/Zabor2 sync zabor 1".format(ruleName), {
whenChanged: 'zigbeeRelayOut/zigbee_relay_8_zabor__state_l1',
then: function (newValue, devName, cellName) {
// log("{}/{}: {}", devName, cellName, newValue);
setTimeout(function() {
dev['zigbeeRelayOut/zigbee_relay_8_zabor__state_l2'] = newValue;
}, 2000);
}
});
Есть несколько подобных правил. Все работают с таймерами, во время тестирования проблем нет - все отрабатывает четко. Но иногда не отключается второе устройство в списке zigbeeRelayOut/zigbee_relay_9_stolb__state
. Не всегда, чаще почему-то ночью.
При тестировании все срабатывает четко, но уже после 2 ночей заметили что устройство не отключено.
Само вирт устройство:
var virtualDevName = "zigbeeRelayOut";
var whd02 = [
{
devName: "zigbee_relay_1",
title: "zigbee_relay 1 (лестница)"
},
{
devName: "zigbee_relay_2",
title: "zigbee_relay 2 (кухня)"
},
{
devName: "zigbee_relay_3",
title: "zigbee_relay 3 (коридор б)"
},
{
devName: "zigbee_relay_4",
title: "zigbee_relay 4 (Зал)"
},
{
devName: "zigbee_relay_5",
title: "zigbee_relay 5 (Гостевая)"
},
{
devName: "zigbee_relay_9_stolb",
title: "zigbee_relay 9 (Столб)",
sync: false,
},
];
...
var cells = {};
var initialCellsLength = 0;
// Add whd02 relays
for (var i in whd02) {
var device = whd02[i];
initialCellsLength = Object.keys(cells).length;
cells[device.devName] = {
type: "switch",
value: (dev[device.devName]["state"] === "ON"),
title: device.title,
order: initialCellsLength
};
}
...
// ********************
// whd02 track ad sync
// ********************
var trackedDevices = [];
var syncDevices = [];
for (i in whd02) {
if (!whd02[i].hasOwnProperty("sync") || whd02[i].sync === true) {
syncDevices.push("{}/state".format(whd02[i].devName));
}
trackedDevices.push("{}/{}".format(virtualDevName, whd02[i].devName));
}
defineRule("{}/whd02 changed".format(virtualDevName), {
whenChanged: trackedDevices,
then: function (newValue, devName, cellName) {
var payload = { state: (newValue) ? "ON" : "OFF" };
publish("zigbee2mqtt/{}/set".format(cellName), JSON.stringify(payload), 2, false);
}
});
defineRule("{}/whd02 sync".format(virtualDevName), {
whenChanged: syncDevices,
then: function (newValue, devName, cellName) {
//log("{}/{}: {}", devName, cellName, newValue);
dev[virtualDevName][devName] = (newValue === "ON");
}
});
Думали что проблема с получением состояния из Zigbee реле, отключили правило получения состояния для этого реле чтобы не влияло на вирт устройство, но не помогло.