hnwの日記

switchbot-actionsではじめる最小構成のIoT

SwitchBotのセンサーデバイス(人感センサーやCO2センサーなど)は、エンジニア視点で見てもハードウェアとしての完成度が非常に高いガジェットです。コンパクトで省電力、かつデバイス単体であれば価格も手頃です。

しかし、これから試そうと思うエンジニアにとって、一つだけ「心理的なハードル」が存在します。それは、公式アプリでの自動化やクラウド連携を行うために、原則として SwitchBotハブ(定価4,000円程度)が必須となる点です。

「データ取得のためだけに専用ハブを買うのは気が引ける……」 「CO2センサーには興味があるので、まずは少し遊んでみたいな……」

そう考える方におすすめしたいのが、拙作の switchbot-actions です。これを使えば、専用ハブを介さず、デバイス1台からSwitchBotの可能性を引き出すことができます。

switchbot-actionsを使うメリット

switchbot-actions は、SwitchBotデバイスを制御・自動化するためのOSSです。このツールを導入する主なメリットは以下の3点です。

1. ハブ不要でスモールスタートが可能

switchbot-actions は、PCやRaspberry Piに搭載されたBluetooth機能を使い、デバイスと直接BLE通信を行います。つまり、一般的なSwitchBotユーザーが利用する公式の「SwitchBotハブ」を購入する必要がありません。 これはエンジニアにとって大きなメリットと言えるでしょう。

「まずはCO2センサーだけ購入して、手元のRaspberry Pi(ラズパイ)で値を取りたい」という場合でも、最小の手間とコストで始められます。

2. YAMLひとつでロジックを記述できる

公式アプリの自動化機能も進化していますが、複雑な条件分岐(条件Aかつ条件Bの時だけ……等)や、任意のSlack WebhookへのPOST送信といった柔軟な外部連携まではカバーしきれていません。

switchbot-actions では、動作のすべてを1つの config.yaml に記述します。 「温度が28度を超えたら」「開閉センサーのボタンが押されたら」といったトリガー条件や、Webhook、シェルコマンド実行といったアクションを、コードベースで柔軟に定義できます。

3. データを自分のものにできる

センサーの現在値を確認するだけでなく、時系列データとして蓄積・可視化したくなるのがエンジニアの性ではないでしょうか。 このツールでは Prometheus Exporter 機能を実装しています。設定を一行追加するだけで、Grafana等を用いて室温や湿度を簡単にグラフ化できるようになります。

実践:CO2センサーで作る「換気アラート」

では、実際に switchbot-actions を使って、実用的なシステムを作ってみましょう。 テーマは、在宅勤務の生産性を守る「CO2換気アラート」です。

やりたいこと

  • 機材: SwitchBot CO2センサー、Raspberry Pi 3(BLEを搭載していればPCやMacでも動作します)
  • 条件: CO2濃度が1000ppmを超えたら
  • 動作: Slackに「換気してください」と通知を送る

設定ファイル (config.yaml)

やることはシンプルです。config.yaml を作成し、以下のように記述します。

# config.yaml

# 1. デバイスの定義 (MACアドレスはデバイス裏面、またはスキャンコマンドで確認)
devices:
  my-co2-meter:
    address: "AA:BB:CC:DD:EE:FF"

# 2. 自動化ルールの定義
automations:
  - name: "換気アラート"
    # 頻繁に通知が来ないよう、一度発火したら1時間は静かにする
    cooldown: "1h"
    
    # トリガー設定 (IF)
    if:
      source: "switchbot"
      device: "my-co2-meter"
      conditions:
        # CO2濃度が1000ppmを超えたら発火
        co2: "> 1000"
    
    # アクション設定 (THEN)
    then:
      - type: "webhook"
        url: "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK"
        method: "POST"
        payload:
          text: "🚨 *換気アラート* 🚨\n現在のCO2濃度は *{co2}ppm* です。窓を開けましょう!"

解説

  • 動作概要: ラズパイが直接CO2センサーのBLEアドバタイズ信号を拾い、YAMLの条件 (co2: "> 1000") に合致した瞬間、インターネット経由でSlack APIを叩きます。
  • プレースホルダ: {co2} と記述するだけで、センサーから取得した実際の値をメッセージに埋め込めます。
  • cooldown: 「1001ppm」と「999ppm」を行き来するたびに通知が来ると、実運用ではノイズになります。 cooldown: "1h" を設定すれば、「一度通知した後は1時間何もしない」といった制御も設定ファイルだけで完結します。

これだけの記述で、自分だけの換気アラートシステムが完成しました。

筆者はほぼ同じ仕組みを実用しています1。在宅勤務中に部屋を閉め切っているとCO2濃度が上がりやすいため、興味を持った方はぜひ試してみてください。 SwitchBot CO2センサーは少々値が張りますが、CO2センサー(NDIR方式)の部品単価自体が高価であることを考えると、完成品としてこの価格はコストパフォーマンスが高いと言えます。

導入手順

導入には Python 3.11 以上 が動く環境が必要です。システム環境を汚さないよう、 pipx でのインストールを推奨します。

1. インストール

# pipxが未インストールの場合はまずインストール
# (Ubuntu/Debian系の場合: sudo apt install pipx)
pipx ensurepath

# switchbot-actionsのインストール
pipx install switchbot-actions

2. デバイスのスキャン

まずは設定ファイルなし、かつデバッグモードで起動し、ラズパイからセンサーが見えているか確認します。

# -vv (verbose x 2) をつけるとDEBUGログが表示され、受信したBLEデータが見えます
# Bluetoothへのアクセス権限が必要な場合があります
switchbot-actions -vv

ログに Received advertisement from... と表示され、手持ちのセンサーのMACアドレスが見つかれば準備完了です。ここで確認したアドレスを config.yaml に記述してください。

3. 起動

先ほど作成した config.yaml を保存し、指定して起動します。

switchbot-actions -c config.yaml

これだけでラズパイがスマートホームハブになりました。

本格的に運用する場合は、リポジトリのドキュメントを参考に systemdDocker で常時稼働させてください。筆者の自宅では半年ほど動き続けています。

まとめ

SwitchBot製品は、ハードウェアとしての完成度だけでなく、ユーザーが自由に遊べる余地が広い点も魅力です。switchbot-actions がそのハードルをさらに下げるツールになればと願っています。

  • ハブを買わずに、センサー1個から始められる
  • YAMLでロジックを記述できる
  • 必要ならGrafanaで可視化できる

まずはデバイスひとつから、手作りIoTの実験をしてみてはいかがでしょうか。特に入門用として、以下の3つは安価でおすすめです。


  1. 筆者はGrafana Cloudで可視化・アラーティングをして、Slack通知しています。設定は面倒ですが、Slackにグラフ画像を出せるのがメリットです。