Возвращаясь в Лондон, я недавно купил Philips Hue. Это лампочки с беспроводным управлением, позволяющие регулировать яркость и цвет. Они поставляются с базовой станцией и приложением, очень просты в использовании, а главное – у Philips Hue есть API.
В Twilio мы *любим* API!
Ууууууух!!! SMS для смены цвета моей лампочки в квартире!!
— Michael Wawra (@xmjw) August 13, 2013
Моя мысль проста. Управлять своими лампочками – это неплохо, но позволить случайным незнакомцам в интернете менять цвет моих лампочек было бы весело! Позволить им менять цвет с помощью SMS-сообщения было бы эпично!
Так как же работает Philips Hue? По сути, это базовая станция с Ethernet-подключением и 3 лампочки. Базовая станция подключается к вашему роутеру и может управлять лампочками через какой-то другой протокол, о котором нам не нужно беспокоиться. Все, что нам нужно сделать, это отправлять запросы на базовую станцию, и она сделает все остальное за нас.
Прежде чем мы сможем написать какой-либо код, нам нужно настроить API на нашем Philips Hue. Этот шаг создает имя пользователя для подтверждения того, что у нас есть физический доступ к устройству. С этим разобрались, давайте напишем немного Ruby и Sinatra и посмотрим, что мы можем сделать. Создайте новый файл под названием ‘sms-hue.rb’ и добавьте следующее:
Далее нам нужно создать некоторые настройки для использования в остальной части приложения. Нам понадобится имя пользователя, которое вы создали, IP-адрес базовой станции и идентификатор используемой лампочки. Вы могли бы заставить это работать со всеми вашими лампочками одновременно, но мне нравится предоставлять доступ в интернет к моему дому по одной комнате за раз.
Поскольку Philips Hue имеет REST API, нам нужно делать HTTP-запросы для изменения состояния наших лампочек. Все, что нам действительно нужно в этом примере, — это код, который делает HTTP PUT-запрос с некоторыми JSON-данными. Давайте создадим метод под названием ‘send_to_single_bulb’, который сможет сделать это для нас:
Теперь, когда у нас все настроено для отправки данных на Philips Hue, нам нужно посмотреть на JSON-данные, которые мы должны отправить. Заглянув в документацию API Philips Hue, мы видим, что нам нужно отправить значения ‘hue’, ‘sat’ и ‘bri’ в API. Это для оттенка (Hue), насыщенности (Saturation) и яркости (Brightness). Чтобы установить определенный цвет, нам нужно понять, как работают эти значения.
Значение оттенка описывает цвет. Philips Hue может управлять впечатляющими 65 000+ цветами, поэтому он использует диапазон 0–65535. Чтобы упростить задачу, мы будем использовать диапазон 0–360 для наших значений оттенка и умножим его примерно на 182, что дает полный диапазон без полной точности. (65535/360 немного больше 182.)
Это облегчает визуализацию цветов. Как показано на цветовом круге, 0° (и 360°) — это красный сверху, 90° — желто-зеленый, 270° — сине-фиолетовый и так далее. Вы можете немного поэкспериментировать с этими значениями с помощью этого цветового селектора, который отображает значения HSL, а также более привычные коды HTML и RGB.
Насыщенность, по сути, — это то, насколько красочен наш цвет по сравнению с тем, насколько он белый. (Более подробное объяснение этого есть в Википедии.) Яркость — это то, насколько ‘включена’ лампочка: 0 — это почти не включено, а высокое число — очень, очень включено. Philips Hue использует 0–255 для насыщенности и яркости. Мы собираемся использовать 255 для насыщенности, чтобы цвета были яркими, но только 70 для яркости, так как смотреть прямо на яркие огни не очень хорошая идея…
Теперь нам нужен код, который может принимать SMS и передавать значение цвета в виде JSON в Philips Hue. Следующий код создает маршрут Sinatra ‘/sms’, который будет это делать:
Класс Ruby String имеет метод to_i, который возвращает целое число, если находит числовое значение в начале строки. Если значение не найдено, он просто возвращает 0. Это делает его очень безопасным в использовании, так как он не вызовет исключение.
Twilio предоставляет текст SMS-сообщения через параметр Body. Поэтому мы используем to_i для преобразования его в целое число, умножаем на 182 и сохраняем в переменной ‘hue_val’. Теперь мы должны создать JSON-данные. В Ruby мы можем создать Hash и использовать метод to_json, который включен из библиотеки JSON выше.
В качестве последнего шага нашего кода мы передаем эти JSON-данные нашему методу ‘send_to_single_bulb’ и возвращаем TwiML, сообщающий Twilio, что дальнейших действий не требуется.
Теперь становится интереснее. Нам нужно запустить этот код в той же сети, что и наша базовая станция Philips Hue. Если у вас нет доступной в Интернете домашней/офисной сети, вы можете воспользоваться такими сервисами, как localtunnel или NGrok. Эти инструменты помогают туннелировать ваш локальный веб-сервер в Интернет – вы можете рассмотреть менеджер задач или проброс портов на вашем домашнем роутере как постоянное решение.
Нам нужно сделать это, потому что мы должны предоставить Twilio доступный URL, чтобы он мог связаться с приведенным выше кодом. Как только у вас это получится, у вас будет доступный URL, который подключается к вашему приложению Sinatra. Войдите в Twilio и на вкладке ‘Numbers’ выберите (или купите) номер, который вы хотите использовать с вашими лампочками. Установите ‘Messaging Request URL’ на URL вашего приложения: