20 May

Как построить “Умный дом" и не сойти с ума

BARY.io corporate blogProgramming microcontrollersSmart HouseIOTDIY
image

Умная мебель, которая сама заботится о порядке в доме, — must-have почти любой футуристической картины. На самом деле саморегулирующееся климат, автоматическое включение и выключение света и голосовое управление бытовой техникой — всё это можно настроить уже сейчас. Но понадобится немного опыта, базовых знаний в области техники и иногда программирования, а также целое море фантазии. В моем же случае, я сделал так что достаточно только фантазии, но обо всем по порядку…

Самой идеей «умного дома» я заинтересовался около пяти лет назад. Сначала я сделал самую простую систему. Она управляла светом в коридоре и ванной по датчику движения, вытяжкой по датчику влажности, а также погодной станцией  —  в то время по ним все сходили с ума. Каждый уважающий себя DIY-щик должен был сделать погодную станцию.

Первым делом я оснастил квартиру управляемым реле для автоматического включения света в коридоре и ванной. Это выглядело следующим образом: один датчик стоял в коридоре, второй в ванной.

Если кто-то шел в ванную комнату, то его движение фиксировал коридорный датчик и тут же включал свет и в коридоре, и в ванной. При этом, если в ванную никто не заходил, то это уже фиксировал датчик, находящийся внутри ванной комнаты. Спустя 15 секунд свет там выключался. Если человек заходил в ванную, то свет в коридоре выключался через минуту. 

Я продумал и такие случаи, если кто-то слишком задумывался, сидя на «белом друге» в ванной (у меня был совмещенный санузел). Для этого свет в ванной был поделен на две группы. Одна выключалась через 3 минуты после того, как датчик в ванной переставал фиксировать движения, другая  —  через 5 минут. Так что больше чем на пять минут оставаться без движения в ванной при свете не получалось. Очень дисциплинирует. Впрочем, можно было всегда пошевелить рукой и продолжить думать о насущном.

В ванной также работал датчик влажности, который автоматически запускал вытяжку, если влажность превышала 50%. Как только помещение проветривалось до 45% влажности, вытяжка выключалась. 

Управление шло  —  а точнее пыталось идти  —  через платформу Arduino. 


Фото взято с сайта производителя

Почти сразу стало понятно, что эта платформа   —   не совсем про создание умного дома. Основное неудобство работы с Arduino сводилось к тому, что платформа работала без сети, а без нее не получалась никакой по-настоящему единой экосистемы.  Конечно, я мог бы переделать Arduino и добавить поддержку сети, но зачем? Я выбрал более простой путь и сменил эту платформу на другую. 

Наигравшись с Arduino, я переподключил дом на плату ESP-8266. По сути это тот же Arduino, но с Wi-Fi + компактнее по размерам.  Этот модуль до сих пор пользуется популярностью у производителей гаджетов для умного дома. 


Фото взято из Интернета

Параллельно я пытался сделать умный дом еще более умным. Например, решить проблему круглосуточно работающих теплых полов или вечно включенного кондиционера. Для этого я купил китайские WiFi-термостаты Beok. Они позволили отключать подогрев пола дистанционно, но приходилось это делать через специальное приложение в телефоне. 

Задачу по дистанционному управлению кондиционером я решил с помощью эмулятора инфракрасных сигналов Broadlink RM Pro. Ничего сложного: записываешь на эмулятор сигнал с пульта управления кондиционером (тут может быть любая техника, управляемая с помощью пульта), а потом в телефоне нажимаешь кнопочку в приложении, и эмулятор воспроизводит ранее записанный сигнал. В случае с кондиционером я получил возможность включать и выключить его, задавать режим работы и выставлять другие параметры удаленно.  

Также установил выключатели Livolo. С их помощью я мог также включать и выключать свет по радиоканалу. 



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

В доме также появились различные управляемые WiFi-реле типа Sonoff или Tuya и даже дорогущий Danalock для замка в квартиру, к которому тоже потребовалось отдельное приложение. Почти все эти мелочи (за исключением Danalock) я покупал на китайской площадке Aliexpress, где они стоили копейки и позволяли мне экспериментировать без серьезных вложений. 

Одной из первых относительно серьезных покупок стал бризер от Tion. С автоматическим контролем CO2 он более или менее справлялся, но температуру подогрева воздуха зимой постоянно приходилось регулировать вручную. И снова  —  для управления пришлось установить отдельное приложение. 


Фото взято с сайта производителя

Всех датчиков и контроллеров, которые я тогда испробовал, я даже не могу вспомнить. Мой смартфон был забит приложениями по их управлению. Это был целый зоопарк, за которым постоянно приходилось следить. Я попытался объединить управление этими приложениями через всякие агрегаторы типа HomeBridge/MajorDomo и т.п. Но у всех обнаружились свои существенные недостатки:

  • недружелюбный интерфейс, а порой просто ужасный интерфейс
  • отсутствие поддержки всех используемых приложений
  • сложное подключение

Поиски какого-либо приложения для централизованного управления такого объема датчиков, контроллеров и других систем управления к успеху не привели. Тогда же я попробовал самостоятельно довести до ума одно из «умных» устройств  —  тот самый бризер Tion. Я написал скрипт для автоматического управления температурой нагрева в зависимости от температуры в помещении. Дело в том, что у системы вентиляции не было автоподстройки температуры нагрева воздуха. Получалось, что в помещении было то супержарко, то суперхолодно. Никак не выходило добиться золотой середины. Вот с помощью написанного скрипта и бризера эту задачу удалось решить. 

Успех со скриптом для бризера натолкнул меня на идею создать собственное приложение для управления умным домом. Основной целью было создать прогу с удобной интеграцией умных устройств, многоуровневыми условиями автоматизации и возможностью управлять всеми девайсами в доме. 

Около года я самостоятельно занимался back-end и front-end разработкой приложения. 

Серверная часть написана на NodeJS. Выбор в пользу NodeJS был сделан из-за развитого сообщества, в котором имеются реализованные протоколы практически ко всем имеющимся на рынке устройствам. Клиентская часть написана на Angular (Ionic) и работает на Android/iOS. В общем классическая клиент-серверная архитектура.

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

Я многократно переписывал драйвера устройств, пока не пришел к примерно такому виду:

Пример кода одного из устройств
import {XiaomiSubdeviceV2} from '../xiaomi.subdevice.v2';
import {load_power} from '../capabilities/load_power';
import {power_plug} from '../capabilities/power_plug';
import {PowerPurpose} from '../../base/PowerPurpose';
import {Relay} from '../../base/types/Relay';
import {HomeKitAccessory} from '../../hap/HomeKitAccessory';
import {Lightbulb2Accessory} from '../../hap/Lightbulb2Accessory';
import {Yandex} from '../../yandex/Yandex';
import {YandexLightOrSwitch} from '../../yandex/YandexLightOrSwitch';

export class LumiPlug extends XiaomiSubdeviceV2.with(Relay, power_plug, load_power, PowerPurpose,
  HomeKitAccessory, Lightbulb2Accessory,
  Yandex, YandexLightOrSwitch) {

  onCreate() {
    super.onCreate();
    this.model = 'Mi Smart Plug';
    this.class_name = 'lumi.plug';
    this.driver_name = 'Mi Smart Plug';
    this.driver_type = 3;
    this.parent_class_name = 'lumi.gateway';
  }

  getIcon() {
    return 'socket';
  }
}


Суть в том, что несмотря на обилие различных устройств, все они делают приблизительно одно и то же и предоставляют примерно одинаковую информацию. Поэтому все возможности устройств были вынесены в отдельные примеси, из которых в конечном итоге и состоит окончательный драйвер. Например, в приложении поддержано множество устройств, имеющих функцию включить/выключить. Она-то и вынесена в отдельную примесь и идентично используется для всех девайсов. Элементарно же, Ватсон!

Что это дало в итоге: любой драйвер нового устройства пишется довольно быстро и легко, т.к. все стандартизировано и не нужно беспокоиться о дальнейшем хранении полученной информации. Для совсем новых протоколов (которых у меня еще не было) также пишутся примеси, которые основаны на имеющихся. Уже они получают информацию устройства и передают ее далее по цепочке. Подобный подход позволил сократить объем кода в десятки раз (изначально каждый драйвер был копией похожего драйвера).

Так постепенно я проходил все круги ада по допиливанию бэка и фронта. Когда приложение приобрело достаточно сносный вид, я подумал: почему бы не поделиться своей разработкой с общественностью? Были найдены партнеры для проекта и помощники для доведения приложения до ума. 

В первую очередь, довести до ума надо было дизайн приложения. Для этого пришлось обратиться к профессиональным дизайнерам. Я наивно полагал, что на это уйдет 3-4 месяца, но в итоге процесс затянулся. Не смотря на то что структура приложения не сильно изменилась от первоисточника, переделывать пришлось буквально все.

Параллельно я — уже не в одиночку, а вместе с командой партнеров по проекту — скупал наиболее популярные устройства для умного дома и дописывал приложение, если оно не поддерживало эти гаджеты. Вскоре, впрочем, стало понятно, что денег на все умные устройства не хватит, поэтому мы решили пообщаться с существующими игроками на рынке и договориться о бесплатных тестовых образцах оборудование бесплатно. Нам не отказали, и первыми серьезными поставщиками стали Wirenboard и MiMiSmart.

Так я вместе с ребятами создал новое приложение для автоматизации умного дома с классической клиент-серверной архитектурой, которая ставится на любую платформу, и удобным современным дизайном. Знакомьтесь  —  BARY*.

*Название произошло не от имени Бари Алибасова, а от персонажа книги Артура К.Дойля «Собака Баскервиллей» дворецкого Бэрримора (англ. Barrymore) —  ваш личный «умный дворецкий». 

Что получилось: описание приложения с красивыми картиночками и котиками


Главный экран представляет из себя удобный дашборд с возможностью просмотра и управления параметрами автоматизируемых помещений. Удобный  —  тут ключевое слово, потому что дашборды в тех приложениях, с которыми я сам пытался работать, было необходимо конфигурировать вручную. Не самое приятное времяпрепровождение



Дом можно поделить на зоны, а зоны — на комнаты. У каждой комнаты есть различные параметры: температура, влажность, текущее потребление электричества и пр., а также избранные действия. Если нажмем на комнату, то провалимся в список подключенных к ней устройств:



Здесь можно включить/выключить устройство, а также увидеть его основной параметр. При переходе на устройство, будет доступно более подробное управление с полным перечнем функций. 

Все устройства подключаются при помощи однотипных настроек. Для многих девайсов есть мастер подключения. Никаких конфигов для тех, кто любит погорячее! В основном все сводится к указанию IP-адреса устройства (для многих устройств есть автопоиск). Если IP-адрес вдруг поменяется, то ничего страшного, сервер найдет его по новому адресу автоматически.



Есть интеграция с Apple HomeKit, она используется для голосового управления через Siri. Все девайсы, поддерживаемые в BARY, интегрируются с Apple HomeKit нажатием одной галочки (привет любителям HomeBridge). Не обошлось и без поддержки Яндекс Алисы. Она оказалась более дружелюбна с точки зрения интерфейс-команд. Например, Siri не хочет закрывать шторы по команде «закрой шторы», не может выставить определенное значение громкости на ТВ и прочее. У Яндекс.Алисы таких закидонов нет. 

Для удобства управления умными угодьями реализованы автоматизации: правила исполнения каких-либо действий при выполнении комплекса условий. Автоматизации логические,  многоуровневые, т.е. можно сделать что-то типа: «Условие 1 и (Условие 2 или Условие 3)». Все в логичном красивом редакторе автоматизаций:



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



В приложении также поддерживаются сценарии. Сценарий — комплекс действий, выполняющийся при каком-либо условии из автоматизации.  Для своего умного дома я использую только стандартный набор:



У меня уход из дома / возвращение домой реализованы через Apple TV — включается/выключается автоматически когда все ушли из дома, или кто-то вернулся домой. Приходишь домой, а тебя там уже встречает диктор с грустными глазами с 1го канала. Ну здорово  же?

Ну и какой же умный дом без возможности наблюдать за котиком?



Можно подключить любую камеру, которая способна отдавать RTSP-поток. 

Отдельно хочу сказать о блоке статистики. Получилось достаточно информативно:



В легенде красная полоса — отклонение от средних значений за последние полгода, серая полоса — расход в пределах  средних значений.

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

Также статистику можно посмотреть по любому подключенному устройству:



Кстати, наличие автоматизаций и статистики сократили расходы на электричество более чем в 2 раза.

Все возникающие события хранятся, и их можно посмотреть:



Также на главной странице есть особая вкладка, которая собирает все выбранные пользователем основные показатели:



Кстати, учет воды реализован через датчик открытия дверей/окон Xiaomi. Для этого вместо геркона на специальный контакт припаивается выход с импульсного счетчика, а в BARY создается виртуальный счетчик, у которого в качестве источника импульсов можно указать этот датчик.

Архитектура и безопасность


Обмен клиента с сервером зашифрован по технологии AES, а сервер находится непосредственно внутри автоматизируемого помещения. На мой взгляд, это максимально защищает систему от сторонних нежелательных вмешательств.

Если нет белого IP-адреса, то можно подключить облако. Оно будет являться посредником, без возможности расшифровки команд, т.к. ключи находятся на сервере. 

Где взять


Серверная часть может быть запущена практически на любой существующей платформе  —  спасибо NodeJS. Для самых распространенных платформ мы подготовили скрипты, которые всю работу сделают автоматически.

Для Raspberry Pi на базе Debian Stretch:

wget -qO- "http://bary.io/install?target=pi" | sudo bash

Параметр target отвечает за целевую платформу и может иметь следующие значения:
Raspberry Pi (Debian Stretch)
pi
Raspberry Pi (Debian Buster)
pi_buster
Tinker Board (Debian Stretch)
tb
Wiren Board (Debian Stretch)
wb

Если у кого-то будет желание установить на другую платформу, напишите нам, и мы обновим скрипт. Если возникнут какие-то трудности — тоже пишите. Нам очень нужна обратная связь. 

Приложение в свободном доступе на Google Play и App Store. Возможно, к концу года, приложение станет платным.

Заключение


Зачем я написал эту статью? Основная цель – получить обратную связь от вас.

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

Мы открыты к диалогу по возможным интеграциям и готовы в кратчайшие сроки реализовать поддержку оборудования от заинтересованных в партнерстве компаний. Вы получаете готовое приложение и не тратите время на разработку ПО. А мы получаем широкую номенклатуру поддерживаемых устройств на любой вкус и цвет. Всем хорошо. 

Ближайшие планы и радужные хотелки


В настоящее время я и моя команда активно занимаемся  разработкой блока хранения видеозаписей. Будет возможность  располагать видео в домашнем хранилище, либо в облачном сервисе. Думаю, в начале следующего года можно будет говорить о новом релизе. Должна же быть  возможность пересматривать в записи лучшие перлы котика, развлекающего себя самого, пока хозяев нет дома? 

В следующем году планируем больше интеграций с различными сервисами: списком покупок и дел, календарем и т.д. Подошел, посмотрел на один экран -  и все как на ладони. Несколько проектов, реализованных «под ключ», показали, что эта задача актуальна.

Также планируем старт производства контроллеров с предустановленным ПО для пакетных решений умного дома (в настоящее время пакетное решение «ПО+железо» доступно совместно с нашими партнерами Wiren Board.

А еще поддержка Google Home и Amazon Alexa. Ну и расширение номенклатуры поддерживаемого оборудования, само собой.

Кстати, кому интересно, можете посмотреть перечень поддерживаемых девайсов (не полный) на нашем сайте, а если чего-то в списке не нашли, то спросить в телеграмм-группе.

Будем очень благодарны, если вы поделитесь, чего вам не хватает в существующих приложениях и какие функции вы бы добавили на нашем месте.

Всем спасибо, кто дочитал. Давайте сделаем свои дома умнее вместе!
Tags:умный домIoTsmart homeлонгридraspberry piarduinodiy или сделай сам
Hubs: BARY.io corporate blog Programming microcontrollers Smart House IOT DIY
+20
19.1k 142
Comments 55