本記事では、Home Assistant上で快適エアリーの各ゾーンをカードとして表示し、温度や運転状態を直接操作できる仕組みを紹介します。Home Assistantでのconfiguration.yaml
の書き方についても説明します。
以前の記事はこちら:
まずは完成イメージを

こんな感じで、快適エアリーのゾーンごとの温度設定・ON/OFF切り替え・冷暖房の状態をカードとして表示できます。これが5分で作れます!
最短導入手順
- YAMLファイルをダウンロード
- 環境に合わせて上記ファイルを編集
- MQTTトピック(特に、echonetlite2mqtt/elapi/v2/devices/**kaiteki_airy**/ 部分)
name
(カードに表示する名称:もともとは「快適エアリー 畳スペース」などとなっている)unique_id
(他と重複せず、わかりやすいID)
- Home Assistantに読み込み
- homeassistant/configディレクトリの下にpackagesディレクトリを作成
- packagesディレクトリに、上記ファイルを保存
configuration.yaml
に以下を追記し、Home Assistantを再起動
homeassistant:
packages: !include_dir_named packages
- ダッシュボードに追加
climate
カードを3ゾーン分並べれば完成
動かないときはまずここを確認
- MQTTブローカに接続できているか
echonetlite2mqtt
が正常動作しているか- YAML編集後にHome Assistantを再起動したか
ここから実装説明編
コードスニペットを用いながら、どのように実装したかを説明します。興味のある方向け。
環境
- Home Assistant
- MQTTブローカ(Mosquittoなど)
echonetlite2mqtt
Home AssistantではMQTT Climateを使い、機器の状態をmode_state_template
やaction_template
でHome Assistantで管理する状態名(off/auto/cooling/heating等)に変換したり、逆にHome Assistantの状態を変換してMQTTトピックに送信したりしています。
Mirror/Backupセンサーの役割
冒頭に出てくるこれ、説明が必要と思います。
mqtt:
- sensor:
- name: "KA ZoneConfigs Mirror"
unique_id: sensor.ka_zoneconfigs_mirror
state_topic: "echonetlite2mqtt/elapi/v2/devices/kaiteki_airy/properties/kaitekiAiryZoneConfigs"
value_template: "{{ value_json.zone1OperationStatus | default('') }}"
json_attributes_topic: "echonetlite2mqtt/elapi/v2/devices/kaiteki_airy/properties/kaitekiAiryZoneConfigs"
json_attributes_template: >-
{{ {'raw': value_json} | tojson }}
- name: "KA ZoneConfigs Backup"
unique_id: sensor.ka_zoneconfigs_backup
state_topic: "kaiteki_airy/backups/zoneconfigs"
value_template: "{{ value_json.zone1OperationStatus | default('') }}"
json_attributes_topic: "kaiteki_airy/backups/zoneconfigs"
json_attributes_template: >-
{{ {'raw': value_json} | tojson }}
Mirror(KA ZoneConfigs Mirror)
現在のゾーン構成をattributes(raw)として保持します。後述のclimate
テンプレートから参照します。
Backup(KA ZoneConfigs Backup)
OFF時にMirrorの内容をそのままMQTTのBackupトピックに保存します。ON時は、バックアップが存在する場合のみ、その内容でゾーン構成を復元します。
なぜBackupが必要か
快適エアリーの主電源ON/OFFは、単にoperationStatus
にON/OFFを送信すれば良いと思っていました。
しかし実際には以下の挙動がありました。
- OFFする前にゾーンが「off」だった場合でも、ONすると全ゾーンがonになってしまう
(おすすめタイマーが設定されていない場合)
このため、「OFF前の状態を正確に再現する」には、Backupへの保存とON時の復元が必要と判断しました。
Backup保存・復元の動き
[OFFボタン押下] → MirrorのrawをBackupに保存 → operationStatus=falseを送信
[ONボタン押下] → operationStatus=true → 3秒待機 → Backupの内容で復元
ゾーン別climate定義の仕組み
- climate
から始まる各ゾーンの定義はほぼ同じ構造で、異なるのは以下の3点だけです。
- 表示名(
name
) unique_id
- 対象ゾーン番号(
zone1
/zone2
/zone3
)
mode_state_template
modes:
- "off"
- "auto"
mode_state_template: >-
{% if value_json.operationStatus == 'false' or value_json.kaitekiAiryZoneConfigs.zone1OperationStatus in ['off','keep'] %}
off
{% else %}
auto
{% endif %}
mode_state_topic: "echonetlite2mqtt/elapi/v2/devices/kaiteki_airy/properties"
機器やゾーンのOperationStatus
をHAのモード(off/auto)に変換します。ゾーンのステータスがkeepの時にはoffにしています。
このoffとautoはUI上はボタンとして表示されます。
action_template
action_template: >-
{% if value_json.operationStatus == 'false' or value_json.kaitekiAiryZoneConfigs.zone1OperationStatus == 'off' %}
off
{% elif value_json.kaitekiAiryZoneConfigs.zone1OperationStatus == 'keep' %}
idle
{% else %}
{% set m = value_json.operationMode %}
{% if m == 'cooling' %}
cooling
{% elif m == 'heating' %}
heating
{% elif m == 'dehumidification' %}
drying
{% else %}
fan
{% endif %}
{% endif %}
action_topic: "echonetlite2mqtt/elapi/v2/devices/kaiteki_airy/properties"
運転状態(冷房/暖房/除湿/送風/keep)をHAの状態(cooling/heating/drying/fan/idle/off)にマッピングします。
set m = value_json.operationMode
で変数を定義できます。
mode_command_template
ここまでの説明は、トピックのデータを読み込んで表示するものでした。ここはコマンドを快適エアリーに送る、つまり制御するものになります。
mode_command_topic: "echonetlite2mqtt/elapi/v2/devices/kaiteki_airy/properties/kaitekiAiryZoneConfigs/set"
mode_command_template: >-
{% set turn = 'off' if value == 'off' else 'on' %}
{% set current = state_attr('sensor.ka_zoneconfigs_mirror', 'raw') or {} %}
{{ current | combine({ 'zone1OperationStatus': turn }) | to_json }}
快適エアリーのゾーン設定は、三つのゾーン全ての情報が一つにまとまってしまっています。そのため、あるゾーンの設定を変更したい時は、他のゾーンの情報も一緒に送信する必要があります。
そこで、上で説明したMirrorが役に立ちます。現在のkaitekiAiryZoneConfigsのJSONを取得し、変更部分をcombine
で上書きして完全なJSONを組み上げた上で送信します。部分更新なので、となりのゾーン情報をゼロで上書きしてしまう…みたいなことを防げます。
この部分的に上書きするcombineは、こちらをご確認ください。
その他
温度設定などもmode_command_templateと同じようにcombineを使って設定できます。
YAMLが冗長になってしまう…
climate
の部分はゾーンごとにほぼ同じ定義を繰り返していますが、Jinjaではテンプレート中のゾーン番号などを動的に差し替える仕組みがないようで、冗長だなと思いつつも3つ似たような記述を繰り返しています。
もし良い仕組みがあればご連絡ください…。
まとめ
ECHONET Liteの解析結果をベースに、Home Assistantで快適エアリーのゾーン別制御ができるようになりました。
これを定義したことで、おまかせタイマー時には人感センサーが結構敏感に働いている、ということもログからわかるようになりました。

解析の基本は正しいデータどりから、ということで、今後も色々なデータをHome Assistantに取り込んでいこうと思います。
コメント