Создание метеостанции с поддержкой Homekit с использованием Homebridge и ESP8266

Осторожно, к этой статье есть продолжение.

— — — —

Моя жена любит выращивать овощи на нашем балконе. Проблема с этим, однако, в том, что нужно также поливать растения (проблемы первого мира, верно?)

Прошлым летом, как технический специалист, я немного сошел с ума и создал решение с поддержкой Homekit для полива растений. Каждый день в 8 утра и 7 вечера пару минут поливал растения.

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

Я хотел решить эту проблему с минимальными усилиями (и затратами), но покупка датчика дождя с поддержкой Homekit оказалась на удивление дорогой. Единственный, который я нашел, был датчик дождя Netatmo (~ 70 €).

Вот почему я решил построить свою собственную систему.

Несколько ключевых моментов, которые он должен выполнять

  • обнаружение дождя и сообщить об этом Homekit
  • измерение температуры, создание диаграммы из исторических значений и информирование Homekit о текущей температуре
  • Использование как можно меньшего количества энергии
  • Использование аккумулятора/Powerbank для перемещения системы в любое место

Части

Я решил использовать ESP8266, так как я могу использовать Arduino IDE, а поддержка сообщества великолепна. Кроме того, он потребляет очень мало энергии, а количество совместимых датчиков чрезвычайно велико.

Следующий список содержит ссылки на Amazon, чтобы упростить покупку деталей, которые я использовал, однако на вашем месте я бы подумал о покупке их на Ebay или Wish, так как они намного дешевле, чем покупка на Амазоне.

В целом, вы не должны тратить больше, чем максимум 15 €, возможно, меньше…

Подготовка

Я не буду подробно объяснять, как настроить Arduino IDE, это довольно просто. Если вам нужно руководство, вы можете следовать этому.

После настройки IDE и включения ESP я хотел начать с простого, как и все, и заставить светодиод мигать. Вот тут-то все и пошло не так.

Проблема I, поиск соответствующего USB-драйвера

Я использовал MacBook с Mac OS BigSur 11.0.1. Поиск нужного драйвера был не самой большой проблемой после проверки чипа на ESP (скорее всего это чипсет CH340), однако установка драйвера была кашей, так как драйвер не был обновлен для Big Sur, но Apple решила усилить безопасность для расширений ядра. В результате я не смог установить драйвер, так как не смог утвердить расширение ядра в настройках безопасности. Помогло только отключение проверки целостности системы, установка драйвера и включение обратно.

Проблема II, Mac не обнаруживает ESP8266

Да, я установил правильный драйвер и да, я пробовал 4 разных кабеля. Ах да, у меня было предположение, что я сломал ESP и купил новый. Я даже проверял исходники драйверов. Выяснилось, что ESP был в полном порядке, но проблема заключалась в кабелях. Поскольку у Macbook есть только порты USB-C, а у меня были только кабели USB-A к Micro-USB, я использовал ключ. Этот, похоже, прервал связь. Покупка нового кабеля, который напрямую использовал USB-C, устранила проблему. Мне потребовалось 4 дня, чтобы выяснить это. (См. список деталей)

Проблема III, Powerbank отключается через x минут

Я немного забегаю вперед, но мне кажется, что это еще одна важная тема для разговора. Если вы хотите, чтобы ESP работал от батареи, вам нужно решить пару проблем. Помимо очевидного факта, что вам нужно экономить электроэнергию везде, где это возможно (Глубокий сон), вы должны что-то использовать, например. Powerbank для запуска ESP, и вот тут-то и начинается самое интересное. В настоящее время Powerbanks предназначены для зарядки смартфонов и тому подобного. Powerbank старается экономить электроэнергию, где это возможно, поэтому в 99% из них реализован режим «автоматического выключения». Это означает, что если Powerbank заметит, что потребляемая мощность практически отсутствует, он отключится. Поскольку ESP потребляет слишком мало энергии, Powerbank отключится. Существуют хаки, как вы можете обойти это, но все они включают потребление дополнительной энергии, чтобы отключить режим автоматического выключения. К счастью, у меня был очень старый Powerbank (старый рекламный подарок), в котором не было функции автоматического отключения. Если у вас его нет, вам следует подумать о том, чтобы взглянуть на раздел частей этой статьи, я добавил альтернативу, которая использует 4 батареи AA для USB. Вы наверняка можете создать множество различных решений, я нашел это самым быстрым и простым.

После того, как я исправил эти проблемы, я, наконец, смог приступить к реальной работе.

Требования

Поскольку Homekit не может отображать исторические данные, мне пришлось придумать небольшой обходной путь. Кроме того, поскольку я запускал ESP от батареи, я хотел знать текущее состояние батареи.

  • Использование Homebridge в качестве приемника данных датчиков
  • Имея исторические данные о температуре и о том, сколько энергии у меня осталось в Powerbank

Если бы я не хотел иметь исторические данные, все было бы проще, ESP просто отправил бы данные в Homebridge и все.

Это архитектура, которую я использую для включения как исторических данных, так и пересылки данных в Homekit.

Строительство

Начнем с процесса сборки. Для следующего объяснения я ожидаю, что вы в основном скопируете мою настройку. Чтобы это работало, вам нужно иметь возможность развернуть сервер nodeJS где-нибудь в качестве конечной точки для ESP (для хранения данных о температуре и энергопотреблении для исторических диаграмм).

Аппаратное обеспечение

Начнем с ESP и проводки.

Программное обеспечение

Весь необходимый код доступен на Github.

ESP8266
Чтобы записать необходимый код в ESP, вам нужно использовать Arduino IDE. Код можно найти здесь. После клонирования репозитория вам сначала нужно переименовать configEXAMPLE.h в config.h и настроить значения в соответствии с вашей средой.
Примечание. Если вам не нужны исторические данные, вы можете просто указать URL-адреса в конфигурации на Homebridge вместо того, чтобы указывать их на серверную часть.
После того, как код был загружен в ESP, он будет пытаться считывать данные с датчиков и отправлять их через ваш Wi-Fi каждые 25 минут. В промежутках он впадает в глубокий сон.

Глубокий сон в основном отключает весь ESP (таким образом, потребление энергии чрезвычайно низкое). Через определенное время ESP просыпается (для этого нужно соединение между контактом RST и D0). Пробуждение в основном такое же, как если бы вы нажали кнопку сброса, поэтому метод настройки выполняется снова.

Сервер NodeJS

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

Вы можете развернуть его где угодно, единственное требование состоит в том, чтобы ESP мог отправлять ему данные, а Homebridge мог запрашивать их.
Вот как выглядят две диаграммы для меня.

Хоумбридж

Homebridge — это, как следует из названия, (программный) мост, который включает Homekit для устройств, которые на самом деле не поддерживаются. Существует множество плагинов. Я запускаю Homebridge на своем Raspberry Pi Zero WH.

Два плагина, которые нам нужно использовать в этом проекте, это это для данных о температуре и это для обнаружения дождя.

Обратите внимание, если вы решили не использовать сервер, вам нужен только последний плагин.

Плагин homebridge-http-temperature-sensor
Этот плагин собирает данные о температуре откуда-то. Это где-то может быть чем угодно, если это конечная точка rest-GET. Идеально подходит для нас, потому что мы запрашиваем nodeJS, чтобы получить последнее значение температуры. Да, я мог бы также позволить ESP отправлять данные в Homebridge напрямую, но это означало бы еще один HTTP-вызов, и, поскольку я хотел максимально сэкономить энергию, я хотел избежать этого.

homebridge-http-webhooks
Этот чрезвычайно мощный плагин позволяет использовать веб-перехватчики в Homebridge. Вам нужно добавить новый веб-хук, чтобы ESP мог отправлять данные обнаружения дождя. Поскольку для этого мне не нужны были исторические данные, я мог отправить их напрямую в Homebridge, не отправляя их сначала на сервер.
В плагине просто создайте новый контактный датчик, назовите его «дождь», скопируйте указанный URL-адрес. и скопируйте его в свой config.h в коде ESP.
Очевидно, Homekit не поддерживает тип датчика «дождь», поэтому контактный датчик должен помочь. Если она открыта, дождя не будет, если закрыта, будет дождь.

Собираем все вместе

После того, как вы развернули сервер узла, настроили Homebridge и прошили ESP, пришло время собрать все вместе.

Поскольку все это работает снаружи, я хотел, чтобы оно было водонепроницаемым, поэтому я купил водонепроницаемый корпус (см. Раздел «Запчасти»).

Потребляемая мощность / внешний аккумулятор

Последняя часть, но, вероятно, одна из самых важных — это управление питанием. Как уже говорилось ранее, я решил работать с Powerbank, так как мне посчастливилось найти его без функции автоматического отключения. Если у вас нет такого устройства, у вас есть 3 варианта.
а) запитайте ESP напрямую от розетки
б) от какой-нибудь батареи Lipo, избегая USB-порта
в) используйте переходник с батареек АА на USB
Если вы Если вы не слишком опытны, я бы посоветовал НЕ экспериментировать с липо, так как это может привести к ужасным последствиям, если вы не знаете, что делаете.

Поскольку я не нашел подходящей водонепроницаемой коробки для моего Powerbank, я проявил немного изобретательности и использовал старую коробку из-под зубной щетки, обернув ее липкой лентой. Я использую 2 кабеля USB, один для подзарядки Powerbank, другой для питания ESP.

Работает хорошо.. Ну, мало что можно решить без изоленты..

Данные о энергопотреблении

Последняя часть, которую я хотел бы здесь осветить, — это данные о энергопотреблении, которые ESP отправляет на сервер nodeJS каждые xx минут. Это нужно для того, чтобы контролировать, сколько энергии осталось и когда мне нужно перезарядить Powerbank. К сожалению, вы не можете прочитать напряжение батареи Vin без внешних компонентов. Однако существует метод косвенного обнаружения разряженной батареи путем измерения входного напряжения ESP8266, который называется V3.3.

В моем коде ESP настроен на считывание напряжения V3.3 путем размещения ADC_MODE(ADC_VCC);
Затем напряжение батареи в мВ считывается с помощью вызова ESP.getVcc();

Я обнаружил, что мой Powerbank на полную мощность дает значение 3,929, в то время как почти пустой Powerbank дает 2,854. Знание этих пороговых значений позволяет мне устанавливать предупреждения, если это необходимо. Однако проблема с этим решением заключается в том, что вы больше не можете использовать аналоговый контакт A0 на вашем ESP, поэтому вы не можете считывать аналоговые данные температуры. Но с этим компромиссом все в порядке, поскольку вы все равно получаете цифровое значение (идет дождь, дождя нет).

Надеюсь, эта статья поможет вам построить собственную метеостанцию. Удачи и счастливого взлома :)