Помогите с написанием правил!

Раньше у вас фигурировало такое выражение, которое переносит границу диапазона справа на следующие сутки,

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

Это похоже на источник проблемы.

Нет. Я пробовал по-разному… Если временной промежуток происходит в один день, например с 7.00 до 19.00, то все работает, а вот если промежуток затрагивает два дня, то тут проблема.

Вот перед этим

выведите? пожалуйста, все значения в лог:

log(date_start);
log(date_end);```

и пришлите, что у вас получается. Разберемся, не переживайте.

Установил date_start.setHours(20);

2017-06-16 20:52:392017-06-16 20:52:37.643+03:00
2017-06-16 20:52:392017-06-16 20:01:37.643+03:00
2017-06-16 20:52:392017-06-16 06:00:37.643+03:00
2017-06-16 20:52:502017-06-16 20:52:48.422+03:00
2017-06-16 20:52:502017-06-16 20:01:48.422+03:00
2017-06-16 20:52:502017-06-16 06:00:48.422+03:00
2017-06-16 20:52:582017-06-16 20:52:56.490+03:00
2017-06-16 20:52:582017-06-16 20:01:56.490+03:00
2017-06-16 20:52:582017-06-16 06:00:56.490+03:00
2017-06-16 20:53:082017-06-16 20:53:06.765+03:00
2017-06-16 20:53:082017-06-16 20:01:06.765+03:00
2017-06-16 20:53:082017-06-16 06:00:06.765+03:00

И, кстати, по этой же причине не работает:

if ((date > sunset) && (date < sunrise))

Потому что время заката всегда больше времени восхода

Вот моё правило выключает воду вечером, включает следующим утром. Может быть вам поможет.

defineRule(“test3”, {
when: cron("*/59 * * * * "),
then: function () {
if(dev[“rule_switch”][“Rules status”] == 1){ //глобальное выключение правила
var date1 = new Date();
var date_start_11 = new Date(date1);
date_start_11.setHours(06);
date_start_11.setMinutes(30);
var date_end_11 = new Date(date1);
date_end_11.setHours(23);
date_end_11.setMinutes(59);
//log(“текущее время”,date1,v);

  		if((date_start_11 <= date1) &&( date1 <= date_end_11))  { // Время проверяется раз в 59 сек. и чтоб постоянно не срабатывало правило сравнения времени - введена переменная. - v
			if(v == 0){
				dev.valve_state["Valve_"] = 1; //для страницы Devices
				valve = 1;
  				log("Время включения крана",date1,v);
   		 		v = 1;
			}
		} else{
				if(v == 1){
					dev.valve_state["Valve_"] = 0;
					valve = 0;
					log("Время выключения крана",date1,v);
					v = 0;
				}
			}
		      
	}
}

});

Кажется разобрался, осталось дождаться заката

var motion_timer_1_timeout_ms = 25 * 1000;
var motion_timer_1_id = null;
 
defineRule("night_light", {
  whenChanged: "hs24bits_114844_6/state",
  then: function (newValue, devName, cellName) {
  
//координаты
    var lat = 55.55;
  	var lng = 37.23; 
  	
    var date = new Date();
  	now = new Date();

    var sunrise = SunCalc.getRise(date, lat, lng);
    var sunset  = SunCalc.getSet(date, lat, lng);
  
//в промежуток между рассветом и закатом  
    if ((now > sunrise) && (now < sunset)) {
    if (dev["hs24bits_114844_114844"]["state"] == 1) {
          dev["wb-gpio"]["EXT3_HS1"] = 0; //не включать свет 
    }
  }

//в остальное время при движении
    if (dev["hs24bits_114844_6"]["state"] == 1) {
          dev["wb-gpio"]["EXT3_HS1"] = 1; //включать свет
      
 
          if (motion_timer_1_id) {
            clearTimeout(motion_timer_1_id);
         }
 
          motion_timer_1_id = setTimeout(function () {
             dev["wb-gpio"]["EXT3_HS1"] = 0;            
          }, motion_timer_1_timeout_ms);              
      }
     }
});

Всем Спасибо за помощь!
upd. Ой, не работает после перезагрузки… всегда горит.

Добавил else, все заработало. Теперь другая грабля. Почему-то время восхода/заката не совпадает с реальным (где-то на час). Установил координаты Калининграда, чтобы “совпадало”. :wink:

Отлично, попробуйте apt-get update && apt-get install tzdata, а затем вернуться на MSK — у вас устаревшая информация о часовых поясах, скорее всего.

Попробовал, все равно закат на 1 час раньше:

Current default time zone: ‘Europe/Moscow’
Local time is now: Tue Jun 20 20:45:23 MSK 2017.
Universal Time is now: Tue Jun 20 17:45:23 UTC 2017.
Run ‘dpkg-reconfigure tzdata’ if you wish to change it.

2017-06-20 20:47:20Восход 2017-06-20 04:51:56.220+03:00
2017-06-20 20:47:20Закат 2017-06-20 20:15:44.566+03:00

Да, ошибка воспроизводится, но причина не ясна. В общем, пока Калининград – лучшее решение :slight_smile: или просто час добавлять к полученным результатам.

alleon, в теме про астрономические вычисления я запостил новый скрипт (от берется отсюда: SunCalc с небольшой модификацией, и новый пример его использования. Теперь все вычисляется верно. Простите, что ввел вас в заблуждение.

2 лайка

Проверил, теперь все правильно. Спасибо!

Есть непростая задачка по установке необходимой температуры воздуха в каждой из 18 зон в зависимости от настройки пользователя (то есть в каждой зоне может быть задана своя температура воздуха).

Реализация задачи не сложная, если бы не одно очень важное условие - одновременно могут работать на нагрев только 2 зоны.

В итоге получаются следующие требования:

  • одновременно могут включаться только 2 зоны теплого пола (ввиду ограничений по мощности)
  • в каждой зоне имеется датчик температуры пола (технические данные, недоступные для пользователя)
  • в каждой зоне имеется датчик температуры воздуха
  • каждая зона должна прогреваться не более 10 минут (это значение будет подбираться практически), чтобы остальные зоны не успели остыть
  • температура пола каждой зоны должна быть не больше 38 градусов
  • должен быть отдельный переключатель: включить или отключить отопление пола

Процесс примерно следующий:

  • начинают прогреваться первые две зоны
  • после того, как одна из зон вышла необходимую температуру воздуха (не забывая, что нагревать пол можно не более 38 градусов) - эта зона выключается, включается третья зона (но нагрев зоны идет не более 10 минут). То есть даже если требуемая температура воздуха не реализована, а таймер вышел - переходим на следующую зону
  • если нагрев зоны по температуре воздуха закончился - сбрасываем таймер и переходим к нагреву следующей зоны
  • далее с таким перебором необходимо нагревать все зоны по кругу

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

__
Прошу помощи в организации такого скрипта