見出し画像

SwitchBotロックの鍵状態をSwitchBot API v1.1から取得する


やりたいこと

SwitchBotには各デバイスの状態を取得したり、遠隔操作するためのAPIが公開されています。
自宅の玄関にはSwitchBotスマートロックを取り付けていますが、このロック状態をHomeAssistant上で確認できるようにしたいと思っています。
そのため、まずはSwitchBot API v1.1を使ってスマートロックの状態がどのように取得できるのか確認してみたいと思います。

SwitchBotスマートロックから鍵状態を取得する方法

SwitchBot APIを使ってスマートロックの状態を取得するため、スマートロックがネットワークに接続されている必要があります。
そのため、SwitchBotハブミニとスマートロックを接続して、スマートロックをネットワークに接続させます。

また、SwichBot温度計の場合はAPI v1.0で取得できましたが、スマートロックの場合はv1.1を使用する必要があります。API v1.1では認証方式が大幅に変更となっているため、まずはAPI v1.1の使用方法を確認します。

SwitchBot API v1.1を使うために必要な情報

SwitchBot API v1.1のドキュメントはこちらで公開されています。

ドキュメントにAPI v1.1の使い方がたくさん記載されていますが、API v1.1が使えるようにするには以下の情報が必要となります。

・アクセストークン
・シークレットキー
・署名(sign)

アクセストークンとシークレットキーはスマホアプリから取得します。また、署名はアクセストークンとシークレットキー、時間、任意文字列を組み合わせて動的に署名を作成します。
つまり、APIを利用する度に署名を作り直して実行する必要があります。

アクセストークンとシークレットキーを取得する

スマホのアプリバージョンがv6.14以上であることが必要です。 使っているアプリケーションのバージョンはv8.2でしたのでアップデート作業なしでそのままアクセストークンとシークレットキーを取得しました。

1.プロフィール > 設定 をタップします。

2.アプリバージョンを10回タップすると「開発者向けオプション」ボタンが表示されますので、「開発者向けオプション」ボタンをタップします。

3.トークンとシークレットキーを取得します。

署名(sign)を作成してみる

SwitchBotAPIのページにサンプルコードが記載されていますので、サンプルコードを利用したり、たくさんの作者様のサイトを参考にしながらテストコードを作成してみました。 今回はJavaScriptを利用して署名(sign)を作成してみます。

<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="utf-8">
		<title>SwitchBot API v1.1 sign生成テスト</title>
		<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js"></script>
	</head>
	<body>
		<h1>SwitchBot API v1.1 sign生成テスト</h1>
		<p>トークン(Authorization):<br>
		<input id="input-token" value="アプリから取得したトークン" size="50"></p>
		<p>シークレットキー:<br>
		<input id="input-secret" value="アプリから取得したシークレットキー" size="50"></p>
		<p>任意文字列(nonce):<br>
		<input id="input-nonce" value="requestID" size="50"></p>
		<button type="button" onclick="createSign()">Sign生成</button>
		<p>▼▼▼ 以下に生成されたsign値が表示されます ▼▼▼</p>
		<p>時間(t):<br>
		<input id="set_time" size="50"></p>
		<p>生成された署名(sign):<br>
		<input id="set_sign" size="50"></p>
		
		 <script>
		 	function createSign() {
		 		const token = document.getElementById("input-token").value;
		 		const secret = document.getElementById("input-secret").value;
		 		const nonce = document.getElementById("input-nonce").value;

		 		const t = Date.now();
				const data = token + t + nonce;
				const sign = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(data, secret));
				
				document.getElementById("set_time").value = t;
				document.getElementById("set_sign").value = sign;
		 	}
		 </script>
	</body>
</html>

上記コードをテキストエディタに貼り付けてhtmlファイルとして保存した後、ブラウザで開くと下のような画面が出てきます。
スマホアプリで取得したトークンとシークレットキーを入力して「Sign生成」ボタンをクリックすると署名(Sign)が作られます。

Postmanを使ったSwitchBot API v1.1の確認

上記の方法で作成した署名(sign)を使って実際にSwitchBot API v1.1を実行してみようと思います。
今回は「Postman」というAPIクライアントツールを使ってSwitch Bot APIを実行してみました。

Postmanのインストール

PostmanはWindows、Mac、Linuxに対応しています。使用するパソコンのOSに合わせてダウンロードしてください。

アプリケーションを起動するとアカウント作成画面が表示されますが、とりあえず動作確認として使う程度でしたらアカウントを作成する必要はありません。

Postmanアカウントを持っていませんので「lightweight API client」リンクをクリックして次へ進みました。

SwitchBot APIの接続情報

■ホストドメイン
SwitchBotの接続先ドメインになります。このドメインの後に使いたいリクエスト名を指定します。

https://api.switch-bot.com

■ヘッダー情報
ヘッダーに指定するパラメータになります。
Postmanでは「Headers」タブに以下のパラメータを設定します。

Authorization : スマホアプリで取得したトークン
sign : 上記の「API v1.1生成テスト」で生成された署名
t : リクエスト実行時の時間。上記の「API v1.1生成テスト」で生成した時間
nonce : 上記の「API v1.1生成テスト」で入力した任意文字列

デバイス一覧を取得する

SwitchBotスマートロックの鍵状態を取得するためには、そのデバイスに割り当てられた「デバイスID」が必要になります。
デバイスIDはデバイス一覧を取得するリクエストで取得することができます。

GET /v1.1/devices

リクエスト名は/v1.1/devicesになりますので、リクエストタイプに「GET」、URLに「https://api.switch-bot.com/v1.1/devices」を入力します。
そして、ヘッダー情報を入力して、「Send」ボタンをクリックすると、以下のように登録されているデバイス情報が返ってきます。

{
    "statusCode": 100,
    "body": {
        "deviceList": [
            {
                "deviceId": "************",
                "deviceName": "ロック下",
                "deviceType": "Smart Lock",
                "enableCloudService": true,
                "hubDeviceId": "************",
                "group": true,
                "master": false,
                "lockDevicesIds": [
                    "************",
                    "************"
                ]
            },
            {
                "deviceId": "************",
                "deviceName": "ロック上",
                "deviceType": "Smart Lock",
                "enableCloudService": true,
                "hubDeviceId": "************",
                "group": true,
                "master": true,
                "groupName": "ツインロック",
                "lockDevicesIds": [
                    "************",
                    "************"
                ]
            },
            {
                "deviceId": "************",
                "deviceName": "Switchbot用Hub",
                "deviceType": "Hub Mini",
                "enableCloudService": false,
                "hubDeviceId": ""
            },
        ],
        "infraredRemoteList": []
    },
    "message": "success"
}

その中からスマートロックのデバイス情報を探します。
見つけたらスマートロックのデバイスID(deviceId)を記録しておきます。

SwitchBotスマートロックの状態を取得する

SwitchBotスマートロックの状態を取得するためには、以下のリクエストでデバイスの状態を取得することができます。

GET /v1.1/devices/{deviceId}/status

{deviceId}のところにデバイス一覧で取得したスマートロックのデバイスIDを入力します。
そして、デバイス一覧と同じようにヘッダー情報を入力して、「Send」ボタンをクリックすると、スマートロックの状態を取得することができます。

{
    "statusCode": 100,
    "body": {
        "deviceId": "************",
        "deviceType": "Smart Lock",
        "hubDeviceId": "************",
        "lockState": "locked",
        "doorState": "closed",
        "calibrate": true,
        "version": "V6.5",
        "battery": 95
    },
    "message": "success"
}

スマートロックの場合、主に以下の情報を取得することができます。

lockState : カギの状態(解錠・施錠)
doorState : 扉の状態(扉が開いている/閉まっている)
battery : バッテリー状態。電池の残量(95%とか)が取得できます。

さいごに

Postmanを使ってSwitchBot API v1.1からSwitchBotロックの鍵状態を取得することが確認できましたので、今度はこれをHomeAssistant上に表示できるようにしたいと思います。

この記事が気に入ったらサポートをしてみませんか?