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

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

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

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
- Current tariff: should change colours based on my 4 tariffs
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.












