ESP8266+mqtt mosquitto, instapush, twitter, SMTP, ThingSpeak

ESP8266 подключаемся к OpenWRT+Mosquitto+mqttwarn и передаем данные на ThingSpeak, EMAIL, Android, iOS, Twitter, CloudMQTT в 100 строчек кода в Arduino IDE

Вы уже поигрались с 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 и фанатом командной строки не являюсь, поэтому и вам постараюсь показать простые приемы, которые, возможно, и не блещут изяществом.

Русифицированный интерфейс OpenWRT

Русифицированный интерфейс OpenWRT

В принципе, все что будет описано в данной статье будет работать и на китайских роутерах за десять баксов, однако малый размер их оперативки существенно сужает возможность применения их в задачах, которые мы будем им ставить. Даже подключив свап раздел на 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 нового маршрутизатора.

Далее мы будем строить такую сеть:

IoT Home Network

ESP8266 IoT Home Network

Как видите, мы не будем вообще использовать функции маршрутизации IP пакетов, наш роутер будет работать в качестве Ethernet моста в той же подсети, что и остальные устройства. Это позволит нормально функционировать протоколу mDNS без пробрасывания UDP портов, отменит необходимость прописывать маршруты из локальной сети в сеть IoT, и при этом мы будем использовать DHCP сервер вашего основного маршрутизатора. Однако, самое главное, что мы получим в результате: две независимые WiFi сети. Это позволит нам переводить ESP8266 в режим 802.11b или 802.11g для снижения энергопотребления в случаях, когда не требуется высокая скорость подключения без ущерба в скорости для остальных WiFi устройств, требовательных к скорости подключения к интернет.

Обсуждение вопросов настройки OpenWRT на нашем формуме

В итоге должно получиться что-то вроде этого (кстати, приколитесь в каком радиовакууме я живу)

WiFi

WiFi

Gl.iNET+OpenWRT

Gl.iNET+OpenWRT

Настраиваем OpenWRT

Этот раздел я писал по памяти, за точность и правильную последовательность действий не ручаюсь. В ваших интернетах полно статей как это сделать. Если вы обнаружили неточность или ошибку то, пожалуйста, сообщите мне об этом, я поправлю статью.

Перед отключением от локальной сети и интернета (напоминаю, что наш OpenWRT роутер будет иметь адрес 192.168.1.1), я рекомендую приготовить следующие программы:

Любой SSH клиент, мне наиболее симпатичен putty. Желательно погуглить про SSH, putty и ключи и сгенерировать собственный ключ — это существенно упростит вам жизнь, но можно обойтись и без этого. Если вы пользуетесь хостингом или уже имеете свой домашний выделенный linux сервер, то такой ключ у вас, наверняка, уже есть.

Любой SFTP клиент, мне больше нравится Far Manager — мы будем редактировать файлы на OpenWRT не через редактор vi, который встроен в OpenWRT, но абсолютно неудобен для обычных людей. Хотя, наверное, линукс гуру со мной не согласятся.

Мне было проще подключиться к роутеру через USB-TTL и все настроить в терминале

Первым делом установим соединение с интернетом:

 Проверяем интернет

Если яндекс пингуется, то жмем CTRL+C

Задаем пароль root

Подключаемся по SSH к 192.168.1.100, попадаем в командную строку терминала. При возникновении проблем — гуглим.

Обновляем список доступных пакетов (это требуется после каждой перезагрузки, если хотим что-то установить, но больше вручную ее вводить не придется — скоро мы установим веб-интерфейс)

Ждем пока все подгрузится, затем

Люся — наша лучшая подруга! Запускаем браузер, заходим на 192.168.1.100 и видим приглашение OpenWRT. Отлично, теперь установим русскоязычный интерфейс.

Идем по меню System — Software — Filtr вводим -ru жмем поиск. Переключаем вкладку на доступные пакеты и ищем luci-i18n-base-ru — вот его и устанавливаем. Обновите страницу после установки (не торопитесь — требуется некоторое время для скачивания и установки пакета), всё — русификация завершена — можете обновить страницу.

Сейчас нужно, чтобы люся сама загружалась при старте роутера — идем в Система — Загрузка и ищем uhttpd — если на кнопке красный крестик и надпись Отключено, то жмем по нему — всё, автозапуск включен.

Дальше я рекомендую настроить Far Manager, а точнее его встроенный плагин NetBox.

far netbox

far netbox

Для того, чтобы мы могли передавать/принимать файлы с OpenWRT через sftp устанавливаем пакет

Фаром подключаетесь к 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 жмите

Просто убедимся, что места у нас полно. Вот у меня для примера свободно более 500 мегов.

Сейчас можно не скупиться и поставить все, что потребуется.

Идем в Система — Программное обеспечение, фильтруем mc, устанавливаем замечательный файловый менеджер, чтобы потом не делать файловые операции из командной строки.

Еще можно установить htop — отличная утилита, интерактивно показывающая загрузку системы и использование памяти

Да хоть и mysql-server, если вам требуется запись в БД ваших данных. В общем, тут уже все индивидуально.

На этом первоначальная настройка OpenWRT завершена.

Настраиваем MQTT брокер mosquitto

Немного расскажу по-простому о протоколе MQTT. Представьте интернет-форум вроде нашего. В нем есть темы (топики). Если вас интересует какой-то топик, то вы на него подписываетесь и вам приходят уведомления об изменениях. Также вы можете публиковать свои посты в топиках, такие уведомления придут и тем, кто подписан на топик, в котором вы опубликовали пост. Топики многоуровневые. Точно также и в MQTT — топики, подписка, публикация. Если вы публикуете в топик, которого не существует, то он создается и становится точно таким-же по свойствам, что и другие. Все это справедливо, если у вас есть права на чтение и/или запись конкретного топика или всех.

Устанавливаем mosquitto через Система — Программное обеспечение, включаем автозапуск. Можно установить все пакеты, у которых в названии есть mosquitto и нет nossl.

Через FarManager или vi редактируем файл /etc/mosquitto/mosquitto.conf

Ищем раздел, где log_dest и добавляем ниже строку

Аналогично делаем

Позаботимся о безопасности даже если вам это кажется не нужным (в примерах далее будут прописаны пользователи и пароли и не будут использованы анонимные подключения)

Сохраняем mosquitto.conf

Теперь создадим необходимые каталоги с помощью mc или командной строки

Для создания пользователей и генерации паролей необходимо установить пакет mosquitto-client. После установки используйте утилиту mosquitto-passwd. Или можете применить грязный хак. Скачиваем win версию mosquitto к себе на комп и с помощью mosquitto_passwd.exe создаем пользователей. Я эту работу сделал за вас, поэтому просто скопируйте эту строчку в пустой файл /overlay/mosquitto/users.list

В одну строку без переносов. Это мы определили пароль test пользователю test. Еще создаем файл /overlay/mosquitto/mosquitt.acl следующего содержания

Это мы даем права на чтение и запись юзеру 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 группы пока еще пустых полей:

  1. Publish message — для публикации топиков
  2. Define new subscribtion — подписка на топики
  3. Вкладка All в которой мы увидим топики, на которые подпишемся
  4. Ниже увидим сообщения из топиков, на которые мы подписались.

Для начала подпишемся на все топики. В поле Define new subscribtion вводим единственный символ # и жмем Subscribe. Должна появиться вкладка #. Итак мы подписаны на все топики, теперь попробуем что-либо опубликовать. В верхнее поле Publish message — Topic вводим название нашего топика, например esp8266, а в поле Data вводим Hello world! и жмем Publish. Если все сделали правильно, то внизу, там где мы видим топики, на которые подписаны мы должны увидеть продублированное наше сообщение, как на скриншоте

mqtt-spy hello world

mqtt-spy hello world

Теперь мы будем иметь возможность шпионить за всеми топиками, в которых что-либо будет опубликовано и, при необходимости, публиковать и свои данные.

Обсуждение 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

esp8266 передает данные mosquitto

esp8266 передает данные mosquitto

Скетч отправляет пакет каждые 10 секунд — это удобно для отладки — не надо долго ждать. Если его настойчивость вас раздражает, то можете сами все поправить. Скетч предназначен только для демонстрации: его код я слепил из примера Ивана Грохоткова (igrr, автор Arduino IDE для ESP8266) и контрибьютера библиотеки PubSubClient — Imroy. Скетч тестировался мной сутками на Arduino IDE 1.6.4-758-ga194024 и PubSubClient версии 1.9, проявив завидную стабильность и надежность. Оставьте модуль ESP8266 включенным — пускай шлет данные в mosquitto — нам они скоро понадобятся.

Для отладки скетчей я использую свой ESPlorer даже не потому, что я его сам написал и поэтому очень люблю, а так совпало, что у него в терминальном окне подсветка синтаксиса в стиле LUA, так что простой текстовый вывод в терминале красиво подсвечивается. Мне, по крайней мере, он нравится много больше встроенного в Arduino IDE терминала.

esplorer mqtt

esplorer mqtt

Вообще, эту статью я начал писать еще пару месяцев назад, но столкнулся с проблемами нестабильности в ранних версиях, библиотека активно развивалась и я бросил это дело до лучших времен, которые вот сейчас и настали.

Точно такого же клиента, в принципе, можно слепить и на NodeMCU, но памяти останется меньше и придется делать на какой-то старой версии, потому что в актуальной прошивке mqtt клиент сломан при подписке более чем на один топик.

Все отлично, идем дальше.

Устанавливаем и настраиваем mqttwarn

Сейчас мы установим прекрасный пакет mqttwarn, который позволяет передавать данные c любого mqtt брокера практически куда угодно. Кроме того, что было анонсировано в начале этой статьи он еще умеет передавать данные в Google Docs, Asterics, FreeSwitch, pastebin — список просто огромен и может быть дополнен, если написать плагин для нового сервиса.

Для начала необходимо установить python и модули к нему. Помните — никакой командной строки — идем в меню люси Система — Программное обеспечение, фильтруем python и устанавливаем следующие пакеты:

и дополнительно

Скачиваем с гитхаба 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. Запускать этот сервис пока не нужно.

OpenWRT init

OpenWRT init

Далее создаем в /overlay/mosquitto файл mqttwarn.ini следующего содержания:

Предварительная настройка mqttwarn готова, теперь конфигурируем сервисы.

Обсуждение mqttwarn на нашем форуме

Передаем данные с ESP8266 на ThingSpeak

Если у вас еще нет аккаунта регистрируемся на thingspeak.com, создаем канал с произвольным именем, в канале задаем произвольные названия для Field1 и Field2. Тут же получаем Write API Key. Добавляем в /overlay/mosquitto/mqttwarn.init

Не забудьте вставить ваш Write API Key.

Теперь запускаем через люси Система — Загрузка — mqttwarn Запустить и смотрим графики на ThingSpeak. Через некоторое время там начнут появляться наши данные.

ESP8266+Mosquitto+mqttwarn+ThingSpeak

ESP8266+Mosquitto+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

Подправляем секцию [/ESP8266/DATA]

Перезагружаем 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. В итоге должно получиться вот так

instapush

instapush

Из вкладки Basic Info копируем AppID и AppSecret и в mqttwarn.ini добавляем

Подправляем секцию [/ESP8266/DATA]

На смартфон устанавливаем мобильное приложение

AppStore     AndroidStore

Залогиниваемся в мобильном приложении, перезагружаем mqttwarn и наслаждаемся уведомлениями, которые прилетают каждые 10 секунд :)

Adroid Instapush

Adroid Instapush

Управляем ESP8266 GPIO со смартфона

Идем на молодой «идиотский» стартап www.dioty.co регистрируемся, жмем Get Started и получаем данные облачного MQTT брокера

DIoTY.co

DIoTY.co

Построим бридж с нашего mosquitto на облачный MQTT DIoTY.

Добавляем в /etc/mosquitto/mosquitto.conf (префиксы меняете на свои)

Перезапускаем mosquitto, идем в люси Статус — Системный журнал и ищем в логах что-то вроде этого

Если у вас все так же — поздравляю, вы построили MQTT Bridge. Коннектимся mqtt-spy к облачному брокеру DIoTY и подписывемся на топик, на который у нас есть права

Проверяем мост. Нашему mosquitto через mqtt-spy публикуем топик

В поле Data пишем — false, жмем Publish, переключаемся на вкладку с соединением DIoTY и убеждаемся, что то же самое false попало в облако в топик

Если да, то отлично, уже почти готово. Еще проверим, управляется ли 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»}

В логах тоже все отображается:

esplorer dioty.co

esplorer dioty.co

Теперь то же самое будем делать намного проще и со смартфона.

Скачиваем мобильное приложение DIoTY

AppStore     AndroidStore

В мобильном приложении логинимся, жмем Menu — Add. Name заполняем gpio4 CONTROL, Type выбираем on-off switch в поле Topic пишем /4refr0nt@gmail.com/ESP8266/CONTROL/GPIO/4 жмем Save. Снова жмем Menu — Add, Namegpio4 status, Type выбираем readonly value, Topic /4refr0nt@gmail.com/ESP8266/STATUS/GPIO/4 и жмем Save. Вот инструкция с картинками.

Правим секцию [/ESP8266/STATUS/GPIO/4]

Перезапускаем mqttwarn. Все. Теперь у вас должно получиться все точно так же, как на видео в начале статьи.

ESP8266 публикует в Twitter состояние GPIO

Сначала из консоли устанавливаем python-twitter

Регистрируем новый аккаунт в твиттере, привязваем его к номеру телефона (без этого нам не дадут зарегистрировать приложение). Дальше идем на apps.twitter.com, добавляем приложение. Обязательно к заполнению название, описание и сайт приложения. Можно заполнять хоть что — это ни на что не влияет. Далее идем на вкладку Keys And Access Tokens и копируем оттуда ключи для конфигурационного файла.

В /overlay/mosquitto/mqttwarn.ini добавляем

Правим секцию [/ESP8266/STATUS/GPIO/4]

Перезапускаем mqttwarn, дергаем GPIO с телефона и смотрим твиты

ESP8266 Twitter

ESP8266 Twitter

Это далеко не единственный способ публиковать твиты — еще можете использовать возможности приложений ThingSpeak для получения аналогичного результата.

Поднимаем Dynamic DNS и делаем bridge с cloudmqtt

Не знаю зачем вам это может понадобится, но можно сделать так, чтобы не mosquitto инициировал бридж с другим брокером, а наоборот, облачный брокер подключался к mosquitto.

Если провайдер вам выдает динамический IP адрес, то вам поможет сервис Dynamic DNS. В люси устанавливаем пакеты

Регистрируемся на сайте 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. Захожу в Дополнительные настройки — Виртуальный сервер 

Virtual Server

Virtual Server

Теперь соединения инициированные из интернета к 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

Обсуждение этой статьи у нас на форуме

Обсуждение mqttwarn

Обсуждение Arduino IDE

Обсуждение домашних IoT серверов

Обсуждение облачных IoT сервисов