Вы уже поигрались с ESP8266 и теперь вам хочется большего? В этой статье я покажу основные приемы передачи данных куда только возможно. Построим надежную домашнюю WiFi сеть, в которой куча ESP8266 не будет мешать вашим высокоскоростным гаджетам. Мы соединим ESP8266 используя прошивку, сделанную в Arduino IDE, c MQTT брокером mosquitto, будем посылать электронную почту с ESP8266, передадим данные на ThingSpeak, CloudMQTT, будем получать PUSH уведомления на смартфон, ESP8266 будет дергать своими GPIO по команде со смартфона без HTTP серверов и проброски портов. ESP8266 будет отчитываться о действиях в собственном твиттер-аккаунте. Интересно? Если да то, как принято говорить на хабре, добро пожаловать под кат — там вас ждет громадное количество кликабельных скриншотов, полезных ссылок, видео и самый минимум линуксовых команд в терминале под OpenWRT, с которыми справятся даже люди абсолютно не знакомые с linux.
Содержание
Делаем отдельную WiFi сеть для IoT
Настраиваем OpenWRT
Настраиваем MQTT брокер mosquitto
Настройка MQTT-Spy
Пишем прошивку в Arduino IDE, подключаем ESP8266 к mosquitto
Устанавливаем и настраиваем mqttwarn
Передаем данные с ESP8266 на ThingSpeak
Передаем данные c ESP8266 по EMAIL
Передаем с ESP8266 на смартфон PUSH уведомления
Управляем ESP8266 GPIO со смартфона
ESP8266 публикует в Twitter состояние GPIO
Поднимаем Dynamic DNS и делаем bridge с CloudMQTT
Делаем отдельную WiFi сеть для IoT
Вы, наверное, уже заметили, что даже один или два модуля ESP8266 с кривым софтом на борту могут уронить вашу домашнюю WiFi сеть и ваши домашние будут ругать провайдера за неповоротливый интернет, пока вы нервно курите в сторонке. Что уж там говорить, если вы собираетесь половину ваших электрических розеток перевести на WiFi управление. Также существует неудобство и в том, что для взаимодействия с ESP8266 вам периодически приходится поднимать на своем рабочем компе то HTTP сервер, то еще что-нибудь. Вот эти две проблемы мы и постараемся решить за один раз (просьба не упоминать про зайцев). Подключим дополнительную WiFi точку доступа на отдельном радио канале специально для наших экспериментов сейчас и для будущей домашней IoT сети в ближайшем будущем.
Мы будем использовать не обычную WiFi точку доступа из ближайшего магазина и не народный MR3020, а для того, чтобы решение получилось максимально доступно для широкого круга умельцев, а не только для линуксоидов, которые не признают ничего, кроме командной строки в терминале, мы возьмем, практически за те же деньги, роутер от китайского стартапа Gl.iNET, созданный специально для DIY. Вот наша партнерская ссылка для покупки этого устройства на Aliexpress для тех, кто готов поддержать наш сайт одновременно экономя на покупках с нашим партнером Aliexpress.
Я не буду здесь описывать все преимущества этого роутера, распаковывать его из коробки у вас на глазах — для этого уже давно есть неплохие обзоры (вот на муське и еще один). Этот роутер подходит лучше других для нашей задачи потому, что имеет на борту 64Мб оперативки, а нагрузить мы его хотим по полной программе :) Еще приятная новость в том, что на нем предустановлена прошивка OpenWRT, что уменьшает вероятность танцев с бубном для тех, кто не знаком с линуксом вообще.
Для тех, кто побаивается линуксов вообще и OpenWRT в частности, сообщаю, что мы будем работать c OpenWRT в русифицированном WEB интерфейсе. Сам я не обладаю большим опытом работы в linux и фанатом командной строки не являюсь, поэтому и вам постараюсь показать простые приемы, которые, возможно, и не блещут изяществом.
В принципе, все что будет описано в данной статье будет работать и на китайских роутерах за десять баксов, однако малый размер их оперативки существенно сужает возможность применения их в задачах, которые мы будем им ставить. Даже подключив свап раздел на USB флешке мы получим монстра, который постоянно качает в свап и обратно страницы памяти и наши приложения будут летать просто как черепахи. Вот скриншот по свободной памяти на моем роутере в обычном режиме работы:
Надо заметить что, скорее всего, вам не понадобится все, что будет описано в этой статье и свободной памяти, в вашем конкретном случае, окажется гораздо больше. Буду очень признателен тем, кто поделится своим опытом у нас на форуме.
Обратите внимание, что у Gl.iNET есть две модели роутеров: 6408A и 6416A, которые имеют на борту 8 и 16 Мб флеш памяти соответственно. Сейчас разницы в цене у них практически нет, так что постарайтесь взять 16-ти мегабайтную модель. Если вы будете повторять все, что будет описано в данной статье, то все равно придется подключать USB флешку для раcширения overlay раздела, потому что размер всех установленных пакетов у меня уже перевалил за 50 Мбайт.
Для владельцев больших домов или квартир с железобетонными перегородками будет интересен вариант с внешней антенной. Хотя, имея достаточный скилл пайки, внешнюю антенну можно примастрячить самому.
Однако в этом замечательном роутере есть и ложка дегтя. При отличной схемотехнике и продуманно скомпонованном железе, китайцы собрали наполовину китайскую OpenWRT, которая обращается к репозитарию пакетов на сайте производителя с битыми ссылками и устаревшими сборками. Кроме того, буквально пару недель назад, вышла новая версия OpenWRT — Chaos Calmer 15.05-rc1, которая включает последнюю версию 1.4.2 MQTT брокера mosquitto в которой исправлены баги именно в тех функциях, которые мы будем активно использовать.
Поэтому, особо не парясь, через веб интерфейс будем заливать новую прошивку. Сначала определите модель (по объему флеш памяти) и скачайте с официального сайта OpenWRT либо openwrt-15.05-rc1-ar71xx-generic-gl-inet-6408A-v1-squashfs-sysupgrade.bin либо openwrt-15.05-rc1-ar71xx-generic-gl-inet-6416A-v1-squashfs-sysupgrade.bin и обновитесь. Процесс обновления прошивки я описывать не буду — это легко гуглится, да и эта статья об ESP8266, а не про OpenWRT. Для тех, кто вообще не знаком с OpenWRT, скажу, что нужно искать описание обновления прошивки с OpenWRT на OpenWRT через веб интерфейс самой OpenWRT без сохранения настроек. Во как.
Если что-то пойдет не так — не отчаивайтесь! Ищите в инете инструкцию по прошивке через консоль. Разбираете роутер, подключаете USB-TTL, питание берете внешнее, подключаетесь к роутеру витой парой, поднимаете у себя на компе tftp сервер. Процедура простая и быстрая, дольше будете tftp искать и настраивать. Кстати, тоже самое придется сделать, если в дальнейшем не примонтируете флешку для увеличения доступного места и наустанавливаете кучу пакетов, которые займут все свободное место — OpenWRT в таком случае может и не стартануть. Сам попался как-то раз на такую удочку :)
Есть одно неудобство — после установки чистая OpenWRT имеет IP адрес 192.168.1.1, который в нашем случае (установка второго домашнего WiFi роутера) уже обычно бывает занят старым роутером, который нам раздает интернет. Поэтому, для первоначальной настройки, придется физически отключиться от вашей локальной сети и подключиться проводом к порту LAN нового маршрутизатора.
Далее мы будем строить такую сеть:
Как видите, мы не будем вообще использовать функции маршрутизации IP пакетов, наш роутер будет работать в качестве Ethernet моста в той же подсети, что и остальные устройства. Это позволит нормально функционировать протоколу mDNS без пробрасывания UDP портов, отменит необходимость прописывать маршруты из локальной сети в сеть IoT, и при этом мы будем использовать DHCP сервер вашего основного маршрутизатора. Однако, самое главное, что мы получим в результате: две независимые WiFi сети. Это позволит нам переводить ESP8266 в режим 802.11b или 802.11g для снижения энергопотребления в случаях, когда не требуется высокая скорость подключения без ущерба в скорости для остальных WiFi устройств, требовательных к скорости подключения к интернет.
Обсуждение вопросов настройки OpenWRT на нашем формуме
В итоге должно получиться что-то вроде этого (кстати, приколитесь в каком радиовакууме я живу)
Настраиваем OpenWRT
Этот раздел я писал по памяти, за точность и правильную последовательность действий не ручаюсь. В ваших интернетах полно статей как это сделать. Если вы обнаружили неточность или ошибку то, пожалуйста, сообщите мне об этом, я поправлю статью.
Перед отключением от локальной сети и интернета (напоминаю, что наш OpenWRT роутер будет иметь адрес 192.168.1.1), я рекомендую приготовить следующие программы:
Любой SSH клиент, мне наиболее симпатичен putty. Желательно погуглить про SSH, putty и ключи и сгенерировать собственный ключ — это существенно упростит вам жизнь, но можно обойтись и без этого. Если вы пользуетесь хостингом или уже имеете свой домашний выделенный linux сервер, то такой ключ у вас, наверняка, уже есть.
Любой SFTP клиент, мне больше нравится Far Manager — мы будем редактировать файлы на OpenWRT не через редактор vi, который встроен в OpenWRT, но абсолютно неудобен для обычных людей. Хотя, наверное, линукс гуру со мной не согласятся.
Мне было проще подключиться к роутеру через USB-TTL и все настроить в терминале
Первым делом установим соединение с интернетом:
1 2 3 |
ifconfig br-lan 192.168.1.100 route add default gw 192.168.1.1 br-lan echo "nameserver 8.8.8.8" >> /etc/resolv.conf |
Проверяем интернет
1 |
ping ya.ru |
Если яндекс пингуется, то жмем CTRL+C
Задаем пароль root
1 |
passwd root |
Подключаемся по SSH к 192.168.1.100, попадаем в командную строку терминала. При возникновении проблем — гуглим.
Обновляем список доступных пакетов (это требуется после каждой перезагрузки, если хотим что-то установить, но больше вручную ее вводить не придется — скоро мы установим веб-интерфейс)
1 |
opkg update |
Ждем пока все подгрузится, затем
1 2 |
opkg install luci /etc/init.d/uhttpd start |
Люся — наша лучшая подруга! Запускаем браузер, заходим на 192.168.1.100 и видим приглашение OpenWRT. Отлично, теперь установим русскоязычный интерфейс.
Идем по меню System — Software — Filtr вводим -ru жмем поиск. Переключаем вкладку на доступные пакеты и ищем luci-i18n-base-ru — вот его и устанавливаем. Обновите страницу после установки (не торопитесь — требуется некоторое время для скачивания и установки пакета), всё — русификация завершена — можете обновить страницу.
Сейчас нужно, чтобы люся сама загружалась при старте роутера — идем в Система — Загрузка и ищем uhttpd — если на кнопке красный крестик и надпись Отключено, то жмем по нему — всё, автозапуск включен.
Дальше я рекомендую настроить Far Manager, а точнее его встроенный плагин NetBox.
Для того, чтобы мы могли передавать/принимать файлы с OpenWRT через sftp устанавливаем пакет
1 |
openssh-sftp-server |
Фаром подключаетесь к OpenWRT, идете в /etc/config/firewall и в политиках зон все REJECT заменяете на ACCEPT, потому что LAN и WAN у этого маршрутизатора находятся в нашей домашней сети, которой мы доверяем.
Дальше все просто: с помощью русскоязычного меню настраиваете WiFi, проверяете настройки br-lan интерфейса (остальные лучше не трогать, но только если вы действительно знаете что делаете). Можете прописать DNS сервера вашего провайдера в качестве вторичных и указать в качестве первичного DNS адрес вашего главного маршрутизатора 192.168.1.1
Перегрузите через меню OpenWRT, убедитесь что все работает, интернет есть и т.п. Подключитесь с ноутбука или смартфона к вашей сети IoT по WiFi, проверьте инет.
Новичкам, которые еще не знают что им может понадобится, лучше сразу увеличить размер файловой системы с помощью USB флешки — лучше взять современную (=быструю) любого размера. Подключение флешки к OpenWRT легко гуглится, так что вы без проблем с этим вполне справитесь. Для облегчения задачи флешку лучше отформатировать у друга на linux машине. Если у вас нет такого друга и возникнут проблемы при разбитии флешки на разделы через консоль в OpenWRT, то можете установить VirtualBox и Extension Pack к нему, запустить linux в виртуальной машине и там в графической оболочке с помощью gparted разбить флешку на разделы. Такая виртуальная машина с линуксом на борту вполне потом может вам сгодится для экспериментов в linux, сборки собственной прошивки для OpenWRT из исходников — я так делал на виртуальной машине с одним гигом памяти — компилировалось всю ночь :)
После того, как примонтируете флешку на overlay жмите
1 |
df -h |
Просто убедимся, что места у нас полно. Вот у меня для примера свободно более 500 мегов.
1 2 3 4 5 6 7 8 9 |
root@OpenWrt:~# df -h Filesystem Size Used Available Use% Mounted on rootfs 609.0M 51.1M 513.4M 9% / /dev/root 2.3M 2.3M 0 100% /rom tmpfs 29.8M 1.2M 28.6M 4% /tmp /dev/sda3 609.0M 51.1M 513.4M 9% /overlay overlayfs:/overlay 609.0M 51.1M 513.4M 9% / tmpfs 512.0K 0 512.0K 0% /dev root@OpenWrt:~# |
Сейчас можно не скупиться и поставить все, что потребуется.
Идем в Система — Программное обеспечение, фильтруем mc, устанавливаем замечательный файловый менеджер, чтобы потом не делать файловые операции из командной строки.
Еще можно установить htop — отличная утилита, интерактивно показывающая загрузку системы и использование памяти
Да хоть и mysql-server, если вам требуется запись в БД ваших данных. В общем, тут уже все индивидуально.
На этом первоначальная настройка OpenWRT завершена.
Настраиваем MQTT брокер mosquitto
Немного расскажу по-простому о протоколе MQTT. Представьте интернет-форум вроде нашего. В нем есть темы (топики). Если вас интересует какой-то топик, то вы на него подписываетесь и вам приходят уведомления об изменениях. Также вы можете публиковать свои посты в топиках, такие уведомления придут и тем, кто подписан на топик, в котором вы опубликовали пост. Топики многоуровневые. Точно также и в MQTT — топики, подписка, публикация. Если вы публикуете в топик, которого не существует, то он создается и становится точно таким-же по свойствам, что и другие. Все это справедливо, если у вас есть права на чтение и/или запись конкретного топика или всех.
Устанавливаем mosquitto через Система — Программное обеспечение, включаем автозапуск. Можно установить все пакеты, у которых в названии есть mosquitto и нет nossl.
Через FarManager или vi редактируем файл /etc/mosquitto/mosquitto.conf
Ищем раздел, где log_dest и добавляем ниже строку
1 |
log_dest syslog |
Аналогично делаем
1 2 3 4 5 6 |
log_facility 5 log_type debug log_type error log_type warning log_type notice log_type information |
Позаботимся о безопасности даже если вам это кажется не нужным (в примерах далее будут прописаны пользователи и пароли и не будут использованы анонимные подключения)
1 2 |
password_file /overlay/mosquitto/users.list acl_file /overlay/mosquitto/mosquitto.acl |
Сохраняем mosquitto.conf
Теперь создадим необходимые каталоги с помощью mc или командной строки
1 2 3 |
cd /overlay mkdir mosquitto cd mosquitto |
Для создания пользователей и генерации паролей необходимо установить пакет mosquitto-client. После установки используйте утилиту mosquitto-passwd. Или можете применить грязный хак. Скачиваем win версию mosquitto к себе на комп и с помощью mosquitto_passwd.exe создаем пользователей. Я эту работу сделал за вас, поэтому просто скопируйте эту строчку в пустой файл /overlay/mosquitto/users.list
1 |
test:$6$5Prq6fKi/BKhXVd+$SK2AYMVcMUKP94nzkZF3YIy6SXQhA5HBjDM/5n0X07YbIVPJP8Mnl4YGlRDkyWxSWs1mnxhP+CEzw9xvtV6F/Q== |
В одну строку без переносов. Это мы определили пароль test пользователю test. Еще создаем файл /overlay/mosquitto/mosquitt.acl следующего содержания
1 2 |
user test topic # |
Это мы даем права на чтение и запись юзеру test на все топики. Подробнее о всех командах файла конфигурации и настройке прав смотрите в документации.
Полный файл конфигурации mosquitto.conf
Все готово к запуску mosquitto — включаем его в автозагрузке и запускаем. Теперь надо проверить как он работает.
Обсуждение процесса настройки mosquitto на нашем форуме
Настройка MQTT-Spy
Для общения с любым mqtt брокером есть отличная программа mqtt-spy единственным недостатком которой можно назвать лишь то, что она требует наличия установленной Java 8.20 и выше. Программа mqtt-spy на потребуется только на период отладки и в рабочей системе будет уже не нужна. JAR файл mqtt-spy просто скачиваем на рабочий стол в пустую папку и запускаем обычным двойным кликом. По умолчанию mqtt-spay автоматически подключается к тестовому серверу iot.eclipse.org, можете поэкспериментировать и с ним, но лучше сразу подключимся к нашему mosquitto. В меню Connections выбираем New connection. Connection Name уже заполнено — можно оставить как есть, но я предпочту исправить на OpenWRT. Ниже на вкладке Connectivity в поле Server URI(s) вводим IP адрес нашего маршрутизатора и порт mosquitto по умолчанию, т.е. 192.168.1.100:1883 Ниже сгенерировался Client ID — можно оставить как есть, или ввести что-то свое. Следует заметить, что стандарт MQTT требует уникальный ClientID у каждого подключенного клиента. Рекомендую так же отметить галочкой Reconnect on failure. На вкладке Security вводим логин и пароль test и test. Жмем Apply и Open Connection. Если все прошло гладко, то вы увидите, что появилась зеленая вкладка с названием нашего соединения OpenWRT. Цвет вкладки означает состояние соединения: красный — отключено, желтый — соединяемся, зеленый — подключено. Забегая вперед скажу, что после отключения/подключения не забывайте переподписываться на топики. Переключаемся на нашу новую вкладку OpenWRT. Далее мы видим 4 группы пока еще пустых полей:
- Publish message — для публикации топиков
- Define new subscribtion — подписка на топики
- Вкладка All в которой мы увидим топики, на которые подпишемся
- Ниже увидим сообщения из топиков, на которые мы подписались.
Для начала подпишемся на все топики. В поле Define new subscribtion вводим единственный символ # и жмем Subscribe. Должна появиться вкладка #. Итак мы подписаны на все топики, теперь попробуем что-либо опубликовать. В верхнее поле Publish message — Topic вводим название нашего топика, например esp8266, а в поле Data вводим Hello world! и жмем Publish. Если все сделали правильно, то внизу, там где мы видим топики, на которые подписаны мы должны увидеть продублированное наше сообщение, как на скриншоте
Теперь мы будем иметь возможность шпионить за всеми топиками, в которых что-либо будет опубликовано и, при необходимости, публиковать и свои данные.
Обсуждение mqtt-spy на нашем форуме
Пишем прошивку в Arduino IDE, подключаем ESP8266 к mosquitto
Для реализации наших планов напишем прошивку для ESP8266 в Arduino IDE. Небольшую статью об Arduino IDE я уже публиковал — она наверняка сможет вам помочь. Установка Arduino IDE дополнительно описана и у нас на форуме или вы можете воспользоваться оригинальной документацией на английском
После установки Arduino IDE подключите библиотеку PubSubClient и залейте мой тестовый скетч mqtt.ino, откройте его в Arduino IDE, поправьте SSID и пароль WiFi сети, настроенной ранее на OpenWRT и заливайте в модуль. Если у вас все получилось, то в mqtt-spy вы увидите приходящие пакеты с ESP8266
Скетч отправляет пакет каждые 10 секунд — это удобно для отладки — не надо долго ждать. Если его настойчивость вас раздражает, то можете сами все поправить. Скетч предназначен только для демонстрации: его код я слепил из примера Ивана Грохоткова (igrr, автор Arduino IDE для ESP8266) и контрибьютера библиотеки PubSubClient — Imroy. Скетч тестировался мной сутками на Arduino IDE 1.6.4-758-ga194024 и PubSubClient версии 1.9, проявив завидную стабильность и надежность. Оставьте модуль ESP8266 включенным — пускай шлет данные в mosquitto — нам они скоро понадобятся.
Для отладки скетчей я использую свой ESPlorer даже не потому, что я его сам написал и поэтому очень люблю, а так совпало, что у него в терминальном окне подсветка синтаксиса в стиле LUA, так что простой текстовый вывод в терминале красиво подсвечивается. Мне, по крайней мере, он нравится много больше встроенного в Arduino IDE терминала.
Вообще, эту статью я начал писать еще пару месяцев назад, но столкнулся с проблемами нестабильности в ранних версиях, библиотека активно развивалась и я бросил это дело до лучших времен, которые вот сейчас и настали.
Точно такого же клиента, в принципе, можно слепить и на NodeMCU, но памяти останется меньше и придется делать на какой-то старой версии, потому что в актуальной прошивке mqtt клиент сломан при подписке более чем на один топик.
Все отлично, идем дальше.
Устанавливаем и настраиваем mqttwarn
Сейчас мы установим прекрасный пакет mqttwarn, который позволяет передавать данные c любого mqtt брокера практически куда угодно. Кроме того, что было анонсировано в начале этой статьи он еще умеет передавать данные в Google Docs, Asterics, FreeSwitch, pastebin — список просто огромен и может быть дополнен, если написать плагин для нового сервиса.
Для начала необходимо установить python и модули к нему. Помните — никакой командной строки — идем в меню люси Система — Программное обеспечение, фильтруем python и устанавливаем следующие пакеты:
1 2 3 4 5 6 7 |
python python-distutils python-email python-logging python-ncurses python-openssl python-pip |
и дополнительно
1 |
ca-certificates |
Скачиваем с гитхаба mqttwarn к себе на компьютер, распаковываем и с помощью Far Manager заливаем в каталог /overlay/mosquitto файл mqttwarn.py и полностью папку с плагинами services.
В mqttwarn не оказалось стартового скрипта для OpenWRT — мне пришлось написать его самому и сделать pull request, так что теперь он есть.
Копируем файл с локального компьютера /etc/OpenWRT.init на маршрутизатор под именем mqttwarn в каталог /etc/init затем через mc делаем File — ChMod и отмечаем галочками три пункта execute/search так чтобы справа получилось число 100755. В люси Система — Загрузка и включаем автозагрузку mqttwarn. Запускать этот сервис пока не нужно.
Далее создаем в /overlay/mosquitto файл mqttwarn.ini следующего содержания:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
[defaults] hostname = 'localhost' port = 1883 username = test password = test clientid = 'mqttwarn' lwt = 'clients/mqttwarn' skipretained = False cleansession = True # MQTTv31 = 3 (default) # MQTTv311 = 4 protocol = 3 ; logging logformat = '%(asctime)-15s %(levelname)-5s [%(module)s] %(message)s' logfile = 'mqttwarn.log' ; one of: CRITICAL, DEBUG, ERROR, INFO, WARN loglevel = DEBUG ; name the service providers you will be using. launch = file, log, instapush, smtp, http, twitter [config:file] append_newline = True targets = { 'data' : ['/overlay/mosquitto/mqtt-data.log'], 'mqttwarn' : ['/overlay/mosquitto/mqttwarn.err'], } [config:log] targets = { 'info' : [ 'info' ], 'warn' : [ 'warn' ], 'crit' : [ 'crit' ], 'error' : [ 'error' ] } ; special config for 'failover' events [failover] targets = log:error, file:mqttwarn |
Предварительная настройка mqttwarn готова, теперь конфигурируем сервисы.
Обсуждение mqttwarn на нашем форуме
Передаем данные с ESP8266 на ThingSpeak
Если у вас еще нет аккаунта регистрируемся на thingspeak.com, создаем канал с произвольным именем, в канале задаем произвольные названия для Field1 и Field2. Тут же получаем Write API Key. Добавляем в /overlay/mosquitto/mqttwarn.init
1 2 3 4 5 6 7 8 9 10 11 |
[config:http] timeout = 60 targets = { #method #URL # query params or None # list auth 'thingspeak' : [ "get", "http://api.thingspeak.com/update?key=ВАШ API KEY&field1={micros}&field2={counter}", None, None ] } [/ESP8266/DATA] targets = http:thingspeak |
Не забудьте вставить ваш Write API Key.
Теперь запускаем через люси Система — Загрузка — mqttwarn Запустить и смотрим графики на ThingSpeak. Через некоторое время там начнут появляться наши данные.
Если данных нет, то смотрите /overlay/mosquitto/mqttwarn.log и /overlay/mosquitto/mqttwarn.err и проверяйте настройки еще раз.
Передача данных через HTTP GET и POST запросы — это наиболее универсальное средство подключения к удаленным сервисам для передачи данных с ESP8266. Аналогичным образом вы можете настроить передачу на narodmon и любые другие сервисы. Делитесь своими успехами в специальной теме mqttwarn
Передаем данные c ESP8266 по EMAIL
Идем на mail.ru, регистрируем новую почту. Мне повезло — адрес esp8266@mail.ru оказался еще свободным :)
Добавляем в mqttwarn.ini
1 2 3 4 5 6 7 8 9 10 |
[config:smtp] server = 'smtp.mail.ru:25' sender = "MQTTwarn " username = esp8266@mail.ru password = xxxxxxxxxxxxxxxx starttls = True targets = { 'notify' : [ '4refr0nt@gmail.com' ] } |
Подправляем секцию [/ESP8266/DATA]
1 2 |
[/ESP8266/DATA] targets = http:thingspeak, smtp:notify |
Перезагружаем mqttwarn и получаем каждые 10 секунд по письму :)
Передаем с ESP8266 на смартфон PUSH уведомления
Регистрируемся на сервисе instapush, делаем все по этой инструкции, кроме пункта 4. В пункте 2 Application Title — ESP8266, Domain — например, esp8266.ru В пункте 3 указываем в поле Event Title: alerts, в поле Trackers сначала вводим object и, не нажимая Enter, жмем на клаве TAB, затем сюда же вводим action и снова TAB, в поле Push Message вводим {object} — {action} далее кликаем Add Event. Идем Dashboards — Apps, кликаем по нашему приложению, жмем +Add Events, добавляем в Event Title — gpio, Trackers — status и жмем TAB, в Push Message вводим Status {status} далее кликаем Add Event. В итоге должно получиться вот так
Из вкладки Basic Info копируем AppID и AppSecret и в mqttwarn.ini добавляем
1 2 3 4 5 6 7 8 9 |
[config:instapush] appid = 'xxxxxxxxxxxxxxxxxxxxxx' appsecret = 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyy' targets = { # event # tracker 'alerts' : [ 'alerts', {"object":"counter", "action":'{counter}'}], 'gpio' : [ 'gpio' , {"status":'{status}'}] } |
Подправляем секцию [/ESP8266/DATA]
1 2 |
[/ESP8266/DATA] targets = http:thingspeak, smtp:notify, instapush:alerts |
На смартфон устанавливаем мобильное приложение
Залогиниваемся в мобильном приложении, перезагружаем mqttwarn и наслаждаемся уведомлениями, которые прилетают каждые 10 секунд :)
Управляем ESP8266 GPIO со смартфона
Идем на молодой «идиотский» стартап www.dioty.co регистрируемся, жмем Get Started и получаем данные облачного MQTT брокера
Построим бридж с нашего mosquitto на облачный MQTT DIoTY.
Добавляем в /etc/mosquitto/mosquitto.conf (префиксы меняете на свои)
1 2 3 4 5 6 7 8 9 10 11 |
connection dioty address mqtt.dioty.co:1883 topic ESP8266/CONTROL/# in 0 / /4refr0nt@gmail.com/ topic ESP8266/STATUS/# out 0 / /4refr0nt@gmail.com/ bridge_attempt_unsubscribe true notifications false start_type automatic remote_username ваш логин на DIoTY remote_password ваш пароль, который пришел в письме |
Перезапускаем mosquitto, идем в люси Статус — Системный журнал и ищем в логах что-то вроде этого
1 2 3 4 5 6 7 8 |
Wed Jun 3 09:04:26 2015 local5.debug mosquitto[19498]: Bridge local.OpenWrt.dioty doing local SUBSCRIBE on topic /ESP8266/STATUS/# Wed Jun 3 09:04:26 2015 local5.notice mosquitto[19498]: Connecting bridge dioty (mqtt.dioty.co:1883) Wed Jun 3 09:04:26 2015 local5.debug mosquitto[19498]: Bridge OpenWrt.dioty sending CONNECT Wed Jun 3 09:04:26 2015 local5.debug mosquitto[19498]: Received CONNACK on connection local.OpenWrt.dioty. Wed Jun 3 09:04:26 2015 local5.debug mosquitto[19498]: Bridge local.OpenWrt.dioty sending SUBSCRIBE (Mid: 1, Topic: /4refr0nt@gmail.com/ESP8266/CONTROL/#, QoS: 0) Wed Jun 3 09:04:26 2015 local5.debug mosquitto[19498]: Bridge local.OpenWrt.dioty sending UNSUBSCRIBE (Mid: 2, Topic: /4refr0nt@gmail.com/ESP8266/STATUS/#) Wed Jun 3 09:04:26 2015 local5.debug mosquitto[19498]: Received SUBACK from local.OpenWrt.dioty |
Если у вас все так же — поздравляю, вы построили MQTT Bridge. Коннектимся mqtt-spy к облачному брокеру DIoTY и подписывемся на топик, на который у нас есть права
1 2 |
/4refr0nt@gmail.com/# |
Проверяем мост. Нашему mosquitto через mqtt-spy публикуем топик
1 |
/ESP8266/STATUS/GPIO/4 |
В поле Data пишем — false, жмем Publish, переключаемся на вкладку с соединением DIoTY и убеждаемся, что то же самое false попало в облако в топик
1 |
/4refr0nt@gmail.com/ESP8266/STATUS/GPIO/4 |
Если да, то отлично, уже почти готово. Еще проверим, управляется ли ESP8266 GPIO4 по MQTT.
С помощью mqtt-spy на mosquitto публикуем топик /ESP8266/CONTROL/GPIO/4 c Data true — светодиод на GPIO4 должен загореться и в ответ должен прилететь топик /ESP8266/STATUS/GPIO/4 с Data {«status»:»LOW»}.
Пробуем потушить: /ESP8266/CONTROL/GPIO/4 false, светодиод тухнет и прилетает /ESP8266/STATUS/GPIO/4 с Data {«status»:»HIGH»}
В логах тоже все отображается:
Теперь то же самое будем делать намного проще и со смартфона.
Скачиваем мобильное приложение DIoTY
В мобильном приложении логинимся, жмем Menu — Add. Name заполняем gpio4 CONTROL, Type выбираем on-off switch в поле Topic пишем /4refr0nt@gmail.com/ESP8266/CONTROL/GPIO/4 жмем Save. Снова жмем Menu — Add, Name — gpio4 status, Type выбираем readonly value, Topic /4refr0nt@gmail.com/ESP8266/STATUS/GPIO/4 и жмем Save. Вот инструкция с картинками.
Правим секцию [/ESP8266/STATUS/GPIO/4]
1 2 3 |
[/ESP8266/STATUS/GPIO/4] targets = instapush:gpio |
Перезапускаем mqttwarn. Все. Теперь у вас должно получиться все точно так же, как на видео в начале статьи.
ESP8266 публикует в Twitter состояние GPIO
Сначала из консоли устанавливаем python-twitter
1 |
pip install python-twitter |
Регистрируем новый аккаунт в твиттере, привязваем его к номеру телефона (без этого нам не дадут зарегистрировать приложение). Дальше идем на apps.twitter.com, добавляем приложение. Обязательно к заполнению название, описание и сайт приложения. Можно заполнять хоть что — это ни на что не влияет. Далее идем на вкладку Keys And Access Tokens и копируем оттуда ключи для конфигурационного файла.
В /overlay/mosquitto/mqttwarn.ini добавляем
1 2 3 4 5 6 7 8 9 |
[config:twitter] targets = { 'tweet' : [ 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', # consumer_key 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', # consumer_secret 'ccccccccccccccccccccccccccccccccc', # access_token_key 'ddddddddddddddddddddddddddddddddd' # access_token_secret ] } |
Правим секцию [/ESP8266/STATUS/GPIO/4]
1 2 3 |
[/ESP8266/STATUS/GPIO/4] targets = instapush:gpio, twitter:tweet |
Перезапускаем mqttwarn, дергаем GPIO с телефона и смотрим твиты
Это далеко не единственный способ публиковать твиты — еще можете использовать возможности приложений ThingSpeak для получения аналогичного результата.
Поднимаем Dynamic DNS и делаем bridge с cloudmqtt
Не знаю зачем вам это может понадобится, но можно сделать так, чтобы не mosquitto инициировал бридж с другим брокером, а наоборот, облачный брокер подключался к mosquitto.
Если провайдер вам выдает динамический IP адрес, то вам поможет сервис Dynamic DNS. В люси устанавливаем пакеты
1 2 3 |
ddns-scripts luci-app-ddns luci-i18n-ddns-ru |
Регистрируемся на сайте noip.com — это один из немногих DDNS сервисов, который предоставляет услуги пока бесплатно, требуется лишь ежемесячно заходить в свой аккаунт продлевать бесплатную подписку. Полученные данные (имя хоста, например esp8266.ddns.net, имя пользователя и пароль) забиваем в новый пункт меню в люси — Сервисы — Динамический DNS. Тут единственная тонкость в том, что нужно в расширенных настройках IP address source выбрать URL, а ниже вписать http://checkip.dyndns.com иначе сервису DDNS будет передаваться ваш приватный адрес 192.168.1.100, а не внешний, присвоенный провайдером.
Сейчас ваш домашний роутер, который смотрит в интернет, вы (да и любой другой) смогут найти в сети по имени esp8266.ddns.net. Чтобы попасть на mosquitto из внешнего мира потребуется пробросить порт 1883 с роутера IoT на роутер, подключенный напрямую к интернету. Эта настройка зависит от модели роутера — у меня Asus. Захожу в Дополнительные настройки — Виртуальный сервер
Теперь соединения инициированные из интернета к esp8266.ddns.net:1883 будут автоматически пробрасываться на ваш роутер с mosquitto.
Теперь регистрируемся на CloudMQTT, заходим в консоль и в разделе Manage Bridges Connection URL вводим mqtt://test:test@esp8266.ddns.net:1883, Direction Both, а префиксы можно не указывать.
Сейчас вы можете посмотреть логи mosquitto на предмет входящих подключений, подключиться к CloudMQTT через mqtt-spy и погонять топики туда-сюда.
Следует заметить, что создание виртуальных серверов (проброска портов) потенциально снижает безопасность вашей локальной сети и делать ее имеет смысл, только если в этом есть реальная необходимость и вы понимаете что делаете.
Более предпочтительным и простым способом подключения к CloudMQTT является создание моста на стороне mosquitto — просто делаете ниже в mosquitto.conf еще одно соединение по аналогии с DIoTY.
Если вы найдете мобильное, десктопное или веб приложение, способное подключаться к CloudMQTT (точнее к любому MQTT брокеру) и интуитивно просто дергать за GPIO как в DIoTY, только с большим количеством возможностей — сообщите мне и я добавлю информацию в эту статью.
Важные замечания.
В этой статье приведены примеры, указаны направления, а не даны законченные решения. В статье и скетче не предусмотрено сохранение состояния GPIO в случае ребута (ждем когда в Arduino IDE будет реализована работа с файловой системой). Не затронуты вопросы повышения безопасности путем использования SSL. Не реализованы режимы сна для снижения энергопотребления в автономных устройствах. Однако, все описанное в этой статье реально работает и вполне может быть использовано в домашней автоматизации.
Купить эту желтенькую отладочную плату с ESP-12
Обсуждение этой статьи у нас на форуме
Обсуждение домашних IoT серверов
Обсуждение облачных IoT сервисов