Stream Deckでswitchbotをいじりたかったので操作するためのサーバを実装してみた

Stream Deck購入

少し前にStream Deckというものを購入した。

社内SNSでこれを使って遊んでる人のつぶやき記事を見つけたので、クレカのポイントも余ってるので購入してみた。

買ったのはElgato Stream Deck Neoというもの。

Stream Deckとしてはかなり小型の部類で安価なので、ちょっとしたおもちゃとして遊ぶのはちょうどよい。

Amazon.co.jp: 【Amazon.co.jp限定】Elgato Stream Deck Neo – カスタム可能な8個のキー、2つのTouch Points、タスクとワークフローを加速 - Word、Excel、PowerPoint、Teams、Zoom、Spotify、その他をコントロール、ドラッグ&ドロップで設定可能 - MacとPCに対応 : パソコン・周辺機器

購入してから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を参照してほしい。

github.com

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"

操作している動画は以下

分かりづらいが部屋のライトが点灯したり、消灯したりしているのが見える。

www.youtube.com