Spiiin's blog

Управление умными лампочками Milight с телефона на Android и iOS

Пару лет назад уже писал про китайские лампочки Milight, которыми можно управлять через Wi-Fi. С тех пор использовал их просто как цветные лампочки с пультом управления и радовался. Но зимой просыпаться утром особенно трудно, поэтому я решил сделать себе будильник, который будет постепенно увеличивать яркость света, вместо того, чтобы просто звенеть.

К сожалению, до сих пор сцепление разных устройств между собой и программное управление ими часто представляет собой нетривиальную задачу. Поэтому решил записать, что получилось в ходе попыток организовать “будильник с умными лампочками”.

Схема управления будет выглядеть примерно так:

К домашнему роутеру цепляется сервер-будильник, и роутер управления лампочками. В нужный момент сервер-будильник передаёт сигнал “Зажечь лампочки”, затем домашний роутер передаёт его на роутер управления лампочками MiLight, который зажигает лампочки и будит человека.

Настройка сети

Как настроить роутер управления лампочками, чтобы он подключался к домашней сети, описано тут. В качестве альтернативы, можно воспользоваться программой EasyBulb, которая предназначена для других лампочек, но тем не менее, позволяет легко перевести роутер в нужный режим (управление лампочками через неё тоже возможно, но криво - протоколы всё-таки немного отличаются).

Выбор “сервера-будильника”

Вообще говоря, лампочки Milight не предназначены для программного управления, после настройки сети производитель лампочек предполагал, что пользователь установит стандартную программу “пульт управления” и будет счастлив. Однако, протокол управления лампочками достаточно прост и исследован, и существуют сторонние библиотеки и программы управления, поэтому можно попытаться выбрать устройство, которое будет работать как будильник.

Лучшим выбором, скорее всего, будет отдельное устройство на основе микроконтроллера, одного заказанные мной для этой цели Arduino идут из Китая слишком долго, поэтому я решил попытаться выбрать на роль сервера одно из имеющихся в наличии устройств. В наличии оказались: ноутбук (который жалко держать включенным постоянно), iPhone (выглядящий перспективно) и старый Samsung Galaxy (с раздолбанным экраном и включающийся не с первой попытки).

Попытки с iPhone

На iPhone после недолгих поисков в AppStore обнаружилось чудесная программа Home Remote. Программа действительно замечательная, и позволяет составлять триггеры с возможностью выбрать действие (поддерживаются все типы ламп Milight и несколько других, команды по TCP/IP, а также комбинации других действий) и способ активации действия. Среди способов активации - геопозиция (координаты зоны, в которую входит пользователь, или параметры сети, к которой подключится пользователь), микрофон (неплохо распознает голос, правда почему-то только на английском), таймер (то, что мне изначально было нужно), или кнопка на связанных с iPhone часах iWatch или маке. Всё чудно, но из-за ограничений iOS триггеры работают, только если открыто главное окно программы.

Если же телефон уснёт, то программа всего лишь показывает локальное уведомление “хочу активировать команду, разблокируйте телефон и откройте программу, чтобы я смогла это сделать”. Из-за этого использовать её или любую другую программу на iOS в качестве умного будильника нельзя. Я весело поговорил со своей лампой (“Лампа, режим Диско!”), и перешёл к поиску подходящего софта под андроид.

Сервер-будильник на Android

Жалко было отказываться от iOS версии, но держать телефон включённым всю ночь не хотелось, поэтому я стал искать планировщик запуска своих программ под Android (на крайний случай, из него можно и полноценный сервер сделать - всё равно валяется без дела). Почти сразу же мне на глаза попалась бесплатная программа TaskBomb. Я просмотрел несколько туториалов к ней, и обнаружил пример, озаглавленный “Running a script every 5 minutes”. Тут мои глаза загорелись и вся схема нарисовалась в голове:

  • К TaskBomb существуют готовые плагины для решения типовых задач. Один из таких плагинов - SL4A Script Launcher, позволяет запускать скрипты SL4A.
  • SL4A (Script Layer for Android) слой, который позволяет выполнять скрипты на множестве разных языков на выбор.
  • Python for Android - добавляет возможность выполнять скрипты на Python для SL4A.
  • Python for Android позволяет ставить 3rd party модули в директорию /sdcard/com.googlecode.pythonforandroid/extras/python .
  • Если добавить туда модуль управления лампами milight (а также модуль importlib из стандартной поставки python для win32/linux/mac, который используется этим модулем), то можно запускать по таймеру собственные python скрипты!

Тестовый скрипт, включающий все лампы (всего в 4 строки!):
https://gist.github.com/spiiin/3b0ebc3a3ee798ef3723c24798fb0978

Дальше остаётся только повесить этот скрипт на запуск в определённое время через TaskBomb и лечь спать.