Когда-то в блоге мы рассказывали, как наш руководитель отдела обучения и замечательный программист Евгений создал марсианские часы и заодно выиграл в конкурсе. А потом — как он же сконструировал систему «Умный дом» своими руками. Так вот, сегодня снова поговорим о DIY-электронике и принципиально новой системе контроля за домом, которую Евгений создал с нуля взамен предыдущей. Я занимаюсь всем, что связано с электроникой и программированием электронных устройств, с университета. Это моя профессия — я учился на приборостроителя. И получилось так, что работаю я разработчиком, а моё хобби связано с профессией. — Евгений, разработчик Идея «умного дома» не давала покоя инженерам ещё в 50-е: тогда появился первый дом с кнопками, где все бытовые задачи решались нажатием конкретной кнопки. В 1966 году с помощью единой системы уже можно было настраивать климат в помещении и включать/выключать приборы. Полноценные «умные дома» появились на западе в 70-е с изобретением передачи сигнала по электросети и беспроводного управления на радиочастоте 433 МГц. Но для управления системой нужен был специальный пульт: с его помощью можно было включать и выключать приборы, менять яркость света и информировать о текущем состоянии бытовой техники. Одна беда — работали такие пульты по закрытым протоколам. Но когда появился Интернет и Wi-Fi, в сфере умных домов всё изменилось. Эпопея с Умным домой началась у Евгения давно — ещё 5 лет назад, когда он впервые узнал про Arduino (аппаратно-программную платформу для создания каких угодно устройств). Эта тема так его заинтересовала, что спустя пару месяцев он заказал собственный набор Arduino и начал с ним «ковыряться», изучать возможности и документацию. А уже спустя 4 месяца сделал первое устройство — сенсорную игру на реакцию. Но после этого, по собственному признанию Евгения, его посетил творческий кризис: у него была база для проектирования и даже время, а вот идеи, что сотворить, не было. В 2016-м он заинтересовался темой умных домов и понял, что на базе Arduino сделать подобную систему для своей квартиры вполне реально. Первая версия умного дома состояла из метеостанции (с датчиками температуры и влажности) и охранной системы (с датчиком открытия/закрытия двери и инфракрасным датчиком движения), и выглядела так: Следить за температурой и влажностью и контролировать происходящее в помещении — классно, но вскоре стало ясно, что эти устройства не такие уж «умные»: ведь централизованной системы управления всем этим не было. Поэтому-то и зародилась идея сделать новую, усовершенствованную, версию системы, которую по праву можно было бы назвать «умным домом». Её Евгений выпустил в 2019-м. Новая система была построена на микрокомпьютере, и у неё был клёвый сенсорный экран (интерфейс которого, кстати, нарисовал один из дизайнеров Сибирикс). Она умела разговаривать, распознавать речь и понимать данные с внешних датчиков, которые к ней можно было подключить. С внешними устройствами система общалась по Wi-Fi с помощью JSON (напомним, это текстовый формат обмена данными). Естественно, все комплектующие для системы заказывались из Китая, поскольку в России найти что-то подобное за адекватные деньги проблематично. В какой-то момент дисплей, как всё китайское (простите за штамп), начал глючить: стал неадекватно реагировать на нажатия и жить своей жизнью. Я, честно, до сих пор не знаю, была это программная ошибка, или действительно дисплей вышел из строя. Собственно, в этот момент я пришёл к выводу, что система «Умный дом» вообще не должна иметь центрального дисплея. Вместо этого она должна базироваться на сервере, к которому можно подключиться вообще с чего угодно: с телефона, планшета, компьютера и из любой точки мира. — Евгений, разработчик Третья версия системы построена на самописной системе центрального управления. Но зачем, спросите вы, ведь есть же готовые решения?! Ага, есть такие. Первая — MajorDomo, придуманная разработчиком из Белоруссии. Сама по себе штука прикольная и очень популярная, к ней есть множество плагинов и модулей, к ней даже можно подключить датчики от супер-брендовых производителей. Но есть нюанс — она построена на языке PHP с использованием MySQL (свободной реляционной системы управления базами данных). Евгений пробовал её в деле, но на сервере дважды терялась база данных, потому что MySQL при запуске сервера почему-то не стартовал. На третий раз я плюнул на это дело и пришёл к выводу, что PHP не слишком годится для систем, которые должны ультрабыстро реагировать на изменения и не просто обрабатывать какой-то запрос, а буквально жить своей жизнью. — Евгений, разработчик Второе распространённое готовое решение — система Home Assistant, написанная на Python и отлично работающая на Unix-машинах (оборудовании с переносимой операционкой). Можно просто записать образ программы управления на флешку, вставить её в свою систему — и всё заработает. Да, для Home Assistant есть плагины для быстрой настройки, но с ними непросто. Поэтому чаще конфигурация такой системы делается вручную (приходится писать код): проще укусить себя за локоть. А если уж нужно писать код, так лучше свой собственный. В новой, написанной ручками, системе есть три узла: Сердце системы — микрокомпьютер версии Raspberry PI 3b+. Стоит он 2−3 тысячи рублей, а взамен вы получаете полноценный компьютер размером с пачку сигарет. Единственный нюанс: его файловая система базируется на карте памяти формата MicroSD, а постоянные записи данных быстро выводят её из строя. Из-за этого приходится заботиться о минимизации записываемых данных или подключать HDD-носитель вместо MicroSD. Но принцип в обоих случаях одинаковый: нужно скачать образ Raspbian, установить его на карту памяти и вставить в микрокомпьютер — и вуаля, у вас готов полноценный Linux-компьютер, на котором можно делать всё что угодно. В нашем случае — сервер умного дома. Второй незаменимый компонент системы — модуль NodeMCU V3, который базируется на микросхеме ESP8266, которую можно программировать в среде Arduino. Напомним, Arduino — это отладочная плата с микроконтроллером, стабилизацией питания, подключением к USB для перепрошивки и выходами для управления чем угодно. Программируется на языке C++.   Arduino всем хорош, но модуль из коробки умеет общаться только с компьютером и только через USB-порт, а для системы умного дома это серьёзный минус. Зато модуль NodeMCU V3, который Евгений использовал для своей системы, имеет «на борту» Wi-Fi — а значит, не нужно заморачиваться с дополнительными периферийными устройствами, и данные легко передавать. В системе также есть несколько датчиков: Чтобы система работала как одно целое, центральный узел и периферийные устройства должны как-то между собой общаться, причём общаться максимально стабильно. Изначально Евгений сделал JSON-обмен: элементы обменивались данными по http-запросу. Способ стабильный, но проблема в том, что так никто не делает. Поэтому в текущей системе за обмен данными отвечает протокол MQTT, заточенный специально под обмен информацией между узлами системы. Его создали в 2016-м и сейчас активно используют на больших серьёзных заводах, где требуется автоматизация производства. У протокола есть центральная часть — Broker, который отвечает за приём и отправку сообщений всем элементам системы. Элементы же делятся на две группы: Publisher (публикуют данные в Broker) и Subscriber (получают эти данные). Причём, Subscriber может заранее подписаться на какой-то топик (скажем, данные о температуре), которого в системе пока нет. Как только топик появится, данные сразу придут.   В сердце системы — NodeMCU, о котором мы уже говорили выше. К нему подключены три узла: Данные между устройствами и сервером передаются по интерфейсу I2С или UART — это интерфейсы для общения. В нашем случае, между микроконтроллерами.   Изначально модуль планировался без узла Arduino, но контроллер NodeMCU просто не успевал отслеживать все изменения в системе и передавать их на большой тачскрин-дисплей. Также в модуль охраны включены датчик движения и сканер RFID ключа-карты. На Arduino-модуль приходится обработка всех параметров с тачскрина. Фактически контроллер запрашивает у Arduino данные с датчиков и отправляет их на дисплей через интерфейс UART.   Этот модуль не имеет корпуса из-за пандемии. Все платы Евгений заказывает на китайском заводе — просто потому что так дешевле. Сотрудничает с ними давно, качество плат устраивает. Но когда он в очередной раз заказал у них плату для охранной системы, с пересылкой в Барнаул начались проблемы: пандемия, границы закрыты, все дела. Деньги вернуть могут только за доставку, а за сами платы нет — ведь они их уже изготовили. Всего 2 $, конечно, но всё равно как-то жалко. Правдами и неправдами выяснилось, что в Новосибирск доставка возможна — и через друзей Евгений получил-таки свои заветные железки. Правда, при стоимости плат в 150 рублей доставка вышла в 1000 :) Из-за этого другие платы он заказал на AliExpress, но и там всё пошло не по плану: заказ дважды отменялся, а деньги за него долго висели на холдировании. Собственно, поэтому плату для GSM пришлось делать самостоятельно. А корпуса нет, потому что его ещё напечатать на 3D-принтере надо. Сервисы в нашем случае — виртуальные модули, отвечающие за какие-либо действия. Их нельзя потрогать руками: Примерная структурная схема того, как устроена система:   В сердце системы — сервер на фреймворке Vue.js, который отлично подходит для создания пользовательского интерфейса, с использованием фреймворка Nuxt.js, который позволяет создавать приложения на Vue.js. Дополнительно к фреймворкам используется модуль mongoDB (это документоориентированная система управления базами данных с открытым исходным кодом). Вещи (физические датчики) публикуют данные в MQTT-брокер, а оттуда они попадают на сервер, где происходит их валидация, обработка, проверка и преобразование. После эти данные попадают в модуль Public, который отвечает за публикацию всех собранных данных для внешних подключений. А уже оттуда данные переходят в Socket IO — библиотеку Java Script, за счёт которой обеспечивается двусторонняя связь между веб-клиентами и серверами в режиме реального времени. На выходе данные получает клиент (например, в браузере). Сервисы работают схожим образом, но передача данных для них обходится без MQTT — информация передаётся сразу через Public и Socket IO «наружу». Важная часть системы — модули скриптов и автоматизаций. Скрипты, или, по-другому, сценарии позволяют делать что-либо в системе при помощи нажатия кнопок. Можно добавить группу действий (открыть окна, включить вентиляцию, включить или выключить что-либо), и скрипт выполнит их в заданной последовательности. Когда задаётся сценарий, нужно выбрать целевую точку: либо отправить команду в узел «вещи», либо в «сервис», либо отправить http-запрос для webhook — функционал для уведомления сторонних сервисов. И конечно, каждой из них можно дать название сценария и прикрепить к ней иконку. Запуск набора сценариев по конкретному событию происходит за счёт автоматизации. Например, если вы открыли дверь, система должна включить свет. Чтобы задать автоматизацию, сначала указывается событие запуска: дата, параметр или автоматизация. Например, 3-го числа каждого месяца, если идёт дождь, нужно напоминать взять с собой зонт :) Внутри автоматизации можно указывать и другие автоматизации. Например, у вас есть два сценария: для будней и для выходных дней. Так вот, вторая автоматизация проверит, какой сегодня день, и только потом запустится автоматический сценарий выходного или рабочего дня. Такая механика даёт неограниченную вложенность автоматизаций, чтобы создавать максимально сложные сценарии, комбинируя типы событий «и» с «или». Когда событие и его параметры указаны, система выбирает подходящий сценарий. Запуск проверки сценариев происходит лишь тогда, когда какой-либо параметр в системе изменился.   Есть два основных канала, которые по факту являются топиками в MQTT: Google Assistant — тот самый сервис, который отвечает за запросы «окей, Гугл...». Аналог Siri от Apple. И конечно, у него есть своё API и среда для подключения умных устройств в экосистему Google Assistant, чтобы можно было сказать «окей, Гугл, включи охранную систему» или «окей, Гугл, какая погода сегодня?». Запрос пройдёт через сервера Гугла, вернётся к вам на устройство, и оно выдаст результат.  Я подумал «круто!», готовое нативное приложение для телефона на Android и как раз годится для системы «умный дом». Начал подключать. Если кто-то видел документацию сервисов Гугла, те меня поймут: я офигел их читать. Во-первых, на английском. Во-вторых, многобукаф и написано очень мудрёно. Я подписан на ютуб-канал одного разработчика, которому удалось подключиться к экосистеме Google Assistant. После своих неудачных попыток я решил написать ему — он ответил и даже помог мне с подключением. Но в первый же день я разочаровался: приложение Google Home — сырое, а его русская версия и подавно. Но самое главное — система заточена под управление брендовыми устройствами: например, умной рисоваркой, которой можно управлять через Wi-Fi. Или умной колонкой Google Station, с помощью которой реально можно управлять хоть всем домом, но которая по-русски не понимает. Мои же устройства кастомные, и под них в экосистеме Google Assistant ничего нет. Так что всё было зря.  — Евгений, разработчик Пробовал Евгений и яндексовскую Алису — она лучше из-за адекватного русского языка, но и её конфигурация ущербная. В итоге он понял, что с готовыми решениями просто не судьба :) Самое дорогое — микрокомпьютер Raspberry PI 3b+ и вообще весь блок центрального управления. Он вышел по стоимости чуть больше 4 тысяч рублей. А общий бюджет проекта составил 9 540 рублей без учёта расходов на пластик для печати корпусов и мелких деталек, которые уже были в арсенале у Евгения.   Сейчас в планах создание мобильного приложения с красивым интерфейсом, чтобы «умный дом» был всегда в кармане и чтобы вместо SMS приходили push-уведомления. Также Евгений планирует добавить управление светом и входным замком. Сейчас на рынке полно светодиодных люстр с пультом дистанционного управления, в которые можно встроить устройство-контроллер и включить его в систему «умного дома». Среди замков на рынке есть интересное решение — замки Sherlock, управляемые через Wi-Fi со смартфона. Евгений хочет собрать нечто подобное, только чтобы со стороны подъезда вместо электронного дисплея было гнездо для RFID метки. Но самое главное — замок должен сигнализировать о том, что он не закрыт (признайтесь, у вас не раз было такое, что вы проспали всю ночь с открытой дверью, правда?).   Также в планах реализовать функцию «разбудить по сети». Это когда при нажатии специальной кнопки роутер отправляет команду по mac-адресу устройства — например, телевизора, — и велит ему включиться. За счёт этого функционала можно настроить сценарии. Скажем, сценарий «хочу работать»: включить компьютер, выключить телевизор, закрыть шторы, выгнать из комнаты всех домашних :) Но самая крутая штука, которую Евгений хочет воплотить, — это подключение ZigBee-устройств. ZigBee — это стандарт общения между гаджетами или попросту протокол передачи данных. Грубо, — аналог подключения по Wi-Fi. Основное преимущество такой технологии — низкое потребление энергии. Но из-за маломощности и дальность работы тоже меньше, чем у Wi-Fi (хотя в свежих версиях этот недостаток, вроде бы, пофиксили). Организовать сеть ZigBee можно тремя вариантами конфигураций:   Координатор — устройство, которое собирает и отправляет данные всем остальным устройствам сети. Если сеть длинная (большая квартира, толстые стены), в ход вступают роутеры — они получают сигнал от координатора, усиливают его и транслируют на конечные устройства. Они могут прятаться в обычных бытовых предметах: настольных лампах или увлажнителях. Фишка в том, что вся ZigBee-система выбирает тип подключения сама, исходя из условий в каждом конкретном случае: координатор пытается через роутеры найти все возможные устройства, чтобы создать сеть. Китайцы быстро поняли, что эта технология быстрая, классная и дешёвая, поэтому выпускают все свои устройства уже с таким функционалом. Но каждый гаджет может функционировать только со своим координатором: то есть, если у вас чайник Xiaomi, то и координатор должен быть этой же фирмы (выглядит он как круглое устройство, которое вставляется в розетку). Но те же самые китайцы быстренько нашли, как обойти это ограничение: сделали USB-свисток, на который через USB-порт компьютера можно скачать специальное ПО, и тогда к нему можно подключить любое устройство любого производителя.  Да, я не скрываю, что думал о коммерческой составляющей. Даже когда-то в самом начале, пока у меня была только сырая версия метеостанции, я рассказал о ней в чатике своего дома. И один из соседей даже интересовался. Но я понимаю, что мне никогда не переплюнуть Xiaomi, IKEA или Aqara банально по цене: даже если я найду китайцев, которые сделают партию по оптовым ценам с готовыми платами, это всё равно получится дороже, чем устройство от того же Xiaomi. Ну и вдобавок моё устройство не будет таким красивым, как у них.  — Евгений, разработчик Физические устройства:   Что пользователь видит в браузере:   Ну вот, теперь вы всё или практически всё знаете о системе «умных домов» и даже сможете поддержать разговор с инженером-электронщиком. А пока — стэй тюнед, как говорится: впереди много интересного! Главный бармалей в Сибирикс и SingularityApp