Время прочтения: 8 мин.
Всем привет!
В публикации я хочу поделиться опытом реализации своего умного дома. Я рассмотрю пример локального решения на примере своего дома. Использовав данное решение в организации, вы сможете оптимизировать расходы на электроэнергию, и это будет важным шагом по направлению к ESG. Ранее я писал небольшой рассказ о том, как я автоматизировал удаление видео-файлов с камер на своем сервере Linux, но на этом я не остановился и решил установить на домашний сервер платформу для автоматизации. На просторах интернета я наткнулся на самые популярные хабы: Google Home, HomeAssistant, Domoticz. Мой выбор пал на openHAB.
Почему именно этот хаб, а не другой? Мне показался этот проект интересным для изучения, так как на русскоговорящих платформах о нем содержится мало сведений и отсутствуют новые публикации. К тому же он поддерживает более 2 000 сущностей разных производителей автоматизированных систем.
На схеме ниже изображен алгоритм взаимодействия устройств в вашей локальной сети при установке openHAB.
Первый шаг, который необходимо будет сделать, это установить openHAB на свой сервер. Как и все домашние автоматизаторы, он не требует много ресурсов, и его можно установить на любую операционную систему (как правило, это unix-системы). Не буду подробно останавливаться на том, как установить и настроить openHAB, в интернете есть много публикаций на эту тему (ссылка на официальный ресурс). Если возникнут проблемы, можете писать в комментариях, постараюсь оперативно ответить.
Когда вы установите платформу и все настроите, в вашей домашней локальной сети появится web-сервер по управлению будущим умным домом.
Пройдя по локальному адресу, который указали при настройке (у меня http://Localhost:8080/), мы попадем на главный экран openHAB. При этом он будет практически пуст, т.к. на нем ничего не настроено. Чтобы увидеть какие-либо настройки, необходимо войти под ролью администратора. Для этого щелкайте по замку в левом нижнем углу и вводите логин и пароль (openhab/openhab).
И тогда вам откроются возможности настройки, где вы сможете творить.
Вторым шагом будет выбор и подключение устройства для автоматизации. На просторах магазинов, будь то Ozon или Aliexpress, вы сможете найти множество готовых решений для умного дома, и с легкостью подключить их к openHAB. Но я буду использовать самодельный модуль, который я собрал для этой задачи. Возможно, это выглядит менее аккуратно, но получается дешевле и более функционально, т.к. готовые решения, как правило, выполняют одну функцию: это может быть датчик температуры или переключатель. Ниже приведу список элементов, которые я заказал на популярном китайском сайте:
Можно поискать на этом же сайте готовые решения, к примеру, от sonoff или других производителей.
После сборки устройства загружаем прошивку ESPEasy, которая работает через mqtt (в следующей публикации я расскажу всю техническую часть, как настраивал, подключал и прошивал данное чудо).
Ниже представлены схема и фото начального прототипа компоновки деталей:
В openHAB необходимо установить binding MQTT.
Для этого проходим в настройки -> Bindings (в разделе Add-os):
Если MQTT Binding отсутствует, то добавляем его через «+»:
Далее проходим в Things и добавляем наше устройство:
Добавляем каналы для нашего устройства:
Коротко о каналах:
Temp – температура
Hum – влажность
SW_TAM_1 – реле управления уличным прожектором
SW_TAM_2 – реле управления уличной розеткой.
Третий шаг – это автоматизация реле и вывод информации с нашего самодельного устройства. Вся автоматизация осуществляется через правила (Rules), которые находятся в разделе «Настройки».
Правила можно добавить двумя способами: через web-интерфейс, пройдя в «Настройки» -> «Правила», и там нажать на кнопку «+», либо, как делал я, через VSCode создание правил, через текстовые файлы. Для создания правила в VSCode нам необходимо на сервере с установленным openHAB пройти по пути /etc/openhab/rules. Для удобства доступа со своего домашнего компьютера я эту папку расшарил в общий доступ.
Приведу пример правила для реле управления светом. Для реле управления внешней розеткой правило будет аналогичным, только с другими временными интервалами.
Синтаксис написания правил на XBase:
rule "ESPTAM Spotlight Off"
when Time cron "0 0 10,23 * * ? *"
then
if (ESPTAM_SWTAM1.state == ON) {
ESPTAM_SWTAM1.sendCommand(OFF)
} else {
ESPTAM_SWTAM1.sendCommand(ON)
}
end
Данное правило будет срабатывать в 10 утра и в 11 вечера и выступать в роли триггера, переключая состояние устройства.
Но я столкнулся со следующей проблемой: в момент отработки правила устройство может находиться не в сети. Это может происходить по причине нестабильной связи с роутером. Поэтому ниже в правило я добавил проверку статуса переключения:
Var Timer myTimerSpotlight = null
rule "ESPTAM Spotlight Off"
when Time cron "0 0 10,23 * * ? *"
then
if (ESPTAM_SWTAM1.state == ON) {
if (myTimerSpotlight !== null) {
logInfo("rules", "Ждем 10 сек.")
myTimerSpotlight.reschedule(now.plusSeconds(10))
} else {
myTimerSpotlight = createTimer(now.plusSeconds(10),
[ |
logInfo("rules","Выключаем прожектор")
ESPTAM_SWTAM1.sendCommand(OFF)
if (ESPTAM_SWTAM1.state == OFF) {
logInfo("rules", "Прожектор выключен")
myTimerSpotlight.cancel()
myTimerSpotlight = null
}else{
myTimerSpotlight.reschedule(now.plusSeconds(10))
}
])
logInfo("rules", "Не выключился. Пробуем каждые 10 сек.")
}
} else {
logInfo("rules", "Прожектор выключен")
}
end
Что я добавил:
- ESPTAM_SWTAM1.state – статус устройства (в сети/нет)
- myTimerSpotlight — переменная таймера
- logInfo – функция логирования
Ниже представлено правило, аналогичное первому, только действует в другую сторону — включает реле в определенное время, если оно выключено:
var Timer myTimerSpotlight = null
rule "ESPTAM Spotlight On"
when
Time cron "0 0 7,17 * * ? *"
then
if (ESPTAM_SWTAM1.state == OFF) {
if (myTimerSpotlight !== null) {
logInfo("rules", "Ждем 10 сек.")
myTimerSpotlight.reschedule(now.plusSeconds(10))
} else {
myTimerSpotlight = createTimer(now.plusSeconds(10),
[ |
logInfo("rules","Включаем прожектор")
ESPTAM_SWTAM1.sendCommand(ON)
if (ESPTAM_SWTAM1.state == ON) {
logInfo("rules", "Прожектор включен")
myTimerSpotlight.cancel()
myTimerSpotlight = null
}else{
myTimerSpotlight.reschedule(now.plusSeconds(10))
}
])
logInfo("rules", "Не включился. Пробуем каждые 10 сек.")
}
} else {
logInfo("rules", "Прожектор включен")
}
end
Добавив это правило в openHAB, мы получаем автоматическое управление светом по времени. Логика простая: если на часах 7 утра или 17 вечера, включается свет, если на часах 10 утра или 23 вечера, то свет выключается. Такое же правило я применил к реле управления внешней розеткой для включения обогрева двигателя в холодное время года.
Это правило я настраивал зимой, когда в семь утра и в пять вечера было темно, и меня устраивала работа освещения по таймеру. Но ближе к весне светать начало с каждым днем все раньше, а темнеть стало все позже, и свет горел в светлое время суток. Меня это не устроило. Почему бы включение и выключение света не привязать к рассвету и закату? Как вам эта мысль? Немного погуглив, я нашел решение. В openHAB есть binding, который отвечает за расположение светила в небе и всё, что с этим связано. Называется он Astro Binding, и его можно установить точно так же, как мы устанавливали MQTT. Установив это расширение, мы сможем добавить в Things такой параметр как Local Sun и брать оттуда время восхода и заката солнца, указав в параметрах свою геопозицию.
Добавляем в Things LocalSun и подключаем два канала: Sunrise Start Time и Sunset End Time.
Теперь у нас есть время восхода и заката, к которым можно привязать включение и выключение света, поэтому перепишем наше правило по управлению реле освещения:
val hour = (LocalTime_Date.state as DateTimeType).zonedDateTime.hour
val current = (LocalTime_Date.state as DateTimeType).zonedDateTime
val SunRise = (LocalSunRise_StartTime.state as DateTimeType).zonedDateTime
val SunSet = (LocalSunSet_EndTime.state as DateTimeType).zonedDateTime
if ( ESPTAM_SWTAM1.state == ON ){
if( current.isAfter(SunSet) && hour >= 23) {
logInfo("rules", "Прожектор выключен")
ESPTAM_SWTAM1.sendCommand(OFF)
return
}
if( current.isAfter(SunRise) && hour < 12) {
logInfo("rules", "Прожектор выключен")
ESPTAM_SWTAM1.sendCommand(OFF)
return
}
}
if ( ESPTAM_SWTAM1.state == OFF ){
if( hour > 7 && hour < 23) {
if( current.isAfter(SunSet) || current.isBefore(SunRise) ) {
logInfo("rules", "Прожектор включен")
ESPTAM_SWTAM1.sendCommand(ON)
return
}
}
}
Вот теперь наше уличное освещение работает как надо и не горит впустую.
Кстати, это решение можно использовать для управления лампами для рассады на подоконнике, чтобы по вечерам не включать вручную светильник. Ну и бонусом я хотел бы вам показать, как я вывел управление устройством на главную страницу:
Ссылка на GitHub
В openHAB можно реализовать достаточно гибкие правила по настройке автоматизации, доступно много драйверов для поддержки разных устройств. У меня этот сервер больше года, и я не нашел задач, с которыми openHAB не смог бы справиться. Если вы ищете систему для построения умного дома, рекомендую обратить внимание на этот проект.
На этом я хочу завершить публикацию. Спасибо за внимание, пишите в комментариях, насколько интересна для вас была эта тема.