Интеграция центрального отопления с Arduino: умное управление по OpenTherm
Компоненты и материалы
| Arduino UNO | × | 1 |
| Arduino OpenTherm Shield | × | 1 |
| Блок питания 24В | × | 1 |
О проекте
Хотите знать, когда и почему работает ваш котел? Автоматизировать отопление с Arduino? OpenTherm Shield — именно для этого. Позволяет мониторить и управлять OpenTherm-котелом с Arduino.


Предыстория
Хотел связать газовый котел BAXI с регулятором камина. Официальные расширения BAXI слишком дорогие. Сделал свой OpenTherm-шлюз, перехватывающий обмен термостата и котла — алгоритм решал: включить котел или использовать тепло камина. Люди заинтересовались — решил сделать модуль (Arduino Shield) для простого управления отоплением.

Для чего нужен шилд?
- Создать свой котел на Arduino с существующим OpenTherm-термостатом (редко нужно, но возможно).
- Построить свой термостат на Arduino для полного контроля котла и отопления. Идеально для умного дома. Нужен только 5В БП.
- Вставить шилд в линию между котлом и термостатом — мониторинг работы котла. Можно перехватывать команды для беспроводного управления.
- OpenTherm позволяет «man-in-the-middle» (шлюз), общающийся и с котлом, и с термостатом. Так я сделал свой регулятор.
Доступные данные и команды
- Температура комнаты
- Уставка температуры комнаты
- Температура подачи теплоносителя
- Температура обратки
- Температура ГВС*
- Давление ГВС*
- Расход ГВС*
- Наружная температура*
- Статус котла (работает / не работает / ошибка)
- Уровень модуляции
- Температура выхлопных газов*
- Статистика времени работы котла
* — доступно только если в котле есть соответствующие датчики
Построение шилда
Схема основана на проекте OpenTherm Gateway (PIC), адаптирована под Arduino с удобной раскладкой для UNO.

Можно сделать самому по схеме и герберам. Заказываю платы у PCBWay — быстро, качественно, синяя маска по цене зелёной. Или заказать DIY-кит.

Использование шилда как термостата
Пример: свой термостат. Нужно:
- OpenTherm-котел
- Arduino UNO, WeMos D1 или совместимая плата (прерывания на пинах 2 и 3 обязательны)
- 5В БП (24В не нужен — он для общения с термостатом)

Подключите котел к шилду, наденьте шилд на Arduino — программируйте. Библиотека Arduino OpenTherm IO содержит пример:
void loop() {
if (OPENTHERM::isIdle()) {
message.type = OT_MSGTYPE_READ_DATA;
message.id = OT_MSGID_SLAVE_CONFIG;
message.valueHB = 0;
message.valueLB = 0;
Serial.print("-> ");
OPENTHERM::printToSerial(message);
Serial.println();
OPENTHERM::send(BOILER_OUT, message);
} else if (OPENTHERM::isSent()) {
OPENTHERM::listen(BOILER_IN, 800);
} else if (OPENTHERM::getMessage(message)) {
OPENTHERM::stop();
Serial.print("<- ");
OPENTHERM::printToSerial(message);
Serial.println();
Serial.println();
delay(100);
} else if (OPENTHERM::isError()) {
OPENTHERM::stop();
Serial.println("<- Timeout");
Serial.println();
}
}
Сначала проверяем isIdle — нет ли ожидающей команды. Шлём запрос конфигурации слейва. Если отправлено — слушаем ответ listen. getMessage вернёт true при ответе, isError — при таймауте. Библиотека даёт структуру OpenthermData с декодированными данными — не нужно парсить протокол вручную. Исходники документированы. Все типы сообщений в константах или в документации OpenTherm.
struct OpenthermData {
byte type;
byte id;
byte valueHB;
byte valueLB;
float f88();
void f88(float value);
uint16_t u16();
void u16(uint16_t value);
int16_t s16();
void s16(int16_t value);
}
Использование как монитора, шлюза или регулятора
Пример: вставка шилда в шину между котлом и термостатом для мониторинга или перехвата.
- OpenTherm-термостат
- 24В 500мА БП

Шилд разрывает шину. Без прошивки шлюза связь пропадёт. В библиотеке есть отличный пример шлюза:
void loop() {
if (mode == MODE_LISTEN_MASTER) {
if (OPENTHERM::isSent() || OPENTHERM::isIdle() || OPENTHERM::isError()) {
OPENTHERM::listen(THERMOSTAT_IN);
} else if (OPENTHERM::getMessage(message)) {
Serial.print("-> ");
OPENTHERM::printToSerial(message);
Serial.println();
OPENTHERM::send(BOILER_OUT, message);
mode = MODE_LISTEN_SLAVE;
}
} else if (mode == MODE_LISTEN_SLAVE) {
if (OPENTHERM::isSent()) {
OPENTHERM::listen(BOILER_IN, 800);
} else if (OPENTHERM::getMessage(message)) {
Serial.print("<- ");
OPENTHERM::printToSerial(message);
Serial.println();
Serial.println();
OPENTHERM::send(THERMOSTAT_OUT, message);
mode = MODE_LISTEN_MASTER;
} else if (OPENTHERM::isError()) {
mode = MODE_LISTEN_MASTER;
Serial.println("<- Timeout");
Serial.println();
}
}
}
Шлюз слушает термостат, парсит запрос, пересылает коту. Затем слушает ответ котла (800 мс) и возвращает термостату. Оба устройства не знают о посреднике. Можно встраивать свою логику: читать данные (статус, температуры, давление, статистику), перехватывать или блокировать команды.
Общение с умным отоплением становится простым. В следующей статье покажу практическое применение в моём OpenTherm-регуляторе.
Код
OpenTherm IO library for Arduino
Схемы

Производственный процесс
- Мониторинг центрального отопительного котла на Raspberry Pi — железо, софт и настройка
- Построение доступной беспроводной сети датчиков для дома
- Подключение газового датчика TGS2600 к Raspberry Pi для обнаружения вредных газов
- Создание интернет-управляемого видеostreaming-робота на Arduino и Raspberry Pi
- Подключение GrabCAD Print к Stratasys 3D-принтеру: пошаговое руководство
- Максимизируйте прибыль бизнеса: проверенные стратегии эффективности отопительного масла
- Управление потолочным вентилятором через Alexa: пошаговое руководство
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- Создание динамической бегущей строки на Arduino Nano и NeoPixel