Делаем «умный» контроллер для кондиционера на ESP8266

в 22:40, , рубрики: diy или сделай сам, esp8266, google assistant, Home Asisstant, кондиционер, умный дом

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

Задача

В квартире стоят четыре кондиционера, ими нужно научиться управлять:

  • Из веб-интерфейса (у меня это Home Assistant, крутящийся на отдельном Raspberry Pi, но в идеале хочется простого подключения к любой системе);
  • Голосом (Google Assistant подойдёт, потом подумаем об Алисе);
  • Скриптами;
  • Дёшево...

Исследование рынка

«Родное» решение

Пожалуй, даже не буду рассказывать. Решение от производителя моих кондиционеров предполагало кучу проводов, минимум два дополнительных модуля на каждый блок, и цену порядка $200 на комнату. Плюс проприетарный протокол, древнее приложение, и всё такое. Вычёркиваем.

Sensibo Sky

Примерно $100 на комнату, нативно работает с Google Assistant и IFTTT, красиво выглядит, но всё равно дороговато.

Делаем «умный» контроллер для кондиционера на ESP8266 - 1

tado° — аналогично (и ещё дороже).

Xiaomi Aqara / Mi Home, Broadlink RM Pro / Mini

Универсальные ИК-передатчики, некоторые теоретически поддерживают нужные кондиционеры «из коробки», с грехом пополам интегрируются с Home Assistant, но в целом — так себе решение, хоть и ценник уже гораздо ближе к доступному ($20-35 за комнату, в зависимости от возможностей). Да и приложения на китайском языке (в некоторых случаях) — это не то, к чему я стремился.

Делаем «умный» контроллер для кондиционера на ESP8266 - 2

DIY

Самый дешёвый и гибкий способ, о котором я и расскажу подробнее.

Выбор компонентов

Тут есть над чем подумать, но в целом нам понадобится:

Железо

Контроллер

Тупо берём ESP8266, а для простоты прошивки и обеспечения питанием воспользуемся D1 mini. Управлять системой, очевидно, будем через WiFi.

Делаем «умный» контроллер для кондиционера на ESP8266 - 3

ИК-передатчик

Для прототипа воспользуемся простым ИК-светодиодом, сопротивлением и транзистором, потом подумаем, как это можно улучшить.

Датчик температуры

С ним веселее, можно задавать целевую температуру, и делать автоматическое включение/выключение. Для начала тупо возьмём DHT22.

Делаем «умный» контроллер для кондиционера на ESP8266 - 4

Экран

На него выведем текущее состояние системы (для отладки), а может быть и текущий ip-адрес (вдруг пригодится?).

Делаем «умный» контроллер для кондиционера на ESP8266 - 5

Софт

IDE

Реализовывать всё будем в Arduino IDE (с которой я никогда до этого не работал), используя открытые библиотеки.
Сильно позже, когда проект уже работал, я перешёл на Visual Studio Code с плагином PlatformIO.

Протокол

Общаться с Home Assistant будем через MQTT (библиотека PubSubClient), т.к. это открытый протокол, и для него есть специальный компонент.

Конфигурация будет выглядеть, например, как-то так:

climate:
  - platform: mqtt
    name: Living Room HVAC
    modes:
      - "off"
      - "auto"
      - "heat"
      - "cool"
      - "dry"
      - "fan"
    swing_modes:
      - "auto"
      - "off"
    fan_modes:
      - "auto"
      - "low"
      - "medium"
      - "high"
    mode_command_topic: "livingroom/meteo/mode/set"
    mode_state_topic: "livingroom/meteo/mode"
    temperature_command_topic: "livingroom/meteo/target/set"
    temperature_state_topic: "livingroom/meteo/target"
    fan_mode_command_topic: "livingroom/meteo/fan/set"
    fan_mode_state_topic: "livingroom/meteo/fan"
    swing_mode_command_topic: "livingroom/meteo/swing/set"
    swing_mode_state_topic: "livingroom/meteo/swing"
    current_temperature_topic: "livingroom/meteo/temperature"

Управление

Библиотека HeatpumpIR поможет нам отправлять сигналы на кондиционер (модель кондиционера пока захардкодим).

Разное

Понадобятся ещё библиотеки для таймера, для работы с датчиком температуры и с экраном, но это уже мелочи. Привычным жестом добавим WiFiManager и ArduinoOTA, чтобы обновлять прошивку через веб-интерфейс, а не USB.

Прототип (00)

Покупаем на алиэкспрессе случайные компоненты, собираем вместе на бредборде, тестируем идею.

Делаем «умный» контроллер для кондиционера на ESP8266 - 6

Понимаем, что:

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

Но в целом идея работает! В интерфейсе Home Assistant появляется «родной» компонент HVAC, а значит, управление из любой точки мира у нас уже «в кармане». Родная интеграция Home Assistant с Google Assistant добавляет нам голосовые команды и обратную связь: можно у ассистента спросить про температуру в комнате, и он ответит как целевую, так и текущую температуру.

Делаем «умный» контроллер для кондиционера на ESP8266 - 7

Изменение целевой температуры, скорости обдува и режима кондиционера в веб-интерфейсе тоже на месте (и, главное, работает!).

Делаем «умный» контроллер для кондиционера на ESP8266 - 8

Тестовый образец (01)

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

Делаем «умный» контроллер для кондиционера на ESP8266 - 9

Также заменим ИК-светодиод на готовый модуль.

Делаем «умный» контроллер для кондиционера на ESP8266 - 10

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

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

Также пришло время всё это собрать на своей печатной плате… Это был один из самых сложных моментов для человека, который никогда не проектировал печатные платы, и наверняка я всё сделал неправильно.

Делаем «умный» контроллер для кондиционера на ESP8266 - 11

Для проектирования я использовал EasyEDA, готовую продукцию заказывал на OSHPark (опять же, наверняка можно было найти более дешёвый вариант), и в результате получил примерно такое:

Делаем «умный» контроллер для кондиционера на ESP8266 - 12
Делаем «умный» контроллер для кондиционера на ESP8266 - 13

Делаем «умный» контроллер для кондиционера на ESP8266 - 14

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

Что ж, уже неплохо, осталось добавить корпус. Для этого запускаем Blender, делаем кучку параллелепипедов, применяем ряд булевских операций…

Делаем «умный» контроллер для кондиционера на ESP8266 - 15

И отправляем на 3D-принтер.

Делаем «умный» контроллер для кондиционера на ESP8266 - 16

Итого, получилось дёшево (меньше $10 за экземпляр), гибко (будет работать с почти любым кондиционером), легко интегрируется, управляется голосом и через веб, стабильно добивает с пяти метров. В общем, примерно то, чего я и хотел.

Как бы всё это сделать чуть лучше?..

Серийная модель (02)

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

  1. Датчик температуры можно взять поменьше размером и более точный, например, BME280, HTU21D или Si7021, что позволит повесить его на те же ноги, что и экран (I2C), заметно уменьшить размер готового устройства и упростить разводку печатной платы. На практике оказалось, что на тот же BME280 начинает сильно влиять нагрев самой ESP8266, и выдаваемые показания нужно корректировать.
    Делаем «умный» контроллер для кондиционера на ESP8266 - 17
  2. (вытекает из первого пункта) Держать ESP8266 постоянно работающей — это не комильфо, нужно периодически уходить в Deep Sleep, лишь иногда просыпаясь для отправки показаний и приёма команд;
  3. (вытекает из второго пункта) Обычный MQTT уже не очень подходит, нужно использовать MQTT-SN, чтобы управляющие команды запоминались и доставлялись на контроллер в момент пробуждения;
  4. Реализация вышеперечисленных пунктов позволит сменить «проводное» питание на аккумулятор;
  5. Текущий способ крепления компонентов к печатной плате (обычная пайка) является сложным в реализации и недостаточно гибок: имеет смысл припаять хедеры, чтобы те же датчики температуры можно было менять, как перчатки;
  6. Наконец (в противоречие с предыдущим пунктом), всё-таки готовые модули — это хорошо и просто, но слегка громоздко, в идеале вместо D1 mini была бы голая ESP8266, а датчик температуры, кнопка и ИК-светодиоды были бы распаяны на одной плате (как это и делают в серийных продуктах), что позволило бы уменьшить размер устройства и его серийную цену;
  7. Да и вообще, было бы здорово предусмотреть в прошивке возможность лёгкого выбора своей модели кондиционера одним кликом...

Заключение

Это было славное приключение, и я многое понял. Например, я понял, почему серийные устройства стоят так дорого, и сколько сил нужно было бы приложить, чтобы выйти на один уровень с ними. С другой стороны, очень многое в этом проекте я делал впервые (работа в Arduino IDE, заказ печатных плат, создание модели для 3D-принтера), и получить этот опыт было бесценно. Исходники, впрочем, не покажу: мне за них достаточно стыдно :)

Но своей цели я всё-таки достиг, а дешёвое и гибкое управление кондиционерами оказалось вполне достижимо.

Автор: Иван Подогов

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js