やりたいこと
スマホ(Android)をシェイクしてテレビを消したりしたい!
システム全体像
準備
必要なアプリ
SwitchBotAPIのトークンとシークレットキーを取得
SwitchBotAPIを使うために必要なトークンとシークレットキーを取得します。
プロフィール > 設定 からアプリバージョンを10回タップすると、 開発者向けオプション が出現します。そこをタップすると、トークンとシークレットキーを取得できます。
※トークン、シークレットキーは公開しないでください!(他の人が家電操作できちゃいます。)
詳細は公式サイト↓
JavaScriptでSwitchBotAPIのヘッダーを作成
SwitchBotのAPIを使用するには、以下手順を踏みます。
- 13桁のタイムスタンプ(UTCでの1970/1/1 0:0:0から現在までの経過時間をミリ秒)とトークンを結合します。
- シークレットキーと前の手順で生成された文字列を使用して署名を作成します。
- 署名を大文字に変換する
今回Taskerで動かすので、JavaScriptで実装していきます
const token = トークン;
const secret = シークレットキー;
// トークンとタイムスタンプを結合
const t = Date.now();
const data = token + t;
// HMAC-SHA256生成
const hmac = CryptoJS.HmacSHA256(data, secret);
// ハッシュ値のバイト列をbase64エンコード
const sign = CryptoJS.enc.Base64.stringify(hmac);
// ヘッダを作成
const headers = {
"Content-Type": "application/json",
"Authorization": token,
"sign": sign,
"nonce": nonce,
"t": String(t)
};
// ヘッダをTasker用に加工し変数に格納
setGlobal("SBHeader", JSON.stringify(headers).replace(/,/g, "\n").replace(/\{|\}|\"/g, ""));
ポイントは最終行のreplaceで文字置換している箇所。Json文字列をそのままヘッダとして使えず、Tasker独自の書式に書換えが必要です。具体的には以下の通りです。
- カンマ区切りを改行に置換
- 波括弧、ダブルクォーテーションを削除
{"Content-Type":"application/json","Authorization":"承認","sign":"署名","nonce":"","t":"1685093231634"}
Content-Type:application/json
Authorization:承認
sign:署名
nonce:
t:1685093231634
デバイスIDを調べる
Taskerでデバイス一覧取得タスク作成
1. ヘッダ作成
機器を操作するため、固有のデバイスIDを調べる必要があります。以下アクションを作成していきます。
これでTaskerの変数「%SBHeader」にヘッダーが格納されます。
-
Code > JavaScript
- Path
- 前工程で作成したgetSwitchBotApiHeader.jsの保存先
- Libraries
- Path
2. SwitchBotAPIにリクエスト
つづいて、SwitchBotAPIからデバイス一覧を取得するPOSTアクションを作成します。
-
Net > HTTP Request
- Method
- POST
- URL
- Headers
- %SBHeader
- Method
3. デバイス一覧をクリップボードに送信
Jsonで結果が返ってくるので、クリップボードに送ります。
-
System > Set Clipboard
- Text
- %http_data
- Text
デバイスIDを確認
先程のタスクを実行すると、クリップボードにJsonコピーされます。このままでもいいのですが、見づらいのでJsonFormatterなどで整形します。
今回は、テレビの電源をオンオフしたいので、該当部分を確認します。
{
"deviceId": "00-202123456789-12345678",
"deviceName": "テレビSwitchBot",
"remoteType": "TV",
"hubDeviceId": "ABCDEFGHIJKL"
}
必要なのはdeviceIdです。これを使って何の操作をするか、リクエストします。
Taskerでテレビの電源オン・オフ タスク作成
テレビの場合、電源オン・オフはボタン共有なので、オフのみはできませんでした。。
1. ヘッダ作成
デバイス一覧取得タスクで作成したものと同じです。
-
Code > JavaScript
- Path
- 前工程で作成したgetSwitchBotApiHeader.jsの保存先
- Libraries
- Path
2. SwitchBotAPIにリクエスト
つづいて、SwitchBotAPIへデバイスの操作指示するPOSTアクションを作成します。
デバイス一覧取得タスクと違う部分は、URLにデバイスID/commands追加。Bodyにコマンドを追加しています。
-
Net > HTTP Request
- Method
- POST
- URL
- Headers
- %SBHeader
- Body
- Method
{
"command": "turnOn",
"parameter": "default",
"commandType": "command"
}
Bodyに記述しているコマンドは、操作したい機器によって変わります。
https://github.com/OpenWonderLabs/SwitchBotAPI#send-device-control-commands
TaskerでProfilesを作成
ここは自由に作成してみてください。
私は、誤動作を防ぐため、ホーム画面の状態&自宅Wifiに接続&スマホシェイクという条件にしてみました。
最後に
今回はテレビの電源オフを題材にしましたが、もちろん他の家電、操作も可能です。さらに、SwitchBotアプリで作成したシーンも実行できますのでアイデア次第で何でもできそうです。
是非皆様もやってみてください。