Как вставить задержку выключения вентилятора при выключении света

Научите/поправьте скрипт K4 - реле основного света,
K5 - подсветка зеркала

K7 - вентилятор

  1. как поставить таймер на отключение вентилятора на 30 секунд? Проверить состояние реле света, если =0 то запустить таймер и отключить. поможите?
var motion_timer_1_timeout_ms = 40 * 1000;
var motion_timer_1_id = null;

//  по включению света в ванной - подключается реле зеркала и реле вентилятора
//  по выключению света  - выключается реле зеркала и через 40 секунд реле вентилятора

defineRule("mirror_bath_change", {
 
  whenChanged: "wb-mr14_26/Input 4 counter",
 
  then: function (newValue, devName, cellName)  {
 // Если меняется значение    
    if (newValue) {

      dev["wb-mr14_26"]["K5"]=!dev["wb-mr14_26"]["K5"] ;


// какой обработчик вставить сюда ????       
      dev["wb-mr14_26"]["K7"]=!dev["wb-mr14_26"]["K7"];
  
      
      
   if (motion_timer_1_id) 
    {
          clearTimeout(motion_timer_1_id);
       }
      
//
  //    motion_timer_1_id = setTimeout(function () {
   	//	   dev["wb-mr14_26"]["K7"] = 0;         
      //         motion_timer_1_id = null;   
       	// }, motion_timer_1_timeout_ms);    
    
    

// Если меняется значение    
      }
    }
 });

Добрый день! для этого вам потребуется 2 правила. Но я бы рекомендовал вам использовать выключатель с фиксацией. предлагаю решение для него. может понравится?

var timer_svet_ms = 30 * 1000;

var timer_svet = null;

defineRule(“mirror_bath_change_start”,
{
when: function ()
{
return dev[“wb-mr14_26”][“Input 4”] ==1; //выключатель включён
},
then: function()
if (timer_svet) //если передумали выключать и снова включили свет
{
clearTimeout(timer_svet);
}
dev[“wb-mr14_26”][“K4”] =1;
dev[“wb-mr14_26”][“K5”] =1;
dev[“wb-mr14_26”][“K7”] =1; //включили всё, что нужно
}
});

defineRule(“mirror_bath_change_stop”,
{
when: function ()
{
return dev[“wb-mr14_26”][“Input 4”] ==0 && dev[“wb-mr14_26”][“K4” ==0; //если перевели выключатель в состояние выключено и если выключился свет
},
then: function()
{
if (timer_svet)
{
clearTimeout(timer_svet);
}
timer_svet = setTimeout(function ()
{
dev[“wb-mr14_26”][“K5”] =0; //выключили свет над зеркалом
dev[“wb-mr14_26”][“K7”] =0; //выключили вентилятор
timer_svet = null;
},
timer_svet_ms);
}
});

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

Вопрос собственно был наверное в If конструкции

нужно было поставить для сравнения величин ==, а я ставил = и у меня свет сразу выключался при включении =)

я где то читал что если вызывать dev[“wb-mr14_26”][“Input 4”] ==1, то это дополнительно нагружает стек mqtt команд. Если это не сильно влияет, то попробую через if конструкцию.

все заработало, спасибо за совет !!!

var vent_timer_1_timeout_ms = 30 * 1000;
var vent_timer_1_id = null;
var relay_on = false; 
 
//  по включению света в ванной - подключается реле зеркала и реле вентилятора
//  по выключению света  - выключается реле зеркала и через 40 секунд реле вентилятора

defineRule("mirror_bath_change", {
 
  whenChanged: "wb-mr14_26/Input 4 counter",
 
  then: function (newValue, devName, cellName)  {
 // Если меняется значение    
  
//  Изменяем состояние реле доп подсветки симметрично основному свету
    dev["wb-mr14_26"]["K5"]=!dev["wb-mr14_26"]["K5"] ;
           
          relay_on = dev["wb-mr14_26"]["K4"];
           log("Состояние реле 4: "+ relay_on);

  if (dev["wb-mr14_26"]["K4"]==true) {

     log("Включаем вентилятор K7");      
            log("Состояние реле 4: "+ relay_on);
      dev["wb-mr14_26"]["K7"]=1;
 }  
 else
{

     log("Выключаем вентилятор K7 !!!!");      
         log("Состояние реле 4: "+ relay_on);

  if (vent_timer_1_id) 
    {
          clearTimeout(vent_timer_1_id);
       }


    vent_timer_1_id = setTimeout(function () {
   		   dev["wb-mr14_26"]["K7"] = 0;         
               vent_timer_1_id = null;   
       	 }, vent_timer_1_timeout_ms);    

}
       }
 });

Приветствую!
Спасибо разработчикам за отличный пример сложного скрипта!
подскажите как модифицировать данный пример на 3 точки подключения последовательно?
И если прошло время - не отключать все последовательно, а все разом?

var button_timer_delay = 1500 //ms; задержка для включения второго реле
var button_timer_id = null  //идентификатор таймера

defineRule("switch_relay_13_14", {
    whenChanged: "wb-mr14_26/Input 14 counter", //Следим за Input 14
    then: function(newValue, devName, cellName) {

        if (newValue && !button_timer_id) {
            log("switch_relay_13_14: Счетчик входа 14 изменил свое значение: ", newValue);
            dev["wb-mr14_26"]["K13"] = !dev["wb-mr14_26"]["K13"];

            button_timer_id = setTimeout(function() {
                log("switch_relay_13_14: Закончился таймаут: ", button_timer_id);
                button_timer_id = null;
            }, button_timer_delay);
            log("Запускаем  таймер", button_timer_id);
        } else if (newValue && button_timer_id) {
            dev["wb-mr14_26"]["K14"] = dev["wb-mr14_26"]["K13"];
            log("switch_relay_13_14: Отключаем таймаут: ", button_timer_id);
            clearTimeout(button_timer_id);
            button_timer_id = null;
        }
    }
});