От желания управлять газовым котлом удалённо до полной автоматизации отопления дома
- четверг, 5 октября 2023 г. в 00:00:21
В статье расскажу про свой путь разработки DIY железок для работы с Home Assistant с целью автоматизации отопления в частном доме.
Захотелось построить дом. Дом построили, встал вопрос с отоплением и управлением, а так как в доме иногда отсутствовали по несколько месяцев, то переплачивать за газ не очень-то и хотелось. Газа ведь магистрального нет, но «мы скоро проведем». До этого «скоро» закопали газгольдер, а газ там в +-10 раз дороже магистрального. Пытливый ум решил: будем поддерживать в доме температуру 15 градусов, когда там никого нет. Как это сделать? Повесить контроллер/термостат для котла. Есть ли готовые решения на рынке? Есть, но мало. Или плохо искал.
На рынке есть некоторые готовые решения, например, ZONT. Для большинства он бы подошел, но в моём случае хотелось управлять всем этим добром из Home Assistant, потому что зоопарк из приложений не нравится. А оно этого не умеет. Точнее, умеет, но через непубличное API. А это значит, что в самый неподходящий момент кто-то из разработчиков задеплоит новую версию API и наша «интеграция» превратится в тыкву.
Все остальные предложения оказались такими же «облачными». Хотя сейчас есть железо и софт от WirenBoard, но сейчас это уже не важно.
В итоге, встает выбор, использовать ZONT и костыли, либо делать что-то своё.
Ищем документацию по OpenTherm, а её особо-то и нет, кроме OpenTherm Protocol Specification v2.2 от 2003 года, всё очень секьюрно. На github нашлась единственная нормальная библиотека для работы с протоколом - OpenTherm Library. И там же примеры. Простенькие и без деталей.
Спустя 20 минут пару дней получаем что-то, что умеет чуть-чуть управлять котлом. Добавляем WiFiManager для удобства настройки подключения к Wifi и… оно нормально не работает. Потому что OpenTherm Library по дефолту блокирующая. То есть, когда в коде ожидается ответ от котла, то микроконтроллер занят ожиданием. Фиаско.
Ладно, подумал я, добавим шедулер! Пока библиотека ждет ответа, займемся чем-нибудь другим, например, веб-сервер ответит на запросы. Звучит прекрасно. Правда, шедулер пришлось чуть-чуть переписать. И в OpenTherm Library внести небольшое изменение.
В какой-то момент я хотел все сжечь, установить Zont и прибить его костылями к HA.
Но, спустя некоторое время месяц получили вполне себе результат: из Home Assistant можно устанавливать температуру теплоносителя. Но задача была другая – поддерживать заданную температуру в доме, а не в теплообменнике котла.
Как подобрать температуру теплоносителя, необходимую для поддержки заданной температуры воздуха в доме? Исторически сложилось, что эмпирически. Дома холодно – повышаем, дома жарко – понижаем. С точки зрения разработки – PID регулятор.
Дописываем код, тестируем. Видим медленный нагрев дома или раскачку системы, когда в доме то 25, то 19 градусов, а стабилизация занимает время. Всё из-за того, что отопление – процесс инертный.
Изучив другие возможные варианты, останавливаюсь на погодозависимом регулировании (эквитермических кривых). Алгоритм худо-бедно описан в документации к некоторым термостатам для котлов, но формул для расчёта нет. Максим Вдовин провел аппроксимацию и выложил данные для расчёта, за что ему спасибо.
Пишем небольшую библиотеку для расчёта температуры теплоносителя в зависимости от температуры на улице и температуры в доме, добавляем ее в контроллер, дописываем логику. Тестируем, подбираем коэффициенты, и чудо случилось – оно работает! В доме воцарилась желаемая температура. Впервые за пару месяцев не нужно ничего вручную регулировать.
Первые несколько месяцев я брал уличную температуру из интеграции Weather в Home Assistant, но точность её оставляла желать лучшего, поэтому температура в доме немного плавала, в пределах 1-2 градуса от установленной.
Решение оказалось простое – вынос внешнего датчика на улицу и съем показаний с него. Пока ехал датчик DS18B20, напечатал будку Стивенсона (метеорологическая будка), чтобы исключить влияние осадков и солнца на показания.
Пару часов на дописывание прошивки, добавление фильтрации показаний от шума. Заливаем.
Подозрительно посмотрев на то, что всё работает так, как задумано, оставил в покое почти на полтора года.
За оставшиеся 3-4 холодных месяца и всю следующую зиму контроллер показал себя весьма достойно: невзирая на суточные колебания температуры от -30 до +2, в доме поддерживалась установленная температура.
За лето были добавлены новые функции, причёсан код, добавлена полная интеграция в HomeAssistant через MQTT Auto Discovery, спроектирована и собрана нормальная плата.
После тестов решил выложить проект на Github. Код открыт и бесплатен. На странице есть файлы для производства и сборки платы.
В последней версии также стало возможно подключать еще один датчик DS18B20 для определения температуры внутри дома. Но лично мне удобнее через MQTT отправлять на контроллер температуру с ZigBee датчиков.
В целом, работа контроллера меня сейчас более чем устраивает. За кадром осталось много не очень интересного и скучного: разработка заняла около года и ведется до сих пор.
Так как «скорое подключение» затянулось, а газ временами был по 25-35р за литр, не давала покоя мысль, что по ночному тарифу отапливать дом электричеством вроде бы дешевле.
Набросав табличку в Excel с расчётами, было ясно, что мысль была неплохой. В среднем, в смешанном цикле (днем – газ, ночью – электричество) за год должно получиться дешевле на 24%. При стоимости электрического котла в 57 000 р., окупаемость такого решения чуть больше 2.5 лет.
Этим же годом Baxi выпустили электрический котел Ampera, который, по удачному совпадению, умеет Opentherm. Случайности не случайны, и спустя некоторое время котёл был установлен параллельно газовому.
К нему был собран и подключён второй контроллер, а в Home Assistant создана автоматизация, переключающая котлы в зависимости от тарифа на электроэнергию и стоимости газа на момент заправки. Оправдает ли себя это решение – время покажет, в крайнем случае, будет как резервный.
Как писал ранее, из-за отсутствия магистрального газа, у меня закопан газгольдер. По умолчанию на них установлен механический уровнемер поплавкового типа с таким же механическим индикатором.
То есть, если хочется зимой проверить уровень, то будь добр его найти под снегом, раскопать крышку от снега и посмотреть. И потом желательно закопать.
Изучив рынок, снова не нашел решений, которые могут работать локально и могут интегрироваться в Home Assistant. Или опять плохо искал. Гуглится по запросу: телеметрия для газгольдера.
В процессе изучения рынка стало понятно, что нужно отдельно искать датчик и документацию к нему с референсными значениями. Все доступные датчики работают по принципу датчика холла, в России возможно приобрести SRG 487-530-2001, под который и был написан софт.
Дабы не утомлять читателя очередной историей с разработкой девайса, скажу так: всё было гораздо проще и быстрее. От макета до нормальной платы ушло чуть больше пары месяцев. Дальше приходилось немного корректировать матрицу показаний, так как референсных значений для этого датчика найти не удалось.
Для отслеживания расхода газа в Home Assistant (через панель Energy) была добавлена функция счётчика. С ней не всё гладко, так как в HA невозможно считать газ в литрах, поэтому используется конвертация в м3, возможно в дальнейшем это исправят.
Проект тоже был опубликован на Github. Там же есть файлы для производства и сборки платы.
Собственно для чего все это делалось? Для автоматизации процессов и удобства, для управления всеми устройствами умного дома из одного приложения. И по фану. Так что цель достигнута.
Примеры дополнительных автоматизаций в HA, которые можно создать:
Push уведомления, если любой из котлов падает в ошибку
Push уведомления при критически низком уровне газа в газгольдере
Push уведомления при затоплении газгольдера (грунтовыми водами)
Автоматическое переключение на электрический котел, когда действует ночной тариф (23:00-07:00) при условии, что цена за кВт тепла из газа выше, чем цена за кВт тепла из электричества.
Установка температуры в доме на 15 градусов, когда дом встает на охрану (когда никого нет)
Установка комфортной температуры, когда дом снимается с охраны.
Установка ночной температуры, когда дом переводится в режим «ночь»
Несмотря на то, что более чем за несколько лет платы ESP8266 чувствуют себя нормально и зависаний не замечено, в сети бытует мнение, что аппаратный watchdog на них работает некорректно и у людей в целом на этой плате встречаются зависания. Для исключения этой проблемы люди делают внешний watchdog на attiny13 или рекомендуют использовать esp32. Поэтому в будущем есть в планах перейти на эту платформу, прикрутив возможность использования BLE датчиков температуры.