コモノポリタン

コモノ、デジモノが好きなKomonopolitan住民 (はてなダイアリーからの引っ越しです)

【Home AssistantでDIY Smart Home】zigbeeデバイスを活用せよ!ライトセンサー編

【Home Assistant(Hass.io)】
シーリングライトのスマート化
Xiaomi Smart Light Sensorと赤外線リモコンを組み合わせる

「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。

 zigbee2mqttをセットアップしてHome AssistantでZigbeeバイスを使えるようにしました。今回はXiaomi Smart Light Sensorを活用して赤外線リモコン対応のシーリングライトをスマートライト化しましょう。まあ、ちょっとスマート度合いは低いのですが…(それは後ほど説明します)。

 以前、汎用赤外線リモコンでシーリングライトをオン・オフできるようにしました。が、実はちょっと問題があったことを言わずにいました。リモコンのスイッチのオンオフだったので、実際にシーリングライトが点灯したかは実は不明だったのです。
 今回は、少なくともリモコンでオンにしたら「光ったか」は確認できるようにしたいと思います。また、一歩スマートに…。

【追記】
さらに一歩スマート化を推し進めてみました。
maky-ba.hatenablog.com

この記事の前提条件
Home Assistant 2021.1.4
HassOS 5.10
Server Raspberry Pi 4(2GB)

1. スマートな電灯の仕組みを考える

 以前下記の記事で汎用赤外線リモコン(Broadlink RM mini 3)でシーリングライトのオン・オフを制御したときは、「スイッチ」を使いました。

maky-ba.hatenablog.com

 確かに、オンとオフの信号を送るスイッチでしかありませんでした。オンの信号は送るもののそれで「電灯が点く」という保証はありません。純正のシーリングライトのリモコンでも壁のスイッチが入っていないときは、天井のシーリングライトに電気が供給されていないのでリモコンそのものを動きませんし、どうあがいても電気を点けることはかないません。電灯のリモコンなんてそんなものです。
 また現在の電灯の状態がわかっているわけではないので、電灯が点いていてもオンの信号を送ることが出来てしまいます。(なお、日立の純正のリモコンでは、シーリングライトは電灯が点灯しているときにオンのボタンを押すと、シーリングライトが「ピピッ」と鳴って二重に点灯ボタンを押したことを教えてくれます。)

 今回は汎用赤外線リモコンに、光センサーを組み合わせてみたいと思います。スイッチをオンにしてオンの信号が送られて確かに電灯が点けば、それは光センサーで捉えることが出来るはずです。一方、うまくつかなかったとき(信号が届かなかった時とか、壁のスイッチで切られている時とか)は、暗いままなのでそれも光センサーで捉えることが出来るはずです。

 ということで光っているか光っていないかが分かるので、今回は「スイッチ」ではなく「ライト」を使いたいと思います。

2. Xiaomi Smart Light Sensor (GZCGQ01LM)

 このXiaomiのセンサーは、先のドア窓センサー同様zigbeeベースのセンサーで、83,000ルクスまでの光を検知できるライトセンサーです。直径40mm 厚み12mmです。
f:id:maky_Ba:20210116211312j:plain:w300

 zigbeeベースのセンサーなので、下記の記事の応用でHome Assistantに組み込むことが出来ます。
maky-ba.hatenablog.com

 横のボタンを5秒程度押すと青いランプが光ってペアリングモードに入ります。先の記事「【Home AssistantでDIY Smart Home】zigbeeバイスを活用せよ」の4.1. zigbee2mqtt側でのデバイスの接続の通りにペアリングして、friendly_nameの登録まですませます。「設定」ー「インテグレーション」ー「MQTT」でfrinedly_nameをもとにデバイスの登録状況を確認しておきます。

私のデバイスはこんな感じでした。

  • バイス名:xiaomi_light_sensor_01
  • バイス情報:MiJia light intensity sensor (GZCGQ01LM) Xiaomi
  • エンティティ:
    xiaomi_light_sensor_01_battery
    xiaomi_light_sensor_01_illuminance
    xiaomi_light_sensor_01_illuminance_lux
    xiaomi_light_sensor_01_linkquality

その中で光センサー(単位はルクス)のエンティティはこんな感じでした。

  • friendly_name: xiaomi_light_sensor_01_illuminance_lux
  • エンティティID: sensor.0x04cf8cdf3c7XXXXX_illuminance_lux

3. 光センサーのシーリングライトへの取り付け

 センサーは電池を入れても18g弱なのでそのままシーリングライトの中にぺちっと貼り付けることもできます(下の写真の黄色の輪っかは付属の貼り付け用の両面テープです)。しかしながら写真にある通り裏側真ん中の窪みにコインとかを引っ掛けて裏蓋を外して電池を交換しければいけない仕組みです。ぺたっと貼ったらどうするつもりでしょう。不思議…。
f:id:maky_Ba:20210116230149j:plain:w300
 ちなみに固定の仕方は3つある(と中国語のマニュアルに書いてあるように見える(by心眼))。

  • 方式一:平らな面に「置く」
  • 方式二:金属面に「(内蔵磁石で)くっつける」
  • 方式三:平らな面に「両面テープ(?)でくっつける」

 小さな磁石が対角線上に2個内蔵されているので、金属面に余裕があれば「方式二」が良いでしょう*1。しかし今回は、ちょうどよい金属のスペースがありませんでした(下記写真をみると一見ありそうなのですが、蓋をするときに干渉するのです。残念。*2

 今回は3Dプリンターを使って第四の固定方法を実現しました。

  • 方式四:光センサーのホルダを作って入れる

f:id:maky_Ba:20210116231641j:plain:w240 f:id:maky_Ba:20210116231712j:plain:w240

 これを蓋を閉めたときに干渉しない位置に両面テープ(3MのコマンドタブMサイズ)で貼り付けます*3。これで電灯の点灯・消灯をダイレクトに光センサーで捉えることが出来るはずです。
f:id:maky_Ba:20210116232138j:plain:w300

4. SwitchとSensorを組み合わせてLightを作る

 Switch(汎用赤外線リモコンBroadlink RM mini 3)とSensor(光センサーXiaomi Smart Light Sensor)を組み合わせて新しいLightを作るのに「Template Light」を使います。出来上がりは下記のとおりです。

(前略)
light:
  - platform: template
    lights:
      # Ceiling Light (Hitachi) in Study Room
      ceilinglight_studyroom:
        friendly_name: StudyRoom Ceiling Light
        value_template: "{{ states('sensor.0x04cf8cdf3c7XXXXX_illuminance_lux')|int > 1000 }}"
        icon_template: >-
          {%- set state = states('sensor.0x04cf8cdf3c7XXXXX_illuminance_lux') -%}
          {%- if state|int > 1000 -%}
            mdi:lightbulb-on
          {%- else -%}
            mdi:lightbulb-outline
          {%- endif -%}
        turn_on:
          service: switch.turn_on
          data:
            entity_id: switch.hitachi_ceiling_light_ch1
        turn_off:
          service: switch.turn_off
          data:
            entity_id: switch.hitachi_ceiling_light_ch1
(後略)

 この中でvalue_templateには、このLightのステータスがtrue(点灯)となる条件を設定しています。1,000ルクス以上であれば点灯していると見なす事にしています。実際に点灯すると2,000~5,000ルクス弱ぐらいは出ます。

        value_template: "{{ states('sensor.0x04cf8cdf3c7XXXXX_illuminance_lux')|int > 1000 }}"

 またステータスに合わせてアイコンが自動的に変わるようにしました。icon_templateで設定しますが、やはり閾値は1,000ルクスとし、それを超えていたら点灯、下回るようだと消灯とわかるアイコンを割り当てました。

        icon_template: >-
          {%- set state = states('sensor.0x04cf8cdf3c7XXXXX_illuminance_lux') -%}
          {%- if state|int > 1500 -%}
            mdi:lightbulb-on
          {%- else -%}
            mdi:lightbulb-outline
          {%- endif -%}

5. UIにライトを設定してみる

 「状態」ー「ダッシュボートの編集」の「+カードの追加」で「ボタン」カードを選んで、上記で作ったLight(light.ceilinglight_studyroom)を設定する。 f:id:maky_Ba:20210804012516j:plain:w450

出来上がりは下記。クリックするとオン・オフできます(なお長く押してから離すと詳細画面が出ます)。
f:id:maky_Ba:20210804012414j:plain:w220f:id:maky_Ba:20210804012443j:plain:w220
 ただし、点灯したかの確認はzigbeeベースのXiaomi Smart Light Sensor任せなので少しタイミングがズレます。長いと12,3秒程度かかってから表示が変更されます。ま、ゆったり待ちましょう。
 ちなみに壁のスイッチをオン・オフしてもこのLightのステータスは変わりますよ。センサーですから当然ですが…

6. おわりに

 ううむ、もうちょい反応早くならんものか。でも電池の持ちとトレードオフだと思うのでこれ以上追求はしません。
 それよりも、ボタンを押しても(=赤外線コマンドを送信しても)ステータスが変わらない(点灯状態に変化が無い)時はたぶん元の壁スイッチが切られているはずなので、その判定と警告を組み込みたいですね。

maky-ba.hatenablog.com

*1:PanasonicのLEDシーリングライトには干渉しないで貼り付ける場所ありましたよー。こっちは少しサイズが大きいシーリングライトだからかなぁ。

*2:あ、内蔵磁石があるということは、コーヒーカプセルを壁に貼り付けた百均のステンレス板を使えば簡単か…。しまった。

*3:今更ですがLEDになるとスペースの空きが少ないですね。蛍光管の時は真ん中あたりにもっと隙間があった気がするのですが。