IFTTTとMESHを使って構築していた、自宅照明の自動点灯システム。
在宅/不在と日没/日の出のステータスに応じて点灯を判断するレシピを一つにまとめました。
またまたIFTTT×MESHのハック。
こちらの記事で、日没と日の出をトリガーにして帰宅時の照明オン/オフを切り替える方法を紹介した。
そして、日没時に在宅していたら照明を点ける方法も。
この日没時に在宅していた時の点灯があまり安定しない。
しかも人感センサーを使うやり方は、センサーをチェックする瞬間に人感センサーの感知するエリアに自分が居なければならない。
しかしふと思いついた。
日没した瞬間に在宅か不在かをチェックしなくても、在宅/不在のステータスをどこかに保持していればいいんじゃないか?
夜間/日中(日没/日の出)のステータスをMESHのスイッチタグで保持しているのと同じように。
IFTTTのLocationトリガーはジオフェンスを「越える」という動作しか識別しない。
でもジオフェンスを越えた時点で在宅/不在ステータスを切り替えて置いておけば、日没の瞬間にそのステータスをチェックして点灯するかしないか振り分けられる。
しかもそれができれば、上記の2つのレシピを統合できるんじゃないか?
というわけで早速MESHのレシピを構築してみた。
目次
MESHレシピ
やりたいこと
- 日没と日の出で切り替わるスイッチを作る→前回のレシピをそのまま使用
- 在宅と不在で切り替わるスイッチを作る→こちらを追加
- 上記2つのスイッチを組み合わせて、次の場合のみ「照明を点灯する」アクションを実行
A「日没」している状態で「帰宅」する
B「在宅」している状態で「日没」する
帰宅(在宅) | 外出(不在) | |
日没(夜間) | 点灯 | × |
日の出(日中) | × | × |
点灯すべきシチュエーションはABの2通りあるが、条件分けすると上の表のようになる。
「日没」と「在宅」が重なった時だけ点灯するようなレシピを作ればいい。
こうして作ったレシピがこちら。
以下解説。
■スイッチタグA:日没/日の出の切替スイッチ
スイッチタグで「選んで切替える」を選択。
ここでは前回同様、次のように設定した。
出力1:照明が点く=日没(夜間)
出力2:何もしない=日の出(日中)
■スイッチタグB:在宅/不在の切替スイッチ
原理はスイッチAと同じ。
出力1:照明が点く=在宅(帰宅)
出力2:何もしない=不在(外出)
AとBで共通させたのは、「出力1」の方に「照明が点いてほしい状態」をセッティングしたこと。
- 日没している時に点いてほしい ⇄ 日が出ている時には点いてほしくない
- 在宅している時に点いてほしい ⇄ 不在の時には点いてほしくない
こうしておくとレシピを作る時にわかりやすい。
■IFTTTタグ1:帰宅
前回までの記事で作った、
「エリア内に入ったらMESHにID:whenbackhome を飛ばす」
というIFTTT Appletで飛んできたIDを受信するタグ。
受信したらスイッチAの入力に流れ、照明を点灯するかの判別をする。
■IFTTTタグ2:日の出
こちらも前回までの記事で作ったもの。
「日が上ったらMESHにID:sunrise を飛ばす」
というIFTTT Appletから受信してスイッチAの出力選択に流れ、スイッチAを出力2(日の出)に切り替える。
■IFTTTタグ3:日没
同じく前回までに作ったもの。
「日没したらMESHにID:sunset を飛ばす」
というIFTTT Appletから受信。
こちらはスイッチBの入力に流れ、日没しているかしていないかによって点灯するかを判別する。
■IFTTTタグ4:外出
こちらは今回新しく作ったタグ。
IFTTTで
「エリアから出たらMESHにID:whenleavehome を飛ばす」
というAppletを作った。(作り方は省略。)
エリアはIFTTTタグ1と同じ自宅中心のエリアを設定しておく。
これを受信するとスイッチBの出力選択に流れ、スイッチBを出力2(不在)に切り替える。
※「帰宅」「日没」タグでスイッチをリセット
一方、IFTTTタグ1(帰宅)のタグはスイッチBのリセットにも繋がっている。
つまり「帰宅したらスイッチBを出力1(在宅)に戻す」役割を果たしている。
同様に、IFTTTタグ3(日没)はスイッチAのリセットにも繋がって「日没したらスイッチAを出力1(日没)に戻す」。
スイッチA、Bを「順番に切替える」でなく「選んで切替える」にしているのは、何らかの理由でスイッチの切り替えがうまく動かなかったとき、「順番に切替える」だと、一度逆になるとずっと逆のままになるから。
「選んで切替える」だと、次のステータス変更時にリセットすることで強制的に正常な状態に戻すことができる。
■IFTTTタグ5:点灯
スイッチA、Bともに、出力1は照明を点灯するIFTTT Appletに繋がっている。
ID:lightmyroom を送信して、IFTTTのMESHタグで点灯のアクションにつなげる。
出力2のほうは照明が点灯しないようにしたいので、MESHのLEDタグに繋いでおいた。
たぶん何も繋がなくても動くはず。
実行
照明が点灯してほしくない/点灯してほしいシチュエーション別に、挙動を図示してみた。
日中に帰宅した場合(点灯してほしくない状態)
日中に帰宅した場合、IFTTTタグ1からスイッチAの入力に流れる。
この時、 スイッチAは日中のため出力2になっているので、IFTTTタグ5:点灯には流れず、照明は点灯しない。
日没時に不在の場合(点灯してほしくない状態)
日没時にIFTTTタグ3からスイッチBの入力に流れる。
外出時は出力2になっているので、IFTTTタグ5には流れず、照明は点灯しない。
日没時に帰宅した場合(点灯してほしい状態)
帰宅時にIFTTTタグ1からスイッチAの入力に流れる。
日没時、スイッチAは出力1になっているので、IFTTTタグ5に流れ、点灯する。
在宅時に日没した場合(点灯してほしい状態)
日没時にIFTTTタグ3からスイッチBの入力に流れる。
帰宅(在宅)している時、スイッチBは出力1になっているので、IFTTTタグ5に流れ、照明が点灯する。
これで全部うまくいった。
レシピ統合成功
日没の瞬間に在宅をチェックするという方法に囚われていたけど、在宅/不在のステータスを切り替えてMESHに保持しておくという方法に気づいたのが大きかった。
日没/日の出と同じことなのに、なんで今まで気づかなかったんだろう。
ともかく、このレシピができたおかげで今まで使っていた人感ブロックを使う必要がなくなったので、また別の使い道を考えよう。