スキップしてメイン コンテンツに移動

Google Homeにライトを複数登録しているとき「家の電気つけて」で家中全部のライトがONになる問題

IoT、やってますか? な小ネタ。ちなみに我が家はラズパイにHome Assistant入れてガシガシやっています。


ライトの一括操作と誤認識

さて、Google Homeにはライトやスイッチやエアコンを複数登録できる。さらに特別な音声コマンドを使うことでこれらを一括で操作することができる。

たとえば「リビングのライトをつけて」でリビングルームに登録しておいたライトをまとめてONにすることができる。


一方で問題もあり、「家のライトをつけて」「自宅の電気をつけて」と言うだけで家中あらゆるライトがONになる。深夜に他の家族が寝ている寝室まで明るくされたりする、かなりの危険機能である。

この深夜全部屋ピカピカ事件は「食卓の電気つけて」が意図せず「自宅の電気つけて」に聞き間違えられたために発生した。


Google Homeの誤認識と相性の悪い音声コマンド

Google Homeは基本的には、音声コマンドを後方一致で認識する。つまり「電気つけて」は「Aの電気つけて」「Bの電気つけて」「Cの電気つけて」すべてをトリガーする。

挙動としては、音声コマンドの先頭部分がうまく聞き取ってもらえなかったとき、後方一致で全部の照明がONされる形となる。誤認識の頻度はかなり高く、日本語での実地テストをしていないのではと疑うレベルであった。


上記の問題は「電気」という名前のライトを登録することで解消できる(登録さえあればよいので、Home Assistant上にしか存在しないダミーライトでも問題ない)。

ライト「電気」が存在する家においては、「電気つけて」に反応するライトが強制的に1つに絞られる。これにより「Aの電気」「Bの電気」にはコマンドが波及しない。


「自宅の電気つけて」

冒頭の問題である「自宅の電気つけて」について同じアプローチを試してみた。

「自宅の電気」という名前のライトを登録する。これにより「自宅の電気つけて」を特定の1照明のみONにするコマンドに読み替えさせる作戦だ。


しかしこの方法はうまく行かなかった。「自宅の電気」というライトがあっても、Google Homeは構わず家中すべてのライトをONにしてしまう。

Google Assistantビルトイン機能としての「自宅の電気」は迂回できない仕様らしい。


回避策:ライトを使うのをやめる

「○○の電気」という音声コマンドは照明にしか反応しない。
つまりGoogle Home上で照明がひとつも登録されていなければ、このコマンドはどれだけ暴発しようと無害になる。


さて、Home Assistantにおいて light は switch とほぼ互換である。

両者の違いはGoogle Homeアプリ上でライトに分類されるかスイッチに分類されるか、あとは調光調色を操作できるかどうか、程度だ。

音声操作では調光しない(ON・OFFだけを操作する)普通のライトであれば、ライトではなくスイッチとして登録しても何ら問題ないことになる。

つまりこれを

- platform: template
  lights:
    dining_downlight:
      friendly_name: 'ダウンライト'
      turn_on:
        service: rest_command.dining_downlight_on
      turn_off:
        service: rest_command.dining_downlight_off

こうする

- platform: template
  switches:
    dining_downlight:
      friendly_name: 'ダウンライト'
      turn_on:
        service: rest_command.dining_downlight_on
      turn_off:
        service: rest_command.dining_downlight_off

これだけでライトを全く同じ挙動のままスイッチに転換できた。

同様に登録済みの全てのライトをスイッチに転換することで「自宅の電気」に該当するデバイスはゼロになり、誤認識が怖くなくなる。

もし調光機能と組み合わせたい場合、プリセットの発光パターンを切り替えるようなスイッチを複数用意するのが簡単だ(スイッチ「電気明るく」「寝室の電気暗く」などを登録していくイメージ)。


こうして「自宅の電気をつけて」と指示しても「はい、ライトをONにします」と返答こそされ、どこのライトも操作されない、という状態を作り出すことができた。


※補足

新たに「自宅のスイッチつけて」という危険コマンドが爆誕したのでは!? と気づいた人はするどい。

しかし「自宅の電気」とくらべて「自宅のスイッチ」が誤認識される確率は極めて低い。それは、我々が通常「スイッチ」を省略して話すからである。

ふつう人々は「加湿器のスイッチをつけて」とは言わず、単に「加湿器つけて」で済ませる。「スイッチ」と発音しないので誤認識もされ得ない。


一括操作できるライトも残しておきたい場合

「自宅の電気」は無効化したいけど「リビングの電気」はいままで通り使いたい、というケースもあろう。

こういった用途にはGoogle Assitantに設定できるルーティン機能を使うとよい。1音声コマンドで複数家電をまとめて操作できる。


また、家族がたくさんいるなどで一人ひとりにルーティン設定をするのが大変な場合、以下のようにHome Assistantのスクリプト機能を使ってもよい。

scrtipts.yaml
# 電気全部つけて
living_all_lights_on:
  sequence:
    - service: switch.turn_on
      target:
        entity_id: switch.dining_downlight
    - delay: 0.5
    - service: switch.turn_on
      target:
        entity_id: switch.living_ceiling_light
switches.yaml
- platform: template
  switches:
    living_all_lights:
      friendly_name: '電気全部'
      turn_on:
        service: script.living_all_lights_on
      turn_off:
        service: script.living_all_lights_off        




コメント