Workflows を使って床暖房を自動で起動するようにした話
はい。Advent Calendar 25日目。トリですが激ゆるの内容です。今年はみんな遅れることなく全部埋まっていてプレッシャーを感じます。
みなさんこんにちは。メリークリスマス。Google Cloud Customer Engineer の TT / tora です。諸般の事情があって TT になりました。あれ?って思っても気にしないでくださいね。
さて、今日は超ゆるい Workflows の実用例になります。あと Cloud Scheduler かな。
モチベーション
構成のところで説明しますが、起動のための条件を色々入れたくてWorkflows がいいやん、って思いやりました。単純に Workflows 使いたかったのもあります。と言っても、今回は天気の情報から条件を判定するだけです。
まああとはネタに困って当日作りました、というところです。つまり当日やってもできるくらい Workflows は簡単なんだよ!あとは無料枠もあるので個人ユースだと嬉しいところ。朝起きて思いつきでやったらできてハッピーです。
寒い日に床が寒いとツラいので床暖房にしました。なんとなく気づいてる人はいるかと思いますが、半分くらいは IFTTT と SwitchBot の話です。
構成
ざっくりこんな感じ。
SwitchBot
床暖房は壁に埋め込みのスイッチをポチッと押す形でリモコンなどはないので自動化がなかなか難しい。というわけで物理的にボタンを押す SwitchBot の出番というわけです。こんな感じになっています。
IFTTT
SwitchBot 自体がどこからでも能動的に起動みたいな口を用意してなく、特定のサービスのみが対象となっているため、汎用的な Webhook を設定できる IFTTT を選択しました。大体調べるとラズパイとBluetooth接続してコントロールするのが多いっぽくて、じゃあラズパイ側にHTTPのエンドポイント用意して公開するという手も使えなくはないけどまあ用意するのめんどくさいので今回は IFTTT で。
Cloud Workflows
ここが今回のメインポイント。 Workflows の説明は Yutty がアドベントカレンダーを書いてるのでご参照ください。今回は中で OpenWeatherMap API を呼んでます。色々と情報が取れて便利です。今回はここで取得した情報を使って床暖房を入れるか入れないかの判断をします。
Cloud Scheduler
Workflows は単体ではスケジュールの機能はありません。これを設定するために Cloud Scheduler を使います。朝起きる前くらいの時間に起動します。
設定していく
IFTTT と SwitchBot
まずは SwitchBot を IFTTT と連携しておく必要があります。SwitchBot の対象ボタンをクラウドサービス連携でIFTTTと連携するので、リンク先を見て設定しましょう。
IFTTT で SwitchBot を起動するための Applet を作ります。まず、If This で Webhook を選びます。
んで、Event Name を入れます。ここが Webhook の URL を構成するキーになります。
次に SwitchBot を設定します。
今回は Bot Press を選びます。
お目当ての床暖房用のスイッチを選んで Create Action
そのまま画面に従って名前とか入力するとできあがります。かんたん。肝心の Webhook のURLですが、アカウント別にキーが設定されており、こちらの Documentation から確認できます。
URL のテンプレートは以下のようになっています。
{event} が先程設定した Event Name、{your_key} はDocumetation に飛べば書いてるので確認してください。
これで IFTTT, SwitchBot は設定終わり。長々書きましたが数分で終わります。
Cloud Workflows
では Cloud Workflows を書いていきます。と言っても大したことないです。ちゃちゃっとやっちゃいます。作成自体は公式ドキュメントを見てください。
設定の内容はこんな感じにしました。
- getWeather:
call: http.get
args:
url: https://api.openweathermap.org/data/2.5/weather?q=Fujisawa&units=metric&lang=ja&appid=xxxxxx
result: weather
- condition:
switch:
- condition: ${weather.body.clouds.all > 60 and weather.body.main.temp < 12}
next: pressSwitchbot
next: returnOutput
- pressSwitchbot:
call: http.get
args:
url: https://maker.ifttt.com/trigger/swbt/with/key/xxxxxx
result: switchbot
- returnOutput:
return: ${weather.body}
getWeather で天気情報を取得します。
次に condition で気温と雲の率で床暖房を入れるか入れないかの判定をしています。うちは晴れてる日は気温が低くてもそんなに寒くならないので、気温に加えて雲の条件も入れています。
条件に合う場合は SwitchBot で床暖房をつけに行くので、先程作成した IFTTT の Webhook エンドポイントを叩きに行ったら終了。最後の returnOutput は正直なんでも良かったので天気の情報を出してます。ここにSlackへの通知を入れたりとかするといいんじゃないかと思います。
ちなみに、特にこれは日本で動いてる必要もまったくないのでリージョンは us-central1 にしました。
Cloud Scheduler
こちらも特に何のひねりもないので公式ドキュメントを参照ください。 Scheduler から Workflows を起動するための Invoke 用 サービスアカウントを作成してそれに実行させる、という具合ですね。
注意点があるとすると、今 Workflows が Beta なので、Scheduler が叩く URL が将来的に変わるという点でしょうか。ここだけは気にしておいたほうがいいと思います。
まとめ
さて、今回は SwitchBot を使って物理的に床暖房を自動的に起動するようにしましたがそれぞれのエンドポイントさえ作れば色々と応用が効きます。
天気で判断するところはもうちょいインテリジェントにやりたいですね。
簡単にできるので自動化はすべてWorkflowsでまとめるのけっこうありだなって思い始めました。
あと、 SwitchBot による物理ボタンはそのボタンの状態を持たないので Firestore とかに入れておけるようにしとくといいかなって思います。
それでは皆様良いお年を。