Aqaraのミリ波を使った人感センサをHomeKitから使いました。Zigbeeで通信するので、Zigbee2MQTTとHomebridgeを使用します。一般的なPIR(パッシブ赤外線)人感センサーと比較して、安定していて非常に使いやすいです。Zigbee2MQTTのwebインタフェースから感度などの設定が可能です。また人の検知以外に、人の移動のイベントもHomeKitから利用可能でした。
AqaraのFP1
独身の日セールで買いたいもの、としてネットで話題になっていたFP1を入手しました。送料込み5,700円でしたが、4,000円台で買えるところもあったらしいです。現在は7,000円台のようです。こちらの製品です.
そこそこ綺麗な白い箱に入ってます。箱には「精准感知空间有人和无人(無人),支持静止人体的存在识别(識別)」と書いてあります。漢字の雰囲気から「空間の有人と無人を正確に感知して、静止している人体の存在識別もサポートしている」という意味に読み取れます。漢字の力はすごい。
USB ACアダプタ、長めの電源(USB)ケーブル、取り付け用鉄板、両面テープなどが付属してます。付属品もしっかりしてました。
本体は丸くて洒落てます。グッドデザイン賞も受賞しているようです。ベースには強力な磁石が入ってます。ベースと本体には可動部分があって角度を調整できます。添付冊子によると、検出範囲は5m、横120度、縦40度程度とのことです。
本来の接続方法
Zigbee通信方式のセンサなので、省電力で、WiFiへの負担も無く使いやすいです。ただそのままではスマホやインターネットに接続できないので、通常はAqaraのHUB製品(例えばAqara E1)と一緒に使います。HUBがZigbeeとLANの橋渡しをしてくれるので、AqaraのスマホアプリやAqaraのクラウドからセンサが利用できるようになります。また嬉しいことに、Aqara HUBは、Apple HomeKitにも対応してます。なのでHUBを用意すればすぐにiPhoneやMacのホームから使えるはずです。
今回の接続方法と比較すると、Aqara Hubを買う方が簡単で良いかもしれません。
ただし、試していませんので詳細不明ですが、上記の販売サイトにはAndroidスマホをオンラインにしておかないとHomeKitへの接続作業ができないようなことが書いてあります。これがセットアップ時の場合だけなのか、常時Androidスマホが必要なのか不明で、ちょっと不安です。
今回の接続方法
今回はFP1を、Zigbee-USBアダプター、Zigbee2MQTT、MQTTブローカ(Mosquitto)、Homebridgeを使ってHomeKitに接続しました。Zigbee2MQTT, MQTT, HomebridgeはRaspberry Pi 4 (4GB)で動いています。AqaraのHUBは使いません。
Aqara HubにはAqara社製品しか使えませんが、Zigbee2MQTTならば、市販のほとんどのZigbee製品が使えます。これからもZigbee製品を増やしていく予定があるならば、Zigbee2MQTTで頑張るのが良いと思います。Zigbee2MQTTインストールの詳細に関しては以下をご覧ください。
背面ボタン長押しでペアリング
箱から出したFP1にUSB電源を接続したら、次にFP1をZigbee2MQTTにペアリングします。Zigbee2MQTTのペアリングモードがoffに設定してある場合は、webインタフェース右上のPermit join (All)のメニューをクリックしてペアリングを許可します。すると5分間、ペアリングが可能になります。
この状態でFP1の裏にあるリセットボタンを5秒程度長押しします。するとFP1の青色LEDが点滅してペアリングモードに入ります。この後20秒くらいでペアリングが終了します。WebインタフェースからDashboardメニューを選べば、FP1の情報が得られます。
人が近づいたことを検出しているようです。また温度も測定されています。ただしこの温度表示は、いつ見ても摂氏23度でした。もしかしたら測定しているふりをしているだけなのかもしれません。
Homebridge/HomeKitから使用する
HomebridgeにすでにZigbee2MQTT用のプラグインがインストール・設定されていれば、FP1が自動的にHomeKit上に現れます。iPhoneまたはMacのホームを見ると、上部に「人感検知」のアイコンが現れています。
これをクリックするとFP1が表示されます。初期状態ではZigbeeのIDが名前になってますが、以下ではAqaraFP1という名前に変更してあります。
また温度計も表示されました。ただしいつも23度なので動作しているのかどうかは怪しいです。
追記です。本日確認したら24度になってました。動作していないということは無く、多少は気温を反映しているようです。ただ隣に置いたDHT20のセンサは22度で、割と変化してます。FP1の温度は、変化がほとんど無く、実際より2度程度高い感じです。FP1のパッケージで密閉された場所の温度で、部品発熱の影響を受けているのかもしれないです。
HomeKitからできること
iPhone/MacのホームアプリケーションでFP1のアイコンをタップすると、以下のメニューが現れます。作成できるオートメーションは、「人を検知した」と「人の検知を停止した」です。
FP1をパソコン部屋の上部に設置して、このオートメーションで部屋の照明と、足元暖房(小さなホットカーペット)の電源をon/offするように設定しました。部屋の照明はZigbee壁スイッチで、ホットカーペットはMerossのスマートプラグで制御しています。
理想的な人センサ
使用したところ大変快適でした。部屋に滞在中はずっと検知してくれます。PIRセンサのように、人が静止していると検知されなくなる不具合は皆無でした。PIRセンサは、人の体温に相当する長波長赤外線の揺らぎを検出します。なので、人が動いていないと、検知されなくなってしまいます。FP1はミリ波を使って距離の変化を測定してます。ミリメーター程度の解像度があるので、呼吸による変動も測定できて人検知するようです。試しに息を止めて動かないよう頑張りましたが、それでも検知されました。脈動のような微小な体の動きを人検知に使っているようです。
人が部屋に入れば10秒から15秒程度で検知されます。部屋から出ると10秒から30秒程度で検知されなくなります。人検知センサとして期待できる機能を実現できていると思いました。
Zigbee2MQTTでの詳細設定
Aqaraのスマホアプリを使うと、検知領域などを細かく設定できるようです。でもZigbee2MQTTのwebインタフェースからもかなりの設定が可能でした。以下のように、
- monitoring_mode:人を無指向で検知するか、左右の入出も検知するかの切り替え。undirectedの場合、presence_eventとしてenter, leve, approach, awayが得られ、reft_rightに切り替えると、加えてright_enter, left_enter, right_leave, left_leaveが得られる。
- approach_distance:人が近づくことを検知する際の検知距離
- motion_sensitivity:検知感度
- reset_nopresence_status:検知結果をリセットする
の設定が可能でした。ここまでのHomeKit設定で使用されるのは、presense(人が検知されたかどうか)の値と、温度の情報だけです。なので、ここの設定もデフォルトでok、もしくは、motion_sensitivity (検知感度)の調整だけで良いと思います。上記のように、FP1は検知領域の左右から出入りしたとか、近づいた・離れたなどのイベントも検知します。これらの情報をHomeKitで利用する方法については、後ほど紹介します。
MQTTメッセージを見る
Zigbee2MQTTがパブリッシュするMQTTメッセージを見ると、詳細な状況がわかります。mosquitto_subコマンドでサブスクライブしてみます。9999…のところには、FP1の実際の値を入れてください。
mosquitto_sub -h 192.168.x.x -t zigbee2mqtt/0x9999999999999999/# -v
この結果、以下のような情報が得られます。
zigbee2mqtt/0x9999999999999999 {"approach_distance":"medium","device_temperature":23,"linkquality":200,"monitoring_mode":"undirected","motion_sensitivity":"high","power_outage_count":0,"presence":true,"update":{"state":"idle"},"update_available":false}
色々な情報がjson方式で書かれています。内容は、
- “approach_distance” 近づく検知を行う場合の距離設定
- “device_temperature” デバイスの温度(いつも23度)
- “linkquality” 電波強度
- “monitoring_mode” 検知モード
- “motion_sensitivity” 感度
- “power_outage_count” 電源遮断回数
- “presence” 人の検知
などです。
MQTTメッセージを要求する
このメッセージは、人の検知状況が変化した場合など、内容が変化した場合にパブリッシュされます。また、何の変化がない場合でも5分経過すると同じ内容がパブリッシュされます。
5分待つことなく、今すぐに情報が欲しい場合は、MQTTのトピックの最後にgetとつけて、欲しい情報を要求することができます。例えば、presenseが必要ならば、その値を空白にしたjson表記をパブリッシュします。
% mosquitto_pub -h 192.168.x.x -t zigbee2mqtt/0x9999999999999999/get -m '{"presence":""}'
するとmosquitto_subしている側に、結果がすぐに現れます。
zigbee2mqtt/0x9999999999999999/get {"presence":""} zigbee2mqtt/0x9999999999999999 {"approach_distance":"medium","device_temperature":23,"linkquality":207,"monitoring_mode":"undirected","motion_sensitivity":"medium","power_outage_count":0,"presence":true,"update":{"state":"idle"},"update_available":false}
このように、結局は全部の情報が得られることになります。
MQTTから設定する
Zigbee2MQTTのweb画面から設定変更すると、その情報がすぐにパブリッシュされます。例えばZigbee2MQTTの設定画面で、感度をmediumに下げてみます。
すると、メッセージも以下のようになります。
zigbee2mqtt/0x9999999999999999 {"approach_distance":"medium","device_temperature":23,"linkquality":207,"monitoring_mode":"undirected","motion_sensitivity":"medium","power_outage_count":0,"presence":true,"update":{"state":"idle"},"update_available":false}
motion_sensitivityがmediumに変わってます。
同じ設定はmosquitto_pubコマンドでも可能です。Zigbee2MQTTのwebインタフェースの裏でMQTTメッセージを出しているので当然可能なのです。MQTTのトピックの最後に今度は、setをつけます。そして設定したい項目を記述します。今度は感度をhighに戻してみましょう。
mosquitto_pub -h 192.168.x.x -t zigbee2mqtt/0x9999999999999999/set -m '{"motion_sensitivity":"high"}'
この結果、感度が再びhighに戻りました。
zigbee2mqtt/0x9999999999999999 {"approach_distance":"medium","device_temperature":23,"linkquality":207,"monitoring_mode":"undirected","motion_sensitivity":"high","power_outage_count":0,"presence":true,"update":{"state":"idle"},"update_available":false}
HomeKitでpresence_eventを利用する
ここまでの設定では、HomeKitから使用できる情報は、人の検知であるpresenceだけです。その値はtrue/falseの2値です。ここまででも十分便利です。FP1は他に、presence_eventとして、 “enter”, “leave”, “left_enter”, “right_leave”, “right_enter”, “left_leave”, “approach”, “away”という値を提供します。これを利用する方法を考えます。
このために、HomebridgeプラグインのMQTTThingを使います。MQTTThingを使えば、Zigbee2MQTTが出してくれるMQTTメッセージを利用できます。
そこで、MQTTThingの設定メニューからMotion Sensorを1個追加します。モーションセンサの名前をFP1_approachとしました。最終的なconfig設定は以下のようにしました。
{ "type": "motionSensor", "name": "FP1_approach", "url": "mqtt://localhost:1883", "topics": { "getMotionDetected": "zigbee2mqtt/0x9999999999999999$.presence_event" }, "onValue": "approach", "offValue": "away", "accessory": "mqttthing" }
MQTTThingの最近のバージョンではjson表記のメッセージも扱えるようになってます。トピックの最後に$.をつけてjsonのキーの名前を指定できます。ここではpresence_eventの値を取得したいので、$.presense_eventと追加してます。これがapproachの場合にonとみなし、awayの場合にoffとみなすように設定しました。
これを保存してHomebridgeをリセットすると、ホームに、このモーションセンサが現れます。
設定のところでは、動きを検知したとき(ここではapproachの場合)と検知しなかったとき(awayの場合)に行うオートメーションを書きます。テストのためにNanoleafの電球をon/offさせるようにしました。
試したところ、FP1に近づく動きをすると電球が点灯し、FP1から離れる動きをすると電球が消灯しました。このようにしてセンサーに向かって近づく・離れる、センサーに左右から近づく・離れるなどの動きにHomeKitで対応できました。
まとめ
ミリ波を使ったZigbee人感センサーFP1を使ってみました。遠赤外線を使った一般的なPIRセンサと比べて数倍から10倍くらい高価ですが、応答速度は早くて動作が安定していて、人の存在を確実に検出できました。PIRセンサと比較したら異次元の製品です。「人が滞在する場合に動作させたい」という目的を完璧に達成する自動化が可能です。
Zigbee2MQTT用のプラグインでは人の検知のみがサポートされていますが、MQTTThingプラグインを使うことで、人の移動も検出できました。MQTTメッセージに対応するPythonプログラムなどを書けば、さまざまな用途にも使えると思います。
コメント