Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

Home Assistant: Sonoff Zigbee 3.0 USB Dongle Plusをルーターとして使う

Sympapaです。
我が家ではHome Assistantとセンサー類の接続にはZigBeeを使用しています。
ZigBeeの接続にはZHA(ZigBee Home Automation)ZigBee2MQTTの両方を使用しており最初に使い始めたZHAをメインで使っていたのですが、ZHAはルーター機能を持ったデバイスを追加するとちょっと調子が良くない部分があるので、メインをZigBee2MQTTへ移行しようかと考えています。(そのあたりのことは今度書こうと思います。)


しかし、ZigBee2MQTTをメインにするにはそれはそれで課題がありました。
ZHAのコーディネーターはHSUBZB-1、ZigBee2MQTTのコーディネーターはSonoff Zigbee 3.0 USB Dongle Plusを使っているのですが、ZHAに使用しているHSUBZB-1は電波の飛びが良く家中をカバー出来るのに対して、Sonoff Zigbee 3.0 USB Dongle Plusは電波の飛びがあまりよろしくないのいです。
といっても前述のとおり、ZigBeeルーター機能を持ったデバイスでメッシュを構築します。外部から電源供給される電球などのデバイスの大半はルーター機能が付いているので、それによってネットワークの範囲を広げることが出来ます。
我が家ではルーター機能を持ったHueの電球が5個、ZigBee2MQTTのネットワーク内にあるので家の大半はカバー出来るのですがHueの電球を使っている範囲も偏りがあるので、一部の箇所に設置したセンサーの電波受信が弱い問題がありました。

そんなワケで今回は、ZigBee2MQTTのコーディネーターとして使用しているのと同じSonoff Zigbee 3.0 USB Dongle Plusを追加で購入し、ルーターファームウェアを焼いてルーター化して、電波の届きにくい場所に追加してやろうと思います。

■Sonoff Zigbee 3.0 USB Dongle Plus

Sonoff Zigbee 3.0 USB Dongle Plusは、ZHAでもZigBee2MQTTでもデフォルトのファームウェアでコーディネーターとして使用でき、アルミのケースに入っていてアンテナも付いているので、そのままで使える初心者に優しいZigBeeコーディネーターです。
もうひとつ初心者に優しい点があって、それはファームウェアを焼くのが簡単な点です。 コーディネーターとして使う分にはデフォルトのファームウェアでも良いと思いますが、最新のコーディネーターファームに更新したりルーター用のファームウェアを焼きたくなった場合、特別なケーブルを用意しなくてもWindows PCのUSB端子に挿してファームウェアを焼くことができます。
CC2652Pベースですが残念ながら電波の飛びは"HUSBZB-1"には遠く及ばず、Hueの電球と比べてもちょっと弱い感じなのでそれが弱点かな。

価格は1700~2000円くらいで比較的安価にZigBeeネットワークを構築できます。
ちなみにここのセラーで4回買い物をしましたが、いずれの場合もAliexpress Standard Shippingを選ぶとJPで始まる追跡番号となり、シンガポールを経由せずに日本へエアでやって来て佐川さんが届けてくれるルートとなって10日前後で届きました。シンガポール経由にならないのは発送元の場所の関係なんですかね。まぁ毎回このルートで届いたのも偶然なのかもしれませんが。
ja.aliexpress.com

ルーターファームウェアを焼いていく

ファームウェアを焼く方法はこのあたりを参考にしてWindows 10のPCを使用し焼いていきます。
ルーター用のファームウェアも、ZHAとZigBee2MQTTの両方をサポートしています。
notenoughtech.com

sonoff.tech


1)ファームウェアを焼くためのWindowsソフトウェアのインストール
こちらでTI FLASH-PROGRAMMER-2をダウンロードし解凍してインストールします。
www.ti.com



2)ファームウェアの入手
ルーター用の最新ファームウェアはここから入手できます。
"Sonoff Zigbee 3.0 USB Dongle Plus"用は”CC1352P2_CC2652P_launchpad_router_*.zip”です。
ダウンロードして解凍します。
github.com



3)ドングルを分解する
アンテナを外してUSBプラグ側のネジ2本を外せば基板を取り出せます。


4)ドングルをPCに接続する
"Sonoff Zigbee 3.0 USB Dongle Plus"をブートローダーモードでPCに接続するため、"Bootボタン"を押しながらPCのUSBポートに接続します。"Bootボタン"はそのまま押しっぱなしでキープし4~5秒に離します。


5)焼く
➀ TI FLASH-PROGRAMMER-2を起動して左上のConnected deviceから"Silicon Labs CP210xUSB to UART Bridge (COM x)"を選びます。
➁ その下のTarget Deviceが”unknown”の場合は、下の”Select Taget Device”のプルダウンメニューから”CC2652P”を選びます。
③ ”Main”タブを選びFlash Image欄にある”Blowse”ボタンを押して、さっきダウンロードし解凍したファームウェアの.hexファイルを選択します。
➃ Actionsの"Erace"にチェックを入れ"All unprotected Pages"にチェックを入れます。
"Program"にチェックを入れ"Entire source file"にチェックを入れます。
"Verify"にチェックを入れ"CRC check"にチェックを入れます。
➄再生マークを押すとスタートし下のStatusに進捗が表示されます。完了するとその下にSuccess!と表示されます。
f:id:sympapa:20220129102411p:plain


うまく接続できなかった場合は下のページからドライバーを入手して解凍し、デバイスマネージャを開いて、ポート(COMとMPT)から"Silicon Labs CP210xUSB to UART Bridge (COM x)"を選び、右クリック>ドライバーの更新>コンピュータを参照してドライバーを検索でさっきダウンロードして解凍したドライバを当てるとうまくいくかもしれません。
www.wch.cn

■設置する

ルーターファームウェアが焼かれている場合は、電源を供給すればルーターとして機能します。
コンセントに対して上下に90°の向きにUSB端子があるUSB電源を使うと便利ですね。
今回は家電量販店で安売りされていたのでこれを使いました。
www.elecom.co.jp


あとはZigBee2MQTTのデバイスとして追加してやればOKです。
バイスの写真は赤いTIロゴになるので一際目立ちます(笑)
これで、電波の届きにくかった場所のネットワークを補強できました。
f:id:sympapa:20220226105743p:plain

Home Assistant: 照度センサーで照明の電源状態を同期させる

Sympapaです。

我が家のキッチンとリビングの照明はどちらも赤外線リモコンの付いたシーリング照明です。
これらの照明をオンオフする手段として主に使用しているのは、1)照明付属のリモコンで操作、2)Google Homeで音声操作、3)物理ボタンリモートスイッチで操作(Home Assistantによる)、4)家のコントロールパネルで操作(Home Assistantによる)、5)人感センサーによる操作(Home Assistantによる)です。
これらをシステム的に見ると、1)照明付属のリモコンからオンオフする、2)Google Homeからオンオフする、3)Home Assistantからオンオフする、の3つの経路があります。


そして、Google HomeやHome Assistantから照明をオンオフするためにスマートIRリモコン: Nature Remoを使用しています。
Home AssisatantのLightエンティティを使用し、Home AssistantからローカルAPIでNature RemoへIR信号を飛ばす指示を出して照明をコントロールしているのですが、素晴しいことにHome AssisatantのLightエンティティはGoogle Homeに「照明」として登録できる(照明デバイスとして認識される)ので、この時点でGoogle Home上の照明オンオフ状態とHome Assistant上の照明オンオフ状態は同期してくれます。
しかし照明付属のリモコンからオンオフした場合は当たり前だけど同期できません。
図に書くとこんな風になってます。
f:id:sympapa:20220219084439p:plain


Home AssistantのフロントエンドUIを使った家のコントロールパネル上にも照明のスイッチがあり、照明がオンの時にアイコンの色が赤色に変わるようにしているのですが、前述のとおり照明付属のリモコンからオンオフした場合にはHome Assistantに照明のオンオフ状態が同期されないのでアイコンの色も同期されません。


今回は、照度センサーを使ってシーリング照明の電源オンオフ状態を取得することで、照明付属のリモコンからオンオフした場合にもHome Assistantと同期されるようにしたいと思います。

■使用する照度センサー

今回使用する照度センサーはXiaomiのlight sensor GZCGQ01LMです。
今回は照明のオンオフを照度で検出しHome Assistantと同期させるので、照度の変化を素早くレポートしてくれる照度センサーを使用する必要があります。
しかし、多くの照度センサーの照度のレポート間隔は分単位だったりするため照度センサーの選定には注意が必要です。
Xiaomiのlight sensor GZCGQ01LMの照度のレポート頻度は照度の変化があまり無い時には30秒間隔ですが、照度が大幅に変化した時は5秒間隔でレポートしてくれます。但し、照度が大幅に変化した時も実際にはその次の次か更にその次のレポートに結果が反映される感じなので、実際には5秒~15秒のタイムラグがあると考えておいた方が良さそうですが、まぁ許容範囲だろうということでこれを選びました。
このあたりの詳細は、前回のXiaomiのlight sensor GZCGQ01LMのレビューを参照ください。
sympapa.hatenablog.com

■とりあえず今回のゴール

今回のゴールは以下のとおりです。

  • 照明付属のリモコンから操作した時も照明のオンオフがHome Assistantと同期されるようにする。
  • Home AssistantやGoogle Homeからの操作ではNature RemoからIR信号を発射する必要があるが、照明付属のリモコンから操作して照明のオンオフがHome Assistantと同期された場合はNature RemoからIR信号を発射しないようにする。
  • 家のコントロールパネル上の照明の電源ボタンに表示されたアイコンの色は、どの操作方法でオンオフしてもオンの時には赤色、オフの時には黒色に変わるようにする。
  • 家のコントロールパネル上の電源ボタンを押して照明をオンオフした場合は、アイコンの色が即変わるようにする。(従来と同じ挙動)
  • その他、Google HomeおよびHome Assistantから照明がオンオフされた場合も、家のコントロールパネル上のアイコンの色が即変わるようにする。(従来と同じ挙動)

■シーリング照明に照度センサーをくっつける

まずはシーリング照明に照度センサーを仕込みます。
周囲が明るい時でも暗い時でも、照明がオンの時とオフの時を照度で線引き出来なくてはいけないので、極力、周囲の明るさの影響を受けずに照明の明るさを拾えそうな位置に設置しました。
とりあえずこんな感じで貼り付けて照度をみながら調整することにしましたが、どうにもならなければ周囲の照度の影響を受けないようにカバーを作らなくてはいけませんね。

■Home Assisatantで同期させる

Home AssistantやGoogle Homeからの操作ではNature RemoからIR信号を発射する必要がありますが、照明付属のリモコンから操作して照明のオンオフがHome Assistantと同期された場合はNature RemoからIR信号を発射しないようにしたいので、そこをどうするか悩みました。
考えた結果、以前から使用しているlightはそのままにしておき、新たに照明のオンオフ状態を保持するためだけのダミースイッチを作ることにしました。
lightがオンオフされた場合はNature Remoから照明をオンオフするIR信号が発射されますが、更にダミースイッチをオンオフするようにします。
照度センサーの照度によって照明のオンオフを検出した場合には、IR信号が発射しないよう直接ダミースイッチをオンオフさせます。
家のコントロールパネル上の照明のボタンは、表示はダミースイッチの状態とし、押した時のアクションはlightをオンオフするようにします。
図に書くとこんな感じです。
f:id:sympapa:20220219173155p:plain

1.ダミースイッチを作る
configuration.yaml上でダミースイッチ"switch.light_kitchen_for_display"を作ります。
"light.light_kitchen"は以前から使っていたlightでオンオフによりrest_commandでNature Remoに赤外線信号を発射させるコマンドを送ります。

input_boolean:
  light_kitchen:
    name: light_kitchen
  light_kitchen_for_display:
    name: light_kitchen_for_display

light:
  - platform: template
    lights:
      light_kitchen:
        value_template: "{{ states('input_boolean.light_kitchen') }}"
        turn_on:
          - service: input_boolean.turn_on
            entity_id: input_boolean.light_kitchen
          - service: rest_command.light_kitchen_on
        turn_off:
          - service: input_boolean.turn_off
            entity_id: input_boolean.light_kitchen
          - service: rest_command.light_kitchen_off

switch:
  - platform: template
    switches:
        light_kitchen_for_display:
        value_template: "{{ states('input_boolean.light_kitchen_for_display') }}"
        turn_on:
          - service: input_boolean.turn_on
            entity_id: input_boolean.light_kitchen_for_display
        turn_off:
          - service: input_boolean.turn_off
 
rest_command:
  light_kitchen_on:
    url: 'http://192.168.11.x/messages' ←Nature RemoのIPアドレス
    method: POST
    headers:
      Accept: 'application/json'
      Content-Type: 'application/json'
      X-Requested-With: 'curl'
      Expect: ''
    payload: '{"format":"us","freq":38,"data":[3117,1571,334,(略),336]}'

  light_kitchen_off:
    url: 'http://192.168.11.x/messages' ←Nature RemoのIPアドレス
    method: POST
    headers:
      Accept: 'application/json'
      Content-Type: 'application/json'
      X-Requested-With: 'curl'
      Expect: ''
    payload: '{"format":"us","freq":38,"data":[3118,1556,326,(略),316]}'



2.照度センサーの照度変化によってダミースイッチをオンオフするオートメーションを作る
照度が1001以上になったらダミースイッチ"switch.light_kitchen_for_display"をオンにし、1000以下になったらオフにするオートメーションを作ります。

alias: light_kitchen_get_power_status_by_light_sensor
description: ''
trigger:
  - type: illuminance
    platform: device
    device_id: 照度センサーのデバイスID
    entity_id: sensor.xiaomi_light_sensor_3_illuminance_lux
    domain: sensor
    above: 1001
    for:
      hours: 0
      minutes: 0
      seconds: 1
  - type: illuminance
    platform: device
    device_id: 照度センサーのデバイスID
    entity_id: sensor.xiaomi_light_sensor_3_illuminance_lux
    domain: sensor
    below: 1000
    for:
      hours: 0
      minutes: 0
      seconds: 1
condition: []
action:
  - choose:
      - conditions:
          - type: is_illuminance
            condition: device
            device_id: 照度センサーのデバイスID
            entity_id: sensor.xiaomi_light_sensor_3_illuminance_lux
            domain: sensor
            above: 1001
        sequence:
          - service: switch.turn_on
            data: {}
            target:
              entity_id:
                - switch.light_kitchen_for_display
      - conditions:
          - type: is_illuminance
            condition: device
            device_id: 照度センサーのデバイスID
            entity_id: sensor.xiaomi_light_sensor_3_illuminance_lux
            domain: sensor
            below: 1000
        sequence:
          - service: switch.turn_off
            target:
              entity_id:
                - switch.light_kitchen_for_display
            data: {}
    default: []
mode: single



3.lightがオンオフされたらダミースイッチをオンオフするオートメーションを作る
lightと連動させるだけなのでオートメーションじゃなくてもいいんですが、configuration.yamlに書くのが面倒だったので手抜きです(笑)
照度センサーのタイムラグによる不整合を考慮し、その20秒後に照度センサーからの照度に合わせてダミースイッチをオンオフし整合するようにします。

alias: light_kitchen_change_power_status_by_switch_entity
description: ''
trigger:
  - platform: state
    entity_id: light.light_kitchen
condition: []
action:
  - choose:
      - conditions:
          - condition: state
            entity_id: light.light_kitchen
            state: 'on'
        sequence:
          - service: switch.turn_on
            data: {}
            target:
              entity_id:
                - switch.light_kitchen_for_display
      - conditions:
          - condition: state
            entity_id: light.light_kitchen
            state: 'off'
        sequence:
          - service: switch.turn_off
            target:
              entity_id:
                - switch.light_kitchen_for_display
            data: {}
    default: []
  - delay:
      hours: 0
      minutes: 0
      seconds: 20
      milliseconds: 0
  - choose:
      - conditions:
          - type: is_illuminance
            condition: device
            device_id: 照度センサーのデバイスID
            entity_id: sensor.xiaomi_light_sensor_3_illuminance_lux
            domain: sensor
            above: 1001
          - condition: state
            entity_id: switch.light_kitchen_for_display
            state: 'off'
        sequence:
          - service: switch.turn_on
            data: {}
            target:
              entity_id: switch.light_kitchen_for_display
      - conditions:
          - type: is_illuminance
            condition: device
            device_id: 照度センサーのデバイスID
            entity_id: sensor.xiaomi_light_sensor_3_illuminance_lux
            domain: sensor
            below: 1000
          - condition: state
            entity_id: switch.light_living_for_display
            state: 'on'
        sequence:
          - service: switch.turn_off
            data: {}
            target:
              entity_id: switch.light_kitchen_for_display
    default: []
mode: restart



4.家のコントロールパネルのボタンに割り当てるスクリプトを作る
家のコントロールパネル上のボタンを押した時に発動させるスクリプトです。
ダミースイッチがオフの時にはlightをオンにし、ダミースイッチがオンの時にはlightをオフにします。

alias: light_kitchen_switch_for_button
sequence:
  - choose:
      - conditions:
          - condition: state
            entity_id: switch.light_kitchen_for_display
            state: 'off'
        sequence:
          - service: light.turn_on
            data: {}
            target:
              entity_id: light.light_kitchen
          - service: switch.turn_on
            data: {}
            target:
              entity_id:
                - switch.light_kitchen_for_display
      - conditions:
          - condition: state
            entity_id: switch.light_kitchen_for_display
            state: 'on'
        sequence:
          - service: light.turn_off
            data: {}
            target:
              entity_id: light.light_kitchen
          - service: switch.turn_off
            data: {}
            target:
              entity_id:
                - switch.light_kitchen_for_display
    default: []  
mode: restart



5.家のコントロールパネルの設定
ボタンカードを設置しますが、エンティティにはダミースイッチ"switch.light_kitchen_for_display"を割り当てます。
タップ時のアクションには「サービスの呼び出し」で4.で作成したスクリプトを割り当てます。

■まとめ

これで照明の付属リモコンで操作してもHome Assistantに同期されるようになりました。最大15秒くらいのタイムラグがありますがまぁ同時させること自体は家族も99%気づかない自己満足の世界ですし十分許容範囲でしょう。
テレビも照明もオンオフ状態を同期できるようになったのであとはエアコンですね。エアコンはオンオフ同期方法はアイディアがありますが、そもそも運転モードや設定温度が同期できないとあまり意味がないのでちょっとビミョーですね。

それでは。

スマートホーム: Xiaomi light sensor GZCGQ01LM 照度センサー レビュー(今更)

Sympapaです。

我が家では半年ほど前から照度専用のセンサーがひとつだけ稼働しています。それが今回レビューするXiaomi light sensor GZCGQ01LMになります。
照度専用のセンサーというのは需要が無いのかほとんどラインナップが無いんですよね。
人感センサーに照度センサーが付いているものは多いのでそれで代用出来そうな気もしますが、人感センサーに付いている照度センサーは「人感があった時に更に照度によって処理を分岐する」ことを想定して付いていると思われ、「人感があった時と人感が無くなった時」及び「数分~数十分間隔」でしかレポートされないものが多いんじゃないかと思います。
例えばAqura Motion sensor (RTCGQ11LM)ですと人感のステータス変化が無い時は55分間隔、Philips Hue 人感センサー (PLH06MS)の場合人感のステータス変化が無い時は5分間隔でしか照度はレポートされません。この2種しか照度センサー内臓の人感センサーを持ってないのでまぁ決めつけですけど(汗
HueとAqaraの人感センサーに内蔵している照度センサーのレポート頻度についてはこちらの記事をご覧ください。
sympapa.hatenablog.com


まぁ照度専用のセンサーであっても「暗くなってきたら照明を点ける」といった用途に使用されるケースがほとんどだと思われ照度の変化が緩やかなので、ほとんどの場合はレポート間隔が分単位であっても困ることはなさそうです。
しかし、例えば「照明のオンオフ状態を照度で取得してスマートホームシステムと同期させたい」場合などは極力即レポートして欲しいため分単位のレポートではNGです。
現在、Home Assistantとシーリング照明の同期をしたいと考えていてそれに適した照度センサーを探していましたが、結局のところ現状は我が家で1個稼働中のXiaomi light sensor GZCGQ01LMが最適じゃなかろうかという結論に至り、追加で2個ポチった記念に(?)今更ですがレビューを書きたいと思います。

■Xiaomi light sensor GZCGQ01LMとは

スマートホーム界隈ではおなじみXiaomiが販売しているZigBee接続の照度センサーです。
生活防水、40mmφ×12mmの小ささ、0~83000luxの広レンジ、2lux単位の精度などが特徴です。
広レンジに関してはちょっと疑問を持っていて、ちょっと明るいだけで簡単に数万luxを叩き出し他の人感センサーがレポートする照度とかけ離れているので絶対値が真値なのかは怪しいと思っています。まぁちゃんとした照度計と比較したわけではないので単なる印象ですが(笑)
でも仮にレンジが広くないとしても、他の人感センサーに内蔵した照度計と比べると分解能が高いことは間違いなさそうです。
電池はCR2450ですが、我が家で過去から使用しているものは5ヶ月使用してまだ電池残量100%表示です。まぁ電池残量に関しては、ある程度減るまで100%表示のものもあるのでアテにならないかもしれませんが、同じXiami(Aqora)の人感センサーとドア開閉センサーはZHAでは1%単位の表示で減って来るので本当に100%に近いままなのかもしれません。

■何より大事なのはレポート頻度

前述したとおり今回はHome Assistantとシーリング照明の同期用に使用するので、照度のレポート頻度が重要になります。
Xiaomi light sensor GZCGQ01LMをHome AssistantのZHAとZigBee2MQTTに接続してそれぞれテストしてみました。
同じXiaomi(Aqura)の人感センサーは人感があった後のレポート間隔は通常60秒間隔なのですが、ペアリングモードになると数時間の間レポート間隔が5秒になる仕様なので、今回の照度センサーも同様の仕様だった場合はペアリング直後だと正確にテスト出来ないことになります。なのでペアリングして半日以上経ってからテストしました。
結果はZHAでもZigBee2MQTTでも以下のとおりでした。ちなみにZHAでもZigBee2MQTTでも取得できる項目は照度(Lux)だけでした。

  • 照度のレポート頻度は照度の変化があまり無い時には30秒間隔。
  • 照度が大幅に変化した時は5秒間隔のレポートに切り替わる。但し、照度が大幅に変化し5秒間隔になった時も実際にはその次の次か更にその次のレポートに結果が反映される感じなので、実際には5秒~15秒のタイムラグがあると考えておいた方が良さそう。

f:id:sympapa:20220213085946p:plain

ディスコン!?

Xiaomi light sensor GZCGQ01LMですが、どうやらディスコンなのかAliexpressで評価の高いちゃんと届きそうなセラーの在庫は全滅となっています(><)
評価がビミョーなセラーで在庫ありのところもありますが、コメントに「発送されねー」って書かれていたりします(汗

代わりの照度センサーを探した結果代替になりそうなのはTuyaのこれくらいでしたが、”Two-way communication, Regular feedback brightness status update brightness value and status every 30 min.”と書かれていて、定期では30分間隔のレポートのようだし照度変化でのレポートはどのくらいの変化で実行されるのかわかりません。単4電池2本を使うので電池持ち的には期待できそうですが、ややデカいのでシーリング照明の中に仕込むのにやや難があるかも。それにAliexpressで売っているセラーも多くはありません。
expo.tuya.com


結局、Techinnなるスペインの通販にXiaomi GZCGQ01LMの在庫があるという情報を見かけたので、はじめてTechinnを使って購入してみることにしました。

■関係ないけどTechinnでの通販

はじめて利用したTechinnですがなかなか安心できる通販サイトでした。
価格はセンサーが1402円×2個、送料(PostNL→日本郵便)が886円(商品が1個でも2個でも同じ)の計3690円。
以前Aliexpressで買った時は1435円の送料タダだったので送料分が余計にかかりました。


Techinnで1月31日のお昼休みにポチってバーチャルな発送案内が1月31日の夕方に来ました。
その後リアル発送がなかなか来なかったので「ほんとに在庫あるのか?」と思いましたが、2月4日にオランダからリアル発送されました。
Techinnの最初の安心要素は発送されると「パッケージの写真」が確認できる点。こんな風に写真を確認できます。
ちなみにこの写真を見た感じ「Aliexpressと同様に袋に直接商品箱が入っててボコボコになって届くんだろうな。。。」と思っていましたが、実際には袋の中に15cm角くらいの段ボール箱が入っていてその中に大量のプチプチで保護された商品箱が入ってました。
大過ぎて届いた時にコレだとは思わんかった(笑) 
ということで梱包もしっかりしてました。


話を配送に戻すと、リアル発送された2月4日当日に国際交換局から発送されて2月9日に日本へ到着、2月12日に郵便屋さんが届けてくれて我が家へ到着しました。
ポチってから12日で着いたのでシンガポール経由の場合のAliexpressと比べるとやや早い感じでした。
ってかリアル発送がもうちょっと早いと完璧でしたが。。。まぁ便の関係で発送日を調整しているとかがあるのかもしれません。

■まとめ

そんなワケで、既にディスコンくさい照度センサー: Xiaomi light sensor GZCGQ01LMの今更レビューを書いてみました。
通常の照度のレポート間隔は30秒ですが、照度が大幅に変化した時は5秒間隔のレポートに切り替わり、実質的なタイムラグは5秒~15秒程度。
照明の同期といった用途でもなんとか使えそうな感じなので、近いうちに試してみたいと思います。
それにしてもXiaomiさん、後継機種は出してくれんのでしょうか?それとも部品不足とかで品薄になっているだけなのでしょうか?


次回は今回レビューしたXiaomi light sensor GZCGQ01LMを使用して、Home Assistantと照明のオンオフ同期をしたいと思います。
それでは。

Qrio Lock(5): Qrio Key S 1.5ヶ月使用レビュー

Sympapaです。

我が家ではスマートロック: Qrio Lockを使っています。
世の中のスマートロックにはカードをタッチして解錠するとか暗証番号で解錠するとか、リモコンキーみたいなモノのボタンを押して解錠するとかスマホのアプリを操作して解錠するとかスマートウオッチで解錠するとか様々な解錠方法がありますが、別売りオプションも含めれば現在のQrio Lockはこれらのどの方法にも対応しています。
しかし、これらのどの方法も荷物をたくさん持っていたりするとちょっと面倒で、特にスマホで操作するのなんかは個人的にはあまりスマートとは思えません。


Qrio Lockにはこれらに加えて、スマホで帰宅判定しハンズフリーで解錠してくれる機能があります。GPSを使って家から数百m離れると外出したと判定し、外出判定されている時に家に帰って来るとGPSとBlutoothビーコンによって帰宅したと判定し自動的に解錠してくれるというものです。しかしハンズフリー解錠の成功率は私の環境ですと打率90~95%という感じでもうひとつでした。


昨年11月に発表されたオプションのリモコンキー: Qrio Key Sにはハンズフリー解錠機能が搭載されました。
GPSではなくジャイロを使って150歩~200歩歩くと外出したと判定し、そこからQrio Lockに近いところで2秒立ち止まると解錠される仕組みのようです。
ハンズフリー解錠の打率がスマホより高いとの評判だったので昨年12月末に購入し、約1.5ヶ月間使用したのでレビューを書いてみようと思います。

■とりあえずQrio Lockシリーズ記事まとめ

Qrio Lockシリーズ記事まとめ
Qrio Lock(1): 1.5年間使用レビュー(今更)
Qrio Lock(2): ドア開閉センサーを追加してロック状態を取得する

Qrio Lock(3): ハンズフリー解錠されている時にお知らせしてくれるようにする
Qrio Lock(4): Home AssistantからQrio Lockを施錠する
Qrio Lock(5): Qrio Key S 1.5ヶ月使用レビュー ←今回
Qrio Lock(6): 家の前を通過しただけなのにハンズフリー解錠された時に再施錠してくれるようにする
Qrio Lock(7): オートロックを一時無効化した後自動的に再有効化してくれるようにする(記事焼き直し)

■できること

■まずは外観

以前からQrio LockにはQrio Keyというリモコンキーのオプションがありました。我が家では嫁様が使っています。
左がQrio Key、右がQrio Key SですがQrio Keyと比べてQrio Key Sは細長になりちょっと分厚くなりました。

他に大きな外観上の違いとして、Qrio Keyは施錠ボタンが膨らんでいて解錠ボタンは凹んでいたので触っただけで識別できたのですが、Qrio Key Sは2つのボタン両方が凹んでいるので触って識別しづらくなくなりました。
おそらくカバンの中などでボタンが押されて電池を消費するのを防止するためではないかと思います。
まぁ毎日使うんだからキーホルダーにでも付けとけば慣れたら向きで判るんだし別にいいっちゃいいんですが。

ハンズフリー解錠の打率はどうか?

解錠率はスマホでのハンズフリー解錠より高くほぼ100%解錠します。
ただ、スマホでのハンズフリー解錠は基本的に玄関に辿り着く前に解錠されていますが、Qrio Key Sでのハンズフリー解錠は基本的に玄関の前で立ち止まって2~3秒後に解錠するので、スマホでのハンズフリー解錠と比べてハンズフリー解錠の失敗(あるいは外出判定に至っていないのでハンズフリー解錠されないこと)を認識できるまでに時間がかかるデメリットがあります。
150歩~200歩かないと外出判定にならないので、クルマでコンビニへ行って帰って来る程度ではハンズフリー解錠されないことも多いんですよね。
その場合は玄関の前で立ち止まって5秒くらいくらいしてから「あれ、解錠されない」と気づくことになります。
Qrioさんのページには、クルマでも「加速度センサーが検知する程度の振動が発生する場合は、ハンズフリー機能が有効になります」と書かれていますが、実際にはクルマでの走行中にカウントされる歩数は僅かなようです。


また、玄関のそばに駐車スペースがある場合、基本的にはクルマから降りて玄関の前に立ち止まるとハンズフリー解錠されるのですが、時々、クルマで帰宅して駐車した時点でハンズフリー解錠される場合があります。
駐車した時点でハンズフリー解錠された場合は玄関の前で立ち止まっても解錠する動作が発生しないので、既に解錠されているのに「あれ?ハンズフリー解錠失敗かな?」となったりしてわかりにくいんです。
私はこの点については、Home Assistantを使い、解錠されている時に玄関の外に設置してある人感センサーが反応した場合にはポーチ灯を点滅させて、解錠していることをお知らせすることで対応しています。


ハンズフリー解錠のトリガーはQrio Lockの近くで立ち止まることのようですが、立ち止まり判定については精度は高いと思います。
我が家は玄関の目の前に駐車スペースがあってクルマを停めてから玄関にたどり着くまでに数歩しか歩かないのでちゃんと立ち止まり判定してくれるのかを懸念していましたが、外出判定になってさえいればクルマを降りて玄関まで数歩しか歩かなくても立ち止まり判定してくれます。


そんなワケでイマイチポイントはありますが概ね100%ハンズフリー解錠が成功するので、スマホでのハンズフリー解錠の打率に不満を持っている方にはおススメできると思います。

GPSを使っていない難点

GPSを使った位置による外出判定では無く100~200歩歩いたら外出判定となるため、家の中でQrio Key Sを持ち歩いていると外出判定になってしまい立ち止まると不意にハンズフリー解錠されます。
帰宅したらすぐにQrio Key S(をくっつけているキーホルダーなど)を定位置に置く癖がない人には不向きかなと思います。
また、外出したと判定する歩行数は100~200歩と言われていますが、それがリセットされるのはQrio Key Sで解錠(ハンズフリー含む)または施錠した時だけではないかと思います。
Qrio Key Sで解錠しなかった場合は家に入ってからすぐにハンズフリー解錠されることもあるので(これはスマホハンズフリー解錠でも同じことが起り得ますが)注意が必要です。

■その他弱点というか気になる点

  • Qrio Key SというよりQrio Lock自体の弱点ですが、1台のデバイスとしかBluetooth接続できません。直前にスマホでロックを操作しているとQrio Key Sでは暫く操作出来なかったりします。
  • ハンズフリー解錠後にドアを開けなかった場合4分間は解錠されたままになり、4分後に再ロックされます。(オートロック設定時)

但しQrio Key Sの場合はQrio Lockの近くで立ち止まらないとハンズフリー解錠されないので、家の前を通り過ぎただけでも解錠されるスマホハンズフリー解錠より不安は少ないと思います。

■まとめ

ハンズフリー解錠率はスマホより高くほぼ100%
・家の中で持ち歩くと不意に解錠されるので家の中で持ち歩くのはNG
ハンズフリー解錠の解錠率に不満がありその改善に6600円の価値があると思う人にはおススメ。ボタン操作もスマホより断然ラク

個人的にはGoogle Nest Doorbellのようなカメラ付ドアベルで顔認識+Qrio KeyのようなBTビーコンの組合せでハンズフリー解錠してくれるスマートロックがあれば、セキュリティ的にも優れているし、家の外にあるのか中にあるのか判別できないBTビーコンの弱点も克服できるのになと思うんですけどね。

それでは。

Home Assistant: テレビの電源をHome Assistantと同期する(もう大幅修正)

Sympapaです。

スマートプラグの消費電力モニタを使ってHome Assisatantとテレビの電源を同期させる記事を今朝アップしましたが、たいへん奇妙でややこしい処理を編み出しました(汗
ややこしい処理の背景を書くのもややこしくて長くなりそうなので詳細は割愛しますが、家のコントロールパネルとしてAndroidタブレット上で使っているHome AssistantのLovelace UIのボタンにSwitchを割り当てた場合、表示も押した時の動作も同じSwitchになってしまうと思い込んでいたからなんです。
しかし後で確認したら、Home AssistantのLovelace UIのボタンは表示と押した時のアクションを別々に設定できることが判りました。押した時のアクションにはサービスの実行が設定できます。
これならば、ボタン上の表示は電源状態保持用のSwitchとし、ボタンを押した時には実際にテレビをオンオフするサービスを実行することで、シンプルな処理に出来るはずです。

そもそもHome Assisatantとテレビの電源を同期させたい背景などは前回の記事をご覧ください。
あとは前回の記事のコピペも多用してささっと(笑)
sympapa.hatenablog.com


■使用するスマートプラグ

使用するスマートプラグはSengled E1C-NB7です。
Home AssistantとはZigBeeで接続し消費電力(W)と電力量(kWh)を取得が出来ます。消費電力取得のタイムラグが1~3秒くらいあるのとテレビを電源オンにしてから消費電力が立ち上がるまでので時間もあるので、それも考慮して設定していきましょう。

sympapa.hatenablog.com



■とりあえず今回のゴール

今回のゴールは以下のとおりです。

  • 家のコントロールパネルにテレビの電源のトグルボタンを表示し、テレビの電源がオンの時はアイコンの色が変わるようにする

家のコントロールパネル上のトグルボタンを押してテレビの電源をオンオフした場合は即アイコンの色が変わるようにする

  • Home Assistantから, Google Homeから, テレビ付属のリモコンから、いずれの方法でテレビの電源をオンオフしても上記アイコンの色が変わるようにする


■Home Assistantの設定

前回はかなりゴチャゴチャした処理を考えましたが今回は非常にシンプルです。
1)まずテレビの電源状態を保持するためだけのswitchを作ります。このswitchではテレビの電源は操作しません。
2)スマートプラグの電源の消費電力によって1)の電源状態を保持するswitchをオンオフするオートメーションを作ります。
3)家のコントロールパネル上のボタンを押して、実際にテレビの電源をオンオフした後電源状態を保持するswitchをオンオフするスクリプトを作ります。
4)ボタンの表示には1)の電源状態を保持するswitchを割り当てし、ボタンを押した時のアクションには3)のテレビの電源をオンオフするスクリプトを割り当てます。


1.Switchの作成

電源オンオフの状態を保持しなくてはいけないので、電源状態を保持するための"switch.kitchen_tv_for_display"をconfiguration.yaml上で作ります。


【configuration.yaml

input_boolean:
  kitchen_tv:
    name: kitchen_tv_for_display

switch:
  - platform: template
    switches:
      kitchen_tv_for_display:
        value_template: "{{ states('input_boolean.kitchen_tv_for_display') }}"
        turn_on:
          - service: input_boolean.turn_on
            entity_id: input_boolean.kitchen_tv_for_display
        turn_off:
          - service: input_boolean.turn_off
            entity_id: input_boolean.kitchen_tv_for_display

rest_command:
  bravia_on:
    url: 'http://192.168.11.x/messages'
    method: POST
    headers:
      Accept: 'application/json'
      Content-Type: 'application/json'
      X-Requested-With: 'curl'
      Expect: ''
    payload: '{"format":"us","freq":38,"data":[2411,580,610,610,(略),36180]}'

  bravia_off:
    url: 'http://192.168.11.x/messages'
    method: POST
    headers:
      Accept: 'application/json'
      Content-Type: 'application/json'
      X-Requested-With: 'curl'
      Expect: ''
    payload: '{"format":"us","freq":38,"data":[2411,580,1220,580,(略),36180]}'


2.スマートプラグの消費電力変化でSwitchをオンオフするオートメーション作成

次は、スマートプラグがモニターしている消費電力が変化したら"switch.kitchen_tv_for_display"をオンオフするオートメーションを作ります。
トリガーは「消費電力が21W以上になった時または消費電力が20W以下になった時」です。
消費電力が21W以上の場合に"switch.kitchen_tv"をオンにし、消費電力が20W以下の場合に"switch.kitchen_tv"をオフにするようにしました。

alias: Bravia_get_power_status_by_sengled
description: ''
trigger:
  - type: power
    platform: device
    device_id: スマートプラグのID
    entity_id: sensor.sengled_e1c_nb7_bravia_power
    domain: sensor
    above: 21
    for:
      hours: 0
      minutes: 0
      seconds: 1
  - type: power
    platform: device
    device_id: スマートプラグのID
    entity_id: sensor.sengled_e1c_nb7_bravia_power
    domain: sensor
    below: 20
    for:
      hours: 0
      minutes: 0
      seconds: 1
condition: []
action:
  - choose:
      - conditions:
          - type: is_power
            condition: device
            device_id: スマートプラグのID
            entity_id: sensor.sengled_e1c_nb7_bravia_power
            domain: sensor
            above: 21
        sequence:
          - service: switch.turn_on
            data: {}
            target:
              entity_id: switch.kitchen_tv_for_display
      - conditions:
          - type: is_power
            condition: device
            device_id: スマートプラグのID
            entity_id: sensor.sengled_e1c_nb7_bravia_power
            domain: sensor
            below: 20
        sequence:
          - service: switch.turn_off
            target:
              entity_id:
                - switch.kitchen_tv_for_display
            data: {}
    default: []
mode: single


3.Switchが操作されたら実行するスクリプトの作成

家のコントロールパネル上のテレビのスイッチボタンが押された時に実行するスクリプトを作成します。
"switch.kitchen_tv_for_display”がOFFの時にはテレビをONにするIR信号を発射するrest_commandを実行し、"switch.kitchen_tv_for_display”がONの時にはテレビをOFFにするIR信号を発射するrest_commandを実行するようにしました。併せて"switch.kitchen_tv_for_display”をオンオフします。
スマートプラグから取得する消費電力にはタイムラグがあり不整合が生じる可能性があるので、その6秒後に"switch.kitchen_tv_for_display"と消費電力の整合をチェックし、不整合があった場合は消費電力と整合が取れるようIR信号を発射せずに"switch.kitchen_tv_for_display”をオンオフするようにしています。

alias: Bravia_power_switch_for_button
sequence:
  - choose:
      - conditions:
          - condition: state
            entity_id: switch.kitchen_tv_for_display
            state: 'off'
        sequence:
          - service: rest_command.bravia_on
            data: {}
          - service: switch.turn_on
            data: {}
            target:
              entity_id: switch.kitchen_tv_for_display
      - conditions:
          - condition: state
            entity_id: switch.kitchen_tv_for_display
            state: 'on'
        sequence:
          - service: rest_command.bravia_off
            data: {}
          - service: switch.turn_off
            data: {}
            target:
              entity_id: switch.kitchen_tv_for_display
    default: []
  - delay:
      hours: 0
      minutes: 0
      seconds: 6
      milliseconds: 0
  - choose:
      - conditions:
          - type: is_power
            condition: device
            device_id: スマートプラグのID
            entity_id: sensor.sengled_e1c_nb7_bravia_power
            domain: sensor
            above: 21
          - condition: state
            entity_id: switch.kitchen_tv_for_display
            state: 'off'
        sequence:
          - service: switch.turn_on
            data: {}
            target:
              entity_id:
                - switch.kitchen_tv_for_display
      - conditions:
          - type: is_power
            condition: device
            device_id: スマートプラグのID
            entity_id: sensor.sengled_e1c_nb7_bravia_power
            domain: sensor
            below: 20
          - condition: state
            entity_id: switch.kitchen_tv_for_display
            state: 'on'
        sequence:
          - service: switch.turn_off
            data: {}
            target:
              entity_id:
                - switch.kitchen_tv_for_display
    default: []
mode: restart


4.家のコントロールパネルの設定

ボタンカードを設置しますが、エンティティには"switch.kitchen_tv_for_display”を割り当てます。
タップ時のアクションには「サービスの呼び出し」で上で作成したスクリプトを割り当てます。


■まとめ

そんなワケで前回、消費電力モニター機能付きスマートプラグを使ってテレビの電源状態をHome Assistantと同期させてみたけどぐちゃぐちゃになってしまった処理の改善を今回は実施しました。
だいぶシンプルになったので、これなら照度センサーを使ったHome Assistantとシーリング照明の同期にも使えるかなと思います。
次回、試したいと思います。


それでは。

Home Assistant: テレビの電源をHome Assistantと同期する

Sympapaです。

我が家ではHome Assistant+Andriodタブレットで家のコントロールパネルを作り、キッチンとリビングの照明やテレビ,エアコンを操作できるようにしています。
電源がオンなのかオフなのかもコントロールパネル上のアイコンの色で判るようにしたい(既に照明はそうしている)のですが、家電付属の赤外線リモコンで操作した場合はHome Assistantへ操作したことを伝達できず同期ができないという課題があります。


また、Home Assistantから照明やテレビ,エアコンを操作する時は見かけ上同期出来ますが、スマートIRリモコン: Nature Remoを経由しているのでIR信号が100%家電に届いて指示どおり動作しているとは限りません。(まぁ実際は100%動いてますけど)
他にも、Nature RemoなどのスマートIRリモコンを使って自動化をする場合、家電付属のリモコンがテレビのようにトグルボタンになっているとスマートIRリモコンでもトグルボタンのIR信号しか用意できない場合も多く、例えば「テレビの電源状態に関わらず確実にオフにする」シーケンスを作るには、電源の状態を取得して電源がオンであることを条件に電源ボタンのIR信号を発射するような工夫をする必要が出てくる場合もあります。


このように、スマートホーム化を進めると、どうしても家電がオンなのかオフなのかをHome Assistantなどのスマートホームシステム上で取得したい場面が出てきます。


家電の電源がオンかオフかを検出する方法として思いつくのは、①電力(電流)を取得し閾値を設定する、➁(照明やディスプレイや電源インジケータなどの)照度を取得し閾値を設定する、③物理的動作を何らかのセンサーで検出する、の3つくらいかなと思います。
先日、消費電力を取得できるスマートプラグを入手したので、今回はそれを使って消費電力を取得しHome Assistantとテレビの電源状態を同期したいと思います。


■使用するスマートプラグ

使用するスマートプラグはSengled E1C-NB7です。
Home AssistantとはZigBeeで接続し消費電力(W)と電力量(kWh)を取得が出来ます。消費電力取得のタイムラグが1~3秒くらいあるのとテレビを電源オンにしてから消費電力が立ち上がるまでので時間もあるので、それも考慮して設定していきましょう。

sympapa.hatenablog.com



■とりあえず今回のゴール

今回のゴールは以下のとおりです。

  • 家のコントロールパネルにテレビの電源のトグルボタンを表示し、テレビの電源がオンの時はアイコンの色が変わるようにする
  • Home Assistantから, Google Homeから, テレビ付属のリモコンから、いずれの方法でテレビの電源をオンオフしても上記アイコンの色が変わるようにする


■Home Assistantの設定

単純そうで意外と悩みました。
我が家ではHome AssistantやGoogle HomeからテレビをコントロールするのにスマートIRリモコン:Nature Remoを使っています。
Home AssistantとGoogle Homeからテレビの電源をオンオフする時はIR信号を発射しなくてはいけませんが、テレビ付属のリモコンから電源をオンオフし同期を取った時はIR信号を発射して欲しくない。
最初は「オンオフ状態の保持」と「Home Assistantからのテレビ操作」を切り離してしまい、消費電力の変化だけで「保持しているオンオフ状態」をオンオフすればいいんでしょと思いました。しかし、家のコントロールパネル上のボタンを押して操作した時はアイコンの色が即変化しないと違和感を感じますが消費電力の取得には数秒のタイムラグがあります。
じゃあ「テレビのSwitch」そのものをボタンとして家のコントロールパネルに表示したらどうなるかというと、ボタンを押した時はIR信号が発射されなきゃいけないんですが、消費電力の変化で「テレビのSwitch」をオンオフした時にはIR信号を発射しないようにする処理をしなくてはいけません。消費電力取得のタイムラグがあるので「消費電力」と「テレビのSwitch」の整合性を条件にしてIR信号を発射するか否かを決めてもうまくいきません。
「オンオフ状態の保持」と「Home Assistantからのテレビ操作」を分けておいて、家のコントロールパネルのボタンを押した時は「テレビのSwitch」の操作、ボタンに表示されているアイコンは「保持されているオンオフ状態」という操作と表示が別々のボタンを作れればいいんですが、やり方が判りません(汗


まぁ他にも悩んだ点は多数ですが文章で書いても解りにくい長文になるだけなので(略
とりあえず今回は、現状の私のスキルでも出来る方法で設定していきましょう。


1.Switchの作成

今まではHome Assistantからテレビをコントロールする場合、直接rest_commandでIR信号を発射しているだけでした。
今回は電源オンオフの状態を保持しなくてはいけないので、まずはconfiguration.yaml上でテレビ用のSwitch"switch.kitchen_tv"を作ります。
それと、消費電力の変化で"switch.kitchen_tv"を操作する場合にIR信号を発射しないフラグ用として"switch.kitchen_tv_switch_by_sensor"も作ります。
私にはコードを書くスキルがないので"switch.kitchen_tv"をオンオフしたら後の処理はスクリプトに丸投げするように設定しておいて、あとはオートメーションとスクリプトの方で何とかしています(汗



【configuration.yaml

input_boolean:
  kitchen_tv:
    name: kitchen_tv
  kitchen_tv_switch_by_sensor:
    name: kitchen_tv_switch_by_sensor

switch:
  - platform: template
    switches:
      kitchen_tv:
        value_template: "{{ states('input_boolean.kitchen_tv') }}"
        turn_on:
          - service: input_boolean.turn_on
            entity_id: input_boolean.kitchen_tv
          - service: script.bravia_on
        turn_off:
          - service: input_boolean.turn_off
            entity_id: input_boolean.kitchen_tv
          - service: script.bravia_off
     kitchen_tv_switch_by_sensor:
        value_template: "{{ states('input_boolean.kitchen_tv_switch_by_sensor') }}"
        turn_on:
          - service: input_boolean.turn_on
            entity_id: input_boolean.kitchen_tv_switch_by_sensor
        turn_off:
          - service: input_boolean.turn_off
            entity_id: input_boolean.kitchen_tv_switch_by_sensor

rest_command:
  bravia_on:
    url: 'http://192.168.11.x/messages'
    method: POST
    headers:
      Accept: 'application/json'
      Content-Type: 'application/json'
      X-Requested-With: 'curl'
      Expect: ''
    payload: '{"format":"us","freq":38,"data":[2411,580,610,610,(略),36180]}'

  bravia_off:
    url: 'http://192.168.11.x/messages'
    method: POST
    headers:
      Accept: 'application/json'
      Content-Type: 'application/json'
      X-Requested-With: 'curl'
      Expect: ''
    payload: '{"format":"us","freq":38,"data":[2411,580,1220,580,(略),36180]}'


2.スマートプラグの消費電力変化でSwitchをオンオフするオートメーション作成

次は、スマートプラグがモニターしている消費電力が変化したら"switch.kitchen_tv"をオンオフするオートメーションを作ります。
トリガーは「消費電力が21W以上になった時または消費電力が20W以下になった時」です。
消費電力が21W以上でかつ"switch.kitchen_tv"がオフの場合に"switch.kitchen_tv"をオンにし、消費電力が20W以下でかつ"switch.kitchen_tv"がオンの場合に"switch.kitchen_tv"をオフにするようにしました。
また"switch .kitchen_tv"をオンオフする前に"switch.kitchen_tv_switch_by_sensor"をオンにして「これは消費電力による"switch.kitchen_tv"の操作ですよ」というフラグを立てています。(フラグの処理については後述)

alias: Bravia_get_power_status_by_sengled
description: ''
trigger:
  - type: power
    platform: device
    device_id: スマートプラグのID
    entity_id: sensor.sengled_e1c_nb7_bravia_power
    domain: sensor
    above: 21
    for:
      hours: 0
      minutes: 0
      seconds: 1
  - type: power
    platform: device
    device_id: スマートプラグのID
    entity_id: sensor.sengled_e1c_nb7_bravia_power
    domain: sensor
    below: 20
    for:
      hours: 0
      minutes: 0
      seconds: 1
condition: []
action:
  - choose:
      - conditions:
          - type: is_power
            condition: device
            device_id: スマートプラグのID
            entity_id: sensor.sengled_e1c_nb7_bravia_power
            domain: sensor
            above: 21
          - condition: state
            entity_id: switch.kitchen_tv
            state: 'off'
        sequence:
          - service: switch.turn_on
            data: {}
            target:
              entity_id: switch.kitchen_tv_switch_by_sensor
          - service: switch.turn_on
            target:
              entity_id: switch.kitchen_tv
            data: {}
      - conditions:
          - type: is_power
            condition: device
            device_id: スマートプラグのID
            entity_id: sensor.sengled_e1c_nb7_bravia_power
            domain: sensor
            below: 20
          - condition: state
            entity_id: switch.kitchen_tv
            state: 'on'
        sequence:
          - service: switch.turn_on
            data: {}
            target:
              entity_id: switch.kitchen_tv_switch_by_sensor
          - service: switch.turn_off
            target:
              entity_id: switch.kitchen_tv
            data: {}
    default: []
mode: single


3.Switchが操作されたら実行するスクリプトの作成

次に"switch.kitchen_tv”が操作されたら実行するスクリプトを作成します。
"switch.kitchen_tv”がオンになった時に実行するスクリプトでは、消費電力による操作であることのフラグ"switch.kitchen_tv_switch_by_sensor"がオフの時にのみテレビをオンにするIR信号をNature Remoが発射するrest_command:を実行します。
タイムラグにより家のコントロールパネルのボタンを連打すると不整合が生じるので、その後6秒後に"switch.kitchen_tv"と消費電力の整合をチェックし不整合があった場合は、消費電力に合わせてIR信号を発射せずに"switch.kitchen_tv”操作するようにしています。
ちょっと処理がループする懸念がありますけど、2回目のループでは条件の不整合は無いはずなので大丈夫なはず、たぶん。
同様に"switch.kitchen_tv”がオフになった時に実行するスクリプトも作成しました。


【Switchがオンになった時に実行するスクリプト

alias: Bravia_on
sequence:
  - service: script.turn_off
    data: {}
    target:
      entity_id:
        - script.bravia_off
  - choose:
      - conditions:
          - condition: state
            entity_id: switch.kitchen_tv_switch_by_sensor
            state: 'off'
        sequence:
          - service: rest_command.bravia_on
            data: {}
    default: []
  - service: switch.turn_off
    data: {}
    target:
      entity_id: switch.kitchen_tv_switch_by_sensor
  - delay:
      hours: 0
      minutes: 0
      seconds: 6
      milliseconds: 0
  - choose:
      - conditions:
          - type: is_power
            condition: device
            device_id: スマートプラグのID
            entity_id: sensor.sengled_e1c_nb7_bravia_power
            domain: sensor
            above: 21
          - condition: state
            entity_id: switch.kitchen_tv
            state: 'off'
        sequence:
          - service: switch.turn_on
            data: {}
            target:
              entity_id: switch.kitchen_tv_switch_by_sensor
          - service: switch.turn_on
            data: {}
            target:
              entity_id: switch.kitchen_tv
      - conditions:
          - type: is_power
            condition: device
            device_id: スマートプラグのID
            entity_id: sensor.sengled_e1c_nb7_bravia_power
            domain: sensor
            below: 20
          - condition: state
            entity_id: switch.kitchen_tv
            state: 'on'
        sequence:
          - service: switch.turn_on
            data: {}
            target:
              entity_id: switch.kitchen_tv_switch_by_sensor
          - service: switch.turn_off
            data: {}
            target:
              entity_id: switch.kitchen_tv
    default: []
mode: restart



【Switchがオフになった時に実行するスクリプト

alias: Bravia_off
sequence:
  - service: script.turn_off
    data: {}
    target:
      entity_id: script.bravia_on
  - choose:
      - conditions:
          - condition: state
            entity_id: switch.kitchen_tv_switch_by_sensor
            state: 'off'
        sequence:
          - service: rest_command.bravia_off
            data: {}
    default: []
  - service: switch.turn_off
    data: {}
    target:
      entity_id: switch.kitchen_tv_switch_by_sensor
  - delay:
      hours: 0
      minutes: 0
      seconds: 6
      milliseconds: 0
  - choose:
      - conditions:
          - type: is_power
            condition: device
            device_id: スマートプラグのID
            entity_id: sensor.sengled_e1c_nb7_bravia_power
            domain: sensor
            above: 21
          - condition: state
            entity_id: switch.kitchen_tv
            state: 'off'
        sequence:
          - service: switch.turn_on
            data: {}
            target:
              entity_id: switch.kitchen_tv_switch_by_sensor
          - service: switch.turn_on
            data: {}
            target:
              entity_id: switch.kitchen_tv
      - conditions:
          - type: is_power
            condition: device
            device_id: スマートプラグのID
            entity_id: sensor.sengled_e1c_nb7_bravia_power
            domain: sensor
            below: 20
          - condition: state
            entity_id: switch.kitchen_tv
            state: 'on'
        sequence:
          - service: switch.turn_on
            data: {}
            target:
              entity_id: switch.kitchen_tv_switch_by_sensor
          - service: switch.turn_off
            data: {}
            target:
              entity_id: switch.kitchen_tv
    default: []
mode: restart


4.家のコントロールパネルの設定

最後に家のコントロールパネルの設定です。
今まではテレビの電源はオンとオフを別々のボタンにしていましたが、Switchのトグルボタンに変更しました。
テレビがオフの時はアイコンが黒色で、オンになると赤色に変化します。
このボタンで操作した時はアイコンの色はすぐに変化するので違和感なく操作することが出来、もし、操作したとおりにテレビの電源がオンオフされていなかった場合は6秒後に実際の状態が反映されます。


■まとめ

そんなワケで今回は、消費電力モニター機能付きスマートプラグを使ってテレビの電源状態をHome Assistantと同期させてみました。
まぁ同期したというだけなので言わなきゃ家族も気づかないだろうし完全に自己満足ですけどね(笑)
それにしてもtemplateを使えるようになれば、今回みたいなグチャグチャな処理はしなくていいんだろうなと思いました(汗
今度は照度センサーを使ってHome Assistantとシーリング照明の電源状態を同期させたいと思っていますが、今回のテレビの同期をブラッシュアップしてからかな。。。
エアコンの同期もやりたいんですが、エアコンは電源じゃなくて運転モードとか設定温度を同期しないと意味ないか。。。これは無理そう(>


それでは。

スマートホーム: Sengledの消費電力モニター機能付ZigBee接続スマートプラグを買ってみた

Sympapaです。

スマートプラグはスマホアプリやGoogle Home,Alexaなどのスマートホームシステムからコンセントの電源をリモートでオンオフできるデバイスです。
スマートホームバイスの中でも取っ付きやすいので使用されている方も多いのではないでしょうか。
我が家でもGoogle Homeを使い始めた頃にTP-LINKのHS105というスマートプラグを購入し扇風機のオンオフに使用しています。


大半のスマートプラグはリモートで電源をオンオフする機能のみですが、中には消費電力モニター機能が付いていてそれをスマートホームシステムの自動化のトリガーに出来るものもあるんですよね。
今回は、テレビの電源状態をHome Assistantに同期させるために、ZigBee接続の消費電力モニター機能付スマートプラグを購入したのでファーストインプレッションを書いておこうと思います。


電源状態の取得と言えば、ちょっと前にテレビの電源状態をHome Assistantから取得するモジュールをDIYで作ったんですけどねぇ。テレビの電源をオンオフする度に動作するリレーの音が大きくて不採用となりました(笑)

■Sengled E1C-NB7

購入したのはSengledのE1C-NB7で、Home Assistantから消費電力を取得することが出来てZigBee接続のものを選びました。
Amazonで2個でUSD 34.99、送料がUSD 10.83、合計USD 41.62の4872円で購入。
米国仕様なので仕様上は120V/60Hzです。我が家は西日本なので周波数はいいとして、日本の100Vで使ったらリレーへの電力供給不足で抵抗が高くなって発熱しないだろうかという不安を持ちつつも、まぁリレーの消費電力なんてたかがしれてるから問題ないかな。消費電力100W未満のテレビでしか使うつもりがないですし。
あと、3ピン(PCの電源などで良くあるアース極が付いているもの)なので少し使いづらいですね。
リレーの動作音は静かな方だと思います。
www.amazon.com


日本で購入できる消費電力モニタ機能が付いたスマートプラグは+style、Switchbot、Gosundあたりから販売されていますが、その中でファームを書き換えずにHome Assistantから消費電力を取得できるスマートプラグは+Styleのもののみのようです。+StyleのものはHome Assistrantでカスタムインテグレーション:Local Tuyaを使用することで使えるみたいです。
plusstyle.jp


SwitchBotプラグwww.switchbot.jp


www.amazon.co.jp


■Home Assistantで使う

Home AssistantでZHAでの接続とZigBee2MQTTでの接続を試してみましたが、どちらでも消費電力(W)と電力量(kWh)の取得が出来ます。消費電力取得のタイムラグは2~3秒くらいかな?といったところです。
もちろんスマートプラグとしての電源オンオフもできます。
あとZigBeeルーターとして認識されていますが、コーディネーターやルーターのメッシュの仲間入りはするもののセンサーなどの子デバイスとは接続されないようです。ググるとそういう情報も出てくるのでルーター機能は無いのかもしれません。

f:id:sympapa:20220211172707p:plain

■まとめ

今回はSengledの消費電力モニター機能付きスマートプラグ:E1C-NB7 を購入したので紹介しました。ZigBee接続でファームウエアを書き換えずに使えるのでHome Assistantとの相性は良いと思います。
次回はこのスマートプラグを使ってHome Assistantにテレビの電源状態を同期させてやろうと思ってます。

それでは。