ラズパイのHome Assistantで買電・売電を見える化|自宅充電自動化③

太陽光・EV充電

 

当ブログではアフィリエイト・Google AdSenseによる広告を掲載しています

昼は電気を買わずに、太陽光の余りだけでATTO 3を充電したい。そのために、まず家の買電と売電をHome Assistantで見える化しました。

Home Assistantは、前の記事で買ったラズパイに入れています。といっても、設定のコードは全部AI(Claude Code)に作ってもらったもので、自分は中身をほとんど理解できていません。

実際の画面と、公開できる範囲の設定ファイル(YAML)を載せて紹介します。

Home Assistantを動かしているのは、Raspberry Pi 4B(4GB)のスターターセットです。

スポンサーリンク

ホーム画面に家の電気の流れをまとめた

Home Assistantのホーム画面。太陽光0W・買電1,096Wの電気の流れと、今日の発電7.03kWh・自家消費4.36kWh・売電2.67kWh・買電14.83kWh

スマホのHome Assistantアプリで見ているホーム画面です。画面の上が今の電気の流れで、太陽光・電力会社・家・EVの4つを線でつないでいます。

夜に撮ったので太陽光は0Wで、家で使っている1,096Wを全部買っています。EVの丸は、Wallbox Pulsar Plusの充電電力です。

Wallbox Pulsar Plus設置で契約20kVAと言われた|自宅充電自動化①
自宅にWallbox Pulsar Plusを設置したら、電力会社から契約容量20kVAと言われました。主幹ブレーカーを100Aから50Aに替えて10kVAで決まるまでと、工事当日の配線、今の本体価格をまとめました。

下の「Today」は今日1日の合計です。9月16日は発電7.03kWhのうち、4.36kWhを家で使って2.67kWhを売りました。

この日はATTO 3をWallboxにつないでいなかったので、余った分がそのまま売電になっています。

1時間ごとの内訳はエネルギーの画面で見る

Home Assistantのエネルギー画面。9月16日の1時間ごとの買電(青)・発電(オレンジ)・売電(紫)のグラフ

1時間ごとの内訳は、Home Assistantに最初から入っているエネルギーの画面で見られます。青が買電、オレンジが発電、紫が売電です。

昼のあいだは紫がマイナス側に出ていて、ここが売った分です。

全館空調とエコキュートも同じ画面に

Home Assistantのホーム画面の下のほう。全館空調の運転状態とエコキュートのタンク残量・給湯温度・ふろ温度

さらに下には、全館空調とエコキュートの状態も並べています。この日の全館空調は冷房24℃、エコキュートのタンクの残りは490Lでした。

AIが全部作った、買電・売電を取り込むYAML

ここからは設定ファイルの中身です。

先に書いておくと、ここから載せるコードは全部AIに作ってもらったものです。

自分は1行も書いていませんし、読んでもところどころしかわかりません。

説明もClaude Codeにしてもらった内容をそのまま書いています。

Natureのアクセストークンと、Wallboxのシリアルナンバーは、「x」の並びに置き換えて伏せています。

YAMLは設定を書くための書き方

YAMLという言葉も自分は知らなかったので、Claude Codeに聞きました。

YAML(ヤムル)は、人が読み書きしやすいように作られた、データや設定を書くための形式です。プログラムというより、決まった形で並べた設定のメモに近いものだそうです。

  • 「項目名: 値」を1行に1つずつ書く
  • 行頭の字下げ(スペース)で、どの項目の中身かを表す
  • 「- 」で始まる行は、並べたもののうちの1つ
  • 「#」から後ろはメモ(コメント)で、動きには関係しない
  • 「{{ }}」や「{% %}」で囲まれた部分は、Home Assistantが値を計算するための式(テンプレート)

Home Assistantでは、configuration.yamlのような設定ファイルがこの形で書かれていて、画面で作ったオートメーションもautomations.yamlというYAMLのファイルに保存されます。

字下げが1つずれるだけで意味が変わってしまうので、自分で書くのはハードルが高そうです。

Nature Remo EのAPIから50秒おきに取る

買電と売電の数字は、Nature Remo EのクラウドAPIから取ってくる設定で、configuration.yamlに書いてあります。

rest:
  - resource: "https://api.nature.global/1/appliances"
    method: GET
    headers:
      Authorization: "Bearer xxxxxxxxxxxxxxxx"
    scan_interval: 50
    sensor:
      # 1. スマートメーター(売買電の瞬時値)
      - name: "Grid Power"
        unique_id: "grid_power_fixed"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        availability: >
          {{ value_json | selectattr('type', 'equalto', 'EL_SMART_METER') | list | length > 0 }}
        value_template: >
          {% set dev = value_json | selectattr('type', 'equalto', 'EL_SMART_METER') | first | default(none) %}
          {% if dev %}
            {{ dev.smart_meter.echonetlite_properties | selectattr('name', 'equalto', 'measured_instantaneous') | map(attribute='val') | first | int(0) }}
          {% else %}
            {{ none }}
          {% endif %}

      # 2. 太陽光発電(現在の発電量)
      - name: "Solar Generation"
        unique_id: "solar_gen_fixed"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        value_template: >
          {% set dev = value_json | selectattr('type', 'equalto', 'EL_SOLAR_POWER') | first | default(none) %}
          {% if dev %}
            {{ dev.smart_meter.echonetlite_properties | selectattr('name', 'equalto', 'measured_instantaneous') | map(attribute='val') | first | int(0) }}
          {% else %}
            0
          {% endif %}

      # 3. スマート分電盤(家全体の消費電力計測値)
      - name: "House Consumption Raw"
        unique_id: "house_dist_meter_fixed"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        value_template: >
          {% set dev = value_json | selectattr('type', 'equalto', 'EL_POWER_DIST_METER') | first | default(none) %}
          {% if dev %}
            {{ dev.smart_meter.echonetlite_properties | selectattr('name', 'equalto', 'measured_instantaneous') | map(attribute='val') | first | int(0) }}
          {% else %}
            0
          {% endif %}

      # 4. 買電量(Grid Powerがプラスの時だけ)
      - name: "Power Import"
        unique_id: "power_import_calc"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        availability: "{{ has_value('sensor.grid_power') }}"
        value_template: >
          {% set val = states('sensor.grid_power') | int(0) %}
          {{ val if val > 0 else 0 }}

      # 5. 売電量(Grid Powerがマイナスの時だけ、絶対値にする)
      - name: "Power Export"
        unique_id: "power_export_calc"
        unit_of_measurement: "W"
        device_class: "power"
        state_class: "measurement"
        availability: "{{ has_value('sensor.grid_power') }}"
        value_template: >
          {% set val = states('sensor.grid_power') | int(0) %}
          {{ val | abs if val < 0 else 0 }}
  • 取りに行く先はNatureのクラウドで、アクセストークンが要ります(Authorization の行)
  • scan_interval: 50 で、50秒おきに取り直します
  • 「Grid Power」はスマートメーターの値で、プラスなら買電、マイナスなら売電です
  • 「Solar Generation」は太陽光、「House Consumption Raw」はスマート分電盤の値で、取り方は同じです
  • 「Power Import」「Power Export」は、Grid Powerをプラスとマイナスで分けたものです。充電の自動制御は、この2つを見て動きます
Nature Remo EをBルート接続|発電の9割を自家消費できた日
Nature Remo EのBルート接続で家じゅうの電力を1W単位で見える化。太陽光・エコキュート・全館空調を連携し、発電40kWhの9割を自家消費できた日の実測と、E2とE2 liteの違いをまとめました。

太陽光とエコキュートはECHONET Liteで直接読む

画面に出している太陽光の発電量と、全館空調・エコキュートの状態は、家のLANにあるECHONET Liteの機器からHome Assistantが直接読んでいます。

ECHONET Lite用の追加機能(echonetlite_homeassistant)は、Claude CodeがGitHubから取ってきて入れてくれました。こちらは画面から機器を足していく方式なので、YAMLはありません。

電気の流れのカードのYAML

画面の上の電気の流れは、HACS(有志が作った追加機能を入れる仕組み)で入れたPower Flow Card Plusというカードです。

type: custom:power-flow-card-plus
entities:
  grid:
    entity:
      consumption: sensor.power_import
      production: sensor.power_export
    name: Grid (+/-)
    color_circle: true
    color_value: false
    secondary_info:
      template: "← {{ states('sensor.power_export') }} W"
      color_value: false
  solar:
    entity: sensor.auto_discovery_measured_instantaneous_amount_of_electricity_generated
    name: Solar
    display_zero_state: true
  home:
    name: Home
    color_circle: true
    secondary_info:
      template: "☀ {{ states('sensor.solar_self_consumption') }} W"
      color_value: false
  individual:
    - entity: sensor.wallbox_pulsar_plus_na_sn_xxxxxx_charging_power
      name: EV
      icon: mdi:car-electric
      color:
        - 180
        - 180
        - 180
      show_direction: false
      display_zero: true
      display_zero_state: true
      unit_of_measurement: W
      color_value: false
      secondary_info:
        template: "{% set s = states('sensor.wallbox_pulsar_plus_na_sn_xxxxxx_status_description') %}{% if s == 'Charging' %}🔋⚡{% elif s == 'Waiting for car demand' %}🔌{% else %}💤{% endif %}"
        color_value: false
clickable_entities: true
display_zero_lines:
  mode: show
  transparency: 50
  grey_color:
    - 189
    - 189
    - 189
use_new_flow_rate_model: true
base_decimals: 0
kilo_decimals: 2
min_flow_rate: 0.75
max_flow_rate: 6
max_expected_power: 5500
min_expected_power: 0.01
kilo_threshold: 1000000
card_mod:
  style: ".circle-container.grid .circle .return { display: none !important; }"
  • grid が電力会社、solar が太陽光、home が家、individual がEV(Wallboxの充電電力)です
  • 丸の中の上にある小さい数字(secondary_info)には、電力会社の丸に売電、家の丸に自家消費を出しています
  • max_expected_power: 5500 は、線の流れる速さの目安にする最大の電力です
  • 最後の card_mod は見た目を細かく調整する設定で、これも追加機能(card-mod)を入れて使っています

まとめ

ばらばらのアプリで見ていた家の電気が、Home Assistantの1つの画面にまとまりました。

載せたコードは全部AIが作ったもので、自分は今もほぼわかっていません。そんな状態でも作れてしまうのは最近のAIのすごいところですね。

次の記事で、この画面にWallboxの操作パネルを足した話を紹介します。

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