В настоящее время системы управления умным домом становятся все популярнее. Централизованный интерфейс, который управляет устройствами по всему дому, помогает экономить время и позволяет гораздо эффективнее контролировать ваше жилище. Реализацией своего видения подобных систем занимаются как именитые бренды: 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 есть специальный режим ожидания, в котором она потребляет очень мало энергии. Можно было бы добавить легкую пользовательскую расширяемость, не требующую изменения исходного кода и перенастройки сетевых подключений и еще много чего. Однако цель всего этого проекта была совсем не в этом. В первую очередь мы хотели создать простую систему, которая могла вполне быть создана кем угодно у себя в доме и не требовала бы серьезной подготовки и затрат. А самое главное: мы хотели научиться многим вещам, пока мы делали этот проект. И если практичность и функциональность нашего решения можно еще долго дорабатывать, то знания, полученные нами в процессе планирования и воплощения в жизнь этой системы, определенно стоили потраченных усилий.
Комментарии (16)
Markscheider
19.05.2017 11:35Немного не по теме, но спрошу. А можно реализовать все тоже самое, но вместо RPi взять Linux-машину?
В квартире стоит ПК с убунтой (24/7). В нем есть и Ethernet, и Wi-fi модуль.
Уверен, что можно, но хотелось бы готовое решение из серии «установил пакет(ы) — все заработало. Потому что с линуксом я пока на „вы“ :)
Может пробегал где-то мануал?gudvinr
19.05.2017 12:12+1А что мешает? RPi — это тоже Linux-машина.
Ставите пакеты, что указаны в посте, иpython-telegram-bot
черезpip
. Всё.
lgorSL
19.05.2017 14:58Держу бота на стареньком нетбуке с intel atom и 1 gb памяти. Довольно весело получается, в процессе написания кучу нового узнал. Бот ничем не управляет, написан just 4 fun.
Настроил доступ по ssh, на нетбуке выключил gui (потребление памяти снизилось до 30мб и нетбук перестал тормозить). С помощью screen запускаю бота и он более-менее работает. Для удобства ботов два — один всё время работает на нетбуке, второго использую для экспериментов и отладки нового кода.
ThandorOne
19.05.2017 23:42Да, особой разницы с RPi быть не должно, то же самое ведь по сути. По поводу настройки в основном сюда (https://frillip.com/using-your-raspberry-pi-3-as-a-wifi-access-point-with-hostapd/), на бунте, думаю, все так же будет.
memtew
19.05.2017 13:52+1Тоже использую Телеграм бота для управления светом в доме, для контроля температуры, просмотра снимков с камер, получения оповещений. Для защиты от посторонних оптимально, как указали выше, использование белых списков. Остальным любопытным показываю случайную весёлую фразу из словаря. В качестве сервера выступает самый простой Intel NUC предыдущего поколения с Debian 8 на борту.
КартинкаN0Good
20.05.2017 00:25Точно так же использую телеграм-бота под Node-red. Есп подключены через mqtt. Есть даже оповещения о выходе температуры и напряжения в рощетке за допустимые пределы. В качестве сервера использую Zyxel Keenetic II с debian'ом. На нём и нод крутится и MQTT-сервер, и он же шлюз в интернет с белым IP. Ессно наружу MQTT с SSL. Еспэхи с прошивкой HomeSmart. Как доделаю чердак и поставлю там освещение на основе WS'ок — мож напишу статью обо всём этом хозяйстве.
zapimir
20.05.2017 06:05Есть даже оповещения о выходе температуры и напряжения в рощетке за допустимые пределы
Интересно, чем меряете температуру в розетке, тоже планирую такую фичу. Силу тока в конкретной розетке не измеряете?
vyacheslavteplyakov
19.05.2017 14:49Я бы делал такое только из интереса к телеграм ботам, это очень интересная тема. А если любопытство откинуть, то MQTT на мой взгляд было бы проще быстрее и удобнее в этих задачах. ESP его умеют, москито на малине поднимается тоже без каких либо пролем, а можно и без малины обойтись, облачных MQTT серверов много.
ThandorOne
19.05.2017 23:58Да, конечно, но по большей части этот проект делался for fun и для интерестного опыта, а поработать хотелось именно с этим.
April22
19.05.2017 23:35Боты… да… давно использую.
Один такой, на даче крутится, написал на PHP, запускается по крону раз в минуту.
Сам бот удачно поселился на Black Swift, работает, я разуюсь.
По сути: тема интересная, и достаточно востребованная. Не требует сверх WEB интерфейсов.
я лично использую систему команд, не сложную и интуитивно понятную.
BigEl
Взломать пароль дело не хитрое. По крайней мере из новостей в мире хакеров (и их поимки) это следует. Будет не очень приятно однажды дома застать «восстание машин», потому что кто то захотел развлечься. А если еще и видео в квартире есть — то считайте снабдили еще и глазами.
По теме: Интересно было почитать. Сам задумываюсь периодически собрать что то умнее сковородки в квартире, но ни должного объема знаний по теме ни навыков нет. Собственно отсюда и интерес, читаем много :) Возник вопрос, чисто гипотетически реально ли в управление данной системы внести работу с GSM модулем. Управление по sms. Как мне кажется доступ к симке получить сложнее, чем найти заветные символы для доступа в админку бота.
gudvinr
Вместо этого можно использовать белый список пользователей и вручную туда добавлять при необходимости.
Каждый пользователь telegram имеет уникальный ID и реализация добавления/проверки не должна вызвать трудностей.
Можно и GSM использовать, есть модули вроде SIM900 специально для этого. Но чем отличается получение пароля от поиска номера телефона, например? Так или иначе, нужна дополнительная защита.
К тому же, придётся отказаться от удобного интерфейса или реализовывать свой для взаимодействия через SMS.
ThandorOne
У нас все, можно сказать, наоборот. Изначально доступ по паролю, но те, кто его ввел неправильно несколько раз, попадает в черный список по тому самому ID и доступ блокируется. Так что перебор тут не прокатит.
gudvinr
А какие в этом преимущества, если телеграмм итак предоставляет средства аутентификации?
Простота реализации? Да, пожалуй.
Дело же не в возможности перебора, а в наличии дополнительного слоя, который по большому счёту и не нужен, в случае грамотной реализации.
danyaShep
GSM — старинное изобретение, которое, надеюсь, скоро умрет. Канал связи, который контролируют всего 4 конторы в стране, которые ничем друг от друга не отличаются. Почитайте, сколько раз взломали аккаунт телеграмма, а сколько раз перевыпускали симку и заходили в инет-банк через неё.
Насчет топика — очередной велосипед… Такое ощущение, что когда кто-то хочет собрать умный дом на коленке, он перед этим отключает себе интернет, чтобы не дай бог не нагуглить что-то готовое. И обязательно с нуля написать свой десяток скриптов, который ни с чем больше не совместим.
Я сам так начинал, но в те времена выбора особо не было. Сейчас есть замечательный Home Assistant — его остается только настроить. Модули, разумеется, надо было по MQTT подключать.
lingvo
Более года мой «умный дом» с полным управлением всей квартирой на Опенхабе/Nodered был без удаленного управления — не особо надо было, да и руки не доходили.
Но вот пришло время отпуска и наконец решил я замутить эту фичу, наконец. Только чтобы было надежно, без привязки к конкретному софту и работало везде, где есть интернет и через любые фаерволы. MQTT у меня уже давно был — через него мой УД управляется с тач-панелей на стенах на Андроиде и сценарии в Node-red
Недолго погуглив, выделил я часок времени, чтобы зарегистрироваться на CloudMQTT и в Node-Red добавить вкладку и на ней 4-ре узла — подписка на все топики моего домашнего брокера и публикация их всех на CloudMQTT и в обратном направлении — подписка на все топики на CloudMQTT и публикация их на локально брокере. Запустил и получил доступ извне. Больше всего времени заняло придумывание паролей и изучение, что же такое TLS/SSL и почему желательно включать эти галочки. На телефоны поставил MQTT клиент и получил удаленный доступ через App. До скриптов не дошел.
Согласен насчет велосипеда.