LoginSignup
2
1

More than 1 year has passed since last update.

TaskerからSwitchBotのAPIを使ってテレビを操作

Posted at

やりたいこと

スマホ(Android)をシェイクしてテレビを消したりしたい!

システム全体像

image.png

準備

必要なアプリ

SwitchBotAPIのトークンとシークレットキーを取得

SwitchBotAPIを使うために必要なトークンとシークレットキーを取得します。
プロフィール > 設定 からアプリバージョンを10回タップすると、 開発者向けオプション が出現します。そこをタップすると、トークンとシークレットキーを取得できます。

※トークン、シークレットキーは公開しないでください!(他の人が家電操作できちゃいます。)

image.png

詳細は公式サイト↓

JavaScriptでSwitchBotAPIのヘッダーを作成

SwitchBotのAPIを使用するには、以下手順を踏みます。

  1. 13桁のタイムスタンプ(UTCでの1970/1/1 0:0:0から現在までの経過時間をミリ秒)とトークンを結合します。
  2. シークレットキーと前の手順で生成された文字列を使用して署名を作成します。
  3. 署名を大文字に変換する

今回Taskerで動かすので、JavaScriptで実装していきます

getSwitchBotApiHeader.js
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独自の書式に書換えが必要です。具体的には以下の通りです。

  1. カンマ区切りを改行に置換
  2. 波括弧、ダブルクォーテーションを削除
Before
{"Content-Type":"application/json","Authorization":"承認","sign":"署名","nonce":"","t":"1685093231634"}
After
Content-Type:application/json
Authorization:承認
sign:署名
nonce:
t:1685093231634

デバイスIDを調べる

Taskerでデバイス一覧取得タスク作成

完成イメージ
image.png

1. ヘッダ作成

機器を操作するため、固有のデバイスIDを調べる必要があります。以下アクションを作成していきます。
これでTaskerの変数「%SBHeader」にヘッダーが格納されます。

2. SwitchBotAPIにリクエスト

つづいて、SwitchBotAPIからデバイス一覧を取得するPOSTアクションを作成します。

3. デバイス一覧をクリップボードに送信

Jsonで結果が返ってくるので、クリップボードに送ります。

  • System > Set Clipboard
    • Text
      • %http_data

デバイスIDを確認

先程のタスクを実行すると、クリップボードにJsonコピーされます。このままでもいいのですが、見づらいのでJsonFormatterなどで整形します。

今回は、テレビの電源をオンオフしたいので、該当部分を確認します。

テレビ
{
   "deviceId": "00-202123456789-12345678",
   "deviceName": "テレビSwitchBot",
   "remoteType": "TV",
   "hubDeviceId": "ABCDEFGHIJKL"
}

必要なのはdeviceIdです。これを使って何の操作をするか、リクエストします。

Taskerでテレビの電源オン・オフ タスク作成

テレビの場合、電源オン・オフはボタン共有なので、オフのみはできませんでした。。
image.png

1. ヘッダ作成

デバイス一覧取得タスクで作成したものと同じです。

2. SwitchBotAPIにリクエスト

つづいて、SwitchBotAPIへデバイスの操作指示するPOSTアクションを作成します。
デバイス一覧取得タスクと違う部分は、URLにデバイスID/commands追加。Bodyにコマンドを追加しています。

Body
{
  "command": "turnOn",
  "parameter": "default",
  "commandType": "command"
}

Bodyに記述しているコマンドは、操作したい機器によって変わります。
https://github.com/OpenWonderLabs/SwitchBotAPI#send-device-control-commands

TaskerでProfilesを作成

ここは自由に作成してみてください。
私は、誤動作を防ぐため、ホーム画面の状態&自宅Wifiに接続&スマホシェイクという条件にしてみました。
image.png

最後に

今回はテレビの電源オフを題材にしましたが、もちろん他の家電、操作も可能です。さらに、SwitchBotアプリで作成したシーンも実行できますのでアイデア次第で何でもできそうです。
是非皆様もやってみてください。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1