Раньше у вас фигурировало такое выражение, которое переносит границу диапазона справа на следующие сутки,
а в скрипте, который вы прислали, время меняется, а дата нет:
Это похоже на источник проблемы.
Раньше у вас фигурировало такое выражение, которое переносит границу диапазона справа на следующие сутки,
а в скрипте, который вы прислали, время меняется, а дата нет:
Это похоже на источник проблемы.
Нет. Я пробовал по-разному… Если временной промежуток происходит в один день, например с 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, все заработало. Теперь другая грабля. Почему-то время восхода/заката не совпадает с реальным (где-то на час). Установил координаты Калининграда, чтобы “совпадало”.
Отлично, попробуйте 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
Да, ошибка воспроизводится, но причина не ясна. В общем, пока Калининград – лучшее решение или просто час добавлять к полученным результатам.
alleon, в теме про астрономические вычисления я запостил новый скрипт (от берется отсюда: SunCalc с небольшой модификацией, и новый пример его использования. Теперь все вычисляется верно. Простите, что ввел вас в заблуждение.
Проверил, теперь все правильно. Спасибо!
Есть непростая задачка по установке необходимой температуры воздуха в каждой из 18 зон в зависимости от настройки пользователя (то есть в каждой зоне может быть задана своя температура воздуха).
Реализация задачи не сложная, если бы не одно очень важное условие - одновременно могут работать на нагрев только 2 зоны.
В итоге получаются следующие требования:
Процесс примерно следующий:
Костыльным вариантом видится создать 18 переключателей (на каждое помещение) и управлять ими в соответствие с выше обозначенным алгоритмом.
__
Прошу помощи в организации такого скрипта