«Умный дом» всё увереннее мигрирует из сферы гик-экзотики в направлении достаточно доступных технологий, с помощью которых можно сделать своё жильё комфортнее, удобнее, энергоэффективнее и вообще «ничоси!». И в этой статье я хотел бы поделиться с вами собственным опытом создания системы «умного дома» в своей квартире.
Немного о розетках
Моя жена очень любит выключать всё из розеток. Уходя, она всё выдергивает, а я потом возвращаюсь домой и вставляю обратно. Мне это не нравится. Я пробовал разное: просил, уговаривал, убеждал, угрожал — ничто не помогло. И тогда я решил, что надо найти высокотехнологичный способ уладить конфликт: каким-то образом коммутировать розетки, чтобы не нужно было физически вытаскивать штекеры по всей квартире.
Ну что же, паяльник есть, руки тоже. Начал думать над реализацией. Но сразу возникло очень много вопросов. Например, какой контроллер использовать для управления? У меня был опыт программирования контроллеров линейки AVR от Atmel. Выглядит всё довольно просто: реле, транзистор для развязки и управление одним пином контроллера. Задачи встало две. Во-первых, контроллер и реле надо питать, а во-вторых, нужно контроллером управлять. С питанием представилось три варианта. Самый простой — запитать от батареек, но батарейки будут садиться, и их придётся менять, а это неудобно. Второй вариант — размещать преобразователи 220 -> 5 прямо рядом с контроллером в каждой розетке. Способ отличный, но готовых компактных преобразователей я не нашёл, а самому возиться с преобразователем не хотелось, да и боялся накосячить и спалить квартиру. Третий вариант — подвести питание извне к каждой розетке. Вопрос управления контроллером распался на два принципиальных пути: управление по радио и управление по проводу. Вариант с проводом выглядит самым простым, но опять требует подведения шнура к каждой розетке. Для себя я решил, что, когда буду делать следующий ремонт в квартире, заранее предусмотрю это и подведу к каждой розетке провод, например UTP 5-й категории. Но пока нужно было разбираться с имеющимися несвязанными розетками.
Последний вопрос, который окончательно заставил меня отказаться от разработки собственной системы управления, — это «тестирование на живых». Отлаживать мелкие баги архитектуры и прошивки пришлось бы прямо во время эксплуатации, что, безусловно, вызвало бы недовольство окружающих.
Я начал изучать имеющиеся готовые системы, на которых можно было бы построить «умный дом». Я сразу решил, что связь модулей должна быть беспроводная. Осталось выбрать технологию. Сначала варианта было два — Wi-Fi и Bluetooth. Они очень распространены, под них много готовых решений. Но Wi-Fi, работающий на 2,4 ГГц, не слишком удобен с точки зрения организации сети. Высокое распространение и отсутствие какого-либо регулирования при установке точек доступа делает эту частоту сильно зашумлённой, а хочется иметь более-менее стабильную систему, чтобы у меня не подвисало переключение розеток, когда работает соседский роутер. Но это оказалось не самой серьёзной проблемой. Гораздо более страшный враг Wi-Fi — микроволновка. Её магнетрон излучает на частоте 2,45 ГГц, поэтому, когда включается моя домашняя микроволновка, вокруг не работает ничего. Гаснет стриминг Bluetooth-аудио, гаснет стриминг видео по Wi-Fi, файлы не качаются, страницы не открываются — ничего. Причём неважно, какой конструкции у вас микроволновка — встроенная или отдельно стоящая, она по-любому будет вносить помехи.
Поэтому от использования Wi-Fi и Bluetooth я тоже отказался.
Z-Wave
Начал изучать, какие ещё существуют решения. Например, у ZigBee несколько стандартов частоты: есть 2,4 ГГц, а есть в районе 1 ГГц. Но тут я наткнулся на статью на Хабре, где рассказывалось про Z-Wave. Я впечатлился. Базовые модули Z-Wave сейчас выпускают всего две компании в мире — это Sigma и Mitsumi. Его размеры примерно сантиметр на сантиметр. По сути, это микроконтроллер с приёмопередатчиком. Его даже можно перепрошивать, но чаще всего в готовом виде монтируют сверху на плату, подключают к нему UART, и он работает как приёмопередатчик.
Все устройства, которые хотят получить значок «Совместимо с Z-Wave», должны пройти сертификацию. Платформа закрытая, что даёт некоторое преимущество с точки зрения совместимости. Для сравнения: в продаже есть очень много Bluetooth-решений для домов, и почти все они несовместимы между собой. А все устройства Z-Wave совместимы благодаря единому закрытому стандарту, который тем не менее эволюционирует. Доступна платная SDK, стоит примерно 2 тыс. долларов. То есть если вы собираетесь одну штучку дома спаять — это дорого. А если вы намереваетесь наладить производство, то, поделив на 2 тыс. устройств, получите всего доллар разницы — вполне неплохо.
Дальность связи у стандарта Z-Wave около 30 м. Одно из его преимуществ заключается в том, что устройства выстраиваются в ячеистую сеть (mesh) и практически в каждом модуле есть таблица маршрутизации. Любой модуль, поймав сигнал, знает, надо передать его дальше или нет. То есть почти каждый модуль является ещё и ретранслятором. Почти, потому что в Z-Wave существуют «спящие» устройства, которые не участвуют в ретрансляции. Такие устройства обычно работают от батареек и выходят на связь при необходимости.
Чтобы ваша сеть не приняла соседскую сеть за свою, используется токен, генерируемый для каждого головного контроллера. В рамках сети есть головной контроллер и есть периферия. У контроллера при первой установке генерируется свой токен, после чего происходит процедура привязки: любое исполнительное устройство сначала привязывается к контроллеру, запоминает его токен, и после этого устройство включается в сеть.
На Amazon продаётся масса Z-Wave-устройств. Есть модули, встраиваемые в розетку и выключатели, есть модули для построения системы безопасности. Замки, сирены, освещение, датчики дыма, датчики протечки воды — что угодно. Я нашёл даже автоматическую кормушку для котов.
Что касается рабочей частоты, то она находится в районе 900 кГц. Эта частота не является открытой для всех стран в мире, поэтому для каждой страны нужно проходить сертификацию и получать разрешение на использование этой технологии, поэтому несущие частоты немного отличаются в разных странах. Скажем, в Европе частота 868,42 МГц, в России — 869,0 МГц, в США и Канаде — 908,42 МГц, в Гонконге — 919,82 МГц, в Австралии — 921,42 МГц.
Если вы купите модуль, который сделан для Европы, то программно его можно перевести на российскую частоту. Точно так же можно программно переключать частоты устройств, сделанных для Гонконга и Австралии. А вот американские устройства не переключаются. Поэтому существует три категории одинаковых устройств, и нужно обращать внимание, для какого региона они изготовлены. Гонконг и Австралию вы вряд ли встретите, так что обращайте внимание только на США, Россию и Европу.
При выстраивании ячеистой сети используется режим Explorer Frame. В этом режиме все устройства «затихают», контроллер запускает сканирование сети, и устройства начинают по очереди отвечать. Происходит своеобразная перекличка, когда каждое устройство выстраивает свою таблицу маршрутизации. Например, рекомендуется включать этот режим после перестановки мебели, ведь есть вероятность, что передвинутый шкаф начал экранировать сигнал между какими-то устройствами, но открыл пространство между другими. В целом считается, что стандарт обеспечивает устойчивую работу на расстоянии 30 м на открытых пространствах, а в квартирах до 10 м. Конечно, расстояние устойчивой связи между модулями, размещёнными в розеточных нишах, будет ещё меньше, но за счёт маршрутизации всё работает достаточно стабильно.
Теперь поговорим о коммерческих контроллерах. Наиболее распространены две марки: Fibaro и Vera. У Fibaro есть серии — Home Center и Home Center Light. У Vera тоже две серии контроллеров, одна подороже, вторая подешевле. Все они поддерживают базовые наборы правил, и вы вполне сможете сделать так, чтобы при при включении одного устройства активировалось другое, а через какое-то время выключалось или делало что-нибудь ещё. Но если вам нужно реализовать более сложное поведение, то придётся программировать самостоятельно. В качестве языка используется Lua.
Есть и третья, менее распространённая марка — Zipabox, но эти контроллеры, судя по описанию, не поддерживают расширенную автоматизацию. Тем не менее Zipabox интересен тем, что у него есть модули расширения, которые стыкуются, как конструктор.
Но мы сейчас поговорим о другом проекте, имеющем отношение к Raspberry Pi. Это проект сообщества, которое решило сделать своё, максимально дешёвое железо. Сегодня Raspberry Pi в розницу стоит около 4000 рублей. На Amazon можно купить за 50 долларов, при текущем курсе это почти в полтора раза дешевле. На Raspberry Pi поднимается веб-сервер с пользовательским интерфейсом, для которого можно писать автоматизацию на JS.
В качестве железа используется плата расширения, которую назвали RaZberry, выглядит она так:
Ставится на порт расширения Raspberry Pi:
А вот пример интерфейса панели управления. Он отображается в браузере, неплохо работает и на планшетах.
Ниже приведён пример настроек. Можно посмотреть, где в какой момент работают все устройства, проверить подключаемость, посмотреть таблицу маршрутизации и так далее.
Одно из преимуществ Z-Wave.Me — проект открытый, вот ссылка на GitHub github.com/Z-Wave-Me/home-automation. Команда разработчиков раскидана по разным странам — Россия, Германия и Швейцария, «с офисом в интернете», как они сами про себя пишут. Интерфейс можно бесплатно скачать с GitHub, при желании можно что-то самому пересобрать.
Всё это прекрасно управляется из админки, но это не всем удобно:
Управление
Я начал думать, как реализовать более удобное управление системой, чем с компа через админку. Это сегодня есть приложения для Android и iOS, а два года назад официальный клиент под Android оставлял желать лучшего. Я так и не понял, как им пользоваться. То есть я нашёл, настроил, подключился, но пользоваться не смог. В то время я был адептом Windows Phone, под который не было клиента. На коленке написал клиент для себя, и, когда выключатели рассинхронизировались, жена обращалась ко мне за помощью.
А год назад, в феврале-марте 2015 года, компания Pebble запустила сбор средств на создание новой версии часов, которая получила название Pebble Time. Я поддержал проект, и к октябрю часы уже были в моём распоряжении. Я подумал, что это прекрасная штука для управления «умным домом». Ведь телефон не лежит всегда в кармане, дома я просто кладу его куда-нибудь, а часы обычно на руке. К тому же Pebble, в отличие от часов на Android Wear или Apple Watch, подключается и к iPhone’ам (которым я пользовался к тому времени) и к телефонам на базе Android.
Pebble
У Pebble довольно много достоинств.
Во-первых, они работают целую неделю на одном заряде. Пользователи Apple Watch знают эту боль, когда уже к вечеру нужно искать зарядку. Кроме того, у Pebble экран всегда показывает время, потому что он сделан на базе цветных электронных чернил. Есть поддержка двух основных операционных систем. Часы водоустойчивы. А ещё они имеют аппаратный порт. Подключаются умные ремешки, которые можно делать самому (есть подробное описание на сайте Pebble).
Но за всё надо платить. Нет сенсорного экрана — управление кнопочное (четыре кнопки). Но зато не надо постоянно опрашивать сенсорный экран, благодаря чему часы так долго работают без подзарядки. Второй недостаток — дисплей отображает 64 цвета.
Работу Pebble обеспечивает операционная система на базе OpenRTOS. Приложения для часов напоминают веб-приложения. Фронтенд исполняется на часах и пишется на C, а бэкенд работает в телефоне и пишется на JS. Разработчики веб-приложений сейчас пришли в ужас: где это видано — фронтенд на С, а бэкенд на JS? Но это легко объяснимо: C, как наиболее компактный для компиляции язык, очень удобен для создания встраиваемых приложений, а плюс JS в том, что он одинаково хорошо исполняется на iPhone и Android. JS работает внутри телефона и обеспечивает интерфейс для выхода в интернет и доступа к GPS. Сами часы имеют встроенный акселерометр, гироскоп и магнитный компас, то есть базовый набор железа.
В итоге я написал приложение для управления своей системой «умного дома». Сначала для последней версии часов, а потом реализовал поддержку самой первой модели Pebble, с чёрно-белым экраном:
Немного о настройках. Они делаются в виде HTML-страницы. Для разработки Pebble советуют использовать Slate Frontend Framework. Страница должна быть расположена в вебе, что само по себе странно, потому что без подключения к интернету вы ничего не настроите, но, видимо, чем-то это было обусловлено.
После того как я написал приложение, я выложил его в официальный магазин приложений и забыл о нём. Его установили 40 человек, и я начал получать отзывы.
Я давно не программировал на С и с ужасом вспомнил, что с выделением памяти, а ещё страшнее — с её высвобождением нужно работать вручную. Поэтому в первой версии я сделал статический массив для восьми устройств, которые у меня были, и всё это прекрасно работало у меня дома. Но в сетях, где больше восьми устройств, понятное дело, не работало. И первый отклик был из Дании: «А можно ли сделать больше?» Я, конечно, сказал: «Можно», и ещё за один вечер перевел приложение на динамические массивы. Товарищ был счастлив, но не очень долго.
Оказалось, что у него около 54 логических устройств — выключатели и датчики, причём один физический модуль может быть сразу несколькими логическими устройствами. У меня, например, дома есть датчик, который одновременно датчик движения, температуры, влажности и освещённости, и в системе он виден как четыре датчика. А у датчанина больше 50, и он жаловался, что для выключения чего-либо ему приходится на часах очень долго пролистывать весь список. Я подумал ровно один вечер и придумал одну штуку. В админке Z-Wave.Me можно вешать на устройство теги, и я решил добавить тег Pebble. А в настройках часов ввести режим, когда на экране отображаются только те устройства, которые помечены этим тегом. То есть пользователь сам выбирает, что он хочет видеть, и помечает этим тегом соответствующие устройства. Товарищ написал, что это просто великолепно. Теперь у него пять устройств, которыми он управляет прямо из часов, и он очень доволен.
Потом мне написал другой пользователь моей программы, у него была иная проблема. Приложение умело отображать датчики, а управлять могло только выключателями, причём выключателями типа Вкл/Выкл. Но существует много других управляемых устройств, например диммеры, для которых можно устанавливать значения от 0 до 100%. Или RGB-модули, на которых можно выставлять любой цвет. Добавить поддержку подобных устройств я согласился, но попросил прислать структуру его сети, чтобы посмотреть, как они выглядят живьём. Он прислал, я посмотрел — выглядят классно, но непонятно, что с этим делать. Я полез в настройки и выяснил, что в Z-Wave.Me есть виртуальные устройства. Такому устройству можно выставить тип, например, Multilevel Switch, и оно превращается в виртуальный диммер.
Ничем не управляет, но делает вид, что он диммер. Хотя почему «ничем не управляет»? Управляет сам собой. Я могу с часов выставить значение, и он мне покажет его в дашборде. Этого мне хватило для реализации поддержки диммеров.
Потом я взялся за RGB. Это управление светодиодными полосами, которые могут отображать любой цвет. RGB-освещение появилось в стандарте Z-Wave не так давно, поэтому изначально оно выглядело в системе как три диммера. То есть все устройства рапортовали, что они три диммера, и можно было отдельно управлять красным, зелёным и синим каналом. Для удобной работы со старыми устройствами в современных системах управления сделали виртуальное устройство RGB-освещения, в котором можно задать три диммера.
Поскольку мы уже умеем задавать Dummy Dimmer, то можем сделать Dummy RGB. Это тоже хорошо работало, но поддержку управления цветом я пока ещё не реализовал, отправил «заказчику» только управление диммерами. И для него я как раз настраивал поддержку чёрно-белых часов.
Виртуальные устройства
В чём ещё мощь виртуальных устройств в Z-Wave? Возьмём виртуальное HTTP-устройство. И пусть у вас есть любое другое устройство, которое несовместимо со стандартом Z-Wave, но которое управляется с помощью HTTP-запросов.
Тогда мы пишем HTTP-запрос на включение: адрес, который нужно дёрнуть, запрос на выключение и запрос, который нужно отправить, чтобы получить статус устройства. Вероятнее всего, устройство, которое не поддерживает Z-Wave, не поддерживает и ответ в формате On/Off.
Для его поддержки можно ввести Inline JavaScript, который будет преобразовывать ответ с вашего устройства в on или off. А имея виртуальное устройство, мы дальше можем делать всё что угодно. Например, интегрировать в эту систему любое устройство на базе контроллеров ESP8266. То есть мы делаем три конца, на которые устройство умеет реагировать, а дальше любую обвязку.
Сцены
Это набор состояний логических устройств. Сцену нельзя включить или выключить, её можно только активировать. У меня, например, сделана сцена Away, которую я активирую, выходя из дома.
Она выключает свет в ванной, в туалете, выключает розетки в ванной и на кухне. Активация сцены Away выключает всё, что у меня есть дома управляемого. Также у меня есть сцена Back. Она включает обратно две розетки, но не свет. Ведь, вернувшись, свет вы включите тогда, когда он будет нужен.
В качестве плана есть идея поставить механизированные вентили и перекрывать воду одним нажатием, уходя из дома. Вентили стоят довольно дорого. Но затопление соседей может обойтись ещё дороже. Опять же, есть автономные датчики протечки. Положите их в ванной, в туалете, на кухне, и в случае протечки вентили автоматически перекроются.
И последнее. Управление на часах это хорошо, но управлять можно только дома. А если хочется управлять извне, то можно сделать бота для Telegram. Он у меня простенький, ему посылают команду Light, он спрашивает: «Где?» — и показывает пиктограммки туалета и ванной. Выбираешь место, он спрашивает: «Что сделать?» — и показывает светящуюся лампочку и чёрную. Выбираешь чёрную, и он говорит: «Ок, свет в ванной выключен».
Заключение
У меня увлечение «умным домом» происходило наплывами. Я в какой-то момент загорелся идеей, заказал модули, встроил один, который управлял только светом в туалете и ванной. Ещё заказал датчик движения, температуры и влажности. Повесил в ванной и сделал классную автоматизацию: свет в туалете автоматически отключается через 15 минут, если забыли выключить, а свет в ванной включается при входе, по датчику движения, а выключается через 15 минут. Всё классно, кроме того, что жить с этим невозможно. Оказалось, что 15 минут в туалете — это на самом деле мало, особенно если там хорошо ловится Wi-Fi. А он ловится хорошо. Увеличение периода ожидания не помогло, так что эту автоматику я пока отключил и заказал ещё один датчик движения.
Автоматика в ванной простая: входишь — свет включается, выходишь — выключается. Удобно. Однако сперва я настроил её не очень удачно. Датчик движения стоял на входе, а когда ты заходишь в душ и задёргиваешь шторку, он тебя не видит. Поэтому через 15 минут свет гаснет. Нужно открыть шторку, махнуть рукой и задёрнуть шторку обратно. Проблема решилась переносом датчика в середину ванной, чтобы он реагировал на движение по обе стороны от шторки.
Сейчас используем в основном активацию сцен при выходе и возвращении домой. Но в будущем, когда управляемых устройств появится больше, станет больше и интересных правил для управления.