「日没後に帰宅すると部屋の照明が点灯する」「日没時に在宅していたら部屋の照明が点灯する」仕組みを、IFTTTだけで実現しました。
目次
MESHを使った照明点灯の操作
MESHを使って、「日没後に帰宅すると部屋の照明が点灯する」「日没時に在宅していたら部屋の照明が点灯する」仕組みを作って運用していました。
IFTTT Pro
IFTTT に Proアカウントが登場して、クエリとフィルター機能が追加されたので、この仕組みを MESH を使わずに組んでみることにしました。
IFTTT のフィルター機能は、簡単なプログラミング(Javascript)でアクションの発動をフィルタリングしたり、メッセージなどアクションの内容を変更したりできる機能。
クエリは簡単にいうとトリガーやアクションに使うサービスまたはその他のサービスからステータスや値を引っ張ってきて、フィルターの条件として使用できたりします。
JavaScript は多少しかわからない僕でもこのくらいなら組めました(後述)。
仕組みの見直し
今までは、MESHレシピの中に
- 「日が出ているか/日没しているか」
- 「外出しているか/在宅しているか」
というステータスを保持するスイッチタグを置いて、
「日没後に帰宅する」あるいは「日没時に在宅している」
ときに照明を点灯するIFTTTアクションに導くという仕組みでした。
これを MESH を使わずに実現するためのポイントは次の2点。
- 「日が出ているか日没しているか」を判別するのは帰宅時だけでよいので、その状態を保存しておく必要はない
→IFTTT Pro のフィルターで判別できる - これまで同様、Location には「エリアに入った/出た」という動作を検出するだけで、「今どこにいるか」はわからない
→「外出しているか在宅しているか」の状態を MESH ではないどこかに保存できればよい
問題はb.の「外出/在宅」の状態を保存する方法でしたが、
「Google スプレッドシートに保存すればいい!」
と思いつきました。
Google スプレッドシートは IFTTT のアクションでセルの内容を更新することができます。
特定のセルに在宅/不在のステータスを書き込んで、外出/帰宅のたびにステータスを更新するようにしておけば、クエリでそのセルを参照してフィルタリングできます。
事前準備
Google ドライブに「IFTTT」というフォルダを作り、その中に「home_absent」というファイル名で Google スプレッドシートのファイルを作ります。
A1セルに「athome」(=在宅)と入力しておきます。
不在時にはこのセルの内容が「absent」(=不在)になるようにします(後述)。
これをステータス保存用ファイルとして使います。
IFTTTアプレット
必要なIFTTTアプレットは次の3つです。
- 帰宅時に日没していたら照明を点灯+ステータスを「在宅」に変更
帰宅したら「日が出ているか日没しているか」を判別して、日が出ていたら照明点灯アクションをスキップ、日没していたらアクションを実行。その後、在宅/不在ステータスを「在宅」にする - 日没時に「在宅」していたら照明を点灯
日没したら在宅/不在ステータスをチェックして、「不在」だったら照明点灯アクションをスキップ、「在宅」ならアクションを実行 - 外出したらステータスを「不在」に変更
1. 帰宅時に日没していたら照明を点灯・ステータスを「在宅」に変更
トリガーに Location>You enter an area で自宅をセット。
アクションに点灯する照明(本記事では Nature Remo を使用します)を設定。
次に If と Then の間の「+」を押して Add query を選択。
サービスで Weather Underground>Current Weather を選択。
日の出/日没時間を参照したい場所(自宅)をセットします。
続いてクエリの下の Add filter を押すと、JavaScript コードの入力画面になります。
選択したトリガー、アクション、クエリによって、フィルターで使えるデータやフィルターアクションがあらかじめコード入力欄の下に記載されています。
今回はこのようなコードを書きました。
let currentTime = Number(Meta.currentUserTime); let sunriseTime = new Date(Weather.currentWeather[0].SunriseAt); let sunsetTime = new Date(Weather.currentWeather[0].SunsetAt); if (currentTime >= Number(sunriseTime) && currentTime < Number(sunsetTime) ) { Nature.sendIr2.skip(); }
Weather Underground から拾ってきた日の出時間と日没時間をトリガー発動時間(現時刻)と比較して、現時刻が日の出と日没の間であれば照明点灯アクションをスキップするというものです。
これでフィルターを保存。
自分でコードを作る場合も、エラーがあれば警告が出て保存できないようになっているのは優しい。
最後に、在宅/不在ステータスを変更するアクションを追加します。
Then の下の「+」を押して、Google Sheets>Update cell in spreadsheet を選択。
このように設定します。
フィルターで照明点灯アクションがスキップされても、在宅/不在ステータスの変更は常に実行されます。
これで完成。
2. 日没時に「不在」でなかったら照明を点灯
トリガーに Weather Underground>Sunset で自宅をセット、アクションに照明を設定。
Add query でクエリに Google Sheets>History of when Cell was updated in spreadsheet を選択、このように設定。
A1セルの内容をチェックします。
Add filter でフィルターをこのように入力。
let homeStatus = GoogleSheets.historyOfWhenCellWasUpdatedInSpreadsheet[0].Value; if (homeStatus == "absent") { Nature.sendIr2.skip(); }
home_absent のA1セルの値が absent だったら点灯アクションをスキップします。
これで完成。
3. 外出したらステータスを「不在」に変更
Location>You exit an area で自宅をセット。
アクションに Google Sheets>Update cell in spreadsheet でこのように設定。
外出したら home_absent のA1セルを absent に変更します。
これで完成。
実行
アプレット1. のフィルターで時間を判別するのにちょっと苦労しましたが、うまくいきました。
これで MESH を使わなくても実現できました。
欠点
これは MESH を使っていた時も同じなのですが、Weather Underground トリガーの発動には日没時間の前後15分程度のタイムラグがあります。
例えば外出時に、日没時間の15分前に2.のトリガーが発動すると、ステータスは absent なのでアクションはスキップ。
その5分後に帰宅すると1.のトリガーが発動。
クエリの日没時間はその10分後なので、まだ日没前と判断されてアクションはスキップされてしまいます。
こうなると、いつまで経っても照明が点灯しないという事態が発生します。
これは Weather Underground の仕様のようなので仕方ないですが、なんとかならないものだろうか。