Определение дня и ночи DayOrNight
День или ночь в системе Mr.Butler может определяться двумя способами по уровню освещенности с датчика освещенности и по времени установленному в приложении
Код вставляется во вкладку настройки дейстсвующего Sitemap(за исключением первой и последней строчки) где:
Check_Night — текущее значение дня = OFF или ночи = ON
Mode_Check_Night — численная переменная типа number определяющая режим определения по времени = ‘1’ или по освещенности = ‘2’
LocalTime_Date — текущее время
Illuminancesensor_Illuminance — текущий уровень освещенности
Nightsettings — позволяет установить уровень освещенности, если текущее значение меньше установленного, то система считает, что сейчас ночь иначе день
Set_clock label — время с которого начинается ночь
Set_clock_night_end label — время окончания ночи
sitemap illuminates label="Illum" {
Frame label="Параметры" {
Switch item=Check_Night label="Время суток" icon="sun" mappings=[ON="Ночь"] visibility=[Check_Night==ON]
Switch item=Check_Night label="Время суток" icon="sun" mappings=[OFF="День"] visibility=[Check_Night==OFF]
Selection item=Mode_Check_Night label="Режим определения[]" icon="sun" mappings=[1='по времени',2='по освещенности']
Text icon="time" label="Текущее время[%1$tH:%1$tM]" item=LocalTime_Date visibility=[Mode_Check_Night==1]
Text icon="moon" label="Освещенность [%.0f lux]" item=Illuminancesensor_Illuminance visibility=[Mode_Check_Night==2]
Slider icon="settings" label="Ночной уровень [%.0f lux]" item=Nightsettings step=5 maxValue=100 visibility=[Mode_Check_Night==2]
Setpoint item=Set_clock label="Ночное время с [JS(numberToClock.js):%s]" minValue=0 maxValue=1425 step=30 visibility=[Mode_Check_Night==1]
Setpoint item=Set_clock_night_end label="до [JS(numberToClock.js):%s]" minValue=0 maxValue=1425 step=30 visibility=[Mode_Check_Night==1]
}
}
Создаем файл numberToClock.js в папке /etc/openhab/transform со следующим содержимым(данная функция трансформирует число минут в вид 15:45):
(function(i) {
var hours = Math.floor(i / 60);
var minutes = i % 60;
hours = (hours < 10) ? "0" + hours : hours;
minutes = (minutes < 10) ? "0" + minutes : minutes;
return hours + ":" + minutes;
})(input)
Создаем файл dayornight.rules в папке /etc/openhab/rules со следующим содержимым:
rule "dayornight"
when
Time cron "0 * * * * ? *"
then
if(Mode_Check_Night.state==2){
if((Illuminancesensor_Illuminance.state as Number).intValue <= (Nightsettings.state as Number).intValue){
Check_Night.sendCommand(ON)
}else{
Check_Night.sendCommand(OFF)
}
} else if (Mode_Check_Night.state==1){
var minuteofhour = now.getMinute
var hourofday = now.getHour
var minuteofday = 60 * hourofday + minuteofhour
logInfo("Minute of day", minuteofday.toString)
if(minuteofday > Set_clock.state as Number || minuteofday < Set_clock_night_end.state as Number){
Check_Night.sendCommand(ON)
}else{
Check_Night.sendCommand(OFF)
}
}
end
В sitemap выбирается режим определения дня и ночи
Если выбран по уровню освещенности, то каждую минуту происходит сравнение текущего уровня освещенности с установленным уровнем, если текущий уровень освещенности ниже установленного то переключатель Check_Night становиться в ON
Если выбран по времени, то любое время(начала и конца ночи) введенное в sitemap переводится в количество минут с 00:00 и между нами называется “MinuteOfDay”. Каждую минуту берется ТЕКУЩЕЕ время и переводится в количество минут “MinuteOfDay” и сравнивается с установленными в SiteMap