[Из песочницы] Управляем домом через Telegram
В настоящее время системы управления умным домом становятся все популярнее. Централизованный интерфейс, который управляет устройствами по всему дому, помогает экономить время и позволяет гораздо эффективнее контролировать ваше жилище. Реализацией своего видения подобных систем занимаются как именитые бренды: Apple, Amazon и Google, встраивая их в свою инфраструктуру, так и умельцы, собирающие подобные системы на базе платформы Arduino.
Наша же цель была следующей: создать систему, которая будет доступна на большом количестве устройств и не будет привязана к какому-либо месту. Отличный вариантом для реализации управления оказался бот для мессенджера Telegram. Telegram имеет приложения на всех основных платформах, а так же web-версию. Доступ к нему можно получить из любого места, нужно лишь иметь аккаунт.
Из модулей мы выбрали следующие:
• Управляемая RGB светодиодная лента
• Управляемая розетка
• Датчик температуры
• Датчик освещенности (он используется для автоматического включения освещения)
Что нам понадобится
1. Raspberry Pi 3
Маленький, но удаленький компьютер, не нуждающийся в представлении, его мощности нам с головой хватит для этих задач. Третья версия хороша наличием встроенного Wi-Fi модуля, так что нам не придется думать о стороннем адаптере.
2. Модули ESP8266
Их нам понадобится 4 штуки. Мы использовали ESP-12F, но вообще разницы нет: ESP-1 будет вполне достаточно. Так же готовые платы NodeMCU помогут сэкономить вам время и силы.
3. Светодиодная лента
Мы взяли управляемую RGB-ленту на контроллерах WS2812b, хотя, впрочем, тут подойдет любая лента, работающая на 5В и поддерживаемая платформой Arduino.
4. Датчики температуры и освещения
Мы использовали модуль BH1750 для определения освещенности в комнате и DS18B20 для температуры. Основными критериями были доступность, поддержка платформой Arduino и возможность работы с 3.3В логикой ESP8266.
5. Реле
Субмодуль MOD-1CH для Arduino может пропускать до 10А тока и управляется 5В, аналогов для 3.3В мы не нашли, так что для управления использовали транзистор в ключевом режиме.
6. Telegram-бот
Непосредственное управление всей системой будет осуществляться при помощи бота Telegram, запущенного на Raspberry: это позволит системе быть легкодоступной на любой платформе из любой точки мира. Создавать бота для Telegram довольно просто, благодаря развитой платформе и поддержке большого количества языков.
Таким образом вся наша система будет выглядеть примерно так:
Реализация
Первым делом протестируем модули.
Готовые печатные платы адаптируют расстояние между пинами, что заметно облегчает пайку, а также содержат в себе необходимые резисторы, соединяющие пины CH_PD и GPIO2 с Vcc.
К сожалению, модули ESP8266 питаются и работают на 3.3В, а не на 5, как Arduino. Преобразовать напряжение можно с помощью готового модуля-преобразователя, но можно и спаять схему на основе линейного стабилизатора AMS1117, как это сделали мы.
Следующий этап — программирование.
К счастью, платформа ESP8266 поддерживается Arduino IDE, что открывает нам множество возможностей. Для непосредственной загрузки прошивки на модуль мы будем использовать Arduino Nano, однако то же самое можно сделать и через обычный USB-UART преобразователь. Не следует забывать про разницу напряжений у Arduino и ESP.
Схема получилось такой:
Кнопка нужна для того, чтобы замкнуть пин GPIO1 на GND при подаче питания на модуль и, тем самым, перевести его в режим программирования.
Далее настраиваем Arduino IDE, чтобы она понимала ESP (подробная инструкция со всеми ссылками) и пробуем записать тестовый скетч на моргание светодиодом.
После удачного мигания мы приступили к пайке всех модулей. С датчиком температуры и освещения все довольно стандартно.
Температуры:
Освещения:
А вот лента и умная розетка вызвали некоторые трудности.
Простое подключение управляющего входа ленты к ESP результата не дало. Оно и не удивительно, ведь WS2812b требует на управляющий вход минимум 70% от входа VCC (50.7=3.5), и 3.3В платы явно недостаточно. Однако мы нашли костыль интересный способ запустить их без использования повышающего преобразователя. Если диоду требуется минимум 0.7Vcc для реакции на сигнал и мы не можем увеличить уровень этого сигнала, то надо уменьшить Vcc! Да, светодиоды будут гореть не так ярко, однако нам не надо запитывать таким образом всю ленту; хватит и одного диода. Передавая сигнал далее по цепочке, светодиод использует уже уровень Vcc для формирования сигнала, чего вполне хватает для «нормального» светодиода. Таким образом, подключив первый диод в ленте к питанию через диод, который «съедает» около 0.6В, мы получаем отлично работающую ленту, напрямую управляемую из нашего модуля ESP8266. А чуть более тусклый первый светодиод мы оставили для отладочных нужд: отображать состояние подключения к сети.
Вот что вышло:
Нашу умную розетку мы хотели разместить полностью в корпусе от старой розетки с таймером. Туда должны были влезть: сам ESP-12F, блок питания для него и реле, управляющее розеткой. Однако, разместив там реле и блок питания, мы так и не смогли вместить там еще и модуль ESP. Поэтому пришлось приделать снизу еще маленькую коробочку.
Итог получился не таким элегантным как мы хотели изначально, зато это было цельное устройство, которое надо было просто воткнуть в розетку.
Следующим шагом была настройка Raspberry. План был такой: наши модули подключаться к точке доступа Wi-Fi, которой является Raspberry, а, точнее, к её встроенному Wi-Fi модуль. На Raspberry запущен Telegram-bot, который находится со всеми модулями в локальной сети и может без проблем обмениваться с ними http-запросами. К интернету это все подключено через Ethernet.
Для осуществления этого плана мы использовали два пакета:
- hostapd — позволяет использовать встроенный wi-fi модуль как точку доступа
- dnsmasq — объединяет в себе DHCP и DNS сервера.
Мы пытались добиться относительной независимости кода и устройств, поэтому все запросы выполнялись не на ip-адреса, а на имена из придуманной зоны .sh (light.sh, socket.sh и т.д.). Для этого мы для каждого модуля настроили статические ip-адреса и добавили на эти адреса DNS записи, соответствующие модулям. Благо dnsmasq очень легко конфигурируется (подробная инструкция по настройке этой системы).
И, наконец, непосредственно бот.
Мы писали бота на Python, используя библиотеку python-telegram-bot. Нами был разработан кнопочный интерфейс, что упрощает управление, превращая устройство в своеобразный пульт ДУ:
Исходный бота код можно изучить здесь.
И, чтобы им не пользовался кто попало, мы поставили защиту паролем.
Вывод
Конечно, мы не создали какой-либо революционной системы, существует огромное количество более целостных и продуманных реализаций. Модули температуры и освещения можно было бы сделать автономными, благо у ESP8266 есть специальный режим ожидания, в котором она потребляет очень мало энергии. Можно было бы добавить легкую пользовательскую расширяемость, не требующую изменения исходного кода и перенастройки сетевых подключений и еще много чего. Однако цель всего этого проекта была совсем не в этом. В первую очередь мы хотели создать простую систему, которая могла вполне быть создана кем угодно у себя в доме и не требовала бы серьезной подготовки и затрат. А самое главное: мы хотели научиться многим вещам, пока мы делали этот проект. И если практичность и функциональность нашего решения можно еще долго дорабатывать, то знания, полученные нами в процессе планирования и воплощения в жизнь этой системы, определенно стоили потраченных усилий.