セントラルヒーティングをArduinoでスマート制御:OpenThermシールド活用ガイド
必要な部品と材料
| 部品 | 数量 |
|---|---|
| Arduino UNO | 1 |
| Arduino OpenThermシールド | 1 |
| 24V電源 | 1 |
プロジェクト概要
ボイラーがいつ、なぜ動作して家を暖めているのか知りたくありませんか? Arduinoで暖房システムを自動化したいと思いませんか? OpenThermシールドはまさにそのためのものです。OpenTherm対応ボイラーをArduinoで監視・制御できるようになります。


背景
昨年、ガス暖房ボイラーと暖炉レギュレーターを連携させたくなりました。私のBAXIボイラーとサーモスタットはかなり高機能なので、ボイラーを拡張して暖炉も制御できるようにしたかったのです。しかし、公式のBAXI拡張モジュールは高価すぎます。
そこで、サーモスタットとボイラー間の通信を傍受し、ボイラーを焚くか暖炉の熱を使うかを判断するアルゴリズムを挟む「OpenThermゲートウェイ」を自作しました(レギュレーター詳細)。
同様のニーズを持つ人が多かったため、誰でも簡単に家庭暖房を制御できるよう、Arduinoシールドとしてモジュール化することにしました。

このシールドでできること
- 既存のOpenThermサーモスタットを使って、Arduinoベースのボイラーを自作(あまり現実的ではないが可能)
- Arduinoベースのサーモスタットを自作し、ボイラーと家庭暖房を完全制御。ホームオートメーションに最適。外部5V電源のみ必要
- 既存のボイラーとサーモスタットの間にシールドを挟み、モニターとして動作。ボイラーがいつ、どう暖房しているかを監視。通信を傍受してワイヤレス制御も可能
- OpenThermはマン・イン・ザ・ミドル(ゲートウェイ)デバイスを許容しており、ボイラーとサーモスタットの両方と通信可能。筆者はこの方法でOpenThermレギュレーターを作成
取得可能なデータと送信可能なコマンド
- 室温
- 室温設定値
- 暖房水温度
- 戻り水温度
- 給湯温度※
- 給湯圧力※
- 給湯流量※
- 外気温※
- ボイラーステータス(運転中/停止中/エラー)
- 変調レベル
- 排気温度※
- ボイラー運転時間統計
※印はボイラーに必要なアクセサリーが装備されている場合のみ利用可能
シールドの製作
電子回路は、PICマイコンを使用したOpenTherm Gatewayプロジェクトをベースに、Arduino用にアレンジし、Arduino UNO互換のレイアウトとして設計しました。

上記回路図とガーバーファイルを使って自作できます。筆者はPCBWayで製造しています(青色ソルダーマスクが緑と同価格、カスタマーサービスも優秀)。またはDIYキットを注文することも可能です。

サーモスタットとして使用する場合
最初の例は、シールドを使ってカスタムサーモスタットを作る方法です。必要なもの:
- OpenTherm対応ボイラー
- Arduino UNO、WeMos D1、またはArduino UNO互換ボード(ピン2と3で割り込み対応必須)
- 5V電源(サーモスタットと通信しないため24V電源は不要)

ボイラーをシールド経由で接続し、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();
}
}
まずOPENTHERM::isIdleで保留コマンドがないか確認。なければ次のコマンドを送信。この例ではスレーブ設定フラグを要求。送信成功ならOPENTHERM::listenで応答待機。OPENTHERM::getMessageで応答受信を検知、エラー/タイムアウト時はOPENTHERM::isErrorがtrueを返す。ライブラリにはデコード済みデータを含むOpenThermメッセージ構造体があり、プロトコルフォーマットを意識せず扱えます。ソースコードはよくドキュメント化されています。メッセージタイプは定数で定義、または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);
}
モニター・ゲートウェイ・レギュレーターとして使用する場合
2つ目の例は、ボイラーとサーモスタットの間にマン・イン・ザ・ミドルデバイスとして接続し、通信を監視・傍受する方法です。必要なもの:
- OpenThermサーモスタット
- 24V 500mA電源

シールドをボイラーとサーモスタットの間のバスに割って入る形で接続します。ゲートウェイソフトウェアをArduinoに書き込まない限り通信は遮断されます。ゲートウェイソフトは、サーモスタットからのコマンドを受信してボイラーに転送し、ボイラーからの応答をサーモスタットに返す役割を果たします。Arduino OpenTherm IOライブラリに優れた例があります。
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); // 800ms以内に応答必要
} 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();
}
}
}
ゲートウェイはサーモスタットからのコマンドを待ち受け、検知したらパースしてボイラーに転送。次にボイラーからの応答を待ち受け、800ms以内に受信したらサーモスタットに返します。サーモスタットもボイラーも、間にデバイスがあることを認識しません。この仕組みを利用して、メッセージを解析して有用情報(ステータス、温度、圧力、統計等)を取得したり、不要なリクエスト/応答を上書き・破棄したりする独自コードを追加できます。
スマート暖房システムと通信して、さらに賢くするのは本当に簡単です。次回の記事では、このハードウェアを使ったOpenThermレギュレーターの実践的な活用例を紹介します。
コードライブラリ
OpenTherm IO library for Arduino: https://github.com/jpraus/arduino-opentherm
回路図

製造プロセス
- Raspberry Piでセントラルヒーティングボイラーを監視 – ハードウェア、ソフトウェア、セットアップガイド
- 家庭用の低コストワイヤレスセンサーネットワークを構築
- Raspberry PiにTGS2600ガスセンサーを接続して有毒ガスを検知
- Arduino & Raspberry Pi でインターネット制御ビデオストリーミングロボットを構築
- Alexaでシーリングファンを音声制御:ステップバイステップガイド
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- Arduino NanoとNeoPixelで作るダイナミックなマーキーLED照明
- Arduino Cloud連携でどこからでも家の温度を監視
- GrabCAD PrintとStratasys 3Dプリンターの接続 - ステップバイステップガイド
- 暖房用オイル効率化でビジネス利益を最大化する実証済み戦略