Sympapaのスマートホーム日記

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

Home Assistant: ECHONETLite2mqttを試す(1)

Sympapaです。

日本の住設のスマートホームプロトコルとしてEchonet liteがあります。
Echonet liteでは電気錠、エコキュート、カーテン、照明、エアコンなど、様々な住設がサポートされているようですが、日本のガラパゴス規格みたいなのでHome Assistantで扱えるカスタムコンポーネントなどはほとんど無く、私のようなスクリプトを書くことが出来ない初心者がHome AssistantとEchonet Liteを連携させるのはなかなか厳しい現状です。


それでもHome AssistantでEchonet lite対応デバイスを操作できるカスタムコンポーネントは皆無ではありません。
現状、こちらのカスタムコンポーネント:"echonetlite_homeassistant"
を使わせて貰い、Echonet Lite対応のエアコンをHome Assistantと連携しています。
Home AssistantのHACSからインストール出来てアップデートが来た時も簡単に実行出来ますし、見つかったEchonet lite対応デバイスは"echonetlite_homeassistant"がサポートしているタイプであれば自動的にHome Assistantのデバイスとして登録してくれるので私のような初心者でも簡単に使えます。
ただ、対応するデバイスタイプが限られているのと、私の環境ではデバイスステータスの変化がHome Assistant側に反映されるまで長い時で数十秒かかるので、そのあたりが改善されると嬉しいんですが。。。使わせて貰っているのにアレですけど(汗)
github.com


最近、家を建てようと思っているのですが、そうなるとHome AssistantとEchonet liteの連携は充実させておきたいところです。
そこで今回は"Home Assistant Echonet lite”でググると上位に出てくるこちらを試してみることにしました。
qiita.com


仕組みとしてはEchonet liteとMQTTをやり取りできるようにするもののようでHome Assistantは直接は関係ありません。
Home AssistantではMQTTを使ったデバイスを作成できるので、それを利用しMQTTを介してEchonet liteとHome Assistantがやりとりできるようになります。

■インストールする

Node.JSかDocker上で動くとのことですが私にはインストール方法すらさっぱりわかりません(汗)
Home Assistantが稼働している1台目のRaspberry Pi 4はHome Assistant OSを使用していてNode.JSとかDockerのインストール方法が判らないので(というかたぶん不可能)、先日Raspberry Pi OS+Home Assistant Supervisedをインストールした2台目のRaspberry Pi 4にインストールしていきます。
今回はDockerでインストールするのにトライします。


1.Dockerイメージの作成
チンプンカンプンすぎて合っているのかわかりませんが、まずdockerfileからdockerコンテナを構成しdockerイメージを作成しなくてはいけないらしいです。正攻法なのか全くわかりませんが以下のコマンドでうまくいきました。

git clone https://github.com/banban525/echonetlite2mqtt.git
cd echonetlite2mqtt
docker build ./ -t echonetlite2mqtt


2."echonetlite2mqtt"の実行
下のコマンドで"echonetlite2mqtt"を実行します。

docker run -d --net=host -e MQTT_BROKER="mqtt://192.xxx.xx.xx:1883" echonetlite2mqtt 

"mqtt://192.xxx.xx.xx:1883"はMQTTブローカーのアドレスで"192.xxx.xx.xx"の部分はMQTTブローカーが動いているサーバーのIPアドレスです。
しかし"echonetlite2mqtt"をインストールしたRaspberry Pi(2台目)にインストールしているHome AssistantのアドオンのMQTTブローカーを指定しても、見かけ上は接続できているのにHome Assistantとのやりとりがうまくいきませんでした。
ここでかなり躓きましたが、結局、別のRaspberry Pi(1台目)にインストールしているHome AssistantのアドオンのMQTTブローカーを指定したらうまくやりとりしてくれました。
Raspberry Pi(2台目)でも"ZigBee2MQTT"は同一サーバー内でうまくやりとり出来ているのに、"Echonetlite2mqtt"ではやりとりできないのはなんでなんだろう。。。
ちと調べた感じ、"Echonetlite2mqtt"とMQTTブローカーが別のDockerコンテナで動いているので、コンテナ間の通信の設定みたいなものをしないといけないみたいです。
"ZigBee2MQTT"の場合はHome AssistantのアドオンとしてMQTTブローカーと同じサーバーにインストールする前提なので、そのあたりを自動で解決してくれる設計になっているってことでしょうか。。。


あと備忘録。

  • MQTTブローカーのユーザー名とパスワードを指定して起動する。

1)どこかにconfig.jsonファイルを作る。

{
  "port": 1883,
  "username": "your-username",
  "password": "your-password"
}

2)下のコマンドで起動する。

docker run -d --net=host -v /xxxxx/config.json:/app/config/config.json -e MQTT_OPTION_FILE=/app/config/config.json -e MQTT_BROKER="mqtt://your.mqtt.brocker" echonetlite2mqtt
  • 稼働中のDockerコンテナのID確認
docker ps
  • 稼働中のコンテナを停止する
docker stop コンテナID

■使ってみる

他のPCなどから"http://192.xxx.xx.xx:3000"で"ECHONETLite2mqtt"のUIにアクセスできます。
Echonet liteデバイスの一覧が出てきて、デバイスをクリックするとこんな画面が表示されデバイスを操作したりデバイスのステータスがチェックできます。


Home Assistantの方では、configuration.yamlにデバイスの構成を書く必要があります。
我が家にはEchonet lite対応のエアコンがあるので、例に書かれていたとおりエアコンの設定をしてみました。
バイスID"fe00-your-device-id-00000000000000"の部分は、先ほどのUIに表示されるのでそれをコピペしました。

climate:
  - platform: mqtt
    name: エアコン2
    icon: mdi:air-conditioner
    modes:
      - "off"
      - "cool"
      - "heat"
      - "dry"
    mode_command_template: >-
      {% set values = { 'off':'off', 'cool':'cooling',  'heat':'heating', 'dry':'dehumidification'} %}
      {{ values[value] if value in values.keys() else 'off' }}
    payload_on: "true"
    payload_off: "false"
    power_command_topic: "echonetlite2mqtt/elapi/v1/devices/fe00-your-device-id-00000000000000/properties/operationStatus/set"
    mode_command_topic: "echonetlite2mqtt/elapi/v1/devices/fe00-your-device-id-00000000000000/properties/operationMode/set"
    temperature_state_topic: "echonetlite2mqtt/elapi/v1/devices/fe00-your-device-id-00000000000000/properties/targetTemperature"
    temperature_command_topic: "echonetlite2mqtt/elapi/v1/devices/fe00-your-device-id-00000000000000/properties/targetTemperature/set"
    current_temperature_topic: "echonetlite2mqtt/elapi/v1/devices/fe00-your-device-id-00000000000000/properties/roomTemperature"
    mode_state_topic: "echonetlite2mqtt/elapi/v1/devices/fe00-your-device-id-00000000000000/properties"
    mode_state_template: >-
      {% if value_json.operationStatus == false %}
        off
      {% else %}
        {% set values = { 'off':'off', 'cooling':'cool',  'heating':'heat', 'dehumidification':'dry'} %}
        {{ values[value_json.operationMode] if value_json.operationMode in values.keys() else 'off' }}
      {% endif %}


これでHome Assistantからエアコンが無事に操作でき、エアコン付属のリモコンで操作した時もちゃんとHome Assistantに反映されました。
しかもエアコン側のステータスの反映が"echonetlite_homeassistant"よりもかなり早いのが嬉しい誤算です。

■つづく

とりあえずエアコンが動作するところまではなんとか辿り着いたので、シミュレーターを使って他の家電も動くかも確認したいと思います。
あとはHome Assistant(のMQTTブローカー)と"ECHONETLite2mqtt"が同一サーバー内にある時にやり取り出来ないのを解決したいところです。Echonet Liteの為だけに1台余計にRaspberry Piを常時稼働させるのは勿体ないし、そもそも2台目のRaspberry PiはHome Assistantを稼働している1台目が壊れた時に即復旧するための予備用として購入したので常時稼働になってしまうとお役目を果たせません(汗)
ちと調べた感じだと対象のコンテナ間で通信できるように設定が必要ってことみたいなのでまたトライしたいと思います。


それでは、つづく。