WB-MDM3 плавное изменение и уставка - как лучше?

Приветствую!
Посоветуйте как сделать красиво.

  1. есть управление яркостью через аппаратные кнопки MDM3
  2. надо сделать программное управление “медленно включить/выключить”
  3. по аппаратной кнопке включить с запомненной яркостью

Сценарий работы:

  • извне команда “плавно выключить” - начинаем снижать яркость
  • может быть нажата аппаратная клавиша в процессе
  • выключили свет полностью
  • (позже) нажали аппаратную кнопку

Вопрос: как “красиво” сделать запоминание исходной яркости, чтобы при следующем включении по кнопке включилось с неё, на не с нуля?

Пока вижу вариант - запоминать яркость при старте алгоритма и выставлять её после отключения реле и/или нажатия аппаратных кнопок, но может есть более правильное/простое решение

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 нормально :slight_smile:

Как это сделать совсем вручную, мне понятно.
Хотелось бы оставить аппаратный функционал модуля, но добавить логики. Ну или хотя бы некий “безопасный режим”, когда без связи модуль управляется аппаратно, а когда связь есть - через скрипт.

Ну скрипт выполняет тот сценарий работы, который вы описали:

Извне команда “плавно выключить” реализована путем переключателя виртуального устройства. При нажатии аппаратной клавиши в процессе плавного отключения — канал будет полностью отключен. Позже при нажатии аппаратной кнопки канал включается с запомненной яркостью.

Чтобы управлять скриптом — управление входом должно быть отключено, иначе логика скрипта будет конфликтовать с логикой работы модуля.
image

А зачем дублировать логику скриптом?

1 ) Я надеялся “подменять” запомненную яркость, не включая светильник. Из документации понял, что так просто не выйдет

2,3) Это понятно. Хочется логику общения с кнопками оставить в модуле, но добавить “фишек”, типа отдельного управления плавностью выключения, включения по расписанию с заданной яркостью (тут и так будет работать).

Собс-но вопрос, можно ли как-то сделать программно плавное выключение так, чтоб потом кнопкой включать не с нуля, а с (некоего) начального значения. Как бы отдельное поле уставки яркости (на короткое нажатие кнопки) внутри модуля.

Программно, при плавном отключении, когда значение дойдет до 0 — устанавливать необходимое значение канала и отключать выход:

dev["wb-mdm3_20/Channel 1"] = 50;
dev["wb-mdm3_20/K1"] = false;

Ага. Так и предполагал. А “моргать” не будет?
Тогда закрываем тему до после-праздников, когда попробую вживую.

Всех с наступающим!

1 лайк