Sympapaのスマートホーム日記

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

初心者がHome AssistantからNature RemoのIRリモコンを動かす

f:id:sympapa:20210812104541p:plain
こんにちは。
Home Assistant初心者のSympapaです。
Home Assistantは初期設定さえ済ませてしまえばかなり多くのデバイスやサービスに対応しているので、大半のデバイスではコードを書かずに使えてコード素人の私はホッとしています。
下のリンクで対応しているデバイスやサービスが確認できます。
www.home-assistant.io

f:id:sympapa:20210814065958j:plain
しかし日本のガラパゴススマートIRリモコン"Nature Remo"には対応していません。
ただNature RemoはクラウドAPIにもローカルAPIにも対応しているのでコードが書ける人にとってはHome Assistantとの連携は難しくないはず。
コードなんてさっぱりわからない私ですが我が家ではNature Remo(第2世代)、Nature Remo mini(初代)、Nature Remo 3のが3台活躍しているのでこれを連携させないわけにはいきません。

そんなわけで某掲示板で教えていただいたりしてなんとなくちょっとだけわかって来たので、備忘録ともし同じような人が居た時の参考になればということで書いていきたいと思います。

ローカルAPIの方がアクションの発動が速くなるので基本的にHome AssistantからNature Remoを操作するならローカルAPIを使うことになると思いますが、リモコンのボタン全部をひとつひとつをローカルAPIで使えるようにするのは死ねるのでクラウドAPIの使い方も覚えておいた方が良さそうです。

今回はローカルAPIを使ってHome Assistantから赤外線コードを送る方法を書いていこうと思います。

1.赤外線コードの取得
取得できるのはそのNature Remoが最後に受信した赤外線信号のコードですので、受信から取得するまでの間に余計な信号を受信しないよう注意が必要です。
1)リモコンをNature Remoに向けて赤外線コードを取得したいボタンを押す。
2)PCを使ってコードを取得する。
下のコマンドを叩きます。IPアドレスはNature Remoのものです。
私はWindows 10のPCでコマンドラインから取得しています。

curl  "http://192.168.x.x/messages" -H "X-Requested-With: curl  " -v

すると下のような結果が出てきますので、そいつがさっきNature Remoへ向けて発射した赤外線のコードです。

{"format":"us","freq":38,"data":[3117,...,336]}

本題からは逸れますが、Remo mini(初代)は「赤外線が届く距離が短い!」という低評価を良くみかけます。
我が家では最初半年間くらいキッチンでRemo mini(初代)を使っていて「すげー飛ぶのに個体差かな?」と思っていましたが、Remo mini(初代)をリビングへ移したところ"リビングの照明をOFFにする信号だけ"が極端にRemo mini(初代)を照明に近づけないと届かない現象が起きました。しかもRemo mini(初代)で赤外線信号を学習させるよりもRemo(第2世代)で学習してRemo mini(初代)で使えるように移した方がマシになるという謎。
コードを取得すると同じリモコンの同じボタンでもRemo mini(初代)とRemo(第2世代)で結構異なっていたりしました。
というわけでもう”赤外線が届く距離が2倍であることをウリにした"後継機が発売されていて基本的に新品は買えませんが、フリマ的なところなどでRemo mini(初代)の購入を検討されている方や既に使用されている方は気をつけた方が良いと思います。

2.赤外線信号をHome Assistantから送る
configuration.yamlに下の例のような記述をすることでNature remoから照明をオンオフできるようになります。"rest_command"の"payload:"のところにさっき取得したコードを入れます。
なんだか面倒ですが、グローバルに販売されているデバイスだと大半はいちいちこんなことをしなくてもHome Assistantの"インテグレーション"(統合)を使って一発登録できます。
IPアドレスは赤外線信号を発信するNature Remoのアドレスです。

input_boolean:
  light_kitchen:
    name: light_kitchen

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

rest_command:
  light_kitchen_on:
    url: 'http://192.168.x.x/messages'
    method: POST
    headers:
      Accept: 'application/json'
      Content-Type: 'application/json'
      X-Requested-With: 'curl'
      Expect: ''
    payload: '{"format":"us","freq":38,"data":[3117,...,336]}'

一番下の”rest_command:”を使ってコマンドを送信でき、これだけでも自動化などから呼び出して使うことが出来ます。
真ん中の"light:"はデバイスクラスが照明である(照明にしたい)デバイスの構成を追記すると照明として取り扱われます。
ここにオンオフする”rest_command.light_kitchen_on(off)”を書いてやることでちゃんと照明であることを認識された状態でオンオフできるようになるようです。
例えば自動化する時に"照明オン"のサービスの対象として、ここで登録した照明が選択できるようになります。
そして驚いたのはGoogle HomeやAlexaからもちゃんと"照明"デバイスとして認識されることです。
Google Homeの場合は複数部屋にGoogle Home(Nest)があっても「OK Google! 電気を点けて!」だけで部屋を区別してONにしてくれる機能も使えます。
一番上の"input_boolean:"は公式ページの説明(Google先生訳)によると「ユーザーインターフェイスを介して制御でき自動化の条件下で使用できるブール値を定義できます。 これは、例えば特定の自動化を条件で使用することにより、それらを無効または有効にするために使用できます。」とのことです。
今回のケースだと単純に信号を送るのではなく状態を記憶させたい場合は必要みたいです。

といった感じで初心者的観点でぼちぼちとHome Assistantで出来ることとか苦労した点の解決手順、買ってみるまで判らない各デバイスのレビューや挙動、これは便利だ!という自動化の紹介などを時系列は無視で書いていきたいと思いますので、スマートホームバイスに興味のある方はまたお立ち寄りください。
次回は初心者がHome AssistantでZigbeeバイスを接続するネタにしようかなと思います。わからんけど(汗
ではまた。