Давненько я что-то не писал, а тем временем есть еще один небольшой проектик чисто по коду который я на днях замутил (помимо интеграции с счетчиком). И это... термостат 🙂 Но, не обычный.
Я давно понял, что какие-то универсальные средства автоматизации (HA, nodered и т.п.) мне не подходят. Уйдет кучу времени на то, чтобы стать гуру в них, нащупать все подводные камни. Да и на выходе это выглядеть будет все так себе. Поэтому я сразу для себя решил, что у меня будет свой кастомный сервис, который будет как раз автоматизировать все. А автоматизации я буду писать на настоящем языке программирования - Go. А не эти всякие yaml'ы и прочую шляпу. И в общем, начало положено.
И первым делом я решил заняться автоматизацией регулировкой температуры теплоносителя в котле, чтобы в комнатах поддерживалась установленная температура. Конечно, многие сейчас могут сказать, что мол, это все реализует обычный термостат и городить это было ни к чему. В текущей реализации - да, это все делает обычный термостат. Но в моих планах сделать по настоящему мощную систему, где температура будет регулироваться в каждой комнате, она так же летом сможет включать кондиционеры для достижения требуемой температуры, будет уменьшать температуру на ночь, когда куда-то надолго уезжаем... В общем, кучу всяких кейсов. Все я сейчас не расскажу, да и не упомню. Делать я это все буду когда-то позже, потому что мне нужны будут еще некоторые девайсы которых сейчас нет. А это так, лирическое отступление, чтобы не было ожидаемых коментов.
В общем, я написал свой термостат. Работает он сейчас крайне просто: собирает показания с датчиков температуры по всем комнатам (они уже стоят), вычисляет среднюю температуру в доме, затем, уже через ПИД регулятор вычисляет какую температуру необходимо установить на котле в данный момент, чтобы либо двигаться к достижению заданной температуры, либо поддерживать уже достигнутую.
В ПИД регуляторе я использовал только интегральную составляющую, поскольку система очень инертна и медлительная, поэтому пропорциональная и дифференциальная тут не к месту. Будут слишком большие прыжки по температуре вверх или вниз. А с очень маленькими коэффициентами оно и нафиг не нужно.
И, как видно на скрине выше, ошибка на данный момент составляет 0.2 градуса, что на мой скромный взгляд весьма недурственно.
А на этом графике видно, как мой термостат менял температуру котла последние несколько дней.
Я когда уехал, в доме отопление отключил и он успел остыть до 12-15 градусов. Так что, как я завел свой термостат, он достаточно быстро разогнал котел до 70ти градусов.
Затем, как нужная температура в доме был достигнута, он начал уменьшать температуру на котле.
Ну и сейчас идут некоторые затухающие колебания в плане изменения температуры котла. Все же, от них никуда не деться. Хотя бы потому, что есть еще улица со своей погодой, котора постоянно меняется. А так, в идеальном мире, конечно они б затухли со временем, и установилась бы та самая температура котла, чтобы поддерживать установленную температуру тютелька в тютельку.
Кстати еще большой плюс моего термостата: я реализовал петлю гистерезиса.
Как видно на скрине выше, когда температура высокая, котел работает постоянно используя просто модуляцию для поддержания нужной температуры теплоносителя. Но, на небольших температурах он уже работает на минимальной своей мощности, и все равно перегревает теплоноситель, из-за чего постоянно отключается. А потом быстро остывает на 10 градусов и включается опять. Я уже рассказывал про эту проблему раньше.
Конечно, в котле есть свои настройки гистерезиса. Но, поскольку я сейчас нахожусь за 500 км от котла, в нем я эти значения реализовать не смогу. Зато, могу реализовать такое поведение удаленно на стороне своего кода. И, я его реализовал. Сейчас оно работает не идеально, иногда бывают моменты когда врубается гистерезис котла (это в целом даже по скринам видно). Но, когда отрабатывает мой алгоритм, то котел между включениями примерно около часа проводит в отключенном состоянии, что уже вполне себе приемлемо и не так страшно за судьбу клапанов, которые могут выйти из строя через год или два.