Комментарии
Как и зачем программист студии создаёт систему для жилья будущего
Умный дом как хобби
Сибирикс



Умный дом как хобби

Как и зачем программист студии создаёт систему для жилья будущего
Когда-то в блоге мы рассказывали, как наш руководитель отдела обучения и замечательный программист Евгений создал марсианские часы и заодно выиграл в конкурсе. А потом — как он же сконструировал систему «Умный дом» своими руками. Так вот, сегодня снова поговорим о 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 есть плагины для быстрой настройки, но с ними непросто. Поэтому чаще конфигурация такой системы делается вручную (приходится писать код): проще укусить себя за локоть. А если уж нужно писать код, так лучше свой собственный.

Всё заново: система «умного дома» своими руками

В новой, написанной ручками, системе есть три узла:

1) Вещи — осязаемые элементы системы: датчики, сенсоры и вообще всё, что можно взять и потрогать руками.

2) Сервисы — виртуальные модули, пока их три: видео-камеры, прогноз погоды и данные самой системы.

3) Центр управления с двумя основными компонентами: MQTT-брокером и сервером на Node.JS.

Сердце системы — микрокомпьютер версии Raspberry PI 3b+. Стоит он 2−3 тысячи рублей, а взамен вы получаете полноценный компьютер размером с пачку сигарет. Единственный нюанс: его файловая система базируется на карте памяти формата MicroSD, а постоянные записи данных быстро выводят её из строя. Из-за этого приходится заботиться о минимизации записываемых данных или подключать HDD-носитель вместо MicroSD. Но принцип в обоих случаях одинаковый: нужно скачать образ Raspbian, установить его на карту памяти и вставить в микрокомпьютер — и вуаля, у вас готов полноценный Linux-компьютер, на котором можно делать всё что угодно. В нашем случае — сервер умного дома.

Второй незаменимый компонент системы — модуль NodeMCU V3, который базируется на микросхеме ESP8266, которую можно программировать в среде Arduino. Напомним, Arduino — это отладочная плата с микроконтроллером, стабилизацией питания, подключением к USB для перепрошивки и выходами для управления чем угодно. Программируется на языке C++.
модуль NodeMCU V3
модуль NodeMCU V3
Arduino всем хорош, но модуль из коробки умеет общаться только с компьютером и только через USB-порт, а для системы умного дома это серьёзный минус. Зато модуль NodeMCU V3, который Евгений использовал для своей системы, имеет «на борту» Wi-Fi — а значит, не нужно заморачиваться с дополнительными периферийными устройствами, и данные легко передавать.

В системе также есть несколько датчиков:
BME280
Один из самых крутых погодных сенсоров, отвечает за данные температуры, влажности и давления. Стоит порядка 200 рублей, а взамен предоставляет пользователю полноценную метеостанцию.
PIR-сенсор, или датчик движения
Работает он хитро: сканирует инфракрасное излучение помещения, и если в два момента времени температура сканированного участка изменилась, значит, какой-то тепловой объект попал в поле зрения датчика. Если вас бесит, что он постоянно реагирует на кошку, можно снизить порог чувствительности устройства.
RC522
Датчик, считывающий электронный ключ. От этой маленькой штучки зависит, например, пройдёте вы дальше пропускного пункта или на вас налетит группа быстрого реагирования :)

Такие стоят везде, где вы прикладываете RFID ключ-карту, чтобы пройти через турникет или войти в какое-то охраняемое помещение. У датчика есть катушка, и если подключено питание, то на ней создаётся электромагнитное поле. Когда вы подносите ключ-карту к такому датчику, он попадает под действие этого электромагнитного поля — фактически происходит беспроводная передача энергии. Ключ начинает посылать свой сигнал на датчик, и тот распознаёт, подходит тот или нет.
SIM800L
Пожалуй, самая интересная вещь в системе. Это GSM/GPRS-модем. Иными словами, телефон размером с половинку спичечной коробки. В него устанавливается мини-SIM-карта, и за счёт этого система может звонить, принимать звонки, отправлять SMS-сообщения и даже гуглить в интернетах. Так что, если хотите замутить себе хенд-мейд мобилку, то на базе этой штуки у вас точно получится. Не смартфон, конечно, но звонить будет.
MH-Z19
Инфракрасный датчик концентрации углекислого газа, самый дорогой в системе. Зачем он нужен, спросите вы? Если в помещении много CO2 (высокая концентрация, говоря научным языком), человек начинает зевать и становится вялым. Если очень много — может заболеть голова, а если слишком много — можно и сознание потерять со всеми вытекающими. Так что контроль этого параметра — необходимый элемент любой метеостанции.

У такого датчика есть 2 окошка, под которыми спрятаны 2 капсулы: в одной — азот, в другой — проба воздуха в помещении. Также внутри есть источник инфракрасного излучения (попросту — лампа): когда инфракрасное излучение проходит через газ в капсулах, оно начинает преломляться за счёт молекул газа, и длина волны меняется. Сенсор, который установлен на входе датчика, сравнивает эталонные значения длины волны с текущими и делает вывод о концентрации CO2 в помещении.
Чтобы система работала как одно целое, центральный узел и периферийные устройства должны как-то между собой общаться, причём общаться максимально стабильно. Изначально Евгений сделал JSON-обмен: элементы обменивались данными по http-запросу. Способ стабильный, но проблема в том, что так никто не делает. Поэтому в текущей системе за обмен данными отвечает протокол MQTT, заточенный специально под обмен информацией между узлами системы. Его создали в 2016-м и сейчас активно используют на больших серьёзных заводах, где требуется автоматизация производства.

У протокола есть центральная часть — Broker, который отвечает за приём и отправку сообщений всем элементам системы. Элементы же делятся на две группы: Publisher (публикуют данные в Broker) и Subscriber (получают эти данные). Причём, Subscriber может заранее подписаться на какой-то топик (скажем, данные о температуре), которого в системе пока нет. Как только топик появится, данные сразу придут.
Как устроен MQTT-протокол

Конфигурация системы

Физические модули: метеостанция

Метеостанция своими руками
В сердце системы — NodeMCU, о котором мы уже говорили выше. К нему подключены три узла:
  1. датчик температуры и влажности BME280;
  2. сенсор CO2 — MH-Z19;
  3. OLED-дисплей, который выводит данные датчиков пользователю.

Данные между устройствами и сервером передаются по интерфейсу I2С или UART — это интерфейсы для общения. В нашем случае, между микроконтроллерами.

Физические модули: охрана

Система охраны своими руками
Изначально модуль планировался без узла Arduino, но контроллер NodeMCU просто не успевал отслеживать все изменения в системе и передавать их на большой тачскрин-дисплей. Также в модуль охраны включены датчик движения и сканер RFID ключа-карты. На Arduino-модуль приходится обработка всех параметров с тачскрина. Фактически контроллер запрашивает у Arduino данные с датчиков и отправляет их на дисплей через интерфейс UART.

Физические модули: GSM

Система "Умный дом" своими руками
Этот модуль не имеет корпуса из-за пандемии.

Все платы Евгений заказывает на китайском заводе — просто потому что так дешевле. Сотрудничает с ними давно, качество плат устраивает. Но когда он в очередной раз заказал у них плату для охранной системы, с пересылкой в Барнаул начались проблемы: пандемия, границы закрыты, все дела. Деньги вернуть могут только за доставку, а за сами платы нет — ведь они их уже изготовили. Всего 2 $, конечно, но всё равно как-то жалко. Правдами и неправдами выяснилось, что в Новосибирск доставка возможна — и через друзей Евгений получил-таки свои заветные железки. Правда, при стоимости плат в 150 рублей доставка вышла в 1000 :)

Из-за этого другие платы он заказал на AliExpress, но и там всё пошло не по плану: заказ дважды отменялся, а деньги за него долго висели на холдировании. Собственно, поэтому плату для GSM пришлось делать самостоятельно. А корпуса нет, потому что его ещё напечатать на 3D-принтере надо.

Сервисы внутри системы

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

  • Openweather — отвечает за прогноз погоды на текущую дату и на неделю, а также график температур в ближайшие дни.
  • Macroscope — отвечает за видеонаблюдение (в доме, где живет Евгений, Управляющая компания установила 18 камер, и за счёт крутого API ко всем 18 не составило труда подключиться).
  • Сервис в самой системе — позволяет получить текущее состояние всей системы: дата и время, продолжительность непрерывной работы для отслеживания сбоев, состояние батареи питания, а также функционал перезагрузки и выключения сервера.

Центр управления

Как сделать умный дом
Примерная структурная схема того, как устроена система
В сердце системы — сервер на фреймворке Vue.js, который отлично подходит для создания пользовательского интерфейса, с использованием фреймворка Nuxt.js, который позволяет создавать приложения на Vue.js. Дополнительно к фреймворкам используется модуль mongoDB (это документоориентированная система управления базами данных с открытым исходным кодом).

Вещи (физические датчики) публикуют данные в MQTT-брокер, а оттуда они попадают на сервер, где происходит их валидация, обработка, проверка и преобразование. После эти данные попадают в модуль Public, который отвечает за публикацию всех собранных данных для внешних подключений. А уже оттуда данные переходят в Socket IO — библиотеку Java Script, за счёт которой обеспечивается двусторонняя связь между веб-клиентами и серверами в режиме реального времени. На выходе данные получает клиент (например, в браузере). Сервисы работают схожим образом, но передача данных для них обходится без MQTT — информация передаётся сразу через Public и Socket IO «наружу».

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

Когда задаётся сценарий, нужно выбрать целевую точку: либо отправить команду в узел «вещи», либо в «сервис», либо отправить http-запрос для webhook — функционал для уведомления сторонних сервисов. И конечно, каждой из них можно дать название сценария и прикрепить к ней иконку.

Запуск набора сценариев по конкретному событию происходит за счёт автоматизации. Например, если вы открыли дверь, система должна включить свет. Чтобы задать автоматизацию, сначала указывается событие запуска: дата, параметр или автоматизация. Например, 3-го числа каждого месяца, если идёт дождь, нужно напоминать взять с собой зонт :) Внутри автоматизации можно указывать и другие автоматизации. Например, у вас есть два сценария: для будней и для выходных дней. Так вот, вторая автоматизация проверит, какой сегодня день, и только потом запустится автоматический сценарий выходного или рабочего дня. Такая механика даёт неограниченную вложенность автоматизаций, чтобы создавать максимально сложные сценарии, комбинируя типы событий «и» с «или».

Когда событие и его параметры указаны, система выбирает подходящий сценарий. Запуск проверки сценариев происходит лишь тогда, когда какой-либо параметр в системе изменился.
Ключевые характеристики системы
  • Софт реализован на Nuxt. js (с использованием Vue. js и MongoDB).
  • Автономная работа сервера — в районе 5 часов (если отключится внешнее питание, система проработает примерно столько за счёт батареи).
  • Запуск приложения происходит через утилиту PM2 process manager (рабочий диспетчер процессов для приложений Node. js) — работает максимально просто: устанавливается в систему, вы пишете команду «старт», и всё работает. Может одновременно запустить столько процессов, сколько есть ядер в системе. Например, если ядра 4, можно запускать параллельно 4 сервера, разделяя между ними трафик на случай, если какой-то из них «упадёт».
  • Подключение происходит по Wi-Fi, причём каждый узел системы способен самостоятельно восстанавливать подключение, если оно отвалится.
  • Каждый элемент системы может работать как отдельное устройство — это было принципиальное условие на старте.
  • Разработка этой версии заняла полгода — Евгений инженерил в свободное время: за час до работы и в обеденный перерыв по будням.

Как происходит обмен данными

Обмен данными в системе "Умный дом"

Есть два основных канала, которые по факту являются топиками в MQTT:

  1. Канал данных — по нему все элементы системы шлют данные на сервер. Данные делятся на типы: строка, справочник (набор предопределённых данных вроде «вкл» и «выкл» для охранной или метеосистемы), число, да/нет.
  2. Канал управления — по нему сервер отдаёт команду какому-либо устройству. Данные также передаются, делясь на типы: либо кнопка, либо строка. В ответ на команду устройство, сервис или вещь возвращает результат выполнения — статус-код: 1 — всё хорошо; 2 — сейчас выполнить нельзя (скажем, нельзя включить тревогу, если помещение не поставлено на охрану); 3 — всё плохо.

Почему ничего не получилось с Google Assistant

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
Координатор — устройство, которое собирает и отправляет данные всем остальным устройствам сети. Если сеть длинная (большая квартира, толстые стены), в ход вступают роутеры — они получают сигнал от координатора, усиливают его и транслируют на конечные устройства. Они могут прятаться в обычных бытовых предметах: настольных лампах или увлажнителях. Фишка в том, что вся ZigBee-система выбирает тип подключения сама, исходя из условий в каждом конкретном случае: координатор пытается через роутеры найти все возможные устройства, чтобы создать сеть.

Китайцы быстро поняли, что эта технология быстрая, классная и дешёвая, поэтому выпускают все свои устройства уже с таким функционалом. Но каждый гаджет может функционировать только со своим координатором: то есть, если у вас чайник Xiaomi, то и координатор должен быть этой же фирмы (выглядит он как круглое устройство, которое вставляется в розетку). Но те же самые китайцы быстренько нашли, как обойти это ограничение: сделали USB-свисток, на который через USB-порт компьютера можно скачать специальное ПО, и тогда к нему можно подключить любое устройство любого производителя.
Да, я не скрываю, что думал о коммерческой составляющей. Даже когда-то в самом начале, пока у меня была только сырая версия метеостанции, я рассказал о ней в чатике своего дома. И один из соседей даже интересовался.

Но я понимаю, что мне никогда не переплюнуть Xiaomi, IKEA или Aqara банально по цене: даже если я найду китайцев, которые сделают партию по оптовым ценам с готовыми платами, это всё равно получится дороже, чем устройство от того же Xiaomi. Ну и вдобавок моё устройство не будет таким красивым, как у них
.

Евгений
Разработчик

Как система выглядит для пользователя

Физические устройства:
Что пользователь видит в браузере:
Ну вот, теперь вы всё или практически всё знаете о системе «умных домов» и даже сможете поддержать разговор с инженером-электронщиком. А пока — стэй тюнед, как говорится: впереди много интересного в нашем блоге!