есть управление яркостью через аппаратные кнопки MDM3
надо сделать программное управление “медленно включить/выключить”
по аппаратной кнопке включить с запомненной яркостью
Сценарий работы:
извне команда “плавно выключить” - начинаем снижать яркость
может быть нажата аппаратная клавиша в процессе
выключили свет полностью
(позже) нажали аппаратную кнопку
Вопрос: как “красиво” сделать запоминание исходной яркости, чтобы при следующем включении по кнопке включилось с неё, на не с нуля?
Пока вижу вариант - запоминать яркость при старте алгоритма и выставлять её после отключения реле и/или нажатия аппаратных кнопок, но может есть более правильное/простое решение
UPD: Ещё раз почитал мануал на модуль… Выставить яркость, не включая, не получится.
Добрый день.
Если правильно понял, то вот пример. Создано виртуальное устройство с переключателем, с помощью которого реализовано “внешнее” плавное включение/выключение 1 канала. На вход 1 подключена кнопка и создано правило по срабатыванию 1 входа, в котором при состоянии включенного 1 канала запоминается яркость 1 канала и выполняется его отключение, а при состоянии выключенного 1 канала устанавливается яркость 1 канала, которая была запомнена при последнем отключении (по умолчанию включится на 100 %) и выполняется его включение.
defineVirtualDevice("smooth", {
cells: {
control: {
title: "ON/OFF",
type: "switch",
value: false
}
}
});
var state = !dev["wb-mdm3_20/K1"];
var br = 100;
defineRule({
asSoonAs: function() {
return dev["wb-mdm3_20/Input 1"];
},
then: function () {
timers["input1"].stop();
if (dev["wb-mdm3_20/K1"]) {
dev["wb-mdm3_20/K1"] = false;
br = dev["wb-mdm3_20/Channel 1"];
state = false;
} else {
dev["wb-mdm3_20/K1"] = true;
dev["wb-mdm3_20/Channel 1"] = br;
state = true;
}
}
});
defineRule({
whenChanged: "smooth/control",
then: function () {
timers["input1"].stop();
state = !state;
startTicker("input1", 1);
}
});
defineRule({
when: function () {
return timers["input1"].firing;
},
then: function () {
var n = dev["wb-mdm3_20/Channel 1"];
if (state) {
n--;
} else {
n++;
}
if (n < 0 || n > 100) {
timers["input1"].stop();
} else {
dev["wb-mdm3_20/Channel 1"] = n;
}
}
});
Не, не совсем. Но скрипт посмотрю для общего образования, вдруг мысль какая придёт. Что-то тяжело “въезжается” у меня логика wb-rules, хоть с js и прочими c/python/bash нормально
Как это сделать совсем вручную, мне понятно.
Хотелось бы оставить аппаратный функционал модуля, но добавить логики. Ну или хотя бы некий “безопасный режим”, когда без связи модуль управляется аппаратно, а когда связь есть - через скрипт.
Ну скрипт выполняет тот сценарий работы, который вы описали:
Извне команда “плавно выключить” реализована путем переключателя виртуального устройства. При нажатии аппаратной клавиши в процессе плавного отключения — канал будет полностью отключен. Позже при нажатии аппаратной кнопки канал включается с запомненной яркостью.
Чтобы управлять скриптом — управление входом должно быть отключено, иначе логика скрипта будет конфликтовать с логикой работы модуля.
1 ) Я надеялся “подменять” запомненную яркость, не включая светильник. Из документации понял, что так просто не выйдет
2,3) Это понятно. Хочется логику общения с кнопками оставить в модуле, но добавить “фишек”, типа отдельного управления плавностью выключения, включения по расписанию с заданной яркостью (тут и так будет работать).
Собс-но вопрос, можно ли как-то сделать программно плавное выключение так, чтоб потом кнопкой включать не с нуля, а с (некоего) начального значения. Как бы отдельное поле уставки яркости (на короткое нажатие кнопки) внутри модуля.