ごきげんよう。フクロモモンガの夜鳴きで夜に3回くらいは起きるmです><
フクモモのポジショニングコールという習性で「ボクはここだよー!」と仲間に知らせるために「ワンワン!」とまるで子犬の様な声で鳴くのです。
この声が意外と大きくて><
お風呂に入っているときにも聞こえるといえば伝わるでしょうか。
夜の寝静まった時はかなーり響きます(^-^;
昨今外回りが多い私です。睡眠時間は結構大事><
ただこの夜鳴き、夜に私が寝室のドアを開けるか、電気をつけると鳴きやみます(^-^;
(しかも私が近づくと逃げる><)
これを利用してswitchbotでそれを自動化しようと思います。
(v1.1対応)Switchbot apiでsceneを実行する方法
音が聞こえたら特定のsceneを実行する、を作りたいと考えています。
音が聞こえたらの部分の話はまたそのうちですw
今回は基本的なSwitchbotのapiをたたくための認証と、scene idの取得、sceneの実行をしてみます。
tokenとsecretを取得する
これはSwitchbotのアプリから簡単に取得ができます。
プロフィール > 設定 > 基本データに行って、「アプリバージョン」を9回タップします。
そうすると「開発者向けオプション」が出てきます。
この中にtokenとsecretがあります。
これがバレると誰でも家の家電を操作できるようになってしまうので管理はしっかりしましょう!
認証するためのheaderの用意&scene idの取得(python)
公式に書いていますが全部英語で大変です。
それに!
リクエストを投げるところは書いていないのね><
一気にsceneの取得まで載せようと思います。
認証のところは公式のものそのままですから「うわわわーわからない!」となっても大丈夫です!
コピペです!(ぅぉぃ
import json
import time
import hashlib
import hmac
import base64
import uuid
import requests # GETリクエスト用
# Declare empty header dictionary
apiHeader = {}
# open token
token = 'あなたのtoken' # SwitchBotアプリからコピーしたトークン(V6.14以降)
# secret key
secret = 'あなたのsecret' # SwitchBotアプリからコピーしたシークレットキー(V6.14以降)
nonce = uuid.uuid4()
t = int(round(time.time() * 1000))
string_to_sign = '{}{}{}'.format(token, t, nonce)
string_to_sign = bytes(string_to_sign, 'utf-8')
secret = bytes(secret, 'utf-8')
sign = base64.b64encode(hmac.new(secret, msg=string_to_sign, digestmod=hashlib.sha256).digest())
print('Authorization: {}'.format(token))
print('t: {}'.format(t))
print('sign: {}'.format(str(sign, 'utf-8')))
print('nonce: {}'.format(nonce))
# Build api header JSON
apiHeader['Authorization'] = token
apiHeader['Content-Type'] = 'application/json'
apiHeader['charset'] = 'utf8'
apiHeader['t'] = str(t)
apiHeader['sign'] = str(sign, 'utf-8')
apiHeader['nonce'] = str(nonce)
###########ここからが実行するところ!
# GETリクエストの実行
url = "https://api.switch-bot.com/v1.1/scenes"
response = requests.get(url, headers=apiHeader)
# レスポンスの確認
if response.ok:
print("Response:")
print(json.dumps(response.json(), indent=4, ensure_ascii=False))
else:
print("Error:", response.status_code)
print(response.text)
sceneのidを取ってくるためにはrequestsを使ってGETで https://api.switch-bot.com/v1.1/scenes を叩きます。
これを実行してあげればOKです。
response = requests.get(url, headers=apiHeader)
中身の確認のときですが、json.dumpsで引数に ensure_ascii=False をつけないとU~~~みたいな文字で表示されるので注意です。
成功するとこんな感じで表示されます。
これで実行したいscene idがわかります。ちなみに私が実行したいのは「鳴き声シーン」ですw

sceneの実行!
sceneの実行はpostで https://api.switch-bot.com/v1.1/scenes/{実行したいscene_id}/executeを叩いてあげればいいです。
コードは以下です。コピペで使えるように認証の部分ももう一度書いています。
import json
import time
import hashlib
import hmac
import base64
import uuid
import requests # GETリクエスト用
# Declare empty header dictionary
apiHeader = {}
# open token
token = 'あなたのtoken' # SwitchBotアプリからコピーしたトークン(V6.14以降)
# secret key
secret = 'あなたのsecret' # SwitchBotアプリからコピーしたシークレットキー(V6.14以降)
nonce = uuid.uuid4()
t = int(round(time.time() * 1000))
string_to_sign = '{}{}{}'.format(token, t, nonce)
string_to_sign = bytes(string_to_sign, 'utf-8')
secret = bytes(secret, 'utf-8')
sign = base64.b64encode(hmac.new(secret, msg=string_to_sign, digestmod=hashlib.sha256).digest())
print('Authorization: {}'.format(token))
print('t: {}'.format(t))
print('sign: {}'.format(str(sign, 'utf-8')))
print('nonce: {}'.format(nonce))
# Build api header JSON
apiHeader['Authorization'] = token
apiHeader['Content-Type'] = 'application/json'
apiHeader['charset'] = 'utf8'
apiHeader['t'] = str(t)
apiHeader['sign'] = str(sign, 'utf-8')
apiHeader['nonce'] = str(nonce)
###### ここから実行!!
url = "https://api.switch-bot.com/v1.1/scenes/実行したいscene_id/execute"
response = requests.post(url, headers=apiHeader)
# レスポンスの確認
if response.ok:
print("Response:")
print(json.dumps(response.json(), indent=4, ensure_ascii=False))
else:
print("Error:", response.status_code)
print(response.text)
これも難しいことはなくて、requestsを使って、postで以下を行えばピッと実行できます!
response = requests.post(url, headers=apiHeader)
実行が成功するとこんな感じに表示されます。
成功したかは電気がついたかとか、家電が動いたかでわかります。

またちょっとしたら、今度は音をマイクで拾って閾値以上だったらトリガーする、という部分を作ってみたいと思います~。






