Срабатывание правила по времени

Добрый день! “Сделал” скрипт управления подсветкой по уровню освещенности, который замеряется фоторезистором на входе А1. Но как сделать (для экономии), чтобы в 0:20, например, свет в любом случае отключался до утра?

// Включение / выключение правила выключателем на панели Devices
// Создаём виртуальное устройство - выключатель.
defineVirtualDevice("autolight", {
  title: "Автоподсветка",
  cells: {
    enabled: {
      type: "switch",
      value: false
    },
  }
});

defineRule("light_control", { //название правила - "Автоподсветка"
  whenChanged: "wb-adc/A1", //при изменении состояния датчика света
  then: function(newValue, devName, cellName) { //выполняй следующие действия
    if (dev.autolight.enabled) { // если вируальн. устр-во autolight  в положении enabled    
      if (dev["wb-adc"]["A1"] > 4,3) { //если напряжение датчика больше 4,3В,
        dev["wb-gpio"]["EXT2_K9"] = false; //установи на выходе wb-gpio устройство EXT2_K9  
		dev["wb-mr3_20"]["K3"] = false; //установи на выходе wb-gpio устройство wb-mr3_20 K3
        //в состояние "выключено" 
      } else { // иначе
        if (dev["wb-adc"]["A1"] < 4) { //если напряжение датчика меньше 4В,
          //(обеспечиваем гистерезис)
          dev["wb-gpio"]["EXT2_K9"] = true; //установи EXT2_K9  в состояние "включено"
		  dev["wb-mr3_20"]["K3"] = true; //установи wb-mr3_20 K3  в состояние "включено"
        }
      }
    }
  }
});

Например через cron. Берем флаг на управление ночным светом, поднимаем его когда светло и опускаем в 0:20, добавляем флаг в существующую логику управления светом.

Еще можно через сравнение текущего времени контроллера с заданным.

Пример cron (не тестировал):
var isEveningLamp = true;

defineRule("light_control", { //название правила - "Автоподсветка"
  whenChanged: "wb-adc/A1", //при изменении состояния датчика света
  then: function(newValue, devName, cellName) { //выполняй следующие действия
    if (dev.autolight.enabled) { // если вируальн. устр-во autolight  в положении enabled    
      if (dev["wb-adc"]["A1"] > 4,3) { //если напряжение датчика больше 4,3В,
        dev["wb-gpio"]["EXT2_K9"] = 0; //установи на выходе wb-gpio устройство EXT2_K9  
		dev["wb-mr3_20"]["K3"] = 0; //установи на выходе wb-gpio устройство wb-mr3_20 K3
        isEveningLamp = true; 
		//в состояние "выключено" 
      } else { // иначе
        if (dev["wb-adc"]["A1"] < 4 && isEveningLamp) { //если напряжение датчика меньше 4В,
          //(обеспечиваем гистерезис)
          dev["wb-gpio"]["EXT2_K9"] = 1; //установи EXT2_K9  в состояние "включено"
		  dev["wb-mr3_20"]["K3"] = 1; //установи wb-mr3_20 K3  в состояние "включено"
        }
      }
    }
  }
});

defineRule("dr_evening_lighting_off", {
	when: cron("* 20 0 ? * * *"), 
	then: function ()  {
		log("evening lamp off 0:20 PM");
		isEveningLamp = false; 
		dev["wb-gpio"]["EXT2_K9"] = 0; //установи на выходе wb-gpio устройство EXT2_K9  
		dev["wb-mr3_20"]["K3"] = 0; //установи на выходе wb-gpio устройство wb-mr3_20 K3
	}
});

Cron Expression Generator & Explainer

да чего-то скрипт и без таймера не работает, но и не ругается ни на что(

надо было писать 4.3 )

спасибо, протестирую

не срабатывает таймер, ни в предложенном, ни в таком виде:

// Включение / выключение правила выключателем на панели Devices
// Создаём виртуальное устройство - выключатель.
defineVirtualDevice("autolight", {
  title: "Автоподсветка",
  cells: {
    enabled: {
      type: "switch",
      value: false
    },
  }
});

defineRule("light_control", { //название правила - "Автоподсветка"
  whenChanged: "wb-adc/A1", //при изменении состояния датчика света
  then: function(newValue, devName, cellName) { //выполняй следующие действия
    if (dev.autolight.enabled) { // если вируальн. устр-во autolight  в положении enabled    
      if (dev["wb-adc"]["A1"] > 4.2) { //если напряжение датчика больше 4.2В,
        dev["wb-gpio"]["EXT2_K9"] = false; //установи на выходе wb-gpio устройство EXT2_K9  
		dev["wb-mr3_20"]["K3"] = false; //установи на выходе wb-gpio устройство wb-mr3_20 K3
        //в состояние "выключено" 
      } else { // иначе
        if (dev["wb-adc"]["A1"] < 4) { //если напряжение датчика меньше 4В,
          //(обеспечиваем гистерезис)
          dev["wb-gpio"]["EXT2_K9"] = true; //установи EXT2_K9  в состояние "включено"
		  dev["wb-mr3_20"]["K3"] = true; //установи wb-mr3_20 K3  в состояние "включено"
        }
      }
    }
  }
});
	
defineRule("dr_evening_lighting_off", {
	when: cron("12 11 * * *"), 
	then: function ()  {
		log("evening lamp off 11:00 AM");
		isEveningLamp = false; 
		dev["wb-gpio"]["EXT2_K9"] = false; //установи на выходе wb-gpio устройство EXT2_K9  
		dev["wb-mr3_20"]["K3"] = false; //установи на выходе wb-gpio устройство wb-mr3_20 K3
	}
});

Рабочий вариант cron:

Заодно проверить системное время: hwclock -r

@Victor_B Здравствуйте! Для вопросов, пожалуйста, создавайте отдельные темы на портале - так будет проще решить проблему. Исходная тема предназначалась только для рабочих примеров правил.

1 лайк

Спасибо, сработало вот в таком виде:

defineRule("dr_evening_lighting_off", {
	when: cron("00 20 00 * * *"), 
	then: function (newValue, devName, cellName)  { //выполняй следующие действия
      if (dev.autolight.enabled) { // если вируальн. устр-во autolight  в положении enabled
		dev["wb-gpio"]["EXT2_K9"] = false; //установи на выходе wb-gpio устройство EXT2_K9  
		dev["wb-mr3_20"]["K3"] = false; //установи на выходе wb-gpio устройство wb-mr3_20 K3
        log.info("evening lamp off 11:00 AM");

Обнаружился прикольный момент, скрипт отрабатывает, свет вечером включается, в 0:20 отключает свет, и он тутже включается, тк на улице еще темно) переворачивать логику на работу правила освещения в заданный интервал времени чтоли…?

Посмотрите значение переменных через вывод в лог: log(“Информационный текст”, переменная);

Не совсем понял, как и для чего(… Приведу скрипт полностью:

// Включение / выключение правила выключателем на панели Devices
// Создаём виртуальное устройство - выключатель.
defineVirtualDevice("autolight", {
  title: "Автоподсветка",
  cells: {
    enabled: {
      type: "switch",
      value: false
    },
  }
});

defineRule("light_control", { //название правила - "Автоподсветка"
  whenChanged: "wb-adc/A1", //при изменении состояния датчика света
  then: function(newValue, devName, cellName) { //выполняй следующие действия
    if (dev.autolight.enabled) { // если вируальн. устр-во autolight  в положении enabled    
      if (dev["wb-adc"]["A1"] > 3.8) { //если напряжение датчика больше 3.8В,
        dev["wb-gpio"]["EXT2_K9"] = false; //установи на выходе wb-gpio устройство EXT2_K9  
		dev["wb-mr3_20"]["K3"] = false; //установи на выходе wb-gpio устройство wb-mr3_20 K3
        //в состояние "выключено" 
      } else { // иначе
        if (dev["wb-adc"]["A1"] < 3.3) { //если напряжение датчика меньше 3.3В,
          //(обеспечиваем гистерезис)
          dev["wb-gpio"]["EXT2_K9"] = true; //установи EXT2_K9  в состояние "включено"
		  dev["wb-mr3_20"]["K3"] = true; //установи wb-mr3_20 K3  в состояние "включено"
        }
      }
    }
  }
});
	
defineRule("dr_evening_lighting_off", {
	when: cron("00 20 00 * * *"), 
	then: function (newValue, devName, cellName)  { //выполняй следующие действия
      if (dev.autolight.enabled) { // если вируальн. устр-во autolight  в положении enabled
		dev["wb-gpio"]["EXT2_K9"] = false; //установи на выходе wb-gpio устройство EXT2_K9  
		dev["wb-mr3_20"]["K3"] = false; //установи на выходе wb-gpio устройство wb-mr3_20 K3
        log.info("evening lamp off 00:20 AM");
	}
    }  
});
	
	

Тут нужно исправить:

 if (dev["autolight"]["enabled"]) {

понятно, спасибо, поправлю, но ведь это условие на проверку, включено ли правило, правильно?
Это не повлияет на то, что по самому правилу освещенность будет проверена, окажется низкой ( в 0:30 например) и освещение опять включится, как я понимаю?

Теперь понятно, все таки не телепат, думал ошибка в предложенной логике.
Попробуйте мой пример с флагом.

1 лайк

Неправильное выражение в if может вызывать работу по ветке else и включать свет.

1 лайк

Посмотрите пример реализации “флагов” состояний тут:

Задача похожа, тоже поддержание уровня освещенности в период веремени. Плавные “рассвет” и “закат” можно выкинуть.

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

// Включение / выключение правила выключателем на панели Devices
// Создаём виртуальное устройство - выключатель.
defineVirtualDevice("autolight", {
  title: "Автоподсветка",
  cells: {
    enabled: {
      type: "switch",
      value: false
    },
  }
});

var isEveningLamp = true;  // флаг на управление ночным светом

defineRule("light_control", { //название правила - "Автоподсветка"
  whenChanged: "wb-adc/A1", //при изменении состояния датчика света
  then: function(newValue, devName, cellName) { //выполняй следующие действия
    if (dev["autolight"]["enabled"]) { // если вируальн. устр-во autolight  в положении enabled    
      if (dev["wb-adc"]["A1"] > 3.8) { //если напряжение датчика больше 3.8В,
        dev["wb-gpio"]["EXT2_K9"] = false; //установи на выходе wb-gpio устройство EXT2_K9  
		dev["wb-mr3_20"]["K3"] = false; //установи на выходе wb-gpio устройство wb-mr3_20 K3
        isEveningLamp = true; 
		//в состояние "выключено" 
      } else { // иначе
        if (dev["wb-adc"]["A1"] < 3.3 && isEveningLamp) { //если напряжение датчика меньше 3.3В,
          //(обеспечиваем гистерезис)
          dev["wb-gpio"]["EXT2_K9"] = true; //установи EXT2_K9  в состояние "включено"
		  dev["wb-mr3_20"]["K3"] = true; //установи wb-mr3_20 K3  в состояние "включено"
        }
      }
    }
  }
});

defineRule("dr_evening_lighting_off", {
	when: cron("00 20 00 * * *"), 
	then: function ()  { //выполняй следующие действия
		isEveningLamp = false; 
		dev["wb-gpio"]["EXT2_K9"] = false; //установи на выходе wb-gpio устройство EXT2_K9  
		dev["wb-mr3_20"]["K3"] = false; //установи на выходе wb-gpio устройство wb-mr3_20 K3
        log.info("evening lamp off 00:20 AM");
	}
});
1 лайк

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.