Заметили некорректное поведение диммирования лент при определении виртуального устройства для WB-LED.
Задача:
- диммировать при долгом нажатии на выключатель (реализовано стандартными настройками wb-led)
- диммировать в интерфейсе через виртуальное устройство.
При включении - выключении проблем нет.
При диммировании через виртуальное устройство - проблем нет
При диммировании путем долгого нажатия выключателя - идет мерцание ленты и время диммирования кратно увеличивается.
Получается что проблема в работе вирутального устройства а точнее его синхронизации с реальным устройством.
Для устройст заданы алиасы:
global.__proto__.f2_led_Kabinet = "wb-led_196/Channel 3"
global.__proto__.f2_led_Kabinet_brightness = "wb-led_196/Channel 3 Brightness"
global.__proto__.f2_led_Vannaya = "wb-led_216/Channel 1"
global.__proto__.f2_led_Vannaya_brightness = "wb-led_216/Channel 1 Brightness"
global.__proto__.f2_balkon = "wb-mr6cu_184/K1";
Само виртуальное устройство:
var virtualDevName = "f2_led";
var virtualDevTitle = "_2 этаж: свет";
var config = [
{
dev: "f2_led_Kabinet",
title: "Кабинет",
brightness: true,
},
{
dev: "f2_led_Vannaya",
title: "Ванная",
brightness: true,
},
{
dev: "f2_balkon",
title: "Балкон",
brightness: false,
}
];
var cells = {};
var virtualDevItems = [];
var realDevItems = [];
var order = 1;
for (var i = 0; i < config.length; i++) {
var element = config[i];
var cellName = "cell_{}".format(element.dev);
cells[cellName] = {
type: "switch",
value: dev[global.__proto__[element.dev]],
title: element.title,
order: order,
}
order++;
virtualDevItems.push("{}/{}".format(virtualDevName, cellName));
realDevItems.push(global.__proto__[element.dev]);
if (element.brightness) {
var cellNameBrightness = "{}_{}".format(cellName, "brightness")
cells[cellNameBrightness] = {
type: "range",
value: dev[global.__proto__["{}_{}".format(element.dev, "brightness")]],
min: 0,
max: 100,
title: "{} {}".format(element.title, "Яркость"),
order: order,
}
virtualDevItems.push("{}/{}".format(virtualDevName, cellNameBrightness));
realDevItems.push(global.__proto__["{}_{}".format(element.dev, "brightness")]);
order++;
}
}
defineVirtualDevice(virtualDevName, {
title: virtualDevTitle,
cells: cells,
});
defineRule("{}/switch".format(virtualDevName), {
whenChanged: virtualDevItems,
then: function (newValue, devName, cellName) {
var realDeviceName = cellName.replace("cell_", "");
dev[global.__proto__[realDeviceName]] = newValue;
}
});
defineRule("{}/sync".format(virtualDevName), {
whenChanged: realDevItems,
then: function (newValue, devName, cellName) {
//log("devName: {}, cellName: {}, newValue: {}", devName, cellName, newValue);
var realDevicePath = "{}/{}".format(devName, cellName);
for (var i = 0; i < config.length; i++) {
var element = config[i];
var virtualCellName = null;
switch (global.__proto__[element.dev]) {
case realDevicePath: // Switch
virtualCellName = "{}/cell_{}".format(virtualDevName, element.dev);
break;
case realDevicePath.replace(" Brightness", ""): // brightness
virtualCellName = "{}/cell_{}_brightness".format(virtualDevName, element.dev);
break;
}
if (virtualCellName && dev[virtualCellName] !== newValue) {
dev[virtualCellName] = newValue;
}
}
}
});
Проблема в defineRule(“{}/sync”.format(virtualDevName)
Когда мы диммируем через физическую кнопку в правило прилетает значение с небольшим опозданием которое в свою очередь вызывает мерцание ленты из-за dev[virtualCellName] = newValue;.
Подскажите как это обходить? Только таймерами с присваением значения яркости в вирутуальное устройство через N секунд после начала диммирования? Не хочется городить костыли для такой простой задачи.


