最近SwitchBotプラグを買ったのですが、APIが用意されているのでこれが最高に楽しいです!しかもAPIはcurl(カール)コマンドを使えば手軽に呼び出すことができ、短いコードで実装できます。

というわけで、今回はRaspberry Pi Zero W温度センサ(ADT7410)で取得した気温に基づいて、SwitchBotプラグのON/OFFを制御する方法について扱ってみたいと思います。例えば、自宅でお留守番しているペットの電気式マットを室温に応じてON/OFFしたい!なんて時に使えますよね。

スポンサーリンク




目次

  1. SwitchBot APIの使い方
  2. 温度センサ(ADT7410)の入手
  3. 回路を組んで動かしてみよう
  4. まとめ

1. SwitchBot APIの使い方

まずはSwitchBotプラグを入手しましょう。amazonでさくっと入手できます。とにかく安くて助かります!

※上記のリンクはamazonへのリンクとなっています。

製品仕様

寸法:76.0mm x 38.0mm x 46.6mm
電源入力:15A 100V (50 / 60Hz)
定格電力:1500W
無線機能:WiFi: 2.4GHz
温度範囲:0〜55°C
対応機種:Android5.0+、iOS11.0+

SwitchBotの基本的な使い方は前回の記事「SwitchBotプラグの基本的な使い方、スケジュール設定方法、Google Homeとの連携方法も:これさえあれば、どんな家電もスマートになるぞ!」にて詳しく扱っているのでこちらもご覧ください。

トークンの取得方法

APIの使い方ですが、まずは専用の「SwitchBot」アプリの画面から次の手順で「トークン」を発行してください。

プロフィール」タブをタップして「設定」に進みます。

アプリバージョン」を10回連続タップして「開発者向けオプション」を表示します。こういう裏メニューの出し方、個人的にはちょっとワクワクします。

このように「開発者向けオプション」画面に「トークン」が表示されているはずです。

この「トークン」をコピーするかメモしてください。Macとも同じiCloudアカウントで紐づいているなら、そのままコピペできますよね。こういう時に超便利。

デバイスIDの取得方法

それでは早速、curlコマンドを使ってAPIをたたいてみましょう。※Macもラズパイもcurlコマンドはデフォルトで使える状態になっているはずです。

curl --request GET 'https://api.switch-bot.com/v1.0/devices' \
--header 'Authorization: ***** 取得したトークン *****' \
--header 'Content-Type: application/json; charset=utf8'

***** 取得したトークン *****」に取得したトークンを置き換えて実行してください。こんな感じでレスポンスが帰って来れば成功です。

{"statusCode":100,"body":{"deviceList":[{"deviceId":"***** この部分をコピー *****","deviceName":"Plug01","deviceType":"Plug","enableCloudService":true,"hubDeviceId":"000000000000"}],"infraredRemoteList":[]},"message":"success"}

帰ってきたレスポンスの「deviceId」をコピーしておきます。これはSwitchBotの操作に必要になります。この「トークン」とdeviceId」さえあれば、SwitchBotをAPIで制御する準備が整いました!

SwitchBotプラグをONにする

下のコマンドの「***** 取得したデバイスID *****」と「***** 取得したトークン *****」は先程のものを置き換えてから実行してください。

curl --request POST 'https://api.switch-bot.com/v1.0/devices/***** 取得したデバイスID *****/commands' \
--header 'Authorization: ***** 取得したトークン *****' \
--header 'Content-Type: application/json; charset=utf8' \
--data-raw '{
  "command": "turnOn",
  "parameter": "default",
  "commandType": "command"
}'

こんな風にレスポンスが帰ってきてスイッチの周りが紫色に点灯したら成功です!

{"statusCode":100,"body":{},"message":"success"}

SwitchBotプラグをOFFにする

今度はOFFにしてみましょう。先程のコマンドから「command」の部分のみ変更してあります。

curl --request POST 'https://api.switch-bot.com/v1.0/devices/***** 取得したデバイスID *****/commands' \
--header 'Authorization: ***** 取得したトークン *****' \
--header 'Content-Type: application/json; charset=utf8' \
--data-raw '{
  "command": "turnOff",
  "parameter": "default",
  "commandType": "command"
}'

こんな風にレスポンスが帰ってきてスイッチの周りが青色に点灯したら成功です!

{"statusCode":100,"body":{},"message":"success"}

どうですか?超簡単ですよね!これで仕事場からでも出先からでも自宅のSwitchBotを制御できます。

参考URL:
SwitchBotAPI
SwitchBotをHub経由でAPIから操作する

2. 温度センサ(ADT7410)の入手

さて今度はラズパイ温度センサ(ADT7410)を使って気温を取得してみましょう。まずは温度センサを用意します。温度センサにはいくつか種類がありますが、MCP9700Eのようなアナログセンサは安価ではありますが、AD変換が必要で、Arduinoの場合はAD変換ができるので楽なのですが、ラズパイの場合は別途MCP3208のようなADコンバータが必要となります。

というわけで、ラズパイの場合はシリアル通信(I2C)でデータを取得できるADT7410の方が実装が簡単なので、今回はこちらを使ってみたいと思います。秋月電子通商で500円(税込)で入手できます。一つ持っておくとラズパイの電子工作にいろいろ使えて便利ですよ。

秋月電子通商製「ADT7410※ピンの半田付けが必要です。

3. 回路を組んで動かしてみよう

まずはラズパイのインターフェース・オプション設定でI2C(アイ・スクエア・シー)がONになっているか確認してください。

sudo raspi-config

3番目の「Interface Options」を選択します。

今度は「P5 I2C」を選択して有効にします。

これでラズパイ側の準備が整いましたので、回路を組んでみます。

必要な回路はたったこれだけ!ADコンバータが必要ないので超簡単。回路を組み終わったら、早速コードを書いてみましょう。

# -*- coding: utf-8 -*-
import smbus
import os

def read_adt7410():
	word_data =  bus.read_word_data(address_adt7410, register_adt7410)
	data = (word_data & 0xff00)>>8 | (word_data & 0xff)<<8
	# 13ビットデータ
	data = data>>3
	# 温度が正または0の場合
	if data & 0x1000 == 0:
		temperature = data*0.0625
	else:
		# 温度が負の場合、 絶対値を取ってからマイナスをかける
		temperature = ( (~data&0x1fff) + 1)*-0.0625
	return temperature

bus = smbus.SMBus(1)
address_adt7410 = 0x48
register_adt7410 = 0x00

# 設定
device_id = "***** 取得したデバイスID *****"
token = "***** 取得したトークン *****"
command = ""
border = 15.0

try:
	inputValue = read_adt7410()

	# コマンド判定
	if inputValue < border:
		command = "turnOn"
	else:
		command = "turnOff"

	# switchbot api実行
	os.system("curl --request POST 'https://api.switch-bot.com/v1.0/devices/" + device_id + "/commands' --header 'Authorization: " + token + "' --header 'Content-Type: application/json; charset=utf8' --data-raw '{ \"command\": \"" + command + "\", \"parameter\": \"default\", \"commandType\": \"command\" }'")

	print(' 現在の気温:' + str(inputValue))

except KeyboardInterrupt:
	pass

23行目、24行目:
***** 取得したデバイスID *****」と「***** 取得したトークン *****」の部分は、先程のものを置き換えてから実行してください。

26行目:
電源ON/OFFの閾値となる設定温度です。お好みに合わせて変更してください。

38行目:
今回はcurlコマンドで実装したのでこのようになっています。そういうわけで、冒頭の「import os」もお忘れなく。他にも、きちんとhttpリクエストでAPIにコマンドを投げるやり方もありますが、こちらの方がコード量が圧倒的に少なくて済むかと思います。

また温度センサ(ADT7410)からの温度の取得箇所に関しては、下記の書籍を参考にしています。この本、まさにラズパイで電子工作をやる人必携のバイブルです。

参考書籍:
カラー図解 最新 Raspberry Piで学ぶ電子工作 作って動かしてしくみがわかる (ブルーバックス)

cronでプログラムを自動的に実行

では最後に、cronを使用して一定間隔でこのコードを実行させる方法に触れておきたいと思います。

crontab -e
*/5 * * * * python /home/pi/switchbot/switchbot-temp.py

上の設定では、先程のサンプルコードを「/home/pi/switchbot/switchbot-temp.py」として保存し、5分毎に実行することにしてあります。これはあくまで一例ですので、必要に応じて適宜変更してください。

sudo /etc/init.d/cron restart

cron設定を上書き保存したら、設定を反映しましょう。

crontab -l

最後にcronリストを表示して新しい設定が反映されているか確認してみましょう。

4. まとめ

いかがだったでしょうか?今回の記事では今回はRaspberry Pi Zero W温度センサ(ADT7410)で取得した気温に基づいて、SwitchBotプラグのON/OFFを制御する方法について扱ってみましたが、PythonでSwitchBotに用意されているAPIをたたいて簡単にシステムを組むことができました。

他にも光センサ(CdSセル)などを使えば、明るさで家電のON/OFF管理もできるので、色々応用できそうです。このようにAPIを備えたスマート家電 × 電子工作で様々なオリジナルのシステムが組めますね!