Home Assistantで快適エアリーをゾーン別に可視化&制御する

IoT

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

以前の記事はこちら:

まずは完成イメージを

こんな感じで、快適エアリーのゾーンごとの温度設定・ON/OFF切り替え・冷暖房の状態をカードとして表示できます。これが5分で作れます!

最短導入手順

  1. YAMLファイルをダウンロード
  1. 環境に合わせて上記ファイルを編集
    • MQTTトピック(特に、echonetlite2mqtt/elapi/v2/devices/**kaiteki_airy**/ 部分)
    • name(カードに表示する名称:もともとは「快適エアリー 畳スペース」などとなっている)
    • unique_id(他と重複せず、わかりやすいID)
  2. Home Assistantに読み込み
    • homeassistant/configディレクトリの下にpackagesディレクトリを作成
    • packagesディレクトリに、上記ファイルを保存
    • configuration.yamlに以下を追記し、Home Assistantを再起動
homeassistant:
  packages: !include_dir_named packages
  1. ダッシュボードに追加
    • climateカードを3ゾーン分並べれば完成

動かないときはまずここを確認

  • MQTTブローカに接続できているか
  • echonetlite2mqttが正常動作しているか
  • YAML編集後にHome Assistantを再起動したか
スポンサーリンク

ここから実装説明編

コードスニペットを用いながら、どのように実装したかを説明します。興味のある方向け。

環境

Home AssistantではMQTT Climateを使い、機器の状態をmode_state_templateaction_templateHome 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で快適エアリーのゾーン別制御ができるようになりました。

これを定義したことで、おまかせタイマー時には人感センサーが結構敏感に働いている、ということもログからわかるようになりました。

水色の領域がON、白く抜けているところがKeepになります

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

コメント

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