Архитектура для умного дома

Перевод поста Architecture for a smart home, автор – Alex Madrossan

Я хотел бы сделать свой дом более умным, но часами находился в лабиринте:

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

В последнее время, некоторые приятные и недорогие интеллектуальные домашние комплекты прославились как SmartThings. К сожалению, они строятся вокруг философии “огороженный сад”.

Я энтузиаст открытого исходного кода и аппаратного обеспечения. Так что я знал, что хотел чего-то другого.

Поворотный момент произошел, когда я познакомился с openhab; Это зрелый и многофункциональный проект автоматизации, с единым пользовательским интерфейсом для мобильных устройств, дистанционного управления и контроля рабочего стола. Более того, в нем есть время и триггеры, гибкий язык правил, он поддерживает несколько баз данных, имеет различные привязки для устройств – Nest, Samsung TV, Sonos, Tivo и др.

Также openhab имеет стабильную поддержку MQTT. Сплав этих технологий мог бы обеспечить действительно надежную и гибкую систему автоматизации.

Описание

Идея состоит в том, чтобы взять несколько микроконтроллеры (MCU) для сбора данных с датчиков, и публиковать их в теме MQTT. Затем openhab будет применять правила для конкретного значения, поступающего от датчика через MQTT и публиковать соответствующую команду на другую тему. Наконец, микроконтроллер будет “слушать” команду и управлять приводом.

Логика будет сосредоточена в openhab, который говорит с несколькими MCU, сообщения MQTT будет поставляться по внутреннему Wi-Fi, так что это избавит от необходимости прокладывать кабели через стены.

Даже если мой список пожеланий для «умного» дома достаточно простой:

  1. Датчик наводнения для обнаружения утечек воды и выключения подачи воды
  2. Датчик света для включения наружногр освещения, когда окружение темнеет
  3. Датчик влажности для включения спринклеров
  4. Температура и датчик влажности

описанная система в состоянии справиться с гораздо более сложными сценариями.

Железо

В отделении MCU я нашел эту маленькую и дешевую жемчужину: ESP8266. Она объединяет подключения Wi-Fi, GPIO-пины, АЦП в одном корпусе. Есть некоторые платы, основанные на MCU, все они поставляются с прошивкой NodeMCU, которая позволяет запускать скрипты Lua, недавно ESP8266 получила поддержку Arduino IDE, так что, при желании, вы можете поставить прошивку Arduino.

Другие компоненты могут включать платы реле DHT22 влажности и температуры, дальности света в качестве датчика света и электромагнитных клапанов.

Я не уверен относительно Raspberry Pi 2, но ODROID-XU4 достаточно мощная, чтобы содержать openhab плюс программное обеспечение, описанное ниже.

Софт

Кроме openhab, мне нужен хороший брокер MQTT. Есть множество вариантов:

  • Mosquitto - язык С, BSD лицензия
  • RabbitMQ - язык Erlang, лицензия MPL или коммерческая
  • HornetQ - Java язык, Apache 2.0 лицензия
  • Apache Apollo - Java язык, Apache 2.0 лицензия

Я использовал мои первоначальные тесты для mosquitto, и они выполнились очень хорошо.

InfluxDB и Grafana завершат программный стек как инструменты для базы данных и визуализации соответственно.

Для визуализации / панели управления я хотел бы упомянуть эти компоненты:

Сценарии из реальной жизни

Я хочу измерить внешнее освещение и включить свет в передней части дома, если темнеет, и свет со значением выше определенного порога, по крайней мере n минут. Свет выключается при фиксированном времени в течение ночи, дабы избежать затрат энергии. Также нужна кнопка “Программное обеспечение” для ручного включения / выключения света.

Это может быть реализовано парой элементов:


Number Outside_Light        "Outside Light [%.1f]"	 (Light)  {mqtt="<[main_broker:sensor/light/outside/A:state:default]"}
Switch Outside_Light_Switch "Outside Light Switch"	 (Light) {mqtt=">[main_broker:switch/light/outside/B:state:ON:1],>[main_broker:switch/light/outside/B:state:OFF:0]"}

Первый пункт Outside_Light – тип номера; он считывает световые значения, поступающие от MCU, который был опубликован в датчике света/внешнего/ A темы.

Второй пункт OutsideLightSwitch – тип переключателя и публикует свое состояние для переключения / света / снаружи / B тема, переход между состояниями 0 и 1. Может быть нажата с помощью пользовательского интерфейса openHAB.

Далее, два правила определяют автоматизацию и связь этих элементов:


import org.openhab.core.library.types.*
import org.openhab.core.persistence.*
import org.openhab.model.script.actions.*

var Number lightThreshold = 600
var Number lightIteration = 0

rule "Change outside light status"
when
      Time cron "0 0/2 15-23 * * ?"
then
      logInfo("Sensor", "Light value: " + Outside_Light.state)
      var Number maxCount = 2
      
      if((Outside_Light.state > lightThreshold){
         lightIteration = lightIteration + 1
         if(lightIteration == maxCount){
	   postUpdate(Outside_Light_Switch, ON)
         }
       } else{
          lightIteration = 0
       }
       logInfo("Sensor", "Iteration: " + lightIteration)
end

rule "Scheduled change outside light status MON-SUN"
when
      Time cron "0 30 1 ? * MON-SUN *"
then
      lightIteration = 0
      postUpdate(Outside_Light_Switch, OFF)
end

Правила выше сами себя объясняют: Я использую временной триггер, чтобы проверить световые значения каждые две минуты с 3 часов до полуночи, далее я использую счетчик по крайней мере n минут (4 минуты в приведенном выше примере) перед включением света. Другой триггер на основе времени выключает свет в 1:30 утра.

Заключение

Достоинства:

  • Гибкость
  • Расширяемость
  • Дешевизна

Недостатки:

  • Не plug & play, требует технических навыков в программировании, электрике и пайке
  • Отсутствие корпуса для датчика то время как коммерческие хороши, см. например Fibaro Flood Sensor. 3D печать Может помочь реализовать пользовательские корпуса, есть готовые проекты онлайн.

Я не проверял openHAB2, поскольку что в момент написания этой статьи она была в альфа-версии, но выглядит многообещающе в снижении необходимых навыков программирования.

Этот проект все еще находится в стадии разработки; я должен выбрать несколько аппаратных и программных компонентов и работать над сетевой безопасностью, но основная идея была описана.

Предупреждение

Этот пост намеренно не содержит каких-либо схем или инструкций о том, как подключаются компоненты. Вы должны быть технически подготовлены знать технику безопасности дома в вашей стране, прежде чем делать какие-либо работы, потому что вы можете нанести травмы себе или повредить свой дом!