Node.jsでスマートロックを解錠する SwitchBot APIで究極のスマートホーム
以前、SwitchBot のWeb APIでできることを説明した記事を書きました↓
本日は、少し具体的にコードを交えながら解説していきます。
目標は、「Node.js (JavaScript)を使ってコマンドラインからスマートロックを操作する」ことです。本ブログ「テック大家さん」のいつもの記事と若干テイストが異なり、とてもプログラミングな内容になっています。
それでは参りましょうー。
SwitchBotとは?SwitchBot Web APIとは?
SwtichBotはスマートホームを実現するためのさまざまなガジェット(機器)を製造・販売しています。製品自体もSwitchBotというブランドで統一されています。例えば、スマホから制御できるスマート電球やコンセント・スイッチ、スマートロックや、スマートカーテン開閉器など。
IoT( Internet of Things 、モノのインターネット)を実現する機器としてAmazonなどにも豊富に存在するスマート機器のひとつの有名ブランドと言えるでしょう。
このような製品は一般にスマホで設定してスマホで操作するような仕様になっており、それを以て「スマート」であると謳っているようなところがあります。
ただ、SwitchBotの嬉しいところは、その「スマート」な遠隔操作のための仕様を公開していることです。公開している仕様の一つがWeb APIの仕様です。
Web APIはHTTP/HTTPSでプログラムから呼び出して使うサービスです。つまり、Web API仕様を公開しているということは、購入者のみなさんに自由にプログラムを作って下さい、というポリシーであるということなのです。
筆者がSwitchBot推しなのは、実はこの仕様公開のポリシーによるところが大きいのです。詳細は以前以下の記事に書きました。こちらも合わせてご覧いただくと理解が深まるでしょう↓
本日の記事では、SwitchBot製品の中でも、スマートロックを取り上げています。
作るもののイメージ
ここで、プログラマー「テック大家さん」が本日の記事で取り上げる自作プログラムをご紹介しましょう。
突然ですが、以下のようなシナリオを想像して下さい。
大家さんのあなたは、パソコンに向かって投資用不動産の検索をしています。
「なにかいいものないかなぁ?あれ、あれ?これ良いんじゃない?利回り12%で駅チカ…」
と、その時です。
鍵がかかった玄関のドアをガチャガチャやっている音がします。きっと家族が帰ってきたけど鍵を持たずに出かけたのでしょう。
「うーん、今手が離せないよー」
と思ったのもつかの間、おもむろにターミナルアプリを開き、コマンドラインから以下のように打ちます。
$ node index.js unlock
するとどうでしょう。パソコンから離れることなく、玄関ドアのサムターンに設置してあるSwitchBotロックが
「キ〜〜ガシャン」
と鳴って、見事に解錠されるのでした。
こんなぐーたらな(!?)大家さんにとって、夢のような体験を実現するNode.jsのプログラムが筆者の自作プログラムです。
まあ、ここまで極端なケースでなくとも、例えば、自分が所有している賃貸が空室になって入居者募集をしているときなど、その部屋のドアにSwitchBotロックを設置しておくとします。不動産屋が内見したいときに鍵を開ける場合、このプログラムを使えばリモートから解錠できるのです。
必要な機材(SwitchBot製品)
以前の記事で書いたように、Web APIを使うということはSwtichBotクラウドにつなぐということになります。この際必要となるのがSwitchBotハブという製品です。
以下のような仕組みで動作します。
したがって必要になるのは、
となります。
Web APIのしくみやできることに関しては、以前の記事も併せてご覧下さい↓
また、ハブ2に関しては、以下のハブ関連の詳細記事を併せてご覧頂くと、より理解が深まるはずです↓
開発言語
Web APIはいわゆるRESTfulなAPIです(Wikipedia参照)。HTTPSとJSONがあつかえるコンピューター言語であれば何でも使えるでしょう。筆者の場合、JavaScriptやTypeScriptを強烈に信仰しておりますので、今回もJavaScriptを使ってプログラムを書いていきます。
JavaScriptといえば、ブラウザで動作するのが元々の目的でしたが、ここではサーバーサイドやコマンドラインで実行できるNode.jsを使ってまいります。
また、Node.jsのバージョンに関してはHTTPリクエストをfetchを使う都合、v18.0以降で実行可能なプログラムを作ることにします。追加のパッケージは一切不要(npmは不要)、Node.jsの組み込み機能だけで動作します。
SwitchBotアプリから得られる認証情報
SwitchBot Web APIの仕様をみると、APIを使うためには認証情報として、スマホの「スイッチボット」アプリからトークンとクライアントシークレットを取得するように書かれています。
Please follow these steps,
- Download the SwitchBot app on App Store or Google Play Store
- Register a SwitchBot account and log in into your account
- Generate an Open Token within the app a) Go to Profile > Preference b) Tap App Version 10 times. Developer Options will show up c) Tap Developer Options d) Tap Get Token
- Roll up your sleeves and get your hands dirty with SwitchBot OpenAPI!
スマホアプリの設定画面から「アプリバージョン」を10回タップすると「開発者向けオプション」が表示されるので、そこから取得して下さい、という内容です。
実際にやってみると以下のように開発者向けオプションという項目が増えます。
開発者向けオプション画面で提示される、トークンとクライアントシークレットを、それぞれ環境変数SWITCHBOT_TOKENとSWITCHBOT_SECRETにセットして使って下さい。
筆者のコードではこれらのデータを環境変数から取得するように実装しています。
以下はその一部のコードです(最後に全コードを掲載します)。このコードでは、環境変数から得たトークンやシークレットをnounceやsignといったAPI呼び出しに必要な情報の計算に使用しています。Web APIの仕様書にあるコードと同じようなものです。
管理機器の一覧をWeb APIで取得
以前の記事で書いたように、SwitchBot Web APIではスマホアプリで管理しているすべての機器の一覧を取り出すことができます。書く機器には固有のdeviceIdというものがあり、個々の機器の操作をするためにはdeviceIdを指定する必要があります。
後述のスマートロックの操作をする際に必要となりますので、以下のコードで機器一覧を取得します。
実行するとサーバーから送られてくるJSONがそのままコンソールに表示されます。
SwitchBotロックをWeb APIで操作
ここでいよいよ、ロックを操作してみます。
deviceIdが必要になるので、上述の機器の一覧のJSONの中から"Smart Lock"の機器のdeviceIdを取得して環境変数にセットして下さい。
以下のコードではその環境変数の値を読み込みます。
その後、施錠・解錠のためのAPIを呼び出します。以下のコードです。
関数の引数のenableの値がtrueだったら、commandにlock(施錠)設定し、falseだったらunlock(解錠)を設定するという、至ってシンプルなコードです。
こちらも、実行するとサーバーから送られてく以下のようなJSONがそのままコンソールに表示されます。
{
"statusCode": 100,
"body": {
"items": [
{
"deviceID": "XXYYAAZZ",
"code": 100,
"status": {
"doorState": "closed",
"isSlave": false,
"isMasterUnlockManually": false,
"doorStateSource": "master",
"isSlaveOnline": false,
"lockType": "Normal",
"linkage": "on",
"battery": 95,
"pauseAutoLock": false,
"lockState": "locked",
"lastActionSource": "command",
"isCalibrate": true,
"power": "on",
"isGroup": false,
"doorOpenedOvertimeWarning": false,
"unlockedOvertimeWarning": false,
"isSlaveUnlockManually": false
},
"message": "success!"
}
]
},
"message": "success"
}
Node.jsによるコマンドラインプログラムの全コード
以下に全コードを掲載します。
使い方は簡単。
コマンドラインプロンプトにて、
node index.js devices
でデバイス一覧の取得。
node index.js lock で施錠、node index.js unlockで解錠。
node index.js lockstateでロックの状態を取得することができます。
免責
「鍵」という生活に重要なセキュリティを扱います。
念の為ですが、筆者の上のプログラムにて読者がいかなる損害を被ったとしても、筆者はいかなる賠償の責任を負いません。御理解の上、ご利用下さい。
また、このプログラムはSwitchBotのクラウドシステムを利用しています。上記のプログラムが自体は正しく動作したとしても、クラウドシステムの負荷等の状況により施錠・解錠が正しく行えない可能性もあります。
実際、筆者の手元で実施してもlockコマンドがエラーになるケースが、最近(2024年5月末現在)多いように思います。以前はもっと安定して動作していた記憶があるのですが…
追伸:BLE APIでもやってみた
以上で述べた方法は、Web APIを使うというインターネット回線が必要な方法でした。 一方、SwitchBotは、Web APIとは別にBLE APIと言うBluetoothを使ったインターフェース経由でも操作可能です。 スマートロックのBLE API は、オープンソースのライブラリとして実装されており、そのライブラリを使ったBLE 通信については別の記事で詳しく書きました。こちらも併せてご覧ください。
ディスカッション
コメント一覧
まだ、コメントがありません