※この連載記事の読者は、ある程度のIT技術系のリテラシーを持たれていることを前提にしていますので、専門用語は普通に使っていきます。
※この記事は「連載記事」です。
今回カスタムするSwitchbotを使う環境を整理します。
元々、仕事の関係から東京の拠点、外部のデータセンター、遠方の実家等をIPSec-VPNでつないだセキュアな運用環境を既に構築してあります。この環境化ではセキュリティの事情から、外部ネットワークとの接続は避けたい。一方で、Switchbotのメーカー提供クラウドとの通信を切り離して運用することは可能です。しかし、視点を変えると、せっかく構築してあるセキュア環境を活用したホームIotを組んだほうが、今後の拡張を考えてもベターと考えました。

Switchbot open source SDKを使って、公式クラウドを使わない操作をする
SwitchBot opensource project – python-host
僕が、物理ボタンの遠隔操作のためにSwitchbotを選んだ理由は、SDKが存在することです。APIではなく、このSDKを使えば、Switchbotが提供する公式クラウドへの接続を行わずに、ローカル・セグメントで遠隔操作が行なえます。
このSDKはRaspberry pi OSまたはOpenWrt OSをホストとして、pythonコードでスクリプトを組むために用意されており、Switchbotの制御用ゲートウェイ・デバイスとして公式で販売されているSwitchbot Hubを使わずに、Raspberry piをゲートウェイ・デバイスとしてシステムを組むことができます。
つまり、ゲートウェイ・デバイスとなるのRaspberry piに、遠隔操作用のサーバー機能または信号中継機能を構築すれば、想定している「公式クラウドを使わない遠隔操作」が可能になります。
※ただし、Switchbotが公式クラウドとAppで提供している他のクライアント機能は使えません。「Switchbotの操作、設置されているSwitchbotの検索」のみがSDKで提供されています。Open Sourceなのでソースをほじくれば、出来ることがまだあるかもしれませんが、気になる方は、ほじくってください笑。
概要図をまとめる
ここまでのところ、Switchbotを直接制御するRaspberry piは、VPN網を経由して遠隔操作するスマートフォン等と接続されることが決まりました。また、SwitchbotはBluetoothでRaspberry piと接続されるため、お互いの距離を考えると同じ部屋に置かれることが想定されます。
さて、全体像をつかむために、「(1)カスタムした理由」の概要図を更新してみます。この工程は大事ですよね。ここで気がつくことって少なくない。

この図でわかるように、Raspberry piがゲートウェイ・デバイスになるということは、遠隔から人がスマートフォンで適宜操作するだけではなく、独自のスケジューラやシステムとの連携が自由に行えるようになります。元々SwitchbotはAPIを公開しているため、ある程度の自由なシステムを組むことができますが、遠隔制御用のネットワーク・セグメントがSwitchbot公式クラウドから独立するということからも、その自由度が全然違います。
応用ケースを想定して、開発する機能を「モジュール化」しておく
既に構築してあるVPN網を使ったSwitchbotのカスタムですが、今回開発することで「これは使えるぜ!」という素敵な結果が出た場合には、VPNが整備されていない等の他の環境にも、できる限り労が少なく応用できるようにしておきたいです。
今回はSwitchbotの操作だけというシンプルな機能ですが、他の機能も同様に、次の図のようにデータフォーマット(通信プロトコル)の作成とバッチ化されたスクリプト群から構成されるモジュールとして開発することで、考え得る様々なケースに対応できるようにします。
今はクラウドを代表とするプラットフォーム全盛期ですが、その際の応用ケースの想定では、プロトコルの設定のみに着目されるケースを散見します。でも、プロトコルってサービスが異なれば全然違う。「JSONでまとめているので対応してね!」がお決まりのパターンです。つまり、一番大事なのは「どんなプロトコルにも対応できるモジュール=バッチ化」が一番シンプルで、かつ大切なポイントだと経験から実感しています。
※連載記事「使われるIoTをつくる」では、「WebSocketを活用した、リモートコントロール・クラウドの開発」を紹介します。(執筆中)

「前へ Switchbot をカスタム ー クラウドを経由しないで操作できるようにする (1)カスタムした理由」
「次へ Switchbot をカスタム ー クラウドを経由しないで操作できるようにする (3)つくるー動かす」