Диммирование ленты исходя из времени, уровня освещенности и состояния выключателя

Всех с наступившим новым годом.

Решил поучиться новым сценариям управления белой лентой. Хочу сделать автоматическую регулировку яркости ленты по нескольким условиям:

  1. По времени - допустим с 4 дня должна включаться автоматическая регулировка яркости, а в 6 утра отключаться.
  2. По уровню освещенности - в указанный промежуток времени, в зависимости от уровня освещенности, меняем уровень яркости ленты
  3. По состоянию выключателя - лента должна регулировать яркость не только в указанные диапазоны времени и уровня освещенности, но и при условии что мы эту ленту включили кнопкой (физической или виртуальной)
  4. Если мы вручную отрегулировали яркость, допустим чтобы сделать комфортный свет для работы, то она уже не должна меняться автоматически до следующего временного цикла.

Имею 3 куска кода:

  1. На вкл/выкл ленты
defineRule({
whenChanged: "wb-mcm8_180/Input 3 Single Press Counter",
then: function (newValue, devName, cellName) {
  dev["wb-led_101"]["Channel 4"] = !dev["wb-led_101"]["Channel 4"];
}
});
  1. на управление яркостью по длинному нажатию кнопки
var direction = false;
defineRule({
  whenChanged: "wb-mcm8_180/Input 3 Long Press Counter",
  then: function (newValue, devName, cellName) {
    // Запуск таймера для изменения значения уровня яркости
    startTicker("wb-mcm8_180/input3_long_press", 40);
  }
});

// Правило для регулировки яркости по таймеру удерживания кнопки
defineRule({
  when: function () { return timers["wb-mcm8_180/input3_long_press"].firing; },
  then: function () {
    var i = dev["wb-led_101/Channel 4 Brightness"];

    if (dev["wb-mcm8_180/Input 3"]) {
      if ( i < 100 && direction) {
        i++
      }
      else if (i > 0 && !direction) {
        i--
      }
      dev["wb-led_101/Channel 4 Brightness"] = i
    } else {
      timers["wb-mcm8_180/input3_long_press"].stop();
      direction = !direction;
    }
  }
});
  1. изменение яркость в зависимости от уровня освещенности
defineRule ("led_white", { //
whenChanged: "wb-msw-v4_83/Illuminance",
then: function(newValue, devName, cellName) {
//
  var date = new Date();
//
var date_start = new Date(date);
          date_start.setHours(00);
          date_start.setMinutes(00);
//
var date_end = new Date(date);
          date_end.setHours(23);
          date_end.setMinutes(59);

    if ((date > date_start) && (date < date_end)) {
        if (newValue < 10) {
          dev["wb-led_101/Channel 4 Brightness"] = 100;
        }
        if ((newValue > 11) && (newValue < 20)) { 
          dev["wb-led_101/Channel 4 Brightness"] = 85;
        }
        if ((newValue > 21) && (newValue < 30)) {
          dev["wb-led_101/Channel 4 Brightness"] = 70;
        }
              if ((newValue > 31) && (newValue < 40)) {
          dev["wb-led_101/Channel 4 Brightness"] = 55;
        }
                    if ((newValue > 41) && (newValue < 50)) {
          dev["wb-led_101/Channel 4 Brightness"] = 45;
        }
                    if ((newValue > 51) && (newValue < 60)) {
          dev["wb-led_101/Channel 4 Brightness"] = 35;
        }
                    if ((newValue > 61) && (newValue < 70)) {
          dev["wb-led_101/Channel 4 Brightness"] = 20;
        }
                    if ((newValue > 71) && (newValue < 80)) {
          dev["wb-led_101/Channel 4 Brightness"] = 10;
        }
                    if ((newValue > 81) && (newValue < 90)) {
          dev["wb-led_101/Channel 4 Brightness"] = 50;
        }
        if (newValue > 91) {
          dev["wb-led_101/Channel 4 Brightness"] = 0;
        }
    } else {
          dev["wb-led_101/Channel 4 Brightness"] = 0;
          }}
});

Как эти куски лучше срастить?

В теории понимаю что вкл/выкл это отдельный, вышестоящий код. Код регулировки яркости по длинному нажатию кнопки это основной код, в котором еще прописаны вторичные условия по времени и уровню освещенности, которые выполняются если ленту включили кнопкой, но уровень яркости не регулировали кнопкой. Но не пойму как корректно и последовательно прописать условия и приоритетность или последовательность выполнения правила

Добрый день!

Я бы добавила флаги.

Например:

  • “если лента включена, тогда регулируем по длинному нажатию”
  • “если лента включена и не регулировали по длинному нажатию, тогда автоматическое регулирование по времени и освещённости”

То есть в данном случае лента включена и регулировали по длинному нажатию - это флаги, от которых строим условия.

Вам подходит такое решение? Есть ли ещё вопросы?

В целом понятно, остается изучить что такое флаги и как их настроить. Спасибо, буду изучать

Флаги, я имею ввиду переменные булевого типа, которые будут отмечать состояние.
Это могут быть переменные или контролы.

Дальше добавить условия if по состоянию этих флагов.

Не уверена, что это именно самый оптимальный способ. Мне он кажется наглядным и довольно простым во всяком случае.

1 лайк

А есть пример по созданию переменных?

Добрый день!

Из ближайшего, думаю, вам может подойти данный пример, он проще всего описывает логику работы флагов.

Также можете попробовать Node-RED, где логику можно описывать визуально.

Ещё один вариант — HomeAssistant, но для вашей задачи он может быть излишне громоздким.

1 лайк

Подскажите, удалось ли решить вопрос? Нужна ли ещё помощь?

Можно ещё включать отключать правила по условию: документация.

Сделал только по условиям освещенности и времени.
Условием чтобы автоматическая регулировка яркости отключилась, если отрегулировали вручную кнопкой, еще не занимался, по мере появления времени буду тестировать.

Хорошо. Я тогда отмечу решённой. Если будут ещё вопросы, можете сделать новую тему.