Emulated Hueを使ってAlexaからHome Assistantに登録しているデバイスを操作しよう

我が家ではスマートデバイスの状態を一元管理したいのでそのほぼ全てをHome Assistantに寄せています。

ということはAlexaからスマートデバイスを操作する場合でも一度Home Assistantを経由させないといけない(=状態管理が狂ってしまう)わけなのですが、普通にAlexaスキルで連携させようとするとHome Assistant Cloud (Nabu Casa)というものを使う必要があり、これが月あたり6.50USDかかるんですよね。

円安の今使おうとすると月あたり900円強…。

たかが家電操作のために月900円強も払うのは割に合わないので代替方法を検討してみたところEmulated Hueというインテグレーションを発見しました。

このインテグレーションを使ってHome Assistant CloudなしでHome Assistant⇔Alexaの連携が実現できたのと、日本語でEmulated Hueの使い方を解説している記事が無かったのでその方法を綴っていきます。

configuration.yamlを編集する

Emulated HueはGUIでの設定に対応してないのでconfiguration.yamlからコードベースで設定する必要があります。

とりあえず以下のように追記して、ご自身の環境向けに値を書き換えてみましょう。

emulated_hue:
  host_ip: 192.168.1.x # Home AssistantサーバーのプライベートIP
  listen_port: 80 # Alexaと連携させたい場合は80固定
  expose_by_default: false # エンティティをデフォルトでAlexaから見えるようにするかどうか
  entities: # Alexaに公開するエンティティ一覧
    input_boolean.ceiling_light: # エンティティID
      name: "シーリングライト" # Alexaから見えるデバイス名を自由に設定
      hidden: false # expose_by_defaultをfalseにしているのでfalse

それぞれの指定がどのような役割を持っているのかをコメントとして記述しています。

サンプルの通り、entitiesには物理デバイスだけでなくヘルパー(input_boolean)も指定することができます。

自分の環境ではこのinput_boolean.ceiling_lightヘルパーをシーリングライトの電源状態に見立てることによって、本来はできない赤外線操作のシーリングライトの状態管理を実現しています。 (ヘルパーの状態が変わったらシーリングライトを実際にトグルするオートメーションが動く)

例えば、Emulated Hueを使わずにSwitchBotとAlexaを直接連携させてAlexaに「電気を消して」と言ったあともう一度「電気を消して」と言うと電気が点いてしまいます🫠

まあ実際には「電気を消して」と2回連続で言うことなんて無いでしょうけども、状態管理ができるようになるとスクリプトの中で「もし電気が付いていたら消す」というような条件分岐が可能になるのでやっぱり赤外線操作のデバイスの状態管理は必要です。

話が逸れましたが、とりあえず特殊な設定などがなければ上記のテンプレートをベースにすればOKです。

ここに記載していないオプションだったりを確認したい場合は公式ドキュメントを参照してみてくださいね。

configuration.yamlの編集が完了したらHome Assistantを再起動しましょう!

動作確認してみる

  • http://<Home AssistantサーバーのプライベートIP>/description.xml
  • http://<Home AssistantサーバーのプライベートIP>/api/v2/lights

のそれぞれにアクセスしてみてそれっぽいレスポンスがあるか確認します。

エラーっぽい文言が出てきたらどこかで設定をまずってるかも…

Emulated HueをAlexaで検出する

Alexaに「デバイスを検出して」と声を掛けるなりしてEmulated Hueで設定した仮想デバイスをAlexaに追加します。

さっきのyamlでnameに日本語を指定すると文字化けするのでAlexa側で名前を編集しちゃいましょう。

これでAlexaからHome Assistantに登録しているデバイス(ヘルパー)の操作ができるようになりました!

(番外編) 特殊なプライベートIP割り当て環境にいる人向け

おそらく、RFC1918の定義外のプライベートIPが割り当てられる特殊環境にいる方はhttp://<Home AssistantサーバーのプライベートIP>/api/v2/lightsにアクセスすると{"message": "Only local IPs allowed"}が返ってくるはずです。

自分の家(賃貸)はプライベートIPが100.64.1.0/24となぜかCGNっぽい範囲になっていて、これで詰まりました。(ほんとになんで?)

とりあえず2重ルーターにして192.168.1.0/24にするとこの問題は解決したものの、TVerのローディングやQuest3からMeta Storeにアクセスする時の速度が激遅になったりと、良からぬところに影響が出てしまったので、2重ルーターをやめてEmulated Hue側をどうにかすることにしました。

このPRでも同じ問題が唱えられていて、custom_componentsディレクトリにプライベートIPの判定ロジックを改変したEmulated Hueのソースを入れて上書きするような方法などもあるようですが自分の環境では上書きされず、、

埒が明かないのでdocker-composeのvolumeディレクティブにてコンテナ内のEmulated Hueのディレクトリを直接マウント、custom_componentsを使わず直接Emulated Hueのソースをいじくることによって100.64.1.0/24からもアクセスできるようにするという荒業で対応しています。

ハマりポイントはあったものの、結構簡単にAlexaと連携できたので驚きました!

Home AssisntatとAlexaを手軽に連携できることによって活用の幅も広がりますね👏

コメント

タイトルとURLをコピーしました