Время прочтения: 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 не смог бы справиться. Если вы ищете систему для построения умного дома, рекомендую обратить внимание на этот проект.

На этом я хочу завершить публикацию. Спасибо за внимание, пишите в комментариях, насколько интересна для вас была эта тема.