3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2023-05-27

🕑 更新履歴

  • 2025/3/13 : ヘッダー作成のJavascriptが動かなくなってしまったので修正。全体を通して再度整理しました

🔥 やりたいこと

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

image.png

📦 準備

必要なアプリ

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

SwitchBotAPIを使うために必要なトークンとシークレットキーを取得します。

  1. 右下のプロフィールボタンをタップ
  2. 設定 > 基本データ > アプリバージョンを10回タップ
  3. 開発者向けオプションが出現

詳細は公式サイトBlogへ(手順や画面が古いです)↓

⚙️ Taskerでタスクを作成

必要なタスクを作成していきます。最低限必要なものを紹介します。

  • ヘッダー作成
  • デバイスID取得
  • デバイス操作

デバイスID取得は、デバイスの操作をするタスクを作成する際に一度だけ使用することになります。

ヘッダー作成 [SwitchBot_ヘッダー作成]

まず、APIの使用に必要なヘッダーを作成します。これは他タスクでも使用するため、「リターン」でヘッダーを呼び出せるようにします。

1. Javascript(小) / JavaScriptlet

JavaScriptを使用して、APIに必要なヘッダーを作成します。

コード(トークンとシークレットキーは先で取得したものに書き換えてください)
// SwitchBotアプリで取得したトークン、シークレットキーを入力
const token = "トークン";
const secret = "シークレットキー";

// タイムスタンプを取得
const t = Date.now();

// トークンとタイムスタンプを結合してHMAC-SHA256生成
const hmac = CryptoJS.HmacSHA256(`${token}${t}`, secret);

// ハッシュ値のバイト列をbase64エンコード
const sign = CryptoJS.enc.Base64.stringify(hmac);

// ヘッダを作成
const headers = {
    "Content-Type": "application/json",
    "Authorization": token,
    "sign": sign,
    "t": String(t)
};

// ヘッダをTasker用に加工し変数に格納
setLocal("switch_bot_header", JSON.stringify(headers).replace(/,/g, "\n").replace(/\{|\}|\"/g, ""));
ライブラリ
https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js
解説

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

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

JavaScriptで実装していきます。

ポイントは最終行のreplaceで文字置換している箇所。Json文字列をそのままヘッダとして使えず、Tasker独自の書式に書換えが必要です。具体的には以下の通りです。

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

2. リターン / Return

他のタスクから実行したときの戻り値を、作成したヘッダー文字列にします。

%switch_bot_header

デバイスID取得 [SwitchBot_デバイスID取得]

デバイスを操作するために、デバイスIDを取得します。

タスクを実行すると以下のように、デバイス名一覧が表示され、タップすることでクリップボードにデバイスIDがコピーされます。

1. タスク実行 / Perform Task

先に作成したタスクを実行してヘッダーを取得します。

名前
SwitchBot_ヘッダー作成
戻り値の変数
%switch_bot_header

2. HTTP リクエスト

SwitchBotのAPIでデバイスリストを取得します。

方式
GET
URL
https://api.switch-bot.com/v1.1/devices
ヘッダー
%switch_bot_header

3. 変数を設定 / Variable Set

取得したデバイスリストのbodyの値を変数に格納します。

名前
%devices
これに
%http_data.body 

4. 変数を設定 / Variable Set

プラグミニなどのデバイス(deviceList)とハブミニなどで設定したリモコン(infraredRemoteList)が別リストのため結合して扱いやすくします。

名前
%devices
これに
{
  "list": [
    %devices.deviceList(),
    %devices.infraredRemoteList()
  ]
}

5. For (繰り返し開始)

前で作成したリストを順番に取り出します。

変数
%device_info
項目
devices.list() 

6.配列に追加 / Array Push

デバイス名だけを取得し、配列に追加します。この時、位置を9999と大きい数字にして、配列の後ろに追加しています。

変数の配列
%device_names
位置
9999
%device_info.deviceName

7. End For(繰り返し終了)

設定なし

8. リストのダイアログ / List Dialog

作成したデバイス名の配列を使用して、リストのダイアログを作成します。

タイトル
SwitchBot devices
項目
%device_names

9. 変数を設定 / Variable Set

リストで選択された、デバイス情報を取り出します。

名前
%device
これに
%devices.list(%ld_selected_index)

10. フラッシュ表示 / Flash

確認の表示をします。

文字
%device.deviceName のデバイスIDをコピーしました。%device.deviceId

11. クリップボードにコピー / Set Clipboard

デバイスIDをクリックボードにコピーします。

文字
%device.deviceld
解説

機器を操作するため、固有のデバイスIDを調べる必要があります。先に作成したヘッダーを使って、以下URLにアクセスすることでリストを取得することができます。
https://api.switch-bot.com/v1.1/devices

入手できる情報としては、以下のような情報で、使用するのはdeviceIdとなる。

TVのデバイス情報
{
   "deviceId": "00-202123456789-12345678",
   "deviceName": "テレビSwitchBot",
   "remoteType": "TV",
   "hubDeviceId": "ABCDEFGHIJKL"
}

デバイスによって出力される内容が異なるので、以下を参照してください。
https://github.com/OpenWonderLabs/SwitchBotAPI?tab=readme-ov-file#get-device-list

Taskerとしては、上記のデバイスリストを加工してリストのダイアログに流し込んでいます。
選択したIndexから選択したデバイスのdeviceIdを取得しクリップボードに送っています。

Jsonから直接読み取ってもよいですが、デバイスが増えると大変なので、少々面倒ですが、このやり方をしています。

デバイス操作 [SwitchBot_デバイス操作]

ここでやっと、操作に入れます。

1. タスク実行 / Perform Task

先に作成したタスクを実行してヘッダーを取得します。

名前
SwitchBot_ヘッダー作成 
戻り値の変数
%switch_bot_header

2. 変数を設定 / Variable Set

デバイス一覧からコピーしてきたデバイスIDを変数に設定します。

名前
%device_id
これに
コピーしたデバイスIDを張り付ける

3. HTTP リクエスト / Request

デバイスの操作をAPIに送ります。これでデバイスが動いていればOKです!

方式
POST
URL
https://api.switch-bot.com/v1.1/devices/%device_id/commands
ヘッダー
%switch_bot_header
本文
{
  "command": "turnOn",
  "parameter": "default",
  "commandType": "command"
}

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

解説

先に作成したヘッダーとデバイスIDを使って、以下URLにアクセスすることデバイスを操作できます。
https://api.switch-bot.com/v1.1/devices/デバイスID/commands

その際、本文(Body)に操作する内容を入れていきます。
こちらも、デバイスによって出力される内容が異なるので、以下を参照してください。
https://github.com/OpenWonderLabs/SwitchBotAPI?tab=readme-ov-file#send-device-control-commands

🤖 TaskerでProfilesを作成

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

👐 最後に

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

最近、TaskerのWidget V2が出たので、Widgetから操作するやり方も書いていきたいです。

3
2
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
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?