Intern

Docker で BACnet クライアント環境を構築して CoolMaster を制御してみた

はじめに

CoolMaster(BACnet対応の空調制御ユニット)に対して
Python の bacpypes ライブラリを用いてセットポイントを読み書きするプログラムhttps://smartlight.co.jp/2025/02/10/coolmaster_python-bacnet/を参考に
今回は Docker を活用して構築しました。

環境・構成

  • Windows 11 + Docker Desktop
  • Docker イメージ: Python 3.11
  • bacpypes ライブラリ
  • CoolMaster BACnet 対応機器
  • BACnet 通信: UDP, ブロードキャスト利用

コードの概要

今回試したコードは

  • BACnet の analogValue オブジェクトの presentValue を読み込み
  • 設定温度を更新
  • 更新後に再度読み込み

するシンプルなものです。

Python 3.11 + bacpypes(旧版)を使用している理由は
bacpypes3 は Python 3.12 以降で asyncore が廃止されたため
古い構成のほうが確実に動くからです。

コード自体は過去記事(上記URL)で紹介した bacpypes の例をベースに
Dockerで対応してみました。

【Dockerfile の例】

<code>FROM python:3.11

WORKDIR /app

RUN pip install bacpypes

COPY coolmaster_bacnet.py /app/

CMD ["python", "coolmaster_bacnet.py"]
</code>Code language: HTML, XML (xml)

このように非常にシンプルで
Python バージョンを固定しつつ bacpypes をコンテナ内にインストールしています。

また以下のコマンドで Docker 上に BACnet クライアント環境を構築しました。

1️⃣ ビルドコマンド

<code>docker build -t bacnet-client .
</code>Code language: HTML, XML (xml)

→ Dockerfile のあるフォルダで実行すると
bacnet-client という名前のイメージが作成されます。


2️⃣ コンテナ実行コマンド

<code>docker run --rm --network host bacnet-client
</code>Code language: HTML, XML (xml)

--network host オプションでホストと同じネットワークに接続し
BACnet のUDPブロードキャストを通す狙いです。

3️⃣ 温度を変更した場合の再ビルド

たとえば

<code>client.write_setpoint(27.0)
</code>Code language: HTML, XML (xml)

<code>client.write_setpoint(25.0)
</code>Code language: HTML, XML (xml)

に修正したら
イメージを再ビルドし直す必要があります。

<code>docker build -t bacnet-client .
</code>Code language: HTML, XML (xml)

再度

<code>docker run --rm --network host bacnet-client
</code>Code language: HTML, XML (xml)

で起動します。

補足

docker run --rm --network host -e SETPOINT=25.0 bacnet-client


のように 環境変数 でパラメータを渡せるよう改良しておくと再ビルド不要で温度変更できるそうです

Docker で BACnet クライアントを構築するメリット

  • Python バージョン管理が容易
    → bacpypes は Python 3.11 までしか正式対応していないため
    ホストに 3.12 以上が入っていても Docker なら 3.11 で隔離して実行可能。
  • 開発環境の再現性が高い
    → Dockerfile を共有するだけで、他の開発者も同じバージョン・同じ依存パッケージで即実行できる。
  • ホストPCに影響を与えない
    → pip install でパッケージを汚さず、既存のシステムに干渉しない。
  • ホストOSを選ばない
    → Docker さえ動けば Windows / Mac / Linux で同じイメージを使える。

Docker で BACnet クライアントを構築するデメリット。

  • ネットワークデバッグが複雑
    → コンテナ内部のネットワークとホストの通信が分かれるので
    BACnet のパケットキャプチャや疎通確認がしづらい。。
  • リアルタイム性の検証には弱い
    → 仮想化レイヤを挟むため、BACnet のレスポンス時間を
    完全にホストと同じ精度で再現するのは難しい。
  • 設定値をハードコードした場合の再ビルドが必要
    → 例えば温度をコード中に直接書いている場合、
    設定を変えるたびに docker build が必要となるため、
    頻繁にパラメータを変える実験にはやや不便。
    (※ 環境変数や外部設定ファイルに置き換えれば回避可能)

検証結果の実証例

実際にDocker上で構築したBACnetクライアントから
CoolMasterの設定温度を変更した様子を記録しました。

以下の写真は

  • Dockerのログ
  • 実際の室内コントローラの表示

26度から27度に変わっていることが確認できました。

まとめ

Docker を使うことで、BACnet クライアントの動作検証や Python バージョンの固定を
非常に簡単かつ再現性高く行えることが分かりました。

一方で、Docker 特有のネットワーク制約や、コードにハードコーディングした設定値の変更に伴う再ビルドの必要性など、運用上のデメリットも改めて確認できました。

今回の検証では、Docker コンテナから CoolMaster の設定温度を正常に読み書きできることを確認でき、Docker 環境でも BACnet 制御が十分可能であると示せました