Однажды зимним утром я проснулся от того, что мне было неприемлемо зябко. «Никогда такого не было!», — подумал лентяй во мне. «И вот опять!», — ответил ему потребитель — «Тыжинженер!». Да, моему котлу в доме уже около 7 лет и все это время он был недоразвитым, а домочадцы постоянно подкручивали температуру теплоносителя, если им было жарко или холодно. В этот день я решил, что пора потратить свой досуг на решение этой задачи, а именно регулирование котла по температуре воздуха в помещении. Кому это близко прошу под кат. Для начала, я, «как инженер», проанализировал рынок на предмет приобретения готового решения. Бошевских регуляторов в доступе не нашел или были варианты «привезем с Марса к 1 июня после 16–00». Альтернативные универсальные решения типа Zont по стоимости от 20 тыр, как будто, уже привезены с Марса. Тут включился жадина со своим «тыжинженер». Ну что же, автоботы инженеры, вперед! Анализ решений в комьюнити DIY привел к довольно зрелым решениям на базе прошивки Tasmota библиотеки Opentherm (автор  yurysannikov ) Котел Bosch 6000 имеет возможность подключения внешнего термостата по протоколу Opentherm, который позволяет плавно регулировать работу котла. В составе tasmota есть готовая библиотека Opentherm, которая позволяет управлять базовыми/обязательными (по спецификации) параметрами моего котла, а именно, включением/отключением режимов внешнего управления горячей водой и отоплением, а также установкой их температур. Но, данная библиотека не входит в состав уже скомпилированных бинарников, представленных на сайте. Поэтому компилировать пришлось самому. В конце статьи выложу свой bin с включенными библиотеками openterm и display для своего контроллера. Подойдет для всех esp8266. В platformio использовалась board=esp8266_4M2M. Как прошивать esp8266 описывать не буду, на Хабре это уже есть. С ПО разобрались и это уже похоже на план, но вот котел имеет аппаратный интерфейс, работающий с напряжениями до 15В, а это не норм для ESP, у которой 3,3В питание. Требуется устройство согласования. Как минимум две версии такого решения и устройства уже имеются в интернете. Я выбрал то, что построено на одном транзисторе, но покупать или заказывать с Марса в очередной раз не стал и спаял его сам.  Источник изображения схемы из проекта библиотеки и адаптера Игоря Мельника.  Далее, как писали еще в прошлом веке в журнале «Радио», «правильно собранное устройство в регулировке и наладке не нуждается», поэтому я потратил день на его наладку. А история житейская... Я пришел в магазин и попросил нужный транзистор. Мне сказали такого нет, я прямо у кассы подобрал в интернете аналог — КТ3107 и мне его продали в пакетике. После полдня мучений я был на пороге вывода, что он не исправен, но вдруг заметил, что мне продали другой транзистор. Радостный, что нашел причину, полез в интернет, но с горечью понял, что он полный аналог по характеристикам. Еще полдня мучений и я заметил, что он не полный аналог по цоколевке (рука‑лицо). В итоге ‑...не нуждается. Отлично, контроллер прошит и настроен по пинам.  Специально оставил имя автора прошивки Theo Arends, сделавшего процесс использования ESP контроллеров доступным для «домохозяев». Подключаем к котлу на специальные клеммы вместо установленной перемычки. Полярность не важна. Важно понимать, что удаление перемычки выключает отопление, поэтому на время отключение платы для отладки/перепрошивки, провода, выведенные из котла достаточно вновь замкнуть, и котел продолжит работу в режиме позиционного регулирования температуры теплоносителя мин/макс. Вот мой Франкенштейн. Если все шаги выполнены без ошибок, то в консоли веб‑интерфейса Тасмоты, при старте, мы видим обмен с котлом. Не стоит пугаться сообщение типа «команда OT19 неизвестна». Библиотека OT при инициализации посылает несколько команд для проверки их поддержки котлом. При трех неудачах она их помечает как не поддерживаемые.  Чтобы убедиться, что все работает можно прямо из консоли дать команду котлу: ot_ch 1 включить управление отоплением; ot_tboiler=60 установить температуру теплоносителя; ot_dhw 1 включить управление горячей водой; ot_twater=45 установить температуру горячей воды. Если данные команды отрабатывают, переходим к следующему шагу, если нет, то как в журнале «Радио»... Далее начинается волшебство, за которое, судя по всему, производители регуляторов и просят 20 тыр, потому что всё, что мы до этого сделали или купили не стоит больше 1000р. Мы с Вами пишем математику PID регулятора. dT =  (Тжелаемая - Тв помещении фактическая) Tнакопительная = Tнакопительная предыдущая + K интегральный * dT * dt Tпропорциональности = Kпропорциональности * dT Tтеплоносителя = Tпропорциональности + Tнакопительная dt = разница во времени между соседними измерениями, к примеру, если раз в секунду, то равна 1, по сути, ею можно пренебречь, в случае равных интервалов расчета. Дальше я так и сделал. Следует пояснить как работает данный регулятор. При старте, когда ошибка рассогласования уставки и фактической температуры регулируемого параметра (воздуха) максимальны, на котел воздействие оказывает расчет Tпропорциональности, а накопительный находится в районе 0. Постепенно воздействие на котел приводит к изменению температуры воздуха в сторону уставки. Ошибка уменьшается и Tпропорциональности стремится к 0. В это время Tнакопительная уже накопила нужное значение для воздействия на котел, и ее прирост из‑за dT = 0 прекращается. Система нашла свой баланс и дальнейшие колебания становятся малозначительными. Котел работает в экономичном режиме, восполняя только утечки тепла из дома. Кто водит машину, тот знает зависимость расхода топлива от характера вождения. K пропорциональности = 40; У него есть физический смысл — это соотношение между диапазонами измеренного параметра и воздействия. В моем случае разброс температур в помещении принят 22,5–23,5=1 градус, а разброс воздействий на теплоноситель 80–40=40 градусов. Соответственно, соотносятся диапазоны как 40 к 1. Kинтегральный = 0.02; Этот параметр тоже имеет смысл — он компенсирует статическую ошибку, и в его значении учтена константа dt. Если бы этого параметра не было, то при некоторых условиях мы не смогли бы достичь требуемого значения, как в задаче «придет ли к финишу лягушка, длина прыжка которой уменьшается в два раза с каждым следующим прыжком». Понятно, что имеются условия, при которых лягушка может финишировать первым прыжком, а значит ответ зависит от его длины. У нас этот прыжок 40*1 (dT) и с приближением стремиться к 0. Начальный расчет Ки можно сделать из исходных параметров. К примеру, мы принимаем, что дом прогреется на 1 градус за два часа, соответственно, мы сделаем 2*60*60секунд измерений и расчетов. Тнакопительная будет копиться по арифметической прогрессии как Ки*dT, где dT от 1 до 0. Сумма членов прогрессии будет как произведение значения среднего члена прогрессии на число ее членов. Получается мы накопим 3600, а нам желательно остаться в среднем значении возможностей котла, к примеру, температура теплоносителя 60 градусов. Напоминаю, что в конце весь вес расчета уставки теплоносителя ложится на Тнакопительная, значит нам надо уменьшить скорость накопления в Ки = 60/3600 =0,016 раз. Что касается погодного регулирования, то лично мое мнение, это маркетинг. При согласованной мощности системы отопления с теплопотерями дома регулирование температуры воздуха в помещении подерживается тем же принципом воздействий на котел. Для систем со слабой системой отопления вопрос частично решается предсказанием теплопотерь по снижению температуры на улице. В данном решении, вам просто надо корректировать крутизну характеристики PI регулятора, а именно K пропорциональности 70, К интегральный 0.04. Это несомненно характеристика вашего дома и цифры ориентировочные, поэтому производители предлагают по несколько кривых, т. е. таких пар можно иметь несколько (нормальный режим, средний и форсированный). Но, к гадалке не ходи, при несогласованности мощности всё упрется в потолок котла 75–80 градусов теплоносителя. Теорию рассмотрели, приступаем к практике. Тасмота имеет механизм выполнения действий по событиям, реализованный через правила, вводимые в консоль. Вы можете просто вставить этот текст. Лучше каждое правило (rule) по отдельности. В Rule1 сгруппированы события и действия, выполняемые при старте и нештатных ситуациях. В Rule2 непосредственно, то что выполняется в цикле расчета. Правила сразу не заработают. Их надо включить командами консоли, введя Rule1 1 ввод и Rule2 1 ввод. По параметрам: mem хранятся во флэше, var теряются при перезагрузке.  mem1 — К пропорциональности mem2 — К интегральный mem3 — Минимальная температура теплоносителя mem4 — Максимальная температура теплоносителя (важно, что она не может быть больше той, что введена с панели котла) mem5 — уставка температуры воздуха в помещении mem6 — уставка температуры горячей воды  mem7 — сохранение Тнакопительная во флэш каждые 10 минут на случай нештатного рестарта. var1 — Тнакопительная var2 — Температура, измеренная локальным датчиком var3 — Tтеплоносителя расчетная, и отправляемая в котел  var4 — Tпропорциональности var10 — Температура, полученная с любого датчика по MQTT var11 — Флаг используемого датчика: 2-локальный, 1-MQTT Правила имеют избыточность, но даже если у Вас не будет MQTT датчика или дисплея они будут работать. Первые 10 секунд будет ожидаться приход температуры с MQTT. Если за 10 секунд не поступило, то в расчет входит термометр, подключенный к контроллеру напрямую. Далее идет расчёт, нормирование, отправка в котел и вывод на дисплей и в MQTT. График изменения температуры из HomeAssistant, включая период ночи и прогрев комнаты через окна днем.На графике в начале видно, что отключался удаленный датчик. Я выключал и переносил его из комнаты в комнату. График изменения температуры теплоносителя в тот же период времени. Видно, как днем «проседает», а ночью сам «наваливает», позволяя спать «тыжинженеру». На этом всё! Всем тепла! Tasmota firmware_OT_displ.bin