Raspberry Pi と Kubernetes によるエアコン室外機冷却システム

スマートホーム
スポンサーリンク

以前作った,エアコン室外機冷却システムを Kubernetes ベースで作り直してみました.

スポンサーリンク

モチベーション

昨年作ったシステムは,期待通りの働きはしてくれたものの以下の課題がありました.

  • Raspberry Pi にソフトを書き込まないと動作確認できない
  • ソフトの更新作業が繁雑で更新中動作が停止してしまう
  • 稼働状況が分かりにくい

これらを,次のようにして改善します.

  • Kubernetes クラスタを前提とした構成にソフトを再構築
  • 電磁弁を制御するコンポーネントと制御量を算出するコンポーネントを分離
  • Web インターフェース作成

改善後のシステム構成

改善後のシステム構成は以下.

Raspberry Pi は右側の四角部分になり,冷却に関わる制御量を受け取って電磁弁を制御するアクチュエータの機能を担います.分析用に噴霧した水量のモニタも行います.ソフトは Raspberry Pi に直接書き込むのではなく,Kubernetes でノード指定をした Deployment で配置します.

冷却に関わる制御量コントローラ,同じく Kuberbetes を使って別のノードに配置しています.

コード全体は下記においています.

GitHub - kimata/outdoor_unit_cooler: エアコンの室外機を自動でミスト冷却するアプリケーションです.
エアコンの室外機を自動でミスト冷却するアプリケーションです.. Contribute to kimata/outdoor_unit_cooler development by creating an account on GitHub.

以降では,先ほどの3 つのポイントを順に説明します.

Kubernetes クラスタを前提としたソフト構成

こちらで必要になる要素を下記の3つのエントリーで説明しています.これらを組み合わせることで,Git にコミットするだけで,自動的にソフトを更新して公開できるようになります.

Raspberry Pi で Kubernetes を使う場合の Tips
Raspberry Pi で Kubernetes を使う場合に知っておくと役立つ情報を紹介したいと思います.
Kubernetes のイメージを GitLab Agent で自動更新する方法
自宅サーバ環境で Kubernetes のイメージを自動更新するCIワークフローを構築する方法を紹介します. やりたいこと git push した際,次の3点を自動で行いたい. テスト コンテナイメージのビルドおよびコンテナレジストリへの登...
自宅の Kubernetes 上のサービスに Google OAuth認証をつける方法
自宅の Kubernetes 上で動かしているサービスをインターネットに公開し,そこに Google OAuth 認証を付ける方法を紹介します.

アクチュエータについては,RPI.GPIO や流量計の動きを模擬する下記のようなクラスを追加し,GitLab CI 等での自動テストを可能にしています.

コンポーネントの分離

電磁弁の制御を担う Raspberry Pi と制御量を算出するサーバは,ZeroMQ を使った Pub-Sub パターンで分離しました.

ZeroMQ
An open-source universal messaging library

RPC的な仕組みを使おうか迷ったのですが,ZeroMQ を使った Pub-Sub パターンだと下記のようなことが,異常系を考慮することなく簡単に実現できるので良かったです.

アクチュエータ,コントローラの起動順番の変更.片方の再起動.
これにより,ソフトをデプロイする際にのシステム停止時間が最小化されます.コントローラを更新する場合,その間冷却動作は問題なく継続できます.
アクチュエータ側の複数配置
これにより,アクチュエータのデプロイ前,実際に稼働しているコントローラと接続して,テストを行うことができます.GitLab CI を設定すれば,テストに成功した場合のみ自動的にデプロイすることもできます.

実際のコードはこんな感じです.異常処理が一切無い簡潔なコードですが,これで問題なく安定稼働しています.

Web インターフェース作成

下記を表示できるようにしています.

  • 散布した水量
  • 冷却モード
  • 散布パターンを決めるのに使っているセンサーデータ(エアコン電力,気象条件)
  • 作動ログログ

画面はこんな感じ.

動いている様子を下記で見てもらえます.センサーデータ等は1週間前の値になっています.

室外機冷却
エアコンの室外機を自動で冷却するシステムの稼働状況が確認できるアプリです.

基本的に Web インターフェースは制御量算出の入出力を表示しているだけですが,「本日の散水量」だけは追加で準備しました.実は昨年は,散布量と水道料金のバランスを取るのに少し苦労したので,改善するのが目的です.

電磁弁を制御する Raspberry Pi で流量をモニタし,これを Fluentd 経由で InfluxDB に格納しておくことで実現しています.

InfluxDB に入っているデータは,Flux と呼ばれるクエリ言語を使って集計して取り出せます.aggregateWindowreduce を使って,1分ごとの流量平均値を計算した上で積算することで,散布量が算出できます.

コードはこんな感じです.

コメント