Наступило лето, с ним — жара, а также время включать кондиционеры. А если вы увлекаетесь современными технологиями и умным домом, то управление кондиционерами хочется делать как-то по-умному (или хотя бы по-современному). Ниже — ряд заметок о моей попытке интегрировать погоду в доме с голосовым управлением и кросс-платформенным интерфейсом.
Задача
В квартире стоят четыре кондиционера, ими нужно научиться управлять:
- Из веб-интерфейса (у меня это Home Assistant, крутящийся на отдельном Raspberry Pi, но в идеале хочется простого подключения к любой системе);
- Голосом (Google Assistant подойдёт, потом подумаем об Алисе);
- Скриптами;
- Дёшево...
Исследование рынка
«Родное» решение
Пожалуй, даже не буду рассказывать. Решение от производителя моих кондиционеров предполагало кучу проводов, минимум два дополнительных модуля на каждый блок, и цену порядка $200 на комнату. Плюс проприетарный протокол, древнее приложение, и всё такое. Вычёркиваем.
Sensibo Sky
Примерно $100 на комнату, нативно работает с Google Assistant и IFTTT, красиво выглядит, но всё равно дороговато.
tado° — аналогично (и ещё дороже).
Xiaomi Aqara / Mi Home, Broadlink RM Pro / Mini
Универсальные ИК-передатчики, некоторые теоретически поддерживают нужные кондиционеры «из коробки», с грехом пополам интегрируются с Home Assistant, но в целом — так себе решение, хоть и ценник уже гораздо ближе к доступному ($20-35 за комнату, в зависимости от возможностей). Да и приложения на китайском языке (в некоторых случаях) — это не то, к чему я стремился.
DIY
Самый дешёвый и гибкий способ, о котором я и расскажу подробнее.
Выбор компонентов
Тут есть над чем подумать, но в целом нам понадобится:
Железо
Контроллер
Тупо берём ESP8266, а для простоты прошивки и обеспечения питанием воспользуемся D1 mini. Управлять системой, очевидно, будем через WiFi.
ИК-передатчик
Для прототипа воспользуемся простым ИК-светодиодом, сопротивлением и транзистором, потом подумаем, как это можно улучшить.
Датчик температуры
С ним веселее, можно задавать целевую температуру, и делать автоматическое включение/выключение. Для начала тупо возьмём DHT22.
Экран
На него выведем текущее состояние системы (для отладки), а может быть и текущий ip-адрес (вдруг пригодится?).
Софт
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)
Покупаем на алиэкспрессе случайные компоненты, собираем вместе на бредборде, тестируем идею.
Понимаем, что:
- Экран был заказан слишком большой, и у него слишком много ног.
- Один светодиод бьёт не очень далеко, и не очень надёжно.
Но в целом идея работает! В интерфейсе Home Assistant появляется «родной» компонент HVAC, а значит, управление из любой точки мира у нас уже «в кармане». Родная интеграция Home Assistant с Google Assistant добавляет нам голосовые команды и обратную связь: можно у ассистента спросить про температуру в комнате, и он ответит как целевую, так и текущую температуру.
Изменение целевой температуры, скорости обдува и режима кондиционера в веб-интерфейсе тоже на месте (и, главное, работает!).
Тестовый образец (01)
Поменяем пару компонентов: закажем экранчик поменьше, и чтобы работал через I2C (и библиотеку применим другую).
Также заменим ИК-светодиод на готовый модуль.
Оказалось, что модули с одним светодиодом (на фото слева) на алиэкспрессе заказывать не стоит: они не содержат транзистора, и одна из ног (VCC) у них, по сути, бутафорская.
А вот если заказать модуль с двумя светодиодами (на фото справа), то тут уже все необходимые компоненты на месте, и подключается такой модуль легко и непринуждённо, и добивает немного дальше.
Также пришло время всё это собрать на своей печатной плате… Это был один из самых сложных моментов для человека, который никогда не проектировал печатные платы, и наверняка я всё сделал неправильно.
Для проектирования я использовал EasyEDA, готовую продукцию заказывал на OSHPark (опять же, наверняка можно было найти более дешёвый вариант), и в результате получил примерно такое:
|
|
Кнопка была добавлена в последний момент, а место для неё нашлось совершенно случайно. Оказалось, что с кнопкой всё немного веселее, можно не держать экран включенным всё время (что для OLED вредно), а показывать состояние по нажатию.
Что ж, уже неплохо, осталось добавить корпус. Для этого запускаем Blender, делаем кучку параллелепипедов, применяем ряд булевских операций…
И отправляем на 3D-принтер.
Итого, получилось дёшево (меньше $10 за экземпляр), гибко (будет работать с почти любым кондиционером), легко интегрируется, управляется голосом и через веб, стабильно добивает с пяти метров. В общем, примерно то, чего я и хотел.
Как бы всё это сделать чуть лучше?..
Серийная модель (02)
Есть ряд направлений для улучшения получившегося продукта (точнее, возможностей улучшения, позволивших бы превратить эксперимент в продукт):
- Датчик температуры можно взять поменьше размером и более точный, например, BME280, HTU21D или Si7021, что позволит повесить его на те же ноги, что и экран (I2C), заметно уменьшить размер готового устройства и упростить разводку печатной платы. На практике оказалось, что на тот же BME280 начинает сильно влиять нагрев самой ESP8266, и выдаваемые показания нужно корректировать.
- (вытекает из первого пункта) Держать ESP8266 постоянно работающей — это не комильфо, нужно периодически уходить в Deep Sleep, лишь иногда просыпаясь для отправки показаний и приёма команд;
- (вытекает из второго пункта) Обычный MQTT уже не очень подходит, нужно использовать MQTT-SN, чтобы управляющие команды запоминались и доставлялись на контроллер в момент пробуждения;
- Реализация вышеперечисленных пунктов позволит сменить «проводное» питание на аккумулятор;
- Текущий способ крепления компонентов к печатной плате (обычная пайка) является сложным в реализации и недостаточно гибок: имеет смысл припаять хедеры, чтобы те же датчики температуры можно было менять, как перчатки;
- Наконец (в противоречие с предыдущим пунктом), всё-таки готовые модули — это хорошо и просто, но слегка громоздко, в идеале вместо D1 mini была бы голая ESP8266, а датчик температуры, кнопка и ИК-светодиоды были бы распаяны на одной плате (как это и делают в серийных продуктах), что позволило бы уменьшить размер устройства и его серийную цену;
- Да и вообще, было бы здорово предусмотреть в прошивке возможность лёгкого выбора своей модели кондиционера одним кликом...
Заключение
Это было славное приключение, и я многое понял. Например, я понял, почему серийные устройства стоят так дорого, и сколько сил нужно было бы приложить, чтобы выйти на один уровень с ними. С другой стороны, очень многое в этом проекте я делал впервые (работа в Arduino IDE, заказ печатных плат, создание модели для 3D-принтера), и получить этот опыт было бесценно. Исходники, впрочем, не покажу: мне за них достаточно стыдно :)
Но своей цели я всё-таки достиг, а дешёвое и гибкое управление кондиционерами оказалось вполне достижимо.
Автор: Иван Подогов