Animated solar/battery/grid energy flow dashboard for Home Assistant, wired for the Neovolt Modbus integration (host + follower combined, BW-INV-SPB5K).
Fork notice This repository is a fork of DJS91/FoxEss-Energy-Card. All visual design, SVG flow animations, day/night sky, weather overlays, detail-overlay layout, and the foundational card architecture are the work of @DJS91. Full credit to the original author. This fork swaps the FoxESS Modbus wiring for the Neovolt Modbus integration, adds signed power inputs, unit auto-detection, the full Neovolt dispatch model (7 modes), and a dispatch detail overlay. See What changed vs upstream below.
All dispatch_* defaults point at neovolt_host_* entities. The host inverter commands the entire system unilaterally — the follower follows automatically. Do not point dispatch_mode_select, dispatch_power_number, dispatch_duration_number, dispatch_target_soc_number, or dispatch_cutoff_soc_number at follower entities; the follower exposes those as read-only mirrors and writing to them has no effect.
If you change the dispatch mode via the card / select.neovolt_host_dispatch_mode, the follower mirrors it within a poll cycle.
- Card type renamed to
custom:neovolt-energy-card(oldcustom:energy-flow-cardstill works as alias). - All editor placeholders + stub defaults now point at Neovolt entities (
sensor.neovolt_host_combined_*,sensor.neovolt_host_*,sensor.neovolt_follower_pv1_*, etc). - Auto-detect power units: reads
unit_of_measurementand converts kW/MW to W internally. Mix W and kW sources freely. - Two new signed-power inputs that replace the legacy positive-only pairs:
grid_power_sensor—+import,−exportbattery_power_sensor—+discharge,−charge The legacygrid_feed_in_sensor/grid_consumption_sensor/battery_charge_sensor/battery_discharge_sensorinputs are still accepted as fallbacks.
- Full Neovolt dispatch model: all 7 dispatch modes get distinct accent colors (Normal/Force Charge/Force Discharge/Dynamic Export/Dynamic Import/No Battery Charge/Idle).
- New dispatch detail card in the overlay showing target power, target/cutoff SOC, and remaining time (from
dispatch_statusdispatch_time_remaining_sattribute). - Footer "Dispatch" row replaces "Inverter Mode" with live mode + target + countdown.
- Animated solar/battery/grid/home wires with photon flow
- Day/night sky gradient + sun position + stars
- Live weather clouds + rain (from a
weather.*entity) - Detail overlay: PV strings, temps, faults, battery health
- All fields configurable via visual editor
- Copy
dist/neovolt-energy-card.jsto/config/www/neovolt-energy-card.js - Settings → Dashboards → Resources → Add Resource
- URL:
/local/neovolt-energy-card.js - Type:
JavaScript module
- URL:
- Hard refresh browser, then add the card to a dashboard.
| Entity | Purpose |
|---|---|
input_boolean.energy_house_image_day_cycle |
Day/night sky + weather overlay |
input_boolean.energy_vision_details |
Detail overlay (PV strings, temps, dispatch box) |
Create via Settings → Devices & Services → Helpers → Create Helper → Toggle.
type: custom:neovolt-energy-card
# Base Energy
solar_generation_sensor: sensor.neovolt_host_combined_pv_power
grid_power_sensor: sensor.neovolt_host_grid_total_active_power # signed: + import / - export
battery_power_sensor: sensor.neovolt_host_combined_battery_power # signed: + discharge / - charge
battery_soc_sensor: sensor.neovolt_host_combined_battery_soc
load_power_sensor: sensor.neovolt_host_combined_house_load
inverter_state_sensor: sensor.neovolt_host_battery_status
dispatch_mode_select: select.neovolt_host_dispatch_mode
# Dispatch detail (shown in overlay when active)
dispatch_status_sensor: sensor.neovolt_host_dispatch_status
dispatch_power_number: number.neovolt_host_dispatch_power
dispatch_duration_number: number.neovolt_host_dispatch_duration
dispatch_target_soc_number: number.neovolt_host_dispatch_charge_target_soc
dispatch_cutoff_soc_number: number.neovolt_host_dispatch_discharge_cutoff_soc
# Inverter details
inverter_temp_sensor: sensor.neovolt_host_inverter_module_temperature
battery_temp_sensor: sensor.neovolt_host_battery_buck_boost_temperature
cell_temp_low_sensor: sensor.neovolt_host_combined_battery_min_cell_temperature
cell_temp_high_sensor: sensor.neovolt_host_combined_battery_max_cell_temperature
grid_voltage_sensor: sensor.neovolt_host_grid_voltage_phase_a
grid_current_sensor: sensor.neovolt_host_grid_current_phase_a
battery_soh_sensor: sensor.neovolt_host_combined_battery_soh
inverter_fault_sensor: sensor.neovolt_host_inverter_fault
# PV strings — host has PV1-3, follower has its own PV1 (shown as PV4)
pv1_power_sensor: sensor.neovolt_host_pv1_power
pv1_current_sensor: sensor.neovolt_host_pv1_current
pv1_voltage_sensor: sensor.neovolt_host_pv1_voltage
pv2_power_sensor: sensor.neovolt_host_pv2_power
pv2_current_sensor: sensor.neovolt_host_pv2_current
pv2_voltage_sensor: sensor.neovolt_host_pv2_voltage
pv3_power_sensor: sensor.neovolt_host_pv3_power
pv3_current_sensor: sensor.neovolt_host_pv3_current
pv3_voltage_sensor: sensor.neovolt_host_pv3_voltage
pv4_power_sensor: sensor.neovolt_follower_pv1_power
pv4_current_sensor: sensor.neovolt_follower_pv1_current
pv4_voltage_sensor: sensor.neovolt_follower_pv1_voltage
# Overlays
day_cycle_boolean: input_boolean.energy_house_image_day_cycle
details_overlay_boolean: input_boolean.energy_vision_details
weather_entity: weather.your_location_hourly
solar_label: SOLAR
background_image: /local/energy-house.png
model_label: NEOVOLT BW-INV-SPB5K # small badge text bottom-right, set '' to hide| Key | Description |
|---|---|
grid_power_sensor |
Single signed grid power: + import, − export (preferred) |
grid_feed_in_sensor / grid_consumption_sensor |
Legacy unsigned pair (used if grid_power_sensor not set) |
battery_power_sensor |
Single signed battery power: + discharge, − charge (preferred) |
battery_charge_sensor / battery_discharge_sensor |
Legacy unsigned pair |
battery_soc_sensor |
Battery SOC % |
load_power_sensor |
Home load |
inverter_state_sensor |
Inverter / battery status text |
dispatch_mode_select |
The select.neovolt_*_dispatch_mode entity |
solar_generation_sensor |
Combined PV power |
solar_label |
Optional label (default SOLAR) |
Power inputs may be in W, kW, or MW — auto-detected from unit_of_measurement.
| Key | Default |
|---|---|
dispatch_status_sensor |
sensor.neovolt_host_dispatch_status |
dispatch_power_number |
number.neovolt_host_dispatch_power |
dispatch_duration_number |
number.neovolt_host_dispatch_duration |
dispatch_target_soc_number |
number.neovolt_host_dispatch_charge_target_soc |
dispatch_cutoff_soc_number |
number.neovolt_host_dispatch_discharge_cutoff_soc |
Mode color mapping:
| Mode | Accent |
|---|---|
| Normal | green |
| Force Charge | blue + pulse |
| Dynamic Import | cyan |
| Force Discharge | amber + falling $ |
| Dynamic Export | violet |
| No Battery Charge | orange |
| Idle (No Dispatch) | gray |
Same as upstream — see Inverter / Grid / Top-Right / PV / Overlay sections in the visual editor.
MIT — same as upstream. Original copyright belongs to @DJS91; fork modifications copyright the fork contributors.
- Original card, design, and SVG animation work: @DJS91 — FoxEss-Energy-Card. The card you see on screen is fundamentally their work; this fork only rewires entity inputs and adds Neovolt-specific dispatch UI on top.
- Neovolt Modbus rewiring + dispatch model: this fork.
- Neovolt integration entities: the Neovolt Home Assistant integration.
If you like this card, please ⭐ the upstream repo too.