前回までで門柱灯(gatepost lamp)のリモート操作ができるようになりましたので、いよいよ自動化の設定に入ります。
とりあえず次のような動作を考えました。
- 昼行灯(ひるあんどん)は良くないので明るいときは無条件にOFF
- 日没後、暗くなったらON
- PM9:00にOFF
EEスイッチを置き換えたので他の項目は実現できなくても1の項目だけは何としてもクリアしたい所です。
前回までに光センサーの値はESP-WROOM-02側からMQTT Brokerの /home/gatepost/sensor/stateへパブリッシュされるようになっていますので、今回はOpenHAB側のconfigを一部追加して表示させるようにします。本来光センサーの値をリアルタイムに表示してもあまり意味をなさないのですが、今回は自動化の設定値を求めるために一時的に行います。(シリアルモニタで見るより簡単・手間いらずです)
■itemsの編集
$ sudo vi /etc/openhab/configurations/items/my_home.items
Group All Switch lamp1 "gatepost Lamp" (all){mqtt=">[broker:/home/gatepost/lamp/com:command:on:ON],>[broker:/home/gatepost/lamp/com:command:off:OFF],<[broker:/home/gatepost/lamp/state:state:default]"} /* 以下を追記します */ Number light_sensor "光センサー (Light Sensor) [%d ]" {mqtt="<[broker:/home/gatepost/sensor/state:state:default]"}
■sitemapの編集
$ sudo vi /etc/openhab/configurations/sitemaps/my_home.sitemap
sitemap my_home label="Main Menu" { Frame label="MQTT" { Switch item=lamp1 label="Gatepost Lamp" /* 以下を追記します */ Text item=light_sensor } }
■OpehnHABの再起動
$ sudo /etc/init.d/openhab restart
光センサーの値がスイッチの下の行に表示されるようになりました。さて、さらにこれを進めて一日の推移をグラフにして表示してみます。
先日紹介した https://openhardwarecoza.wordpress.com/2015/03/30/openhab-mqtt-arduino-and-esp8266-part-5-1-graphing-sensor-data/ こちらのサイトを参考に設定を行います。
■rrd4j add-onをインストール
$ sudo apt-get install openhab-addon-persistence-rrd4j
上記はdemoサイトが設定されていれば追加されるみたいです。そのときは不要です。
■persistenceファイルの編集
$ sudo vi /etc/openhab/configurations/persistence/rrd4j.persist
Strategies { // for rrd charts, we need a cron strategy everyMinute : "0 * * * * ?" } Items { light_sensor : strategy = everyMinute }
■sitemapの編集
$ sudo vi /etc/openhab/configurations/sitemaps/my_home.sitemap
sitemap my_home label="Main Menu" { Frame label="MQTT" { Switch item=lamp1 label="Gatepost Lamp" Text item=light_sensor /* 以下を追記します */ Frame label="フォトトランジスタの出力をAD変換した値" { Chart label="light_sensor" item=light_sensor period=d refresh=30000 } } }
■OpehnHABの再起動
$ sudo /etc/init.d/openhab restart
再起動後しばらくするとグラフが描かれ始めます。period=d としたので24時間のグラフになりました。このようにOpenHABではとても簡単にグラフを描くことができます。
こちら に書かれていますがデータをグループで指定して複数のグラフを書くこともできるようです。ただ残念ながら現在のところ複数のY軸の設定は出来ないようなので異なるカテゴリーの値を一つのグラフに表示させることは難しいようです。また、設定が悪いのかバグなのかは分かりませんが、私のiOSアプリではなぜかグラフが表示されません。(サファリなどのブラウザからは表示されます)
観察の結果、だいたいセンサーの値が25を下回ったら電灯をONにすれば良さそうです。電灯をOFFにする条件は、センサーの値の変動を考慮して50を超えた値で無条件にOFFとしましょう。先ほども申しましたが光センサーの値のグラフはあまり意味をなさないので、将来的には気温のグラフを表示させようと思っています。
余談ですが、当初は光センサーのフォトトランジスタの向きが良くなかったようで、暗いときの感度が低くNGでした。センサーを外付けにして調整したころ改善しました。
さて、ようやく準備ができました。いよいよルールを設定する番です。OpenHABではJAVA言語を発展させたXtendという言語でルールを記述するようです。JAVAすら初めてな私にとっては、ハードルが極めて高そうですね。でもそこは、いつもどおり「見よう見まね」で切り抜けていきましょう。
https://github.com/openhab/openhab/wiki/Rules やhttps://github.com/openhab/openhab/wiki/Samples-Rules を参考にして、だいたい次の事がわかりました。
● rules ファイルはテキストで記述され、
[インポート:Imports] [変数宣言:Variable Declarations] [ルール:Rules]
3セクション構成となっている
rules file 例 (https://github.com/openhab/openhab/wiki/Samples-Rules#how-to-turn-on-light-when-motion-detected-and-is-dark 記載)
var Number counter = 0 var Number lastCheck = 0 rule "corLightOn" when Item corMotion changed from OFF to ON or Item corFrontDoor changed from CLOSED to OPEN then counter = counter + 1 if(corBright.state < 40) { sendCommand(corLightCeil, ON) } end rule "corLightOff" when Time cron "0 * * * * ?" then if(lastCheck == counter) { counter = 0 lastCheck = -1; sendCommand(corLightCeil, OFF) sendCommand(corMotion, OFF) } else { lastCheck = counter } end
上記の通りルールは一つのファイルに複数記入しても良いみたいですね。正直言って [インポート:Imports] は全く理解不能ですが、この例のように簡単なルールでは必要ないみたいです。恐らくArduino IDEで言えばライブラリみたいなものでしょう。まぁ、動作しなかった時に考えましょう。何か読み込ませばきっと動くでしょう。たぶん。
● ルールが起動するトリガは次の3つ
- Itemベーストリガ —– コマンドが発行されたりステータスが変更になったときに起動
- Timeベーストリガ —– 時間指定による起動
- Systemベーストリガ—- システムの開始時などに起動
例
Itemベーストリガ Item received command [] Item received update [] Item changed [from ] [to ] Timeベーストリガ Time is midnight Time is noon Time cron ""
TimeベーストリガではLinuxのcronライクな表現で指定できるのですね。ただ こちら を見るとlinux の cronにくらべ機能が拡張されているようです。左から順に
秒 分 時 日 月 曜日 年(オプション)
秒や年が指定できるようです。persistenceファイルの編集の時にも出てきました。ワイルドカードの*はともかくとして、?マークは見慣れないですね。どうやら日と曜日はどちらかを指定して指定しない方に?をつけるようです(たぶん)。という訳で16時台から20時台の15分毎に起動させたければ “0 0/15 16-20 * * ?” と指定すれば良いですね。
以上をふまえて、当初計画した自動化ルールを作成します。
- 光センサー(Item:light_sensor)の値を調べ、50より大きいときは門柱灯(Item:lamp1)へOFFのコマンドを送る。[1分おきに実行]
- 光センサーの値が25より小さい時はONのコマンドを送る。[16時から20時45分まで15分おきに実行]
- 門柱灯へOFFのコマンドを送る。[21時0分0秒に実行]
サンプルを見ると日没時間等を計算式で求める事も可能なようですね。まったくもってアメージングです。でも、あまり欲をかいてしまうと失敗してしまいますので、身の丈にあった設定ファイルにしておきます。
■gatepost.rulesの作成
$ sudo vi /etc/openhab/configurations/rules/gatepost.rules
rule "LightOFF_in_daylight" when Time cron "0 * * * * ?" then if (light_sensor.state > 50){ sendCommand(lamp1, OFF) } rule "LightON_after_sunset" when Time cron "0 0/15 16-20 * * ?" then if (lamp1.state == OFF && light_sensor.state < 25){ sendCommand(lamp1, ON) } rule "LightOff_at_21" when Time cron "0 0 21 * * ?" then sendCommand(lamp1, OFF) end
■OpehnHABの再起動
$ sudo /etc/init.d/openhab restart
11月22日 東京での日の入り時間は16時31分でした。 16時45分に門柱灯が自動的に点灯しましたので、どうやらうまく行ったようです。ログを見てみます。
$ sudo cat /var/log/openhab/events.log .... 2015-11-22 16:28:55 - light_sensor state updated to 54 2015-11-22 16:29:00 - lamp1 received command OFF 2015-11-22 16:29:00 - lamp1 state updated to OFF 2015-11-22 16:29:00 - light_sensor state updated to 53 .... 2015-11-22 16:29:55 - light_sensor state updated to 50 2015-11-22 16:30:00 - light_sensor state updated to 51 2015-11-22 16:30:05 - light_sensor state updated to 46 .... 2015-11-22 16:44:56 - light_sensor state updated to 24 2015-11-22 16:45:00 - lamp1 received command ON 2015-11-22 16:45:00 - lamp1 state updated to ON 2015-11-22 16:45:01 - light_sensor state updated to 24 2015-11-22 16:45:06 - light_sensor state updated to 24 2015-11-22 16:45:11 - light_sensor state updated to 25 ....
光センサーの値が5秒間隔で記録されています。必要以上に間隔が短すぎるかもしれませんね、後で調整することにします。