続・住宅設備家電(エアコン、エコキュート、電動シャッター、分電盤)をHome Assistantでスマート化したい 2022年版

# はじめに

ちょうど1年くらい前に公開したこの記事の続きになります。

https://qiita.com/banban525/items/bfebb371d6061294bc77

エアコン、エコキュート、電動シャッターなど、日本製の住宅設備家電をスマート化するにはECHONET Liteという規格に対応する必要があります。
しかし、流行ってないし、ツールもそろってない、合ったとしてもメーカー純正の高価でイケてないインターフェイスしかない、という現状でした。
そこで、ECHONET LiteとMQTTをつなぐことで、Home Assistantなどスマートホームの一元管理システムにつなぐことで使いやすくしようという目論見です。
また、やっと自宅のリフォームも終わり、実際の設備家電の連携ができてきました。

# 作っているもの


https://github.com/banban525/echonetlite2mqtt

[![topimage.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217768/7f984464-1279-f262-ceda-2a152cdecef8.jpeg)](https://github.com/banban525/echonetlite2mqtt)

ちょうど先日、大型アップデートを行って、 [ver.2.0.0](https://github.com/banban525/echonetlite2mqtt/releases/tag/v2.0.0) を公開しました。
大きな進化としては、[ECHONET Lite Machine Readable Appendix (MRA)](https://echonet.jp/spec_mra_rp1/)を使用にするようになり、公式サポート機種が4種だったところが50種に大幅に増えています。
この辺は後述します。

現在の主な対応機種はこちらです。
すべての対応機器は本ページ後半か[ECHONETLite2MQTT](https://github.com/banban525/echonetlite2mqtt)を参照してください。

* 家庭用エアコン	(0x0130)
* 空調換気扇	(0x0134)
* 空気清浄器	(0x0135)
* 電動雨戸・シャッター	(0x0263)
* 電動窓	(0x0265)
* 電気温水器	(0x026B)
* 電気錠	(0x026F)
* 瞬間式給湯器	(0x0272)
* 浴室暖房乾燥機	(0x0273)
* 住宅用太陽光発電	(0x0279)
* 床暖房	(0x027B)
* 電気自動車充放電器	(0x027E)
* 分電盤メータリング	(0x0287)
* 一般照明	(0x0290)
* 単機能照明	(0x0291)
* 照明システム	(0x02A3)
* ハイブリッド給湯機	(0x02A6)
* スイッチ (JEM-A/HA端子対応)	(0x05FD)


# デモ

さっそく動作しているところをお見せします。

## エアコン

まずは定番のエアコン。
下の動画はダイキンのうるさらX [AN-22YRS-W](https://www.daikinaircon.com/roomaircon/2021/products/r_series/) です。


![demo-AirCnditioner-daikin.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217768/553abc61-6ea7-7338-a6a1-0a6d3f7ed11d.gif)

他にも、[AN-56ZRP-W](https://www.daikinaircon.com/roomaircon/products/r_series/index.html) 、[AN22YFS-W](https://www.daikinaircon.com/roomaircon/products/f_series/)、[AN-22YRS-W(wifiモジュール増設)](https://www.daikinaircon.com/roomaircon/products/c_series/)、とダイキンでそろえてみました。
すべて制御できています。

Home Assistantの設定例はこちら。これは1年前とほとんど同じですが。
```yml
mqtt:
  climate:
    - name: "air-conditioner"
      icon: mdi:air-conditioner
      modes:
        - "off"
        - "cool"
        - "heat"
        - "dry"
        - "auto"
      mode_command_template: >-
        {% if value == 'off' %}
          {"operationStatus":"false"}
        {% elif value == 'cool' %}
          {"operationStatus":"true","operationMode":"cooling"}
        {% elif value == 'heat' %}
          {"operationStatus":"true","operationMode":"heating"}
        {% elif value == 'dry' %}
          {"operationStatus":"true","operationMode":"dehumidification"}
        {% elif value == 'auto' %}
          {"operationStatus":"true","operationMode":"auto"}
        {% else %}
          {}
        {% endif %}
      mode_command_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties/set"
      temperature_state_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties/targetTemperature"
      temperature_command_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties/targetTemperature/set"
      current_temperature_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties/roomTemperature"
      mode_state_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties"
      mode_state_template: >-
        {% if value_json.operationStatus == 'false' %}
          off
        {% elif value_json.operationMode == 'cooling' %}
          cool
        {% elif value_json.operationMode == 'heating' %}
          heat
        {% elif value_json.operationMode == 'dehumidification' %}
          dry
        {% elif value_json.operationMode == 'auto' %}
          auto
        {% else %}
          off
        {% endif %}
```
(2023-03-31 更新: `power_command_topic` がHome Assistantで非推奨になったようなので使わないようにしました)

割と満足していますが、不満点は・・・
* 温度設定が1度単位しかない。リモコンやスマホアプリだと0.5度単位で設定可能。
  これは [GitHubのFAQ](https://github.com/banban525/echonetlite2mqtt#i-want-to-specify-the-set-temperature-of-the-air-conditioner-in-units-of-05-degrees) にも入れておきましたが、ECHONET Liteの仕様のようです。
  下にもありますが、やはり細かい制御はリモコンが良いようです。ちなみにスマホアプリDaikinAppは遅いので使いたくない。
* 三菱のエアコンは定期的に設定温度値を通知してくれていたが、このエアコンは要求しないと通知がない
  メーカーごとの方言のようなもののようです。
  ECHONETLite2MQTTには、エアコンに情報を要求するrequestの機能があるので、これを定期的に呼ぶことで対応しています。
* モード:「自動」時の細かい設定ができない、OFF時の内部クリーンが動かない、など細かいところに手が届かない
  やはり使い勝手はリモコンが一番です。今のところ寝起きに暖めるとか消し忘れ防止とか自動化部分はHome Assistantで、細かい日常操作はリモコンで、という住み分けかなと思っています。

## 電動シャッター

[LIXIL電動シャッター採風タイプ](https://www.lixil-online.com/window/window-shutter/10-WBMSY1AA2111K/) です。このシャッターは[ライフアシスト2:ホームデバイス](https://www.lixil.co.jp/lineup/smarthome/lifeassist2/product/homedevice/) を使うことでECHONET Lite対応されます。

![demo_shutter_with_HomeAssistant.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217768/611a2849-3f8c-be69-d330-704562529801.gif)

Home Assistantの設定例はこちら。

```yml
mqtt:
  cover:
    - name: shutter1
      unique_id: shutter1
      command_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties/openCloseOperation/set"
      device_class: shutter
      payload_close: "close"
      payload_open: "open"
      payload_stop: "stop"
      state_closed: "fullyClosed"
      state_closing: "closing"
      state_open: "fullyOpen"
      state_opening: "opening"
      state_stopped: "stoppedHalfway"
      state_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties/openCloseStatus"
      optimistic: true
```

電動シャッターは最近人気のようでそのままでもカーテン代わりになり便利ですが、スマート化することで(1)平日の毎朝6時にシャッターを開ける、(2)毎日日没の30分前にシャッターを閉める、が自動化できています。

また、うちのシャッターは採風機能付きでこれもECHONET LiteのBlindAngleプロパティで制御できるようです。
Home Assistantからはまだ制御していないので、下はECHONETLite2mqttの制御画面からの操作です。
![demo_shutter_with_ECHONETLite2mqtt.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217768/03b085f8-6004-ecda-5cb8-e708db6050d0.gif)

ほぼ満足ですが、こちらも一部不満点(注意点)。
* 「途中停止状態」(stoppedHalfway)とか「開いている最中」(opening)、「閉じている最中」(closing)には未対応。完全に閉まっているか(close)、その他(open)しかわからない
  一応、Home Assistantの設定では指定していますが、この状態にはならないようです。そのため、optimistic(楽観モード)をONにしています。
* これは純正リモコンもそうですが採風状態から全開状態にするには採風→全閉→全開と一度全閉にしないといけなく、時間をあけて2回操作が必要
  delayで対応できるんですが、面倒なのでHome Assistant対応はまだです。

## 電動窓

ノリで付けた [LIXIL 高所用横すべり出し窓 電動タイプ](https://www.lixil.co.jp/lineup/window/s/electric-items/) です。
これはうれしい誤算だったのですが、[ライフアシスト2:ホームデバイス](https://www.lixil.co.jp/lineup/smarthome/lifeassist2/product/homedevice/)を設置することでECHONET Liteに対応するようです。

![demo-window.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217768/1e172d57-884e-7efd-28ef-d889dd80c7c1.gif)

```yml
cover:
  - platform: mqtt
    command_topic: "echonetlite2mqtt/elapi/v1/devices/fe00-your-device-id-00000000000000/properties/openCloseOperation/set"
    device_class: shutter
    name: shutter1
    payload_close: "close"
    payload_open: "open"
    payload_stop: "stop"
    state_closed: "fullyClosed"
    state_closing: "closing"
    state_open: "fullyOpen"
    state_opening: "opening"
    state_stopped: "stoppedHalfway"
    state_topic: "echonetlite2mqtt/elapi/v1/devices/fe00-your-device-id-00000000000000/properties/openCloseStatus"
```

注意点はシャッターと同じ感じでした。


## エコキュート(電気温水器)

[三菱 エコキュートSシリーズ SRT-S375A](https://www.mitsubishielectric.co.jp/ldg/wink/ssl/displayProduct.do?pid=309056&ccd=10501120)です。[GT-HEM4](https://www.mitsubishielectric.co.jp/ldg/wink/ssl/displayProduct.do?pid=309179&ccd=10501170)というWifiモジュールをつなぐことでECHONET Lite対応されます。

![demo_waterheater.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217768/9537ffad-144f-6223-c6f0-d104f078d56d.gif)

動作状態(アイドルor給湯中or保温中)とか残湯量とか給湯温度などいろいろ情報が取れますが、便利なのは[風呂自動モード]の取得と設定。これでお湯はりボタンをHome Assistantに作り、スマートスピーカーから制御可能にしています。
その結果、スマートスピーカーに話しかけてお湯はりができます。またお湯はりが終わったタイミングで家中のスピーカーでアナウンスしたりしています。
実は、お湯はりだけだとそんなに旨味は無いんですが、おそうじ浴槽との組み合わせで事前の掃除が不要でいつでもお湯はりが可能になり便利になりました。

なお、上の動画では、残湯量をモニターしていますが普段からお湯が足りなくなることはないのでこれはあまり意味がないです。

Home Assistantの設定例はこちら
```yml
mqtt:
  sensor:
   - name: "WaterHeater_Remains"
     state_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties/remainingWater"
     unit_of_measurement: "L"
     icon: mdi:water-boiler
   - name: "WaterHeater_State"
     state_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties/bathOperationStatusMonitor"
  switch:
    - name: "WaterHeater_Auto"
      unique_id: waterHeater_auto
      state_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties"
      value_template: >-
        {% if value_json.bathOperationStatusMonitor == 'noOperation' %}
          false
        {% else %}
          true
        {% endif %}
      command_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties/automaticBathOperation/set"
      payload_on: "true"
      payload_off: "false"
      state_on: "true"
      state_off: "false"
      optimistic: false
      qos: 0
      retain: false
```



不満点
* 給湯温度はリモコンからだと60度まで変更できるが、ECHONET Lite経由だと48度までしか上がらない
  たぶん、事故防止のためと思いますが、どこにもその仕様書いてないし。


## 分電盤

何かに使えるだろうと思い、分電盤は通信機能付きの [パナソニック 分電盤スマートコスモ BHM87261B2](https://www2.panasonic.biz/scvb/a2A/opnItemDetail?use_obligation=scva&contents_view_flg=1&catalog_view_flg=1&item_cd=BHM87261B2&item_no=BHM87261B2&b_cd=301&hinban_kbn=1&s_hinban_key=BHM87261B2&s_end_flg=&vcata_flg=1) にしました。
その後、Home Assistantのバージョンアップで「エネルギー」の項目を発見。分電盤のECHONET Lite情報を使ってHome Assistantのエネルギーに対応しました。
![demo-energy.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217768/d9bd8412-70c6-ac4f-b986-f3040af19a1c.jpeg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217768/95cb5ec2-eef1-5bdf-7774-2c62f0fe989e.png)


分電盤のECHONET Lite規格では、回路(要するにブレーカー)ごとに積算の電力量を取得できます。それをHome Assistantの電力網に設定しています。
おそらくこのやり方は間違っていて、21個もの電力会社から電気を買っていることになってそうです。
グラフの色数が足りてませんね。
でも、回路ごとに毎日の電気料金が見えるのは割と便利です。
(もしかしたら「個々のデバイス」のほうを使うべきなのかもしれませんね)

なお、電気料金はうちの場合、休日と平日で違ったり、時間帯によっても違うので、別途スクリプトを書いてMQTTに送っています。これができない方は固定料金でも目安にはなると思います。

また、分電盤は、1時間ごとに1時間の使用電力量を通知してくれるので、それを棒グラフにもしています。

![demo-energy2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217768/3cfc3992-ce64-02ac-b35c-18cceceb393b.jpeg)

設定例はこちら。こちらは「エネルギー」に設定するための回路ごとの積算電力量です。
```yml
mqtt:
  sensor:
   - name: "energy channel 1"
     unique_id: energy_channel1
     state_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties/measurementChannel1"
     unit_of_measurement: "kWh"
     value_template: "{{ value_json.electricEnergy * 0.01 }}"
     state_class: "total_increasing"
     device_class: "energy"
   - name: "Energy StudyRoom Aircon"
     unique_id: energy_channel2
     state_topic: "echonetlite2mqtt/elapi/v2/devices/fe00-your-device-id-00000000000000/properties/measurementChannel2"
     unit_of_measurement: "kWh"
     value_template: "{{ value_json.electricEnergy * 0.01 }}"
     state_class: "total_increasing"
     device_class: "energy"
     // ... and more
```

こちらは、個々の電気使用量グラフのためのセンサーです。上のmqttセンサーからstatisticsを使って差分を計算しています。

``` yml
sensor:
 - platform: statistics
   unique_id: energy_channel1_instantaneous
   name: "energy channel 1"
   entity_id: sensor.energy_channel1
   state_characteristic: change
   sampling_size: 2
   precision: 2
 - platform: statistics
   unique_id: energy_channel2_instantaneous
   name: "energy channel 2"
   entity_id: sensor.energy_channel2
   state_characteristic: change
   sampling_size: 2
   precision: 2
   // ... and more

```

ちなみに注意点ですが、1時間に一度通知される積算電力量を使って差分が計算されるので、グラフ的には1時間遅く表示されます。(11:00～12:00の使用量が12時のグラフになる)
これはどうしようも無さそうです。
似たような話がこちらでも報告されています。

https://maky-ba.hatenablog.com/entry/2022/07/12/002737#3-%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB

## あれ？玄関電気錠は？ (非ECHONET Lite)

[1年前の記事](https://qiita.com/banban525/items/bfebb371d6061294bc77) では玄関電気錠は [IP/JEM-A変換アダプター](https://av.jpn.support.panasonic.com/support/pvjcontroller/product/hf_ja1_w.html) を使ってECHONET Liteで制御するつもりでした。
しかし、工務店の手配ミスでIP/JEM-A変換アダプターが設置されておらず、後付けしようにも有線LANが来ていない。
仕方がないので、JEM-AをESPHomeを使って制御するように自作しました。

これはこれで、省スペースですし、安定しているし、安価だし、結果的に良かったと思います。

## 参考: おそうじ浴槽 (非ECHONET Lite)

上で少し触れていますが、お風呂掃除を楽にしようと [TOTO おそうじ浴槽](https://jp.toto.com/products/bath/jidosenjo/index.htm) にしてみました。
ただ、これはECHONET Lite対応しておらず、専用アプリからの操作のみのようです。(TOTOさん、これなんとかしてくださいよ)
このため、どうせお風呂から出た時に掃除ボタンを押すだけなのでネットワーク機能もなしにしました。

浴槽だけですが排水後すぐに掃除されるので、いつでもお湯はりができる、というのはなかなかいい体験です。

ただ、不満点として、おそうじ浴槽は給湯温度を45度以下にしないといけないようです。
これも事前に知らなかったので驚いたのですが・・・

リフォーム前は給湯温度をずっと60度にしていて、このほうが食洗機の汚れ落ちがいい気がするんですよね。
仕方がないので、お湯はりが終わったタイミングで、Home Assistantから給湯温度を45度にし、早朝に48度にするという運用にしています。
本当は60度にしたかったのですが、三菱エコキュートはECHONET Lite経由は48度までみたいなんですよね・・・。(バグの可能性もありますが)


# 開発の裏側

## ECHONET Lite Machine Readable Appendix (MRA)

ECHONET Liteは通信仕様としてはバイナリであり、これをECHONETLite2MQTTでは仕様書に従ってjsonに変換しています。
この変換にver.1.xの頃は、 [ECHONET Lite Web API ガイドライン](https://echonet.jp/web_api_guideline/)を利用していました。しかし、このWeb APIガイドラインはそもそも目的が違うものなので、すべてのプロパティに対応できず、半分くらいは手作業で実装でした。
また、ECHONET Liteの仕様書はPDFであり、コピペも自動変換もしにくく困っていました。

そこで発見したのが、 [ECHONET Lite Machine Readable Appendix (MRA)](https://echonet.jp/spec_mra_rp1/) です。
これは、ECHONET Liteの仕様書をJSONの形で表現してくれており、プログラムでの変換で使用できます。
全部ではなかったですが主要なものは網羅されており、これによって以下の機器に対応することができました。
()内はECHONET Liteのデバイスクラスです。

* 非常ボタン	(0x0003)
* 人体検知センサ	(0x0007)
* 温度センサ	(0x0011)
* 湿度センサ	(0x0012)
* 風呂沸き上がりセンサ	(0x0016)
* CO2センサ	(0x001B)
* VOCセンサ	(0x001D)
* 電力量センサ	(0x0022)
* 電流センサ	(0x0023)
* 照度センサ	(0x00D0)
* 家庭用エアコン	(0x0130)
* 換気扇	(0x0133)
* 空調換気扇	(0x0134)
* 空気清浄器	(0x0135)
* 業務用パッケージエアコン室内機 (設備用を除く)	(0x0156)
* 業務用パッケージエアコン室外機 (設備用を除く)	(0x0157)
* 電動雨戸・シャッター	(0x0263)
* 電気温水器	(0x026B)
* 電気錠	(0x026F)
* 瞬間式給湯器	(0x0272)
* 浴室暖房乾燥機	(0x0273)
* 住宅用太陽光発電	(0x0279)
* 冷温水熱源機	(0x027A)
* 床暖房	(0x027B)
* 燃料電池	(0x027C)
* 蓄電池	(0x027D)
* 電気自動車充放電器	(0x027E)
* 電力量メータ	(0x0280)
* 水流量メータ	(0x0281)
* ガスメータ	(0x0282)
* 分電盤メータリング	(0x0287)
* 低圧スマート電力量メータ	(0x0288)
* 高圧スマート電力量メータ	(0x028A)
* スマート電力量サブメータ	(0x028D)
* 一般照明	(0x0290)
* 単機能照明	(0x0291)
* 電気自動車充電器	(0x02A1)
* 照明システム	(0x02A3)
* 拡張照明システム	(0x02A4)
* ハイブリッド給湯機	(0x02A6)
* 冷凍冷蔵庫	(0x03B7)
* クッキングヒータ	(0x03B9)
* 炊飯器	(0x03BB)
* 業務用ショーケース	(0x03CE)
* 洗濯乾燥機	(0x03D3)
* 業務用ショーケース向け室外機	(0x03D4)
* スイッチ (JEM-A/HA端子対応)	(0x05FD)
* コントローラ	(0x05FF)
* テレビ	(0x0602)
* 電動窓	(0x0265)  (独自追加)

なお、電動窓(0x0265)はMachine Readable Appendixになかったので自分でJSONを書いて追加しています。

このMachine Readable Appendix、リンク先によると大学で作ったようで、学生さんが泣きながらPDFの仕様書片手にJSONを書いたのかと思うと感慨深いですね(単なる個人の想像です)。
ちなみにデータ型の表現としてよくできていました。他の通信仕様やデータ型仕様に流用できるかもしれません。

## SPAからMPAへ

ver.1.xの頃は、Reactを使ったSingle Page Applicationでした。
当時私がReactの勉強中だったこともあるのですが、後から考えるとReactを使うほどのUIではなかったのと、2回ビルドが必要だったりと面倒が多かったので、MRA採用のついでにexpressを使ったMulti Page Applicationにしました。

jQueryはあまり得意ではなかったのですが、MPAのほうが無駄なトラブルとかなく良かったと思っています。

# 余談: Matterってどうなの？

スマートホームの共通規格 Matter ですが、最近1.0がリリースされたことで話題です。
ECHONET Liteが比較として挙げられ、日本ガラパゴス仕様は取り残されるとか、Matterに駆逐されるとかの論調をよく見ます。

ここからは個人的な感想ですが・・・
ECHONET LiteはMatterとは共存していくのではないかと思います。
ECHONET Liteは現状、流行っていませんし、使いやすいとも言えませんが、それでもメーカー横断の仕様でそれなりに歴史があり、仕様が公開され誰でも使えるようにしたという功績があります。
Matterはまだまだこれからなので、普及まで時間がかかるのと、現状では仕様書は有料のようです。

仮にMatterが今後伸びたとしても、ECHONETLite2MQTTのようにECHONET LiteとMatterをつなぐブリッジを作れば、過去の機種も含めてMatter対応できるはずで、あまり心配する必要はないんじゃないかと思っています。

あと、各社スマートスピーカー事業は縮小方向のようで、Matterも廃れるんじゃないと危惧しています。
共通規格としてのMatterは必要だと思いますし、頑張ってほしいです。

また、個人的にはHome AssistantがMatter対応してくれたらそれで十分ですね。

# 最後に

以上、今年一年取り組んできたECHONETLite2MQTTの紹介でした。
こんなマイナーな仕様にプライベートな時間をこんなにかけてよいのかとずっと自問していましたが、何人かから使用しているとの話があったり、バグ報告があったりと、スマートホーム界隈に多少は貢献できたのかなと思います。

今後追加したい機能もなくなってきましたし、うちの自宅に必要な機能はそろったので、
バグをつぶしたり、Readmeのメンテをしたりと、しばらくはメンテフェーズですかね。

では皆様、良いスマートホームライフを。