虎の穴開発室ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

SwitchBotで部屋の温度を自動管理してみた

こんにちは! 虎の穴ラボのS.Sです。

本記事は 虎の穴ラボのカレンダー | Advent Calendar 2022 - Qiita 24日目の記事です。

昨日は磯江さんによる「Deno向けWebフレームワーク「Fresh」入門」が投稿されました。
明日は松尾さんによる「虎の穴ラボというエンジニア組織が1年間でどう変化したか 1年間振り返り」が投稿されます。
こちらもぜひご覧ください。

季節は冬になり、すっかり寒くなりましたね。そんな時、部屋の温度調節が自動で出来たらいいなと思いまして、
今回は、SwitchBot(スイッチボット)の温湿度計を使用して、SwitchBotが提供しているAPIで室温を取得して、 室温が閾値以下もしくは閾値以上ならAPIで、SwitchBot ハブミニを操作して、暖房を自動的にONもしくはOFFにするシステムを組んでみたいと思います。

目次

今回使用するアイテムの紹介

SwitchBot 温湿度計

通常の温度計・湿度計の機能にプラスして、スマホアプリやWEB APIからでも、温度と湿度が取得出来るアイテムです。

SwitchBot 温湿度計www.switchbot.jp

SwitchBot ハブミニ

赤外線リモコン対応のテレビや照明やエアコンなどを、簡単な初期設定だけで、スマホアプリやWEB APIで、スマート家電のように遠隔操作が出来るようになるアイテムです。

SwitchBot ハブミニwww.switchbot.jp

SwitchBot のAPIにアクセスしてみる

まずSwitchBot のAPIにアクセスするには、APIトークンが必要になります。
APIトークンは、SwitchBotのスマートフォンアプリから取得が可能です。 詳しい取得方法は、以前ブログ記事にて紹介していますので、こちらをご参照ください。
toranoana-lab.hatenablog.com

リクエストAPI

GET https://api.switch-bot.com/v1.0/devices

取得したアクセストークンをヘッダーにのせて、上記のAPIにアクセスすると登録されているデバイスの一覧が取得可能です。
レスポンス

{
  "deviceId":"********",
  "deviceName":"温湿度計プラス E0",
  "deviceType":"MeterPlus",
  "enableCloudService":true,
  "hubDeviceId":"********"
},

ここから温湿度計のデバイスID(deviceId)を取得します。

SwitchBot APIから現在の温度・湿度を取得する

devices/{デバイスID}/status にてデバイスの情報が取得できます。
今回は、SwitchBotの温湿度計にアクセスして、温度と湿度を取得します。

リクエストAPI

GET https://api.switch-bot.com/v1.0/devices/{温湿度計のデバイスID}/status

レスポンス

{
    "deviceId":"*********",
    "deviceType":"MeterPlus",
    "hubDeviceId":"*************",
    "humidity":41,
    "temperature":23.2
} 

temperatureが室温、humidityが湿度になります。

SwitchBot APIからエアコンを操作してみる

devices/{デバイスID}/commands にパラメーターでデバイスの操作コマンドを送ると、実際にデバイスの操作をAPIで行うことが出来ます。

リクエストAPI

POST https://api.switch-bot.com/v1.0/devices/{エコアンのデバイスID}/commands

リクエストパラメーター

{
    'command': 'setAll',
    'parameter': '26,5,2,on’,  // 温度、モード (5:暖房)、風速(2:低速)、電源のON/OFF 
    'commandType': 'command'
} 

GASからSwitchBotのAPIにアクセスして、室温を自動的にコントロールする

UrlFetchApp.fetchを使ってGAS(GoogleAppsScript)からSwitchBotのAPIでSwitchBotにアクセスして、温度の取得や、暖房の操作を行います。

GASのスクリプト

function autoControlRoomTemperature() {
  // 温湿度計から室温を取得
  const temperature = getRoomTemperature();

  // 21度以下なら暖房をON
  if(temperature <= 21){
    const requestPayload = {
      'command': 'setAll',
      'parameter': '26,5,1,on',
      'commandType': 'command'
    }
    sendDevicesCommands(requestPayload);

 // 25度以上なら暖房をOFF
  } else if(temperature >= 25){
    const requestPayload = {
      'command': 'setAll',
      'parameter': '26,5,1,off',
      'commandType': 'command'
    }
    sendDevicesCommands(requestPayload);
  }
}

// SwitchBot APIで温湿度計のデータを取得
function getRoomTemperature(){
  const requestHeaders = {
    'Content-Type': 'application/json',
      'Authorization': TOKEN_ID
  }
  
  const requestOptions = {
    'method' : 'get',
    'headers' : requestHeaders
  }
  const requestUrl = 'https://api.switch-bot.com/v1.0/devices/' + DEVICES_ID_THERMOMETER + '/status'
  const response = UrlFetchApp.fetch(requestUrl, requestOptions);
  const response_arr = JSON.parse(response.getContentText());
  return response_arr['body']['temperature'];
}

// SwitchBot APIでデバイスの操作コマンドを送信
function sendDevicesCommands(requestPayload){
  const requestHeaders = {
    'Content-Type': 'application/json',
      'Authorization': TOKEN_ID
  }
  
  const requestOptions = {
    'method' : 'post',
    'payload' : JSON.stringify(requestPayload),
    'headers' : requestHeaders
  }
  const requestUrl = 'https://api.switch-bot.com/v1.0/devices/' + DEVICES_ID_AIR_CONDITIONER + '/commands'
  UrlFetchApp.fetch(requestUrl, requestOptions);
}

このスクリプトをトリガーで定期実行設定すれば、完成です!

まとめ

温湿度計から温度と湿度の取得と連動して、エアコンの操作がSwitchBotのAPIで簡単に出来ました。
デバイスの価格も安価で、APIの機能も充実しているので、一度試してみては如何でしょうか。

P.S.

採用

虎の穴では一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。
yumenosora.co.jp

LINEスタンプ

エンジニア専用のメイドちゃんスタンプが完成しました!
「あの場面」で思わず使いたくなるようなスタンプから、日常で役立つスタンプを合計40個用意しました。
エンジニアの皆さん、エンジニアでない方もぜひスタンプを確認してみてください。
store.line.me