UPD 17.10.2019. Этот вопрос реализован здесь.
После изучения темы о диммировании, мы можем создать забавное устройство — световой будильник. В установленное время свет в вашей комнате будет плавно зажигаться от нуля до 100% мощности осветителя.
Приступим.
Создадим ряд элементов в файле noolite.items:
Group WakeUp (Home)
Switch wakeup1 "Понедельник" (WakeUp)
Switch wakeup2 "Вторник" (WakeUp)
Switch wakeup3 "Среда" (WakeUp)
Switch wakeup4 "Четверг" (WakeUp)
Switch wakeup5 "Пятница" (WakeUp)
Switch wakeup6 "Суббота" (WakeUp)
Switch wakeup7 "Воскресенье" (WakeUp)
String wakeupMessage "%s"
Number wakeupHour "Час [%d]" (WakeUp)
Number wakeupMinute "Минута [%d]" (WakeUp)
Switch StartdimmerNoo "Рассвет" (WakeUp)
И поместим их на noolite.sitemap:
Frame label="Подъем!" {
Text label="Будильник [%s]" item=wakeupMessage icon="clock" {
Frame label="Установка" {
Setpoint item=wakeupHour minValue=0 maxValue=23 step=1
Setpoint item=wakeupMinute minValue=0 maxValue=55 step=5
}
Frame label="Включено" {
Switch item=wakeup1
Switch item=wakeup2
Switch item=wakeup3
Switch item=wakeup4
Switch item=wakeup5
Switch item=wakeup6
Switch item=wakeup7
}
}
}
Создадим правила:
import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*
import org.joda.time.*
//-------------
import org.openhab.action.squeezebox.*
import java.util.concurrent.locks.ReentrantLock
var Timer timer1 = null
var java.util.concurrent.locks.ReentrantLock lock1 = new java.util.concurrent.locks.ReentrantLock()
//------------
rule "Initialization"
when
System started
then
postUpdate(wakeupHour, 7)
postUpdate(wakeupMinute, 15)
postUpdate(wakeup1, ON)
postUpdate(wakeup2, ON)
postUpdate(wakeup3, ON)
postUpdate(wakeup4, ON)
postUpdate(wakeup5, ON)
postUpdate(wakeup6, OFF)
postUpdate(wakeup7, OFF)
end
rule "WakeUp Now"
when
Item wakeupHour changed or
Item wakeupMinute changed
then
lock1.lock()
try {
var String msg = ""
var hour = wakeupHour.state as DecimalType
var minute = wakeupMinute.state as DecimalType
if (hour < 10) { msg = "0" }
msg = msg + wakeupHour.state.format("%d") + ":"
if (minute < 10) { msg = msg + "0" } msg = msg + wakeupMinute.state.format("%d") postUpdate(wakeupMessage,msg) var int wakeUp1 wakeUp1 = (wakeupHour.state as DecimalType).intValue * 60 + (wakeupMinute.state as DecimalType).intValue wakeUp1 = wakeUp1.intValue var int now1 now1 = now.getMinuteOfDay now1 = now1.intValue var int delta1 if (timer1 != null) { timer1.cancel timer1 = null } delta1 = (wakeUp1 - now1) delta1 = delta1.intValue if (now1 > wakeUp1) { delta1 = delta1 + 1440 }
timer1 = createTimer(now.plusMinutes(delta1)) [|
var Number day = now.getDayOfWeek
if (((day == 1) && (wakeup1.state == ON)) ||
((day == 2) && (wakeup2.state == ON)) ||
((day == 3) && (wakeup3.state == ON)) ||
((day == 4) && (wakeup4.state == ON)) ||
((day == 5) && (wakeup5.state == ON)) ||
((day == 6) && (wakeup6.state == ON)) ||
((day == 7) && (wakeup7.state == ON))
) {
sendCommand(Noolite, ON)
createTimer(now.plusSeconds(90)) [|
sendCommand(Noolite, OFF)
]
}
timer1.reschedule(now.plusHours(24))
]
}
} finally {
lock1.unlock()
}
end
В результате у вас получится такая картина:
Мы получили семь выключателей будильника по числу дней недели. Будильник при рестарте системы устанавливается на 7-15. Затем его можно установить на любое другое время.
Обратим внимание на строки в коде правил:
sendCommand(Noolite, ON) // Выключатель "Noolite" у нас уже создан ранее
// Отправляем команду на его включение
createTimer(now.plusSeconds(90)) [| // Создаем таймер на 90 секунд
sendCommand(Noolite, OFF) // И через 90 секунд выключаем освещение
]
Таким образом, вместе с запчастями nooLite мы уже создали световой будильник. Проверьте, в установленное время включается и выключается силовой блок. Но это еще не все!
Силовые блоки nooLite позволяют регулировать яркость свечения нагрузки. Этим нельзя не воспользоваться!
Чтобы в полной мере задействовать возможность плавно пробудить себя утром, в директории /opt/openhab/configurations/scripts создадим скрипт с названием wakeupnoo.script:
var Number wakeUpDimmer
wakeUpDimmer=0 // Объявляем переменную
while(wakeUpDimmer<100){ // Зацикливаем, пока не достигнем 100% яркости
wakeUpDimmer=wakeUpDimmer+2 // Увеличиваем каждый шаг на 2%
sendCommand(NooDimmer01,wakeUpDimmer) // Отправляем команду
Thread::sleep(5000) // Ждем 5 секунд
if(StartdimmerNoo.state == OFF) { // Эта строка првоеряет - не выключили мы наш "Рассвет"
break; // и отменяет работу скрипта.
}
}
Этот скрипт будет каждые пять секунд, путем изменения состояния диммера NooDimmer01 из прошлой заметки, через MT-1132 посылать на силовой блок команду 6 (установление яркости), увеличивая ее значение через 5 секунд каждый раз на две единицы. Вы можете самостоятельно изменить эти параметры как вам нравится.
Чтобы проверить в реальном времени работу этого скрипта мы уже создали выключатель, с романтическим названием «Рассвет» (см. в этой заметке выше изменения в файл noolite.items). Поместим и его на sitemap, в результате чего noolite.siteamp станет таким:
sitemap noolite label="Noolite"
{
Frame {
Switch item=Noolite
Text item=NooliteP
Slider item=NooDimmer01 switchSupport
Text item=NooCommander01
Switch item=StartdimmerNoo
}
Frame label="Подъем!" {
Text label="Будильник [%s]" item=wakeupMessage icon="clock" {
Frame label="Установка" {
Setpoint item=wakeupHour minValue=0 maxValue=23 step=1
Setpoint item=wakeupMinute minValue=0 maxValue=55 step=5
}
Frame label="Включено" {
Switch item=wakeup1
Switch item=wakeup2
Switch item=wakeup3
Switch item=wakeup4
Switch item=wakeup5
Switch item=wakeup6
Switch item=wakeup7
}
}
}
}
Добавим еще одно правило, для активизации StartdimmerNoo:
rule "WakeUp Switch"
when Item StartdimmerNoo changed
then
if (StartdimmerNoo.state == ON)
callScript("wakeupnoo")
else
sendCommand(NooDimmer, 0)
end
И самое последнее что следует изменить — отредактировать файл noolite.rules таким образом, чтобы будильник воздействовал на наш новый выключатель StartdimmerNoo. Причем, полагаю, время включения светильника следует либо увеличить минут до 10, либо вообще его не отключать. В итоге, файл noolite.rules должен получиться таким:
import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*
import org.joda.time.*
//-------------
import org.openhab.action.squeezebox.*
import java.util.concurrent.locks.ReentrantLock
var Timer timer1 = null
var java.util.concurrent.locks.ReentrantLock lock1 = new java.util.concurrent.locks.ReentrantLock()
//------------
var Timer timerNoolite01 = null
rule "change noolite"
when
Item NooliteP received update 4 or
Item NooliteP received update 5
then
if (Noolite.state == OFF) {
Noolite.state = ON
}
else {
Noolite.state = OFF
}
end
rule "change nooLite01 brightness"
when
Item NooDimmer01 changed
then
var double toNoolite01
//var String commandToNoolite
var Number commandToNoolite01
if (timerNoolite01 != null)
timerNoolite01.cancel()
timerNoolite01 = createTimer(now.plusSeconds(3)) [|
{
toNoolite01=(NooDimmer01.state as DecimalType).doubleValue
if (toNoolite01 != 0) {
var Number commandToNoolite01 = ((toNoolite01 * 1.21) + 35).intValue
sendCommand(NooCommander01, commandToNoolite01)
postUpdate(NooCommander01, commandToNoolite01)
}
else {
commandToNoolite01 = 0
sendCommand(NooCommander01, commandToNoolite01)
postUpdate(NooCommander01, commandToNoolite01)
}
}
]
end
rule "WakeUp Switch"
when Item StartdimmerNoo changed
then
if (StartdimmerNoo.state == ON)
callScript("wakeupnoo")
else
sendCommand(NooDimmer01,0)
end
rule "Initialization"
when
System started
then
postUpdate(wakeupHour, 7)
postUpdate(wakeupMinute, 15)
postUpdate(wakeup1, ON)
postUpdate(wakeup2, ON)
postUpdate(wakeup3, ON)
postUpdate(wakeup4, ON)
postUpdate(wakeup5, ON)
postUpdate(wakeup6, OFF)
postUpdate(wakeup7, OFF)
end
rule "WakeUp Now"
when
Item wakeupHour changed or
Item wakeupMinute changed
then
lock1.lock()
try {
var String msg = ""
var hour = wakeupHour.state as DecimalType
var minute = wakeupMinute.state as DecimalType
if (hour < 10) { msg = "0" }
msg = msg + wakeupHour.state.format("%d") + ":"
if (minute < 10) { msg = msg + "0" } msg = msg + wakeupMinute.state.format("%d") postUpdate(wakeupMessage,msg) var int wakeUp1 wakeUp1 = (wakeupHour.state as DecimalType).intValue * 60 + (wakeupMinute.state as DecimalType).intValue wakeUp1 = wakeUp1.intValue var int now1 now1 = now.getMinuteOfDay now1 = now1.intValue var int delta1 if (timer1 != null) { timer1.cancel timer1 = null } delta1 = (wakeUp1 - now1) delta1 = delta1.intValue if (now1 > wakeUp1) { delta1 = delta1 + 1440 }
timer1 = createTimer(now.plusMinutes(delta1)) [|
var Number day = now.getDayOfWeek
if (((day == 1) && (wakeup1.state == ON)) ||
((day == 2) && (wakeup2.state == ON)) ||
((day == 3) && (wakeup3.state == ON)) ||
((day == 4) && (wakeup4.state == ON)) ||
((day == 5) && (wakeup5.state == ON)) ||
((day == 6) && (wakeup6.state == ON)) ||
((day == 7) && (wakeup7.state == ON))
) {
sendCommand(StartdimmerNoo, ON)
//======= участок кода ниже выключает освещение через 10 минут ====== //
createTimer(now.plusSeconds(600)) [|
sendCommand(StartdimmerNoo, OFF)
]
//===================================================================//
}
timer1.reschedule(now.plusHours(24))
]
}
} finally {
lock1.unlock()
}
end
Итак, наблюдаем:
И пока наблюдали — подоспел модуль MR1132.
NooLite: световой будильник.: Один комментарий