NooLite: световой будильник.

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

В результате у вас получится такая картина:

noolite001
noolite002Мы получили семь выключателей будильника по числу дней недели. Будильник при рестарте системы устанавливается на 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: световой будильник.: Один комментарий

  1. Уведомление: Arduino links — Синергия

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s