Как построить Умный дом и не сойти с ума
May 20, 2020Умная мебель, которая сама заботится о порядке в доме, — 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. Ну и расширение номенклатуры поддерживаемого оборудования, само собой.
Кстати, кому интересно, можете посмотреть перечень поддерживаемых девайсов (не полный) на нашем сайте, а если чего-то в списке не нашли, то спросить в телеграмм-группе.
Будем очень благодарны, если вы поделитесь, чего вам не хватает в существующих приложениях и какие функции вы бы добавили на нашем месте.
Всем спасибо, кто дочитал. Давайте сделаем свои дома умнее вместе!