Stream Deck購入
少し前にStream Deckというものを購入した。
社内SNSでこれを使って遊んでる人のつぶやき記事を見つけたので、クレカのポイントも余ってるので購入してみた。
買ったのはElgato Stream Deck Neoというもの。
Stream Deckとしてはかなり小型の部類で安価なので、ちょっとしたおもちゃとして遊ぶのはちょうどよい。
購入してからDiscordのミュート解除とか、音量調整とかで利用しており、かなり便利に利用している。
ページ機能があり、1ページ1ページでボタンの操作対象を変更することができる。
例えば1ページ目ではDiscord操作用ボタンとして機能し、2ページ目では音量、再生等操作の方に切り替わるといった具合だ。
Switchbot pluginにおける問題点
さて、このようにボタンで操作できると便利になるものはほかにもあって、それが我が家の場合はswitchbotでの照明操作、エアコン操作となる。
どうやら同じように考えていた同志がいたらしく、Stream Deck Plugin StoreにはSwitchbot用のプラグインがあった。
https://marketplace.elgato.com/product/switchbot-b0f7f3c2-9a44-448c-bdf1-a00ae99f68ff
しかし、悲しいことにSwitchBot APIの認証トークンの処理が変更され、本プラグインは動作しなくなっていた。
Switchbot APIの認証関係の変更箇所は以下を参照すること。
ざっくり説明すると今まではトークンと秘密鍵さえあればよかったが、今はそれらをもとに認証に必要な情報 (nonce) を生成してSwitchbot APIにリクエストを送って検証してもらう必要がある。
GitHub - OpenWonderLabs/SwitchBotAPI: SwitchBot Open API Documents
このような変更のせいで旧APIにしか対応してないプラグインでは動作しなくなっている。
対応方針
Stream DeckにはAPI Ninjaというpluginがあり、これでGET, POST, PUT, DELETEというようなリクエストを投げることができる。
このため何かしらのREST APIを持つサーバを作成して、そこに対してリクエストを投げると、Switchbot APIに操作を中継するというふうにすればよい。
https://marketplace.elgato.com/product/api-ninja-fd59edeb-e7e5-412f-91ef-304c3e03f035
認証トークン取得方法は上記リンク先に取得方法のコードがあるのでそれに基づいて取得する。
成果物
ということでできたのが以下のプログラム。
自宅にKubernetesがあるのでそれの上で動くようにhelm chart等に固めたり、トークン系はHashicorp Vault上から取得するようにとじゃっかん特殊なことをやっているが、バイナリをビルドして必要な環境変数を設定さえすればKubernetesがなくても簡単に動かすことができる。
ローカルでの動かし方はhttps://github.com/ABC10946/switchbot-middleware/tree/main/app/exampleを参照してほしい。
Kubernetes上のConfigMapで操作対象や操作するためのAPIを変更したかったためyamlファイルで設定をできるようにしている。
以下のように設定するとexample.com/light/turnonとするとライトが点灯するように設定できる。
独自操作としてtoggleというものを実装したが、これはこのAPIを叩くとOn, Off切り替えをしてくれるというもの。
ボタン一つでOn, Offさせたいというときに重宝するだろうということで実装してある。
switchbot-configuration: - name: "light-turnon" path: "/light/turnon" type: "turnOn" deviceIds: - "01-202304012328-87495896" - name: "light-turnoff" path: "/light/turnoff" type: "turnOff" deviceIds: - "01-202304012328-87495896" - name: "light-toggle" path: "/light/toggle" type: "toggle" deviceIds: - "01-202304012328-87495896" - name: allon path: "/all/turnon" type: "turnOn" deviceIds: - "01-202210180121-38128280" - "01-202304012328-87495896" - "70041D7EEE6A" - name: alloff path: "/all/turnoff" type: "turnOff" deviceIds: - "01-202210180121-38128280" - "01-202304012328-87495896" - "70041D7EEE6A" - name: aircon-toggle path: "/aircon/toggle" type: "toggle" deviceIds: - "01-202210180121-38128280"
操作している動画は以下
分かりづらいが部屋のライトが点灯したり、消灯したりしているのが見える。