メインコンテンツへスキップ
見出し画像

SwitchBotをフロアマップ的なやつから操作する

    SwitchBotといえば!照明のスイッチを物理的に押すだけの機械から始まり、スマートプラグ、温湿度計、人感センサー、カメラ、掃除機、それらを繋ぐハブ兼スマートリモコン…スマートホームのだいたいが揃った一大プラットフォームですね。

    当然これらはSwitchBotのアプリから操作できるわけだけど、SwitchBotの機械が増えるほど、アプリの画面のどこにあったっけ…みたいなことになる。複数まとめて操作するシーン機能もあるけれど、それも味気のないリスト表示。

    しかしSwitchBotはなんと…APIで操作することもできます!ということは、Claude Codeくんに「SwitchBotのAPIを使って俺の家に合わせたグラフィカルな操作画面を作って」と言えばやってくれるんじゃないですか?

    画像

    できた。どう作ってもらったか書いていきます。以下は全てSonnetくんがやったので、Opusくんならもっと上手いかもしれない。

    Raspberry PiにWebサービスを置く

    SwitchBot APIを使用して温度計や照度センサー、プラグミニの電力といったセンサー値を取得したり、スイッチ操作したりするためのWebページをRaspberry Pi 4上に構築したい。PythonとNginxはすでに使用可能な状態。設計案を考えて。

    5/17 俺

    別にMacやiOSアプリを作ってもいいわけですが、Raspberry Piみたいなサーバ上のWebサービスにすればLAN内のどのブラウザからも操作できるようにになり、将来的にESP32たちからも呼び出せるはず。なのでまずはそういう簡単なWebサービスを作ってもらおう。

    画像
    5/17 Claudeくん

    設計案をCLAUDE.mdにしてもらって、Claude Codeくんにコードを書いてもらう。エラーや改善点を指摘していって、まずはこういう一覧表示を作った。

    画像
    エアコン等はスマートリモコンから制御されるため、状態を取得できるデバイスではない。rate limitもあるので途中から状態を取得しないようにしている。

    当初は定期的なポーリング前提のコードを書いてきたんだけど、Rate limitがあるので現在はWebページを開いたり更新した時のみデバイスの状態を読み込んでいる。読み込んだ状態はSQLiteに保存されるので、APIを呼び出すことなく最後の状態を取得することもできる。

    フロアマップから操作できるようにする

    さて、上記のようなリスト表示だとSwitchBotアプリとあまり変わらないけれど、APIを通じてデバイスの状態表示や操作ができることは確認できた。あとは自宅の部屋レイアウトとデバイスの位置を対応付けてフロアマップ的な表示を作ることにより、部屋をタップしたら電気がつく、みたいなGUIができるはず。

    画像
    こういうだいたいのフロアマップを作って…

    Python側はそのままで、添付のイメージ図のようなWebインターフェースを作成して、旧来の一覧と切り替えられるようにして。
    明るいエリアは薄い黄色、暗いエリアは濃い灰色で表示:
    ①Contact Sensor XXXXXXXXXXX の明暗
    ②Hub 2 XXXXXXXXXXX の照度が5未満か5以上かで明暗
    ③Motion Sensor XXXXXXXXXXX の明暗
    ④Contact Sensor XXXXXXXXXXX の明暗
    ⑤Contact Sensor XXXXXXXXXXX の明暗

    5/24 俺

    各部屋ごとに照度センサーを装備したデバイスがあるので、そのIDを指定してイメージ図上の位置と紐づけてもらう。

    画像
    出来たか…?出来てない!

    ただまあ…レイアウトは再現できなかった。これは手動で座標指定をせざるを得ないか…と思ったんだけど、考え方を変えてレイアウトツールを作ってもらうことにした。

    フロアマップのレイアウト調整を手動でやりたいな。各ダイヤモンドの位置をドラッグで移動できて、各点の座標を数値表示する、フロアマップだけのhtmlを別に作成できる?それで調整したものを本番用htmlに書き込みたい。

    5/24 俺
    画像
    作成されたフロアマップエディタ。位置は人間が調整した後のもの

    これならフロアマップというすごくグラフィカルなものを作るのに、文章で指示を出す必要はないわけですよ。やるなこいつ。

    画像
    最終的なフロアマップ画面

    最終的にはこんな感じで、照度センサーが明るいと感知しているエリアは黄色く、暗いエリアはダークグレーで表示する。各エリアをタップすると照明のスイッチが押されて、20秒くらい待ってから照度をもう一回読んで表示を更新する。これがLAN内のWebブラウザすべてから可能になった。素晴らしい。

    ESP32デバイスから操作できるようにする

    家にはESP32デバイスがたくさん転がっている。ESP32は流石にWebブラウザ機能はないんだけど、簡単な画面表示やWeb API呼び出しくらいはできる。ということは、上記のブラウザ版のコードを基にESP32にこういう機能を移植して、と言えばやってくれるんじゃないか?

    画像
    これはSensecap Indicatorというデバイス。480x480タッチパネル液晶を装備したESP32デバイスだ

    できたね…
    今度は画像からではなくhtmlからレイアウトを読み取ったおかげか、一発でこのレイアウトが出てきた。

    未来へ…

    どの部屋の照明がついているか、ということを他の部屋から視覚的に把握できるのはとてもいい。一部屋に一個画面を置いておきたいくらいだ。M5Paperも何枚か転がっているからそれにも移植したい。画面がなくてボタンだけのESP32デバイスでも、シーン実行ボタンになら出来る(SwitchBot製品にもある)。
    まあ…部屋の数に対して一人しか住んでないからこんなことになるんですけど…

    あなたへのおすすめ