Содержание статьи
Если ты успел поддаться моде и купил хотя бы пару умных домашних приборов, то наверняка столкнулся с проблемой: каждый из них управляется через свое приложение, имеет свой стандарт связи и хорошо интегрируется только с устройствами того же производителя. Обойти это ограничение вполне реально, причем в основном софтверными методами, которые не требуют замены всей техники. Купить придется разве что Raspberry Pi или другой одноплатный компьютер и (если понадобится) несколько модулей беспроводной связи для него.
Для меня возня с умным домом началась с приобретения одной-единственной светодиодной лампочки, на примере которой я и покажу, как будет работать моя система. Я решил не шиковать и остановился на самом бюджетном варианте — лампе MiLight с четырьмя диодами (тремя цветными и белым).
Рано или поздно умные лампы будут стоить примерно столько же, сколько и обычные светодиодные, и китайцы уже неплохо продвинулись в этом направлении. На AliExpress лампы MiLight сейчас продаются примерно за 800 рублей, к ним в комплект можно взять беспроводной командный модуль. Он подключается к домашнему Wi-Fi, а лампочками рулит по собственному проприетарному радиопротоколу.
Как вариант — можешь посмотреть на лампы Yeelight производства Xiaomi. Они подороже, зато подключаются сразу к Wi-Fi и не требуют промежуточного радиоканала и лишней коробки с контроллером. Ну и конечно, всегда существуют Lifx и Philips Hue. Их качество не вызывает сомнений, но цены тут уже совсем другие — по 4–7 тысяч за лампочку.
Особое внимание при выборе лампы стоит обратить на протокол. Попадаются модели с управлением не по Wi-Fi, а по Bluetooth LE. При работе со смартфоном это может быть удобнее, но если ты, как и я, собираешься использовать Raspberry Pi или другой компьютер в качестве «мозга» умного дома, то предпочтителен Wi-Fi.
Подключаем лампу и настраиваем Wi-Fi
Честно говоря, изначально у меня не было вообще никакого плана. Мне была нужна лампочка для настольной лампы, и я хотел иметь возможность выключать ее, не вставая с кровати. Иногда, знаешь ли, хочется просто накрыться одеялом и немедленно заснуть — в такие моменты выключатель в другом конце комнаты становится куда большей проблемой, чем обычно.
Первоначальная установка оказалась проста, хоть и не совсем прямолинейна. Вкручиваем лампочку в патрон, включаем радиомодуль в любой USB и подключаемся к сети Wi-Fi, которую он создаст. Это временное решение: оно нужно только для первой настройки.
В случае с MiLight последующие действия будут такими. Открываем веб-интерфейс (обычно по адресу 10.10.100.254) и вбиваем админский логин и пароль (admin/admin). Теперь можно зайти в настройки STA Setting и вписать данные своего роутера, а потом выбрать STA mode в разделе Work Mode.
Обязательно зайди в раздел Other Setting и скопируй себе номер порта UDP, а также IP-адрес из поля Server Address. Эти данные пригодятся тебе чуть позже. По желанию можешь еще зайти в раздел Account и поменять логин и пароль на что-нибудь пооригинальнее.
Теперь перезагружай радиокоробок, и можешь переключать компьютер на обычный Wi-Fi. С настройкой покончено, это было нетяжело! А вот следующий шаг из инструкции доставил мне почти физическую боль.
Проблема в том, что админка авторства безвестных китайских программистов — это еще туда-сюда, а вот доверять им дизайн приложения для iOS не стоит вовсе. В нем плохо все. В первую очередь — необходимость зачем-то каждый раз выбирать вид пульта, который оно эмулирует, а также отсутствие возможности одной кнопкой вернуть нормальный ровный свет, если вдруг ошибся и начал перебирать режимы мигания (количество которых превышает все разумные пределы). Дизайн и разрешение экрана времен iPhone 4, учитывая перечисленное, можно уже и не обсуждать. Китайский лубок как он есть.
Впрочем, неверно выразился. Китайский лубок, известный также как няньхуа, прекрасен, чего не скажешь о приложении MiLight. Хорошая новость заключается в том, что нам оно не понадобится.
Пишем простой скрипт и рулим лампочкой с компьютера
Если программа общается с устройством по IP, значит, отловить и подделать ее команды — не такая уж сложная задача. В нашем случае она к тому же давно решена и существует масса реализаций протокола MiLight на разных языках программирования и в составе разных утилит.
Начнем с самого простого. Чтобы включить лампочку, достаточно всего трех строк на Python без всяких левых библиотек.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto("x42x00x55", ("192.168.0.10", 8899))
В последней строчке поменяй IP и порт на актуальные, и лампочка должна начать повиноваться. Для выключения замени первый байт послания на 41
, а для выставления белого цвета полной яркости — на C2
. Если твоя лампа работает по TCP, а не по UDP, поменяй SOCK_DGRAM
на SOCK_STREAM
.
Такой способ удобен для отправки одной-двух команд, но если ты хочешь что-то более развесистое, то, так или иначе, понадобится скрипт-обертка. Писать ее не обязательно — есть готовые варианты. Лично мне приглянулся модуль wifileds, с ним включение лампочки выглядит следующим образом:
import wifileds
led_connection = wifileds.limitlessled.connect('192.168.0.10', 8899)
led_connection.rgbw.all_on()
led_connection.rgbw.white()
Полный список команд ты увидишь, открыв файл rgbw.py
, rgb.py
или white.py
, там же можешь подсмотреть и шестнадцатеричные коды, если планируешь командовать лампой напрямую через socket. Важный момент: для белых ламп, RGB и RGBW коды команд различаются.
Я сделал пару скриптов для включения и выключения света и привязал их к сочетаниям клавиш. Теперь управлять лампой, работая за компьютером, можно прямо с клавиатуры, без всякого выключателя. Потрясающий комфорт и оголтелое гиковство!
Прочие извраты с MiLight
Большую подборку скриптов, совместимых с MiLight, ты можешь найти на сайте LimitlessLED. Это американская фирма, которая продает под своим брендом те же или похожие лампочки (по крайней мере, их протоколы полностью идентичны).
Настоящие фанаты своего дела пошли дальше и разреверсили радиопротокол MiLight. Если тебе не мил фирменный вайфайный коробок, то ты можешь попробовать воспроизвести его функции при помощи Arduino с модулем ESP8266. Для него к тому же существует прошивка, которая расширяет число групп лампочек с четырех штук до 262 тысяч, а также имеет веб-интерфейс и RESTful API.
Наводим мост между MiLight и Siri
Итак, мы можем управлять лампой с компьютера, но на смартфоне по-прежнему приходится довольствоваться китайским шедевром. Моей первой мыслью было поднять свой веб-сервер на Raspberry Pi, обрабатывать GET-запросы с командами и слать их через какой-нибудь IFTTT (на iOS у него есть виджет с кнопками). Ну а RPi будет дергать адаптер лампочки через сокет.
Все это оказалось совершенно не нужно, потому что iOS уже отлично умеет общаться с умными бытовыми приборами. Подразумевается, правда, что они должны иметь сертификацию Apple и поддерживать протокол HomeKit. Но и в этом случае нас спасет труд энтузиастов, которые успешно вскрыли HomeKit и написали опенсорсную утилиту под названием Homebridge. Это «мост» между iOS с Siri и практически любым IoT-устройством.
Для тестирования я сначала развернул Homebridge на своем компьютере и только потом — на Raspberry Pi, но здесь опишу лишь второй случай, поскольку у Raspberry свои особенности. В качестве операционной системы рекомендую взять Raspbian Jessie. Конечно, при желании ты можешь всласть понастраивать Arch, но сейчас у нас другая задача.
Версию Raspbian я уточнил не зря — Jessie уже содержит GCC 4.8, без которого Homebridge не заведется. Если у тебя Wheezy, то настоятельно рекомендую апгрейдиться или записать карточку с новой системой. Даже если обновить GCC, могут возникнуть проблемы с другими зависимостями.
Второй необходимый компонент — это Node.js. Поставить его на Raspbian можно разными способами, но, чтобы получить самую свежую версию, качай напрямую с сайта nodejs.org. Для первой модели Raspberry Pi нужна сборка для ARMv6, для второй (до 64-разрядной версии 1.2) лучше взять дистрибутив для ARMv7, для более новых — ARMv8. Распакуй архив и копируй содержимое в /usr/local
.
Ставим остальные зависимости. Библиотека Avahi понадобится для поддержки эппловского zeroconf-протокола Bonjour, node-gyp нужен для установки аддонов к Node, HAP-NodeJS — опенсорсная реализация HomeKit, на которой основан Homebridge. Кстати, если в будущем тебе понадобится лезть в дебри Homebridge, то в исходниках HAP ты найдешь много полезной информации.
sudo apt-get install libavahi-compat-libdnssd-dev
sudo npm install -g --unsafe-perm homebridge hap-nodejs node-gyp
cd /usr/local/lib/node_modules/homebridge/
sudo npm install --unsafe-perm bignum
cd /usr/local/lib/node_modules/hap-nodejs/node_modules/mdns
sudo node-gyp BUILDTYPE=Release rebuild
Установка и сборка всего этого хозяйства на первой Raspberry Pi заняла у меня немало времени, но на этом подготовительный этап почти заканчивается. Ты уже можешь запустить и потестировать Homebridge, но, чтобы он работал непрерывно, его придется немного демонизировать.
Раз уж мы договорились использовать Raspbian Jessie, то воспользуемся его системой запуска systemd, которая постепенно приходит на смену init.d. Качай готовые конфиги для демона Homebridge и клади файл homebridge
в /etc/default
, а homebridge.service
— в /etc/systemd/system
.
Теперь создай пользователя homebridge
командой useradd --system homebridge
и папку /var/lib/homebridge
. Дай свежесозданному пользователю права на запись в нее. Именно сюда нужно будет складывать конфиги для постоянно запущенной версии homebridge, а не в .homebridge
в домашнем каталоге.
Поскольку управлять я собираюсь лампой MiLight, для нее нужен плагин к Homebridge. Ставится он командой npm install -g homebridge-milight
. Если хочешь настроить какой-то другой прибор, то ищи соответствующий плагин в NPM — их для Homebridge уже написаны десятки.
Каждый гаджет нужно прописывать в конфиг Homebridge. В случае с MiLight содержимое /var/lib/homebridge/config.json
получается следующим:
{
"bridge": {
"name": "Homebridge",
"username": "CC:22:3D:E3:CE:33",
"port": 51826,
"pin": "031-45-154"
},
"platforms": [
{
"platform": "MiLight",
"name": "MiLight",
"ip_address": "192.168.0.10",
"port": 8899,
"type": "rgbw",
"delay": 30,
"repeat": 3,
"zones":["Light"]
}
]
}
Естественно, тебе нужно будет указать актуальный порт и IP в platforms
. Еще тебе может пригодиться трюк с изменением username
. Если iOS вдруг будет отказываться видеть Homebridge, просто меняй любую цифру и перезапускай сервис.
Когда все будет готово, пиши sudo systemctl enable homebridge
и sudo systemctl start homebridge
. Дай Raspberry время подумать — на слабом железе Node.js, увы, запускается небыстро. Узнать, как идут дела, можно командой systemctl status homebridge
.
Если ошибок нет и сервис не вошел в бесконечный цикл перезагрузки, то бери iPhone или iPad с iOS 10 и ищи приложение Home. Жми плюс в левом верхнем углу, выбирай Add accessory, и вскоре увидишь Homebridge в списке найденных устройств.
После того как ты введешь PIN (см. поле pin
в конфиге) и добавишь свою лампочку в избранные устройства, она появится на основном экране Home, а также на третьей странице шторки Control Center.
Самое же приятное, что ты теперь можешь сказать: «Эй, Сири, включи неяркий персиковый свет» — и почувствовать, что живешь в будущем.
Досадные затруднения и дальнейшие планы
Понятно, что умный дом с одной китайской лампочкой — это полная ерунда. Но, убедившись, что все работает, можно переходить к следующему этапу — снабдить такими лампочками все светильники в доме, настроить зоны и добавить другие умные приборы вроде датчиков движения, розеток и беспроводных выключателей.
Кстати, из Raspberry Pi можно в два счета сделать камеру слежения: понадобится утилита motion и любая веб-камера. Ее, кстати, тоже можно сопрячь с Homebridge, но тут, увы, не все так просто, и до возни с видеопротоколами у меня руки пока не дошли.
INFO
Если Homebridge не приглянулся, то, возможно, тебя заинтересует его более серьезный аналог — openHAB.
Хочу поделиться с тобой и еще одним фейлом. Честно говоря, закончить эту статью я хотел рассказом о том, как классно можно обращаться к Homebridge через веб-сокеты и получать (а также менять) состояние приборов простыми командами вроде той, что я описал в самом начале. А потом еще установить Node-RED и программировать свой умный дом через удобный визуальный интерфейс.
Увы, этим планам не суждено было сбыться, поскольку заставить работать плагин homebridge-websocket мне не удалось никакими силами. Он устанавливается, принимает команды, но ни к каким действиям они не ведут. Я обязательно продолжу свои эксперименты и снова поделюсь с читателями Х, если удастся напасть на что-то особенное. Ну а пока — всё.
Сири, выключи свет!