Home Energy Management dashboard - Solar, Battery (BESS)

I have been cleaning up automations that have sprawled over the last 5-years. One of these clean-up was replacing my old and, simple solar inverter with a shiny new one.

The new solar system is a substantial improvement on the old one. As soon as it was added, I realised some gaps.

What are the questions this is trying to answer

  • Keeping information and control in my hands, not with a cloud service (Security)
  • What is the local technology doing now? (Infomation)
  • How can the technology lower my electricity bills? (Manual control)
  • How can I change what I’m doing to be more efficient? (Education)
  • How can I use automation to work with my grid supplier? (Supplychain)
  • Why was this a good financial investment? (Wife-proofing)

Here is the critical hardware used:

  • Fronius GEN24 (Inverter)
  • Fronius Smart IP Meter
  • Fronius Reserva Battery Energy Storage Solution (BESS)
  • Fronius Wattpilot Flex (EV Charger)

Associated articles:

What do you need to be successful?

  • Home assistant + HACS
  • Static IP address for inverter (or smart meter) and EV charger
  • Inverter will require the technician password or at least the technician to enable some settings for this to work (username + password)
  • EV charger will require the serial number and the default password

Step 1:
Add custom repo’s in HACS (http://homeassistant.local:8123/hacs/dashboard → 3 dots menu in top right → custom repositories)

https://github.com/francois-le-ko4la/lovelace-entity-progress-card
https://github.com/Clooos/bubble-card
https://github.com/rosenrot00/home-flow-card
https://github.com/piitaya/lovelace-mushroom

Step 2.
Restart Home Assistant

Step 3.
See what code below is relevant for your setup and replicate it on your HA.

Main dashboard (Mobile and desktop)

Mobile:

Desktop:

Header using Markdown card + grouped badges (not 100% in love with the badges)

type: markdown
text_only: true
content: '# Energy Management'

Footer using progress card, this is fairly standard in most of my individual cards
image

type: custom:entity-progress-card
entity: sensor.reserva_state_of_charge_2
min_value: 0
bar_size: large
theme: optimal_when_high
layout: horizontal
tap_action:
  action: none
hold_action:
  action: none
double_tap_action:
  action: none
icon_tap_action:
  action: none
icon_hold_action:
  action: none
icon_double_tap_action:
  action: none
max_value: 100
hide:
  - icon
name: Battery Storage (State of Charge)
grid_options:
  columns: full

Left panel Main consumption displays. These are all read-only to view what current consumption looks like.

  • Backup controller: this is a module of the Solar inverter. Only displayed if the grid is offline
type: custom:bubble-card
card_type: button
entity: binary_sensor.outside_utility_wall_solarnet_backup_mode
button_type: state
sub_button:
  main: []
  bottom: []
force_icon: false
rows: '2'
card_layout: large
scrolling_effect: true
visibility:
  - condition: state
    state: 'on'
grid_options:
  columns: full
name: 'WARNING: We are in a critical backup-mode, no connection to the Synergy Grid'
icon: mdi:alert-decagram
show_last_updated: true
show_attribute: false
show_last_changed: false
tap_action:
  action: none
double_tap_action:
  action: none
hold_action:
  action: none
  • Solar generation (day): this is a module of the Solar inverter. Only displayed when solar is generating
type: custom:button-card
entity: sensor.solarnet_power_photovoltaics
name: Solar PV
icon: mdi:solar-power
show_state: true
show_name: true
show_icon: true
show_label: true
label: |
  [[[
    return `Today: ${states['sensor.solar_power_daily']?.state || '--'} kWh`;
  ]]]
state_display: |
  [[[
    const power = parseFloat(entity.state);
    if (isNaN(power)) return '-- kW';
    return `${power.toFixed(2)} kW`;
  ]]]
styles:
  card:
    - height: 220px
    - border-radius: 24px
    - padding: 24px
  grid:
    - grid-template-areas: '"i n" "i s" "i l"'
    - grid-template-columns: 80px 1fr
    - grid-template-rows: 40px 80px 35px
  icon:
    - width: 65px
    - color: var(--primary-color)
  name:
    - justify-self: start
    - align-self: end
    - font-size: 24px
    - font-weight: 600
  state:
    - justify-self: start
    - align-self: center
    - font-size: 48px
    - font-weight: 700
  label:
    - justify-self: start
    - align-self: start
    - font-size: 16px
    - color: var(--secondary-text-color)
tap_action:
  action: more-info
visibility:
  - condition: time
    after: '07:00:00'
    before: '17:00'
  • Energy usage (night): this is an alternative to generation, native graph with hour-by-hour summary of generation/usage
type: energy-usage-graph
expand_legend: false
visibility:
  - condition: time
    after: '17:00:00'
    before: '07:00:00'
  • Live map of key energy usage appliances. Would like to try a few versions of this to clone major inverter apps
type: custom:home-flow-card
nodes:
  - id: leaf-1-copy-copy-copy-3
    kind: leaf
    label: Lights
    entity: sensor.inside_sub_group_energy
    invert: false
    flowDirection: supply
    allowed_flow: both
    hide_zero_values: true
    hide_if_zero: false
    hide_below: 6
    show_flow_arrow: true
    highlight_when_active: true
    active_from: 100
    radius: 65
    icon: mdi:lightning-bolt
  - id: leaf-1-copy-copy
    kind: leaf
    label: Dishwasher
    entity: sensor.kitchen_switch_dishwasher_power
    invert: false
    flowDirection: consume
    allowed_flow: consume
    hide_zero_values: true
    hide_if_zero: false
    hide_below: 6
    show_flow_arrow: true
    highlight_when_active: true
    active_from: 100
    radius: 65
    icon: mdi:dishwasher
  - id: leaf-1-copy-copy-copy-2
    kind: leaf
    label: Washing Machine
    entity: sensor.laundry_washing_machine_power
    invert: false
    flowDirection: consume
    allowed_flow: consume
    hide_zero_values: true
    hide_if_zero: false
    hide_below: 5
    show_flow_arrow: true
    highlight_when_active: true
    active_from: 100
    radius: 65
    icon: mdi:washing-machine
  - id: leaf-1-copy-2
    kind: leaf
    label: Dryer
    entity: sensor.dryer_gpo_power
    secondary_action: none
    invert: false
    flowDirection: consume
    allowed_flow: consume
    hide_zero_values: true
    hide_if_zero: false
    show_flow_arrow: true
    highlight_when_active: true
    active_from: 100
    radius: 65
    icon: mdi:tumble-dryer
  - id: junction-1
    kind: junction
    label: Appliances
    invert: false
    flowDirection: supply
    balance_role: junction
    radius: 90
    icon: mdi:hub
    color: '#d04b89'
  - id: leaf-1-copy-copy-copy
    kind: leaf
    label: Car
    entity: sensor.tesla_model_3_charger_power
    secondary_entity: sensor.tesla_model_3_battery
    invert: false
    flowDirection: consume
    allowed_flow: consume
    hide_zero_values: true
    hide_if_zero: false
    hide_below: 5
    show_flow_arrow: true
    highlight_when_active: true
    active_from: 100
    radius: 65
    icon: phu:tesla-icon
    color: '#be3aee'
  - id: heat-pump-copy-copy
    kind: leaf
    label: Solar
    flow_mode: bidirectional
    entity: sensor.fronius_symo_gen24_12_0_sc_pv_power
    incoming_entity: sensor.fronius_symo_gen24_12_0_sc_pv_power
    invert: false
    flowDirection: consume
    allowed_flow: supply
    hide_zero_values: true
    hide_if_zero: false
    hide_below: 5
    show_flow_arrow: true
    highlight_when_active: true
    active_from: 500
    radius: 75
    icon: mdi:sun-compass
    color: '#e4d749'
  - id: grid
    kind: junction
    label: Grid
    flow_mode: bidirectional
    incoming_entity: sensor.solarnet_power_grid_import
    outgoing_entity: sensor.solarnet_power_grid_export
    invert: false
    flowDirection: supply
    balance_role: measured
    junction_display_value: net
    show_flow_arrow: true
    highlight_when_active: true
    active_from: 1000
    flowMinVisibleValue: 60
    radius: 65
    icon: mdi:transmission-tower
    color: '#000000'
  - id: heat-pump-copy
    kind: leaf
    label: Battery
    flow_mode: bidirectional
    entity: sensor.fronius_symo_gen24_12_0_sc_pv_power
    incoming_entity: sensor.fronius_symo_gen24_12_0_sc_storage_charging_lifetime_energy
    outgoing_entity: sensor.fronius_symo_gen24_12_0_sc_storage_discharging_lifetime_energy
    secondary_entity: sensor.reserva_state_of_charge_2
    invert: false
    flowDirection: consume
    allowed_flow: supply
    show_flow_arrow: true
    highlight_when_active: true
    active_from: 500
    radius: 75
    icon: mdi:battery-charging-high
    color: '#1f982d'
  - id: home
    kind: junction
    label: Home
    flow_mode: bidirectional
    entity: sensor.fronius_symo_gen24_12_0_sc_pv_power
    incoming_entity: sensor.fronius_symo_gen24_12_0_sc_load
    secondary_entity: sensor.fronius_symo_gen24_12_0_sc_pv_power
    invert: false
    flowDirection: consume
    allowed_flow: both
    balance_role: junction
    flowMinVisibleValue: 60
    radius: 100
    icon: mdi:solar-power
    color: '#3f79c9'
links:
  - id: grid->home
    from: grid
    to: home
    invert: false
  - id: heat-pump-copy->home
    from: heat-pump-copy
    to: home
    invert: false
  - id: heat-pump-copy-copy->home
    from: heat-pump-copy-copy
    to: home
    invert: false
  - id: leaf-1-copy-copy-copy->home
    from: leaf-1-copy-copy-copy
    to: home
    invert: false
  - id: junction-1->home
    from: junction-1
    to: home
    invert: false
  - id: leaf-1-copy-copy->junction-1
    from: leaf-1-copy-copy
    to: junction-1
    invert: false
  - id: leaf-1-copy-copy-copy-2->junction-1
    from: leaf-1-copy-copy-copy-2
    to: junction-1
    invert: false
  - id: leaf-1-copy-2->junction-1
    from: leaf-1-copy-2
    to: junction-1
    invert: false
  - id: leaf-1-copy-copy-copy-3->junction-1
    from: leaf-1-copy-copy-copy-3
    to: junction-1
    invert: false
    fromAnchor: 31
    fromAnchorMode: manual
    toAnchor: 20
    toAnchorMode: manual
layout:
  grid:
    x: 94
    'y': 386
  home:
    x: 370
    'y': 386
  heat-pump-copy:
    x: 238
    'y': 602
  heat-pump-copy-copy:
    x: 226
    'y': 170
  leaf-1-copy-copy-copy:
    x: 514
    'y': 170
  junction-1:
    x: 658
    'y': 386
  leaf-1-copy-2:
    x: 814
    'y': 602
  leaf-1-copy-copy-copy-2:
    x: 886
    'y': 386
  leaf-1-copy-copy:
    x: 838
    'y': 182
  leaf-1-copy-copy-copy-3:
    x: 538
    'y': 614
flow_min_visible_value: 10
flow_max_value: 12000
label_style: straight
leaf_routing: sweep
scaling_mode: fit-width
width: 502
height: 360
grid_options:
  columns: full

  • Battery storage: Discharge/charge graphic, using progress bar
    image
type: custom:entity-progress-card
entity: sensor.outside_utility_wall_solarnet_power_battery
bar_size: xlarge
theme: battery_adaptive
layout: horizontal
tap_action:
  action: none
hold_action:
  action: none
double_tap_action:
  action: none
icon_tap_action:
  action: none
icon_hold_action:
  action: none
icon_double_tap_action:
  action: none
hide: []
unit_position: after
unit_spacing: space
reverse_secondary_info_row: true
center_zero: true
height: 100px
marginless: false
frameless: true
bar_effect:
  - shimmer
icon: mdi:battery
name: Battery storage (discharge/charge)
min_value: -6760
max_value: 6760
grid_options:
  columns: full

  • House load: Progress bar of house load usage
    image
type: custom:entity-progress-card
entity: sensor.fronius_symo_gen24_12_0_sc_load
bar_size: xlarge
theme: optimal_when_low
layout: horizontal
tap_action:
  action: none
hold_action:
  action: none
double_tap_action:
  action: none
icon_tap_action:
  action: none
icon_hold_action:
  action: none
icon_double_tap_action:
  action: none
hide: []
unit_position: after
unit_spacing: space
reverse_secondary_info_row: true
center_zero: false
height: 100px
marginless: false
frameless: true
bar_effect:
  - shimmer
icon: mdi:solar-power
max_value: 5000
min_value: 700
name: House Load
bar_color_mode: segment
watermark:
  type: round
  high: false
grid_options:
  columns: full

type: custom:mushroom-template-card
primary: Current energy plan
secondary: >
  {{ states('select.tou_em_channel_b_energy','') }}: Rate of charge is ${{
  states('input_number.energy_tiered_price_current','') }} per kWh
icon: mdi:power-plug-battery
icon_color: |-
  {% set state = states('select.tou_em_channel_b_energy','hvac_action') %}
  {% if state == 'Peak' %}
  red
  {% elif state == 'Off Peak' %}
  amber
  {% elif state == 'Super Off Peak' %}
  green
  {% else %}
  blue
  {% endif %}
entity: select.tou_em_channel_b_energy
badge_color: ''
layout: vertical
fill_container: false

Right panel Battery manual control functions, manual overrides for solar/battery app’s

  • Storage charge options: these generic switches for critical functions
  • Control mode: simple 3 options for Battery Energy Storage Solution (BESS) 3 key options
  • Tile cards for critical limitations required. These are only visible when the option is valid. The vendor only enables each modbus entity when the relevant control mode has been selected.

I am not 100% happy with this right now here are things I would like to replicate from other established vendors:

House visualisation:

Icon visualisation

Elements I like:

  • 2-way flow of supply and consumption
  • Simple icon’s

Hi. I don’t get it what you try to do. But maybe you can try AION EMS Zeus to resolve some parts of that you point as ( I’m not happy ).

It does but, it’s putting control inside another sub-system that doesn’t honour existing HA entities

That’s a fair point, and I understand what you mean.
Zeus is moving toward using existing Home Assistant entities as the authority rather than replacing them with private controls.

For example, if a climate device exposes native HA target temperature/presets, Zeus uses those entities/services directly.
The same principle should apply to battery/EV/etc. controls: Zeus adds intelligence and supervised coordination on top, while the existing HA entities remain usable and authoritative.

Your comment is useful because this is exactly the kind of architecture I want to improve.

looks like someone else has already made this GitHub - SpengeSec/Genergy-Dashboard: A Home Assitant energy dashboard in Sigenergy theme · GitHub

No. Is not the same at all. A few parts yes ( maybe 12 to 15 % ) , but is not the same.
For example: Optimization Relies on EMHASS/HAEO/Energy Manager
Zeus is developing its own planning/intelligence