- esp8266 — Сообщество разработчиков
- Свой собственный облачный MQTT брокер с поддержкой WebSockets, сертификатами LetsEncrypt, мониторингом и визуализацией в Grafana и сохранением данных в Influx. Бесплатно и навсегда
- Получаем VPS сервер бесплатно и навсегда
- Получаем домен второго уровня бесплатно
- ESP + MQTT как основа умного дома
- Настройка Arduino IDE
- Скетч для MQTT
- Настройка клиента на телефоне
- Умный дом на ESP32 через протокол MQTT
esp8266 — Сообщество разработчиков
Свой собственный облачный MQTT брокер с поддержкой WebSockets, сертификатами LetsEncrypt, мониторингом и визуализацией в Grafana и сохранением данных в Influx. Бесплатно и навсегда
Уровень сложности для продвинутого пользователя ПК: средний. Потребуются навыки работы с командной строкой linux через SSH, возможно понадобится изучение технической документации на английском языке. Хочу предупредить, что эта статья не туториал для начинающих, в котором достаточно скопировать все команды из статьи в консоль и все заработает. То, что мы будем делать, потянет на тестовое задание для начинающего DevOps инженера. Может быть я упустил что-то очевидное для меня и Вам придется немного поработать напильником. Ориентировочное время: от 1 часа до бесконечности, в зависимости от Ваших навыков и желания учиться.
TLDR; Получаем бесплатный VPS сервер, бесплатный домен 2 уровня и запускаем docker контейнеры: portainer, nginx, certbot, RabbitMQ, Grafana, Prometheus, Telegraf, InfluxDB с помощью docker-compose файла, который я заботливо приготовил для Вас.
Для домашней автоматизации часто необходим MQTT брокер, который должен быть доступен из интернета. Поднимать брокер на RaspberryPi и пробрасывать порты во внешний мир через домашний роутер — можно, но это далеко не идеальное решение (еще и валидные сертификаты при этой схеме непросто получить), а вот построить bridge (мост) между домашним брокером и облачным, чтобы иметь доступ и из дома и из любой точки мира и не оказаться в «умершем умном доме» при отсутствии интернета — неплохое решение.
Раньше в качестве облачного бесплатного брокера использовали CloudMQTT.com, но недавно эта компания прекратила регистрацию новых бесплатных инстансов и оставила возможность только платной регистрации.
Чаще всего, в качестве MQTT брокера разворачивают mosquitto — это отличный быстрый брокер, не требующий излишних вычислительных ресурсов. Но есть у него и недостатки — список пользователей и их права доступа необходимо прописывать в текстовых файлах. Я предлагаю Вам пострелять из пушки по воробьям и использовать в качестве MQTT сервера брокер сообщений RabbitMQ, который имеет плагин MQTT в базовой поставке и простой WEB интерфейс для настройки и управления пользователями.
Также мы будем использовать Prometheus плагин для RabbitMQ, для мониторинга состоянии брокера и ресурсов, которые он использует.
RabbitMQ написан на языке erlang, позволяет объединять брокеры в кластер, успешно используется во многих коммерческих проектах.
RabbitMQ имеет и другие замечательные возможности (очереди, например), но описание этих возможностей выходит за рамки данной статьи и я предлагаю Вам самостоятельно их изучить, если будет интересно.
Для полноценного использования MQTT мы настроим автоматическое получение бесплатных SSL(TLS) сертификатов LetsEncrypt, подключение WebSockets (MQTT over WebSockets), настроим WEB сервер nginx, так что сделать еще и собственный сайт — дело пяти дополнительных минут.
Современные DevOps инженеры не представляют свою работу без контейнеров, поэтому и мы будем использовать best practices — развернем весь необходимый софт в контейнерах. Я не фанатичный линуксоид, который признает исключительно командную строку в терминале, поэтому для обычных людей установим Portainer — удобный WEB интерфейс для управления docker контейнерами.
Раз уж мы используем Prometheus для мониторинга брокера, то установим и node-exporter для мониторинга нашего VPS сервера.
Также мы, легким движением руки, реализуем задачу сохранения MQTT сообщений в базе данных InfluxDB, используя для этого Telegraf.
Вишенкой на торте будет визуализация данных в одном из самых популярных современных продуктов — Grafana. Там мы увидим статистику и нашего VPS сервера и статистику RabbitMQ и сами данные, полученные по MQTT. По факту, мы сделаем собственный универсальный dashboard (точнее, можем сделать множество наборов панелей, в зависимости от задач), переплюнув популярные облачные сервисы.
Grafana: мониторинг VPS
Grafana: мониторинг RabbitMQ
Grafana: визуализация MQTT данных
Получаем VPS сервер бесплатно и навсегда
Здесь я не буду останавливаться подробно — Вы сможете без труда найти статьи как это сделать. Мне понравились VPS, которые предоставляет Oracle — они дают две виртуальных машины и у них 1Gb RAM в каждой, а для нашего проекта 512 может не хватить.
Активация аккаунта Oracle для получения бесплатной виртуальной машины требует международную карту Visa/MasterCard типа WORLD с балансом не менее 100 рублей (списанные средства будут возвращены, это необходимо для верификации карты и владельца). Проверить тип Вашей карты можно заранее на любом сервисе по BIN коду (первые 6 цифр карты), в строке Категория карты должно быть WORLD.
Могу сказать, что эта акция на бесплатные VPS действующая, я зарегистрировал такой аккаунт неделю назад (август 2020).
На этапе выбора образа для виртуалки выберите Ubuntu 20.04 или любой другой дистрибутив linux, если обоснованно считаете это необходимым.
На окончании этого шага Вы должны получить доступ по SSH к новой виртуалке и знать ее внешний (публичный) IP адрес (не пугайтесь, с настройками по умолчанию этот адрес не пингуется из интернета). Для новичков могу сообщить, что приватные (частные) IP адреса начинаются на 10. и выглядят, например, так 10.0.0.15 (есть и другие частные подсети, погуглите) Нам нужен не этот адрес, а другой, общедоступный IP-адрес.
Получаем домен второго уровня бесплатно
Если у Вас уже есть собственный домен и DNS, тогда вы должны создать DNS запись типа А и вписать туда общедоступный IP-адрес VPS. После этого можете переходить к следующему пункту.
Если у Вас еще нет собственного домена, то идем на Freenom.com (кредитная карта не понадобится) подбираем свободный домен и регистрируем его. Большинство доменов, даже 4-х буквенные бесплатны, кроме премиальных (по мнению авторов сервиса). Регистрация аккаунта происходит в момент регистрации домена, также пусть вас не смущает кнопка Оформить заказ — да, для регистрации бесплатного домена нужно оформить заказ. Еще не забудьте указать, что регистрируете домен на 12 месяцев (по умолчанию регистрируют только на 3).
Регистрация бесплатного домена
В момент регистрации домена (на большом мониторе, а не на маленьком как у меня на скриншоте) вы можете сразу указать общедоступный IP адрес вашей виртуалки для нового доменного имени. Указать его нужно два раза (обычно для каждого WEB сервера создается две DNS записи: первая только с именем домена и вторая www.+имя домена). Если у Вас нет поля для ввода IP адреса при регистрации, то ничего страшного, Вы сможете это сделать после регистрации.
После регистрации домена и аккаунта на freenom нужно залогиниться и перейти в меню Services — My Domains — напротив Вашего домена нажать Manage Domain, выбрать вкладку Manage Freenom DNS, ввести два раза общедоступный IP-адрес в поле Target и сохранить изменения.
Дальше можете подождать и попить кофе пока обновится кэш DNS.
Успешным результатом этого шага станет возможность подключаться по SSH к Вашей VPS не только по общедоступному IP-адресу, но и по доменному имени.
Источник
ESP + MQTT как основа умного дома
Платы ESP8266 стали очень популярны из-за своей низкой цены и совместимостью с Arduino IDE. Для решения задач устройств «Умного дома» они просто идеальны. ESP требует только подключения питания, а сбор и отправку данных она может осуществлять по Wi-Fi через домашний роутер.
Одним из популярных открытых протоколов связи для Умного дома является MQTT. Его основа — обычные http(s) сокет соединение. Протокол по сути дела описывает лишь язык, а не способ доставки данных. MQTT требует наличие сервера — брокера, который объединяет подключенные устройства в сеть. Сами же устройства при подключении подписываются на топики в которых отсылаются данные и брокер отсылает только те топики устройству, которые ему нужны.
Получить к возможность подключиться к брокер серверу можно двумя способами: воспользоваться бесплатными MGTT брокерами или поднять свой собственный сервер (путь самурая).
Первый вариант самый простой. Из бесплатных я бы рекомендовал cloudmqtt.com. Там есть ограничения по количеству устройств и запросов, но для домашнего использования этого более чем достаточно. При регистрации выдается логин, пароль, сервер к которому нужно делать коннект, тип соединения (с/без ssl).
Свой брокер поднять не на много сложнее. Дольше уйдет время на настройку окружения, чем на поднятие брокера. Сделать это можно на nodeJs с npm пакетом mqtt. Примеры можно посмотреть на сайте расширения. Но это уже выходит за рамки данной статейки.
Вернемся к нашей ESP. Из этих устройств мы соберем периферию по сбору данных. Для реализации устройств удобно использовать модуль ESP8266 ESP-12. Он имеет встроенный стабилизатор на 3.2 вольта и множество свободных GPIO для подключения периферии. Цена так себе, если паяльник не вызывает страха, то можно замутить на 01/07 модулях. На али такие меньше чем за 2$ за штуку можно отхватить.
Настройка Arduino IDE
Для прошивки ESP будем использовать Arduino IDE. Просто так взять и залить скетч нельзя. Для начала нужно подготовить настроить IDE для работы с платой ESP.
Запускаем наше IDE и идем в Файл — Настройки.
Прописываем ссылку на менеджер плат http://arduino.esp8266.com/stable/package_esp8266com_index.json
Теперь выбираем Инструменты — Плата — Менеджер плат. В конце списка мы увидим esp8266 by esp8266 Community.
Выбираем последнюю версию и жмем Установить.
Esp прошивает на другой скорости чем чипы Atmega и по тому нам нужно в первую очередь изменить скорость uart. Инструменты — Upload Speed:-115200:
Не забываем задать тип платы: Инструменты — Generic ESP8266 Module.
Ну и все, наше IDE готово загружать скетч в ESP. Если вы счастливый обладатель ESP8266 ESP-12 — переключаем в режим программирования, тыкаем usb, выбираем COM порт и погнали. Если плата попроще (ESP8266-01), не беда. Подключаем GPIO0 на землю, USB-UART «свисток», подаем стабильные 3.2 вольт и наша дешевая плата тоже готова принять скетч. Распиновка подключения для 01:
Скетч для MQTT
Наша демонстративная схема будет лишь отдавать данные брокеру через равные промежутки времени и слушать топики, на которые подписана.
Код выполняет соединение к Wi-Fi точке доступа в квартире, через интернет соединяется к брокер серверу. Подписывается на топики test/1 и test/2. Отсылает раз в 3 секунды значение системного счетчика. В общем, ничего лишнего.
Брокер сервер работает таким образом, что на устройство будут отправлены только те топики на которое он подписан. Таким образом, мы не перегружаем сеть лишними данными.
Настройка клиента на телефоне
Скачиваем приложение в маркетплейсе Android/iPhone — IoT MQTT Dashboard или любое аналогичное. Они все работают одинаково.
В запущенном приложении нужно задать хост, логин, пароль, порт брокер-сервера.
Далее мы попадаем на страницу подписок. Задаем наши два топика «test/1» и «test/2» — теперь мы всегда будем видеть последние присланные значения этих топиков. Это может быть температура воздуха или влажность земли в теплице. Есть поддержка передачи изображения в base64, но это уже совсем другая история.
На втором экране мы можем создать управляемые контролы: кнопки, переключатели, выбор цвета, мультиселек, поле ввода текста. Добавляем переключатели и вбиваем в них наши топики «test/1» и «test/2». Запускаем и видим как переключение топиков сразу же вываливает в консоль UART микроконтроллера ответы. Колдунство!
Данная инструкция открывает простор перед фантазией разработчика. С ее помощью можно сделать компоненты умного дома, которые будут управлять RGB лентой, защищать квартиру от протечек, управлять пелетным/газовым котлом и многое другое.
Источник
Умный дом на ESP32 через протокол MQTT
На данный момент существует много протоколов для Интернета вещей: CoAP, MQTT, AMQP… В этом руководстве познакомимся с протоколом MQTT – это один из хорошо известных протоколов Интернета вещей. Он предназначен для управления данными и их передачи между устройствами в сети Интернета вещей.
MQTT расшифровывается как Message Queuing Telemetry Transport (Передача телеметрии очередью сообщений).
Протокол имеет следующие основные особенности:
- используется механизм издатель/подписчик/топик;
- асинхронный протокол;
- компактные пакеты;
- работает поверх стека TCP/IP;
- требуется меньшая пропускная способность сети и может работать в условиях нестабильного канала передачи данных.
В основе работы протокола MQTT лежит традиционная модель клиент-сервер. Согласно этой модели, есть один сервер (также называемый брокером) и много клиентов. Клиенты всегда поддерживают связь с сервером. Задачами сервера (брокера) являются фильтрация и передача сообщений для клиентов-подписчиков.
Связь между клиентами основана на механизме издатель / подписчик / топик, в котором:
- сообщениям присваивают топик;
- издатель отправляет сообщения в сеть;
- подписчик ожидает сообщения, содержащие нужный ему топик;
- брокер координирует связь между издателями и подписчиками.
Топик представляет собой строку символов в кодировке UTF‑8 и состоит из одного или нескольких уровней, которые разделены между собой символом «/». Например: «этаж1 / комната1 / температура»: этот топик состоит из трёх уровней, лёгко понимаемых человеком (это этаж 1, комната 1 и температурный датчик).
Кроме этого существуют ещё некоторые термины, о которых необходимо знать:
QoS (Quality of Service – качество обслуживания): неформально, этот показатель обозначает вероятность прохождения пакета между двумя точками сети. Существуют следующие модели QoS:
- QoS 0 — на этом уровне издатель отправляет пакет брокеру без подтверждения доставки (этот уровень самый быстрый, но ненадёжный);
- QoS 1 — на этом уровне пакеты гарантированно доставляется брокеру, но существует вероятность дублирования сообщения от издателя. После получения дублированного сообщеня брокер заново делает рассылку подписчикам, издателю снова отправляет сообщение о получении. В случае если издатель не получает PUBACK сообщения от брокера, то осущуствляется повторная отправка пакета, а DUP присваивается значение “1”. Этот уровень используется по умолчанию.
- QoS 2 — гарантируется доставка сообщений подписчику и исключается вероятность дублирования отправленных пакетов. Здесь издатель отправляет пакет брокеру. Указывается уникальный PacketID, QoS=2 и DUP присваевается значение “0”. До тех пор, пока от брокера не получен ответ PUBREC издатель хранит сообщение неподтверждённым. Брокер должен ответить сообщением PUBREC, которое содержит тот же PacketID. ПРосле того, как пакет получен, издатель отправляет с тем же PacketID PUBREL. Пока брокер не получил PUBREL он хранит пакет у себя. После получения PUBREL копия сообщения удаляется, а издателю отправляется PUBCOMP об успешном завершении транзакции. Это самый надёжный уровень, но самый медленный.
Сохраняемые сообщения: брокер сохраняет такие сообщения после отправки, поэтому если появиться новый подписчик, интересующийся топиком этого сообщения, то оно будет отправлено ему.
Большинство библиотек, реализующих протокол MQTT, определяют несколько стандартных методов, таких как:
- Connect(): подключиться к серверу.
- Disconnect(): отключиться от сервера.
- Subscribe(): подписаться на топик сообщений, идущих от сервера.
- UnSubscribe(): отписаться от топика сообщений, идущих от сервера.
- Publish(): публикация клиентом топика в сеть.
Для демонстрационного примера мы создали простую сеть для Умного дома с тремя узлами-клиентами (смартфон, микропроцессорное управляющее устройство с интерфейсом Wi‑Fi и датчиком температуры, микропроцессорное управляющее устройство с интерфейсом Wi‑Fi и светодиодом (лампой)) и одним узлом-сервером, служащим в качестве брокера (ПК или плата Raspberry Pi).
В нашем случае мы хотим использовать смартфон для отслеживания температуры и управления (включение и выключение) светодиодом или лампой. Поэтому мы создали систему с реализацией протокола MQTT, описанную ниже.
Источник