Skip to content

Instantly share code, notes, and snippets.

@fbradyirl
Last active March 28, 2026 04:16
Show Gist options
  • Select an option

  • Save fbradyirl/08fef90bd11d7bdddf588a56e668d879 to your computer and use it in GitHub Desktop.

Select an option

Save fbradyirl/08fef90bd11d7bdddf588a56e668d879 to your computer and use it in GitHub Desktop.
Recreate Sigenergy UI (using modbus sensors) as Home Assistant Card
type: custom:button-card
show_state: true
tap_action: none
custom_fields:
home_image:
card:
type: picture
image: local/Sigenergy/home_has_solar_has_car.png
card_mod:
style: |
ha-card {
background-color: transparent;
border: none;
}
sigenstor_home_image:
card:
type: picture
image: local/Sigenergy/sigenstor_home.png
card_mod:
style: |
ha-card {
background-color: transparent;
border: none;
}
ammeter_home_image:
card:
type: picture
image: local/Sigenergy/ammeter_home.png
card_mod:
style: |
ha-card {
background-color: transparent;
border: none;
}
ac_charger_bg_image:
card:
type: picture
image: local/Sigenergy/ac_charger_bg.png
card_mod:
style: |
ha-card {
background-color: transparent;
border: none;
}
pv_power:
card:
type: custom:mushroom-template-card
primary: "{{states('sensor.sigen_inverter_pv_power') | round(1) }}kW"
secondary: SOLAR
multiline_secondary: false
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 14px !important;
font-weight: bold !important;
position: relative;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
overflow: visible !important;
text-align: left;
}
.secondary {
font-size: 12px !important;
color: gray !important;
position: relative;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
load_power:
card:
type: custom:mushroom-template-card
primary: "{{states('sensor.sigen_plant_consumed_power') | round(1) }}kW"
secondary: HOME
multiline_secondary: false
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 14px !important;
font-weight: bold !important;
position: relative;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
overflow: visible !important;
text-align: left;
}
.secondary {
font-size: 12px !important;
color: gray !important;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
position: relative;
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
grid_power:
card:
type: custom:mushroom-template-card
primary: >
{% set import = states('sensor.sigen_plant_grid_import_power') |
round(1) %} {% set export =
states('sensor.sigen_plant_grid_export_power') | round(1) %} {% if
import > 0 %}
{{ import }}kW
{% elif export > 0 %}
{{ -export }}kW
{% else %}
0
{% endif %}
secondary: |
GRID
multiline_secondary: false
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 14px !important;
font-weight: bold !important;
position: relative;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
overflow: visible !important;
text-align: left;
}
.secondary {
font-size: 12px !important;
color: gray !important;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
position: relative;
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
grid_flow_label:
card:
type: custom:mushroom-template-card
primary: >
{% set import = states('sensor.sigen_plant_grid_import_power') |
round(1) %} {% set export =
states('sensor.sigen_plant_grid_export_power') | round(1)
%} {% if import > 0 %}
Importing
{% elif export > 0 %}
Exporting
{% else %} {% endif %}
multiline_secondary: false
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 12px !important;
font-weight: bold !important;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
color: lightgray !important;
position: relative;
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
battery_soc:
card:
type: custom:mushroom-template-card
primary: >
{% set soc = states('sensor.sigen_plant_battery_state_of_charge') %} {%
set soc_power = states('sensor.sigen_plant_battery_power') | round(1)
%}
{% if soc_power != 0 %}
{{ soc_power | abs }}kW · {{ soc }}%
{% else %}
{{ soc }}%
{% endif %}
secondary: SigenStor
multiline_secondary: false
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 14px !important;
font-weight: bold !important;
position: relative;
overflow: visible !important;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
text-align: left;
}
.secondary {
font-size: 12px !important;
color: gray !important;
position: relative;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
battery_discharge_label:
card:
type: custom:mushroom-template-card
primary: >
{% set soc = states('sensor.sigen_plant_battery_state_of_charge') %} {%
set soc_power = states('sensor.sigen_plant_battery_power') | round(1)
%}
{% if soc_power < 0 %}
Discharging
{% else %}
{% endif %}
multiline_secondary: false
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 12px !important;
font-weight: bold !important;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
color: lightgreen !important;
position: relative;
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
battery_charge_label:
card:
type: custom:mushroom-template-card
primary: >
{% set soc = states('sensor.sigen_plant_battery_state_of_charge') %} {%
set soc_power = states('sensor.sigen_plant_battery_power') | round(1)
%}
{% if soc_power == 0 %}
{% else %}
{% if soc_power > 0 %}
Charging
{% endif %}
{% endif %}
multiline_secondary: false
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 12px !important;
font-weight: bold !important;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
color: red !important;
position: relative;
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
ev_soc:
card:
type: custom:mushroom-template-card
primary: >
{% set power = states('sensor.buzz_lightgear_charger_power') | float %}
{% set soc = states('sensor.buzz_lightgear_battery') %} {% set range =
states('sensor.buzz_lightgear_range') | round(0) %} {% if power > 0 %}
{{ power }}kW - {{ soc }}% ({{ range }}km)
{% else %}
{{ soc }}% ({{ range }}km)
{% endif %}
secondary: >
{% set soc = states('sensor.buzz_lightgear_battery') %} {% if soc ==
'unknown' %}
Car Asleep
{% else %}
Buzz Lightgear
{% endif %}
multiline_secondary: false
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 14px !important;
font-weight: bold !important;
position: relative;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
overflow: visible !important;
text-align: left;
}
.secondary {
font-size: 12px !important;
color: gray !important;
position: relative;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
water_diverter_power:
card:
type: custom:mushroom-template-card
primary: >
{% set power = states('sensor.sigen_2024052302935_smart_home_1_power') |
float %} {% if power > 0 %}
{{ power | round(2) }}kW
{% else %}
{% endif %}
secondary: >
{% set power = states('sensor.sigen_2024052302935_smart_home_1_power') |
float %} {% if power > 0 %}
🛁 Heating
{% else %}
{% endif %}
multiline_secondary: false
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 14px !important;
font-weight: bold !important;
position: relative;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
overflow: visible !important;
text-align: left;
}
.secondary {
font-size: 12px !important;
color: gray !important;
position: relative;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
ev_ac_power:
card:
type: custom:mushroom-template-card
primary: >
{% set acrunstatus =
states('sensor.sigen_ac_charger_system_state').split('-')[0] %} {% set
amps = states('number.sigen_ac_charger_charger_output_current') %}
{% if acrunstatus == 'Charging' %}
{{ states('sensor.sigen_ac_charger_charging_power') }} kW ({{ amps | float | round(0) | int }}A)
{% else %}
{{ acrunstatus }}
{% endif %}
secondary: |
AC CHARGER
multiline_secondary: false
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 14px !important;
font-weight: bold !important;
position: relative;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
overflow: visible !important;
text-align: left;
}
.secondary {
font-size: 12px !important;
color: gray !important;
position: relative;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
ev_charging_label:
card:
type: custom:mushroom-template-card
primary: >
{% set soc_power = states('sensor.buzz_lightgear_charger_power') | float
%}
{% if soc_power > 0 %}
Charging
{% else %}
{% endif %}
multiline_secondary: false
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 12px !important;
font-weight: bold !important;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
color: red !important;
position: relative;
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
ev_charging_icon:
card:
type: custom:mushroom-template-card
icon: >-
{% set soc_power = states('sensor.buzz_lightgear_charger_power') | float
%}
{% if soc_power > 0 %}
mdi:lightning-bolt
{% endif %}
icon_color: >-
{% set soc_power = states('sensor.buzz_lightgear_charger_power') | float
%}
{% if soc_power > 0 %}
red
{% endif %}
fill_container: false
card_mod:
style:
mushroom-state-info$: |
.primary {
font-size: 12px !important;
font-weight: bold !important;
letter-spacing: -0.1px !important; /* Reduce letter spacing */
color: lightgreen !important;
position: relative;
overflow: visible !important;
text-align: left;
}
.: |
ha-card {
background-color: transparent;
border: none;
}
vertical_line:
card:
type: custom:button-card
card_mod:
style: |
ha-card {
background-color: transparent;
border: none;
position: relative;
width: 1px;
height: 110px; /* Adjust height as needed */
background-color: gray; /* Light gray background */
overflow: hidden;
animation: rotation 2s linear infinite;
}
.line {
position: absolute;
width: 100%;
height: 100%;
background: linear-gradient(0deg, green 50%, transparent 50%);
background-size: 100% 200%;
}
@keyframes rotation {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(00deg);
}
}
styles:
card:
- align-self: start
- height: >
[[[ return states['input_number.sigen_home_card_height'].state + 'px';
]]]
- opacity: 1
- background-color: transparent
- border: none
custom_fields:
home_image:
- position: absolute
- top: 5px
- left: 10px
- width: 395px
sigenstor_home_image:
- position: absolute
- top: 5px
- left: 10px
- width: 395px
ammeter_home_image:
- position: absolute
- top: 5px
- left: 10px
- width: 395px
ac_charger_bg_image:
- position: absolute
- top: 5px
- left: 10px
- width: 395px
pv_power:
- position: absolute
- top: 15px
- left: 210px
- width: 100px
load_power:
- position: absolute
- top: 15px
- left: 300px
- width: 100px
water_diverter_power:
- position: absolute
- top: 110px
- left: 130px
- width: 100px
grid_power:
- position: absolute
- top: 300px
- left: 300px
- width: 100px
grid_flow_label:
- position: absolute
- top: 335px
- left: 300px
- width: 100px
battery_soc:
- position: absolute
- top: 300px
- left: 175px
- width: 100px
battery_discharge_label:
- position: absolute
- top: 335px
- left: 175px
- width: 100px
battery_charge_label:
- position: absolute
- top: 335px
- left: 175px
- width: 100px
ev_soc:
- position: absolute
- top: 300px
- left: 20px
- width: 100px
ev_ac_power:
- position: absolute
- top: 15px
- left: 20px
- width: 100px
ev_charging_label:
- position: absolute
- top: 335px
- left: 20px
- width: 100px
ev_charging_icon:
- position: absolute
- top: 245px
- left: 10px
- width: 100px
vertical_line:
- position: absolute
- top: 47px
- left: 305px
- width: 1px
- height: 100px
@htbuddha
Copy link
Copy Markdown

htbuddha commented Nov 1, 2025

Still nothing? I'm getting desperate.

@sneekerzzz
Copy link
Copy Markdown

Its a working progress.

Pastebin wont let me.... Using "code" will make the thread so long. so hopefully this works? https://limewire.com/d/n59es#in36tBdSth

Would you mind sharing your yaml again for the animation?

@Budadangol
Copy link
Copy Markdown

any updates yet?

@arwindersingh82
Copy link
Copy Markdown

I'm new to sigenergy - just had mine installed last week. Is there a yaml or something we can use to create the house energy monitor like in the screenshots above? I have modbus enabled and have HA all working

@debantspain
Copy link
Copy Markdown

@arwindersingh82 I for one am certainly looking forward to the YAML that @H4TR1Z will create - no good at coding myself so have to rely on the skills of others.

@russell2200
Copy link
Copy Markdown

This is awesome looking forward to the YAML or card.

@SpengeSec
Copy link
Copy Markdown

SpengeSec commented Mar 26, 2026

Hey everyone!

Since @H4TR1Z never posted their version, I decided to create my own Sigenergy-inspired Home Assistant dashboard. It's still in early development, but I'm excited to share it with the community at this stage.

🔗 Repository: https://github.com/SpengeSec/Genergy-Dashboard

Dashboard preview

Key Features

  • Zero coding required – no manual YAML editing needed
  • Easy setup – guided configuration flow on first run
  • Flexible settings – everything can be adjusted through the settings view
  • Auto-detection – automatically detects entities from the HA Energy Dashboard (just pushed this update!)
  • Sigenergy integration – toggle "Use Sigenergy Default Entities" during setup if you're using the Sigenergy Modbus integration
  • Universal compatibility – works with any setup, not locked to Sigenergy hardware
Settings view

EMHASS Support

The dashboard includes EMHASS forecast visualization. One of our Australian beta testers even successfully used HAEO by mapping their HAEO entities to the EMHASS fields.

⚠️ Work in Progress

This is an early release. Some features are still being developed, and not all settings options are fully functional yet. Please be patient with bugs and rough edges – I'll be improving things over time!

Looking forward to your feedback and contributions!

@Roving-Ronin
Copy link
Copy Markdown

Roving-Ronin commented Mar 27, 2026

@SpengeSec

Great work / thank you. Just installed and I noticed that whilst the setup page reads the 'Power' sensors and shows them as (say) 1.96kW, that on the dashboard it is showing all the power sensors in Watts. So the Inverter Active Power / Solar Power for instance at 1.96kW is showing as '2W'.

Also using the sensor.sigen_plant_battery_power and the dash is showing the power flow the wrong way around. Currently -0.3kW which is discharging, but the dash is showing it as charging.

Also a bit confused as to Battery Current, Battery Pack 1-4 (no 5 & 6?) SoC, Grid Voltage, Inverter Temp (vs the PCS Temp) ... are these for future, as I've not seen these available in Sigenergy modbus registers?

BTW apart from EMHASS, have you seen:

@SpengeSec
Copy link
Copy Markdown

Hi,

I do not use Sigenergy modbus myself, I assume you do?
Can you please create an Issue on the github explaining in detail every step you took? Possibly with screenshots of the issues you're facing and the entities you used?

You're right about needing to add more battery pack entity slots.

Yes I know about HAEO, however I personally use EMHASS.

As I wrote earlier:

"EMHASS Support

The dashboard includes EMHASS forecast visualization. One of our Australian beta testers even successfully used HAEO by mapping their HAEO entities to the EMHASS fields."

You should probably experiment with the Settings View and setting additional entities there yourself, if you use the Sigenergy Use Default Entities toggle in the Config flow.

Thanks!

@Roving-Ronin
Copy link
Copy Markdown

Which integration are you using for querying Sigenergy modbus registers? I actually installed it upon a fresh HA with the MQTT based integration, but none sensors where found/mapped using the 'auto detect' function. Instead I've disabled this, wiped the sensors from HA and installed the modbus integration, following which your integration was able to auto detect most of the sensors.

Main obvious issue atm is that no matter is power sensors are set to use unit of measurement is W or kW, the inverter / inverter details shows it as W (i.e. 2kW shows as 2W) and the flow directions are back to front. For instance Battery currently discharging -2.15kW (kW showing correctly on the house image) but the flow animation is showing it Charging.

image

As above, wondering re the SoC per battery module, Grid Voltage, Battery Current and the 'Battery # Details' card, as there's currently no modbus registers for this to be queried? Or are you somehow getting them another way?

@SpengeSec
Copy link
Copy Markdown

I'm going to push an update soon.

You should use this integration for sigenergy modbus integration: https://my.home-assistant.io/redirect/hacs_repository/?owner=TypQxQ&repository=Sigenergy-Local-Modbus&category=Integration

Furthermore, you can change entitites and additioanl functions in the Settings view (the wheel button top left, second button).

Why is your House image card white? The integration uses the black one as far as I know.

@SpengeSec
Copy link
Copy Markdown

Please update to Version 2.5.0 and restart HA.

Most of your issues should be fixed.

You may want to remove Genergy completely, re-add to HACS and fresh install.
https://github.com/SpengeSec/Genergy-Dashboard?tab=readme-ov-file#changelog

@Roving-Ronin
Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment