Достаточно давно занимаюсь внедрением концепции "умный дом" у себя дома. Делаю это с одной стороны ради интереса (чешутся руки), с другой как проверка идей в целом ну и ради некоторого облегчения рутинных процедур.

В моем понимании "умный дом" это, в первую очередь, про автоматизацию а не управление. Другими словами - возможность с веб-морды управлять светом/отоплением/вентиляцией это НЕ умный дом. А вот автоматическое регулирование отопления в зависимости от каких-либо факторов, без участия человека, сильно ближе к желанному результату.

В ходе разнообразных экспериментов я пришел к тому что использовать одну технологию (например Zwave, KNX, Zigbee, 433, проприетарные протоколы Xiaomi, AJAX и т.п.) это загонять себя либо в очень узкие рамки решений, либо у меня нет столько денег. Решил взять всего понемногу и поверх всего использовать одно из софтовых решений, которое сможет все объединить в одну эко-систему. 

На данный момент шорт-лист технологий и продуктов, которые меня устраивают и которые дают мне возможность получить желаемый результат, выглядит следующим образом:

Openhab2 - это именно то большое софтовое решение, которое позволяет объединить разные продукты и технологии в одну домашнюю систему

Sonoff - удивительно приятные, а главное дешевые, реле/датчики на базе популярного esp8266 чипа. Я их прошиваю в отличную альтернативную прошивку Sonoff-Tasmota, тем самым получаю полноценный MQTT клиент и отвязываю от китайского облака.

MQTT - локальный брокер событий,  в принципе можно и "облачный", но если уж все равно разворачивать openhab то нет смысла привязываться к чужой инфраструктуре. Я использую mosquitto - но совершенно не принципиально.

Philips HUE - несмотря на название, это вполне приличная экосистема "умного" LED-освещения под ключ. Работает на проприетарном варианте Zigbee, но в большинстве решений управляется по публичному API. Не могу сказать что я на 100% доволен но пока лучше варианта не нашел.

Netatmo weather - это хипстерская домашняя метеостанция, может быть дополнена датчиками ветра/дождя но у меня используется наружный блок, внутренний, CO2/ Ситуация очень напоминает ситуацию с Philips HUE, с одной стороны проприетарщина, с другой ребята хорошо заморочились API - разве что с утюгом нельзя связать, хотя не факт. Вопрос температур, CO2, влажности он во всей автоматизации чуть-ли не в первую очередь возникает, можно использовать массу альтернативных решений, возможно более дешевых, но тут в комплекте получаете альтернативный мобильный интерфейс. Метеостанция трудится на благо дома но вы всегда можете получить в мобилке информацию по погоде автономно. Как оказалось это удобно.

Grafana + InfluxDB. Сам по себе InfluxDB используется как один из вариантов persistent-стораджа для openhab. Теоретически можно использовать и более тривиальные БД, НО возможность в графане получить сразу аналитику по поведению "умного дома" (температуры, что когда где включается, выключается и тп) определила мой выбор.

Mysensors - самая забавная и спорная штука в моем пуле, если коротко это достаточно красноглазый проект, который позволяет на копеечных чипах (arduino+радио), практически на коленке, создать защищенную меш-радио сеть "умных" устройств. Это вроде звучит безобидно, но на практике позволяет за 5-10 баксов автоматизировать и сделать "умным" практически любое устройство с которым может работать arduino

А теперь конкретика.

Есть в моем, пока арендованном, доме одна проблема (вернее их масса но сейчас про одну из) - на неотапливаемом чердаке установлена насосная станция, зимой есть вероятность ее замерзания и поломки. Хозяин решил что он будет просто на время холодов включать рядом с насосом пару ламп накаливания. Задача идеально подходит для автоматизации.

Берем sonoff TH10 с внешним датчиком температуры - в принципе его родная прошивка вроде как позволяет решить задачу из коробки (есть настройка правил включения/выключения по температуре) НО:

  1. Привязана к китайскому облаку
  2. Вы никак не можете завязать устройство с другими системами и дома
  3. Самое главное - алгоритм работы очень лобовой (нижняя температура, верхняя, в диапазоне горим). Как показала практика - лампа в таком режиме бывает чаще в состоянии "уже перегорела".

Будем делать по другому

Прошиваем выключатель упомянутой прошивкой Sonoff-Tasmota (как это сделать есть масса инструкций в нете). Настраиваем MQTT клиент в прошивке. Все - у нас управляемое через MQTT реле с датчиком температуры.

Далее просто код для openhab:

heat.items:

Я сторонник того что автоматизация должна быть опциональной, потому все свои алгоритмы снабжаю функциями "выключить" и "установить принудительно" - тут Item Water_Pump_Heater_State  как раз и используется для управления управлением )

Group gWater       "Water"   <water>

Group gWater_Pump  "Water pump" <pressure> (gWater)
Group gWater_Pump_Heater  "Water pump heter" <heating> (gWater_Pump)


Switch Water_Pump_Heater_Switcher "Water pump heater [%s]" <switch> (gWater_Pump_Heater)
    { mqtt=">[local:cmnd/sonoff1/POWER:command:*:default],
            <[local:stat/sonoff1/POWER:state:default]" }

Number Water_Pump_Heater_Temp "Water pump heater Temperature [%.1f t]" <temperature> (gWater_Pump_Heater,temperature)
    { mqtt="<[local:tele/sonoff1/SENSOR:state:JSONPATH($.AM2301.Temperature)]" }

Number Water_Pump_Heater_Humidity "Water pump heater Humidity [%.1f %%]" <moisture> (gWater_Pump_Heater,moisture)
    { mqtt="<[local:tele/sonoff1/SENSOR:state:JSONPATH($.AM2301.Humidity)]" }

Number Water_Pump_Heater_State <switch> (gWater_Pump_Heater)

heat.rules:

Тут в начале сценария задаются граничные температуры, а также самое главное - время переключения (tempMinutes). Как показали эксперименты со стоковым (не очень умным) sonoff - помещение с насосом имеет ооочень низкую инертность, потому быстро прогревается и мгновенно остывает, реле несчастную лампу постоянно делало ВКЛ-ВЫКЛ-ВКЛ-ВЫКЛ, с интервалами в 5-10 минут. В итоге лампа конечно перегорает. Я ввожу минимальное время - которое я лампу не трогаю, включил - минимум 45 минут она горит, если не нагрела - горит дальше, если нагрела - на 45 минут выключается.

import org.joda.time.*
import org.openhab.model.script.actions.Timer


var Timer pumpHeaterTimer = null
var tempOn = 3
var tempOff = 20
var tempMinutes = 45
rule "Watter_Pump_Heater state"
when
    Item Water_Pump_Heater_State changed
then
    switch (Water_Pump_Heater_State.state as DecimalType) {
        case 0 : Water_Pump_Heater_Switcher.sendCommand(OFF)
        case 1 : Water_Pump_Heater_Switcher.sendCommand(ON)
        case 2 : {
            // AUTO but turn ON for default
            Water_Pump_Heater_Switcher.sendCommand(ON)
            if (pumpHeaterTimer != null) {
                pumpHeaterTimer.cancel();
                pumpHeaterTimer = null;
            }
        }
    }
end

rule "Water_Pump_Heater temp"
when
    Item Water_Pump_Heater_Temp changed
then
    if (pumpHeaterTimer == null && Water_Pump_Heater_State.state == 2) { // AUTO
        
        var state = if (Water_Pump_Heater_Switcher.state == ON1 else 0
        var temp = Water_Pump_Heater_Temp.state

        logInfo("Water_Pump_Heater","state = " + state)
        logInfo("Water_Pump_Heater","temp = " + temp)

        if (temp == UNDEF) {
            // ? HZ
        } else if (temp <= tempOn && state == 0) {
            // should ON
            
            Water_Pump_Heater_Switcher.sendCommand(ON)
            pumpHeaterTimer = createTimer(now.plusMinutes(tempMinutes), [|
                pumpHeaterTimer.cancel();
                pumpHeaterTimer = null
            ])
        } else if (temp >= tempOff && state == 1) {
            // should OFF
            
            Water_Pump_Heater_Switcher.sendCommand(OFF)
            pumpHeaterTimer = createTimer(now.plusMinutes(tempMinutes), [|
                pumpHeaterTimer.cancel();
                pumpHeaterTimer = null
            ])
        }
    }
    
end

heat.sitemap:

Тут чистая визуалка - переключатель на 3 положения (принудительно вкл/выкл/авто). Датчики температуры/влажности и текущее состояние реле.

sitemap heat label="Инженерка" {

    Frame label="Насос" {
        Switch item=Water_Pump_Heater_State label="Режим" mappings=[0="OFF",1="ON",2="AUTO"]
        
        Text item=Water_Pump_Heater_Temp label="Температура [%.1f °C]" icon="temperature"
        Text item=Water_Pump_Heater_Humidity label="Влажность [%.1f %%]" icon="moisture"

        Text item=Water_Pump_Heater_Switcher label="Обогрев"

    }
}

Получается такой интерфейс в openhab (в который по хорошему заглядывать и не нужно)

А в графане можно понаблюдать "что собственно происходило"