前回の記事で防犯ライトを作ってみましたが、昼間も点くのがかっこ悪い。そこで、夜だけ動作するようにしてみました。と言っても、照度センサーはない(対応センサーはあるけどBLEなのでイマイチ)ので、アクション側で時間帯で動作するかしないか判定するように変更。
ポイント
- BranchTimeCaseコンポーネントを使用する
- そのために、CreateRecordでステップ出力に時刻情報をマッピングする
BranchTimeCaseはBranchコンポーネント配下で利用する条件指定コンポーネントですが、時間の範囲を指定して、配下のステップを実行するかどうかを決めることができるんです。なので、今回はこのコンポーネントを使いました。
CreateRecordで時刻をステップ出力に渡す
まずはBranchTimeCaseで使えるようにCreateRecordコンポーネントで時刻情報をステップ出力に渡します。
CreateRecordを追加したら、ステップ出力をクリックします。で、右ペインのところで「+」をクリックしてフィールドを追加します。出力フィールド名はTimestamp
にしましょう。型はDateTime
。式はアクション変数から持ってくるので、av.Timestamp
とします。
これでOK。これでステップ出力として次のコンポーネントのステップ入力として時刻情報が渡せるようになりました。BranchやFilterを使うときにはアクション変数ではなくてステップ入力として値を渡さなければなりませんので注意しましょう。
BranchTimeCaseを使う
さて、今回のポイント、BranchTimeCaseです。上に書いたとおり、時刻情報から指定された時間内であれば配下の処理を実行するコンポーネントです。
まずはCreateRecordのあとにBranchを追加します。Branchをダブルクリックするとその配下に処理が移ります。BranchCaseが追加されてますので、これを削除し、新たにBranchTimeCaseを追加します。ちなみに、Branchの配下にはいくつか条件指定コンポーネントを配置できますが、左から順に評価され、評価されたレコードは次の条件指定には渡されません。プログラム的に言うと、if-else
構文に近いのですが、ステップ入力はレコード(配列)なので、それぞれのレコードがif-else
で評価されていくと考えるといいと思います。ある条件で合致して処理されたレコードが削除された形で次の条件に進むって感じですかね。
さて、BranchTimeCaseは時間に特化した条件指定コンポーネントです。なので、まずは評価するフィールドとしてTargetを指定します。これにはCreateRecordで作成したTimestamp
を指定します。ここではav
だとかsin
だとかのプレフィックスは必要ありません。単にステップ入力のフィールド名を指定します。また、この時刻はローカルタイムとして評価されますので、特に変換等は気にしなくて良いです。HubKitの動作OSのタイムゾーンだけは正しく指定しておきましょう。
Start timeとEnd timeには、配下の処理を実行したい時間帯の、それぞれ開始時刻、終了時刻を指定します。ここでは、Start timeに16:00
、End timeに8:00
を指定しました。ここで、一つポイントです。そうです、Start timeよりもEnd timeの方が早い時間になってます。通常この手の指定は、開始が終了よりも早ければなりません。もしくは、0:00
をまたぐことはできないのです。つまり、16:00~32:00
と指定するか、0:00~08:00
と16:00~24:00
の2つの条件を指定しなければならないことも多いです。でも、BranchTimeCaseはそれをいい感じで処理してくれます。直感的ですねー。
条件指定はここまでです。あとは、BranchTimeCaseをダブルクリックして、中に前回指定したGeneralLightを配置します。今回は玄関に行かなくても分かりやすいようにLineNotifyで自分にもテスト用に通知するようにしてみました。
以上です。これで、暗い時間帯だけライトが点くようになりました。