Configuration Reference
Complete guide to all configuration parameters with explanations and practical examples
Quick Navigation
Optimizer Configuration
Choose your optimization backend. EOS Connect ships with a built-in optimizer
(local_evopt) that requires no external server, plus connectors to the Akkudoktor
EOS server and the external EVopt server.
eos.source
| Parameter | eos.source |
|---|---|
| Description | Which optimization backend to use |
| Valid Values | local_evopt, eos_server, evopt |
| Default | local_evopt |
| Notes |
local_evopt: Built-in MILP optimizer — no external server needed.
Based on the evcc-io/optimizer
engine (MIT license). Supports configurable charging/discharging strategies,
emergency battery reserve, and optional grid import/export limits. eos_server: Full-featured Akkudoktor EOS (GitHub) — requires external server evopt: External EVopt server (GitHub) — requires external server |
eos.server
| Parameter | eos.server |
|---|---|
| Description | Hostname or IP address of your EOS/EVopt server |
| Required | Only when eos.source is eos_server or evopt |
| Examples |
homeassistant192.168.1.50eos.local
|
eos.port
| Parameter | eos.port |
|---|---|
| Description | Port number of your optimization server |
| Valid Values |
8503 for eos_server7050 for evopt
|
| Required | Only when eos.source is eos_server or evopt |
Built-in Optimizer Settings (local_evopt)
These settings are only active when eos.source = local_evopt.
They control the strategy, battery reserve, and optional grid limits used
by the built-in MILP solver.
eos.local_evopt_charging_strategy
| Parameter | eos.local_evopt_charging_strategy |
|---|---|
| Description | How the optimizer prefers to charge the battery |
| Valid Values |
charge_before_export — charge battery before exporting surplus PV (default)maximize_self_consumption — prefer charging from PV, penalise grid export and reward battery charging to lower the effective charge break-even priceattenuate_grid_peaks — charge when PV production is high to smooth grid peaksnone — no charging preference; pure cost optimization
|
| Default | charge_before_export |
| Hot-reloadable | Yes — changes take effect immediately and trigger a new optimization run. No restart required. |
eos.local_evopt_discharging_strategy
| Parameter | eos.local_evopt_discharging_strategy |
|---|---|
| Description | How the optimizer prefers to discharge the battery |
| Valid Values |
discharge_before_import — prefer using battery before importing from grid (default)emergency_reserve — keep a minimum SOC at end of optimization horizon
(configure the percentage with local_evopt_emergency_reserve_pct)none — no discharging preference; pure cost optimization
|
| Default | discharge_before_import |
| Hot-reloadable | Yes — changes take effect immediately and trigger a new optimization run. No restart required. |
eos.local_evopt_emergency_reserve_pct
| Parameter | eos.local_evopt_emergency_reserve_pct |
|---|---|
| Description |
Minimum battery state-of-charge to maintain at the end of the optimization horizon
when discharging_strategy = emergency_reserve.
The optimizer will strongly prefer to keep the battery above this level.
|
| Valid Values | Integer 0–80 (%) |
| Default | 0 (disabled) |
| Requires | local_evopt_discharging_strategy = emergency_reserve |
| Example | Set to 20 to keep at least 20% battery charge in reserve |
| Hot-reloadable | Yes — changes take effect immediately and trigger a new optimization run. No restart required. |
eos.local_evopt_max_grid_import_w
| Parameter | eos.local_evopt_max_grid_import_w |
|---|---|
| Description | Hard upper limit on grid import power in Watts. The optimizer will not schedule grid imports exceeding this value per time slot. Useful for households with a contracted grid connection limit or demand-charge tariffs. |
| Valid Values | Integer 0–100000 (W). Set to 0 to disable this constraint (optimizer uses battery charge max and inverter limits only). |
| Default | 0 (no additional limit) |
| Level | Expert |
eos.local_evopt_max_grid_export_w
| Parameter | eos.local_evopt_max_grid_export_w |
|---|---|
| Description | Hard upper limit on grid export power in Watts. Useful when your grid contract or inverter limits how much energy you can feed in. |
| Valid Values | Integer 0–100000 (W). Set to 0 to disable this constraint (optimizer uses battery discharge max only). |
| Default | 0 (no additional limit) |
| Level | Expert |
eos.local_evopt_num_threads
| Parameter | eos.local_evopt_num_threads |
|---|---|
| Description |
Number of threads for the CBC solver. 0 lets the solver decide
automatically. On low-powered devices (e.g. Raspberry Pi), limiting to
1 or 2 can improve stability.
|
| Valid Values | Integer 0–32. Set to 0 for auto. |
| Default | 0 (auto) |
| Level | Expert |
eos.local_evopt_time_limit
| Parameter | eos.local_evopt_time_limit |
|---|---|
| Description |
Maximum solver time in seconds. 0 uses 80% of the EOS timeout
as the limit. Set explicitly if you want to cap solve time independently
of the overall timeout.
|
| Valid Values | Integer 0–600 (seconds). Set to 0 for auto. |
| Default | 0 (auto) |
| Level | Expert |
eos.time_frame
| Parameter | eos.time_frame |
|---|---|
| Description | Granularity of optimization time steps |
| Unit | Seconds |
| Valid Values |
3600 - Hourly optimization (EOS server only option; EVopt also supports this)900 - 15-minute optimization (EVopt only; will be auto-corrected to 3600 if used with EOS server)
|
| Default | 3600 |
| Notes | Smaller values = more detailed optimization but higher computational load. See Time Slot Configuration & Optimizer Constraints for supported values and optimizer limitations. |
eos.timeout
| Parameter | eos.timeout |
|---|---|
| Description | Maximum time to wait for optimization response |
| Unit | Seconds |
| Default | 180 |
| Example | 120-180 for normal operation |
| Notes | Increase if optimization takes longer or server is slow |
eos.dyn_override_discharge_allowed_pv_greater_load
| Parameter | eos.dyn_override_discharge_allowed_pv_greater_load |
|---|---|
| Description | Dynamically allow battery discharge when solar PV forecast exceeds household load |
| Valid Values | true, false |
| Default | false (disabled) |
| When to Enable | Enable when you want to prevent grid input during cloud shadows. This feature overrides the optimizer's discharge decision when solar generation exceeds current load. |
| Notes |
|
| Hot-reloadable | Yes — changes take effect immediately and trigger a new optimization run so the effect is visible at once. No restart required. |
eos.pv_battery_charge_control_enabled
| Parameter | eos.pv_battery_charge_control_enabled |
|---|---|
| Description | Allows the optimizer to control PV-to-battery charging on a per-slot basis using the dc_charge signal. When enabled, slots where the optimizer plans no PV charging (e.g. negative price slots, battery near full) will physically block PV→battery charging. |
| Valid Values | true, false |
| Default | false (disabled) |
| Notes |
Fronius Gen24 only — Hardware charge blocking via TOU register. All other inverter types are unaffected regardless of this setting.
|
Dynamic PV Override Explained
The Dynamic PV Override automatically allows battery discharge when solar production exceeds household load, preventing unwanted grid input.
How It Works
The system compares each time slot:
- PV Forecast vs Household Load
If PV > Load and optimizer said "avoid discharge", the system automatically allows discharge instead.
Common Scenarios
| Scenario | Without Override | With Override |
|---|---|---|
| Morning cloud shadow with high solar forecast | Battery holds, PV excess → grid | Battery discharges, supplies household directly |
| High solar day + low current load | Grid import despite available PV | Battery covers load, self-consumption maximized |
Priority Hierarchy
- Manual Override (Highest - takes full control)
- Dynamic Override (automatic PV>Load detection)
- EV Charging (EVCC modes)
- Optimizer Decision (default)
Configuration Example
eos:
source: eos_server
server: 192.168.1.50
port: 8503
time_frame: 3600
dyn_override_discharge_allowed_pv_greater_load: true # Enable
Dashboard Indicators
Green Triangle: Mode indicator shows green triangle when active
Green Label: \"Dynamic Override Active\" + \"PV > Load\" in control panel
Green Overlay: Chart shows green shading for future slots where override applies
Monitoring & Logs
Check logs for activation events:
[OPTIMIZATION] Dynamic PV>Load override ACTIVATED for step 3 (14:00): PV=2500 Wh > Load=1800 Wh - discharge allowed overridden to TRUE
EVCC Configuration
- Data source for PV forecasts — Retrieve solar generation forecasts from your EVCC system
- Inverter control gateway — Manage battery charging through EVCC's external battery control interface
- Car charging dependent control — Coordinate EV charging with optimization decisions
If not using EVCC: Simply skip this section and leave the URL empty. Other configuration sections do not depend on EVCC.
evcc.url
| Parameter | evcc.url |
|---|---|
| Description | URL for the EVCC instance |
| Example | http://192.168.1.100:7070 |
| Notes |
Leave empty if not used: url: or url: ""Important: When using evcc as the pv_forecast_source, this EVCC configuration must be properly configured. EOS Connect will retrieve PV forecasts directly from the EVCC API instead of using individual PV installation configurations. In this case, the pv_forecast section requires at least one entry with valid lat and lon coordinates for temperature forecasts.
|
inverter.type is set to evcc, EOS Connect uses EVCC's external battery control feature to manage battery charging. This provides a universal interface that works with many inverter types supported by EVCC.
Inverter Configuration
Configure inverter control for automated battery management.
inverter.type
| Parameter | inverter.type |
|---|---|
| Description | Type of inverter for automated control |
| Valid Values |
victron - Victron MultiPlus (3-phase ESS via Modbus/TCP)fronius_gen24 - Fronius Gen24 (enhanced V2 interface, firmware-based auth)fronius_gen24_legacy - Fronius Gen24 (legacy V1 interface)homeassistant - Generic Home Assistant inverter control via service callsevcc - Universal via EVCC external battery controldefault - Disable control (display only)
|
| Default | default |
inverter.address
| Parameter | inverter.address |
|---|---|
| Description | IP address of the inverter / device |
| Required | Yes (for victron, fronius_gen24, fronius_gen24_legacy) |
| Example |
192.168.1.12 (Fronius)192.168.1.50 (Victron CCGX/Cerbo GX)
|
| Notes |
Victron: Set a static IP on your Victron device (CCGX, Cerbo GX, or Venus OS host). Modbus/TCP connection will use port 502 (standard). Fronius: IP address of the inverter's local portal. |
inverter.user
| Parameter | inverter.user |
|---|---|
| Description | Username for inverter's local portal (Fronius only) |
| Required | Yes (for fronius_gen24, fronius_gen24_legacy) |
| Example | customer |
inverter.password
| Parameter | inverter.password |
|---|---|
| Description | Password for inverter's local portal (Fronius only) |
| Required | Yes (for fronius_gen24, fronius_gen24_legacy) |
| Notes | Fronius Gen24 enhanced interface: Automatically detects firmware version and uses appropriate auth method. If you updated firmware to 1.38.6-1+ or newer, you may need to reset password in WebUI (http://your-inverter-ip/) under Settings → User Management. |
Victron MultiPlus Configuration
Requirements:
- Victron MultiPlus 3-phase system (single-phase support is experimental)
- ESS (Energy Storage System) mode enabled on the Victron device
- Network connectivity between EOS Connect and the Victron device's IP address
- Default Modbus/TCP port: 502 (standard)
How It Works:
- Discharge Allowed Mode: Normal ESS operation - Victron's internal logic manages battery discharge and grid interaction
- Avoid Discharge Mode (Hold): ESS switches to External Control, setpoint writes 0W to all phases - prevents battery discharge and grid import
- Charge from Grid: Positive power setpoint written to MultiPlus - inverter regulates grid import to charge batteries
- Auto Restore: When EOS Connect disconnects, original ESS mode is automatically restored
inverter.max_pv_charge_rate value is used by the optimizer model only. When the optimizer requests dc_charge=0 (no PV charging) for a time slot, EOS Connect logs a warning but cannot enforce this on the hardware — PV will still charge the battery if solar energy is available.
inverter.max_grid_charge_rate
| Parameter | inverter.max_grid_charge_rate |
|---|---|
| Description | Maximum grid charge rate |
| Unit | Watts (W) |
| Default | 5000 |
| Notes | Limitation for calculating target grid charge power and for EOS inverter model. Currently not supported by EVCC external battery control, but shown and calculated (reachable per EOS Connect API) |
inverter.max_pv_charge_rate
| Parameter | inverter.max_pv_charge_rate |
|---|---|
| Description | Maximum PV charge rate |
| Unit | Watts (W) |
| Default | 5000 |
| Notes |
Upper cap for the optimizer model and the target PV charge power calculation. Fronius Gen24 ( fronius_gen24, fronius_gen24_legacy): Actively enforced via the Time-of-Use (TOU) API on every control cycle. When the optimizer sets dc_charge=0 for a slot, a CHARGE_MAX:0 TOU entry is written to the inverter, explicitly blocking PV-to-battery charging. When dc_charge>0, a CHARGE_MAX:<rate> entry is written instead, allowing PV charging up to this wattage.All other inverter types (Victron, HA, EVCC, default): Value is stored internally and used by the optimizer model only — no hardware PV charge limiting is performed. For Victron ESS, blocking PV charging via Modbus is not supported; a warning is logged when dc_charge=0 is requested.
|
Home Assistant Service Call Sequences
When using inverter.type: homeassistant, define the HA service calls to execute for each battery control mode. Each field accepts a JSON array of service call objects.
inverter.charge_from_grid
| Parameter | inverter.charge_from_grid |
|---|---|
| Type | JSON Array |
| Description | Service calls to execute when charging from grid |
| Default | [] |
| Availability | Only visible/required when inverter.type = "homeassistant" |
| Notes |
Use {{ power }} template variable in data_template to receive the optimal wattage from EOS Connect.Example:
|
inverter.avoid_discharge
| Parameter | inverter.avoid_discharge |
|---|---|
| Type | JSON Array |
| Description | Service calls to execute when preventing battery discharge (hold mode) |
| Default | [] |
| Availability | Only visible/required when inverter.type = "homeassistant" |
| Notes |
Use this mode when battery should not discharge but PV charging is allowed. Typically sets the inverter to "hold" or "standby" mode. Example for Sungrow:
|
inverter.discharge_allowed
| Parameter | inverter.discharge_allowed |
|---|---|
| Type | JSON Array |
| Description | Service calls to execute for normal battery discharge mode |
| Default | [] |
| Availability | Only visible/required when inverter.type = "homeassistant" |
| Notes |
Use this mode when battery is allowed to discharge normally (providing power to the home and grid). Example:
|
The homeassistant inverter type allows controlling any inverter/battery system that is integrated into Home Assistant via configurable service call sequences (e.g., Marstek, Sungrow, Goodwe, custom ESPHome integrations).
Credentials: The inverter automatically uses your data_source credentials (URL and token) — no separate HA authentication needed. This ensures all HA integrations (sensors, inverter control) use the same connection.
Service Call Sequences: For each battery control mode, define a JSON array of Home Assistant service calls:
charge_from_grid– Service calls to charge from grid. Supports{{ power }}template variable indata_templatefor dynamic wattage.avoid_discharge– Service calls to hold battery (no discharge, PV charging allowed).discharge_allowed– Service calls for normal battery discharge.
Service Call Format: Each call in a sequence must specify:
service– The HA service domain and action (e.g.,select.select_option,number.set_value)entity_id– The target entity (e.g.,select.mt1_betriebsmodus)dataordata_template– Parameters for the service call
Note: These fields are JSON arrays. Use valid JSON syntax (square brackets, quotes on strings). The web UI provides a JSON editor with syntax validation.
See the Marstek example below for a complete working configuration.
Data Source
Define the primary data connection that EOS Connect uses to read sensor values and send control commands.
battery.soc_sensorrefers to an entity or item from this sourceload.load_sensorrefers to an entity or item from this sourcepv_forecast.inverter_iduses this source's API for PV data
You do not need to configure this in each section separately. This is your only connection configuration.
data_source.type
| Parameter | data_source.type |
|---|---|
| Description | The primary integration platform for sensor data |
| Options |
homeassistant – Home Assistant (recommended for most users)openhab – OpenHAB system
|
| Default | homeassistant |
data_source.url
| Parameter | data_source.url |
|---|---|
| Description | Connection URL or IP address of your data source |
| Examples |
http://192.168.1.100:8123 (Home Assistant)http://192.168.1.100:8080 (OpenHAB)
|
data_source.access_token
| Parameter | data_source.access_token |
|---|---|
| Description | Authentication token for accessing your data source API |
| For Home Assistant | Create a Long-Lived Access Token: Profile → Long-Lived Access Tokens → Create Token |
| For OpenHAB | Find or create an API token in OpenHAB settings |
data_source.ssl_ignore
| Parameter | data_source.ssl_ignore |
|---|---|
| Description | Disable SSL/TLS certificate verification for HTTPS connections |
| Valid Values |
true – Disable SSL verification (not recommended for production)false – Enable SSL verification (default, secure)
|
| Default | false |
| Requires Restart | Yes |
| Expert Level | Yes — only visible in advanced configuration |
- Your Home Assistant or OpenHAB uses a self-signed certificate
- Your Home Assistant or OpenHAB uses a private CA certificate
- The connection is within a trusted, isolated private network
- You understand and accept the security trade-offs
If using HTTPS with a valid public certificate, keep this disabled.
Troubleshooting Connection Errors
If you see SSL certificate errors like:
SSLError: Certificate verify failed
SSLError: [SSL: SELF_SIGNED_CERT_REJECT] self signed certificate
Step 1 (Recommended): Install a valid certificate using Let's Encrypt (free) via your reverse proxy or DNS.
Step 2: If Step 1 isn't feasible, enable this option in Settings → Data Source, then restart EOS Connect.
Example Configuration
data_source:
type: homeassistant
url: https://homeassistant.local:8123 # Self-signed certificate
access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
ssl_ignore: true # ⚠️ Only because of self-signed cert in private network
Battery Configuration
Configure your battery system for state-of-charge monitoring and optimization.
battery.source
| Parameter | battery.source |
|---|---|
| Description | Data source for battery SOC (State of Charge) |
| Valid Values |
openhab - OpenHAB integrationhomeassistant - Home Assistant integrationdefault - Static data
|
battery.url
| Parameter | battery.url |
|---|---|
| Description | URL for OpenHAB or Home Assistant server |
| Examples |
http://192.168.1.50:8080 (OpenHAB)http://homeassistant:8123 (Home Assistant)
|
battery.soc_sensor
| Parameter | battery.soc_sensor |
|---|---|
| Description | Item/entity name for the SOC sensor |
| Valid Values |
OpenHAB: Decimal (0-1), percentage (0-100), or UoM ('0 %' - '100 %') Home Assistant: Entity ID (e.g., sensor.battery_soc)
|
battery.access_token
| Parameter | battery.access_token |
|---|---|
| Description | Access token for Home Assistant authentication |
| Notes | Required for Home Assistant. Independent from load configuration token. Leave empty if not needed: access_token: |
battery.capacity_wh
| Parameter | battery.capacity_wh |
|---|---|
| Description | Total capacity of the battery |
| Unit | Watt-hours (Wh) |
| Example | 11059 (11.059 kWh) |
battery.charge_efficiency
| Parameter | battery.charge_efficiency |
|---|---|
| Description | Efficiency of charging the battery |
| Valid Values | Decimal between 0 and 1 |
| Example | 0.88 (88% efficient) |
battery.discharge_efficiency
| Parameter | battery.discharge_efficiency |
|---|---|
| Description | Efficiency of discharging the battery |
| Valid Values | Decimal between 0 and 1 |
| Example | 0.88 (88% efficient) |
battery.max_charge_power_w
| Parameter | battery.max_charge_power_w |
|---|---|
| Description | Maximum charging power for the battery |
| Unit | Watts (W) |
| Example | 5000 |
battery.min_soc_percentage
| Parameter | battery.min_soc_percentage |
|---|---|
| Description | Minimum state of charge for the battery |
| Unit | Percentage (%) |
| Example | 5 |
battery.max_soc_percentage
| Parameter | battery.max_soc_percentage |
|---|---|
| Description | Maximum state of charge for the battery |
| Unit | Percentage (%) |
| Example | 100 |
battery.charging_curve_enabled
| Parameter | battery.charging_curve_enabled |
|||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Description | Enable dynamic charging curve for battery protection | |||||||||||||||||||||||||||
| Valid Values |
true - Enable dynamic curve (SOC + temperature based)false - Always charge at max power
|
|||||||||||||||||||||||||||
| Default | true |
|||||||||||||||||||||||||||
| Notes |
SOC-based reduction: At SOC ≤50%, full power. Above 50%, exponentially reduced to ~5% at 95% SOC. Temperature protection: If sensor_battery_temperature configured, uses a generic temperature derating curve derived from BYD HVM battery thermal specifications. This generic approach works with any battery chemistry or manufacturer:
Combined Effect: The final charging power is the product of both SOC and temperature multipliers. Example: At 10.5°C with 30% SOC, a 3 kWh battery would charge at ~71% power applying the generic curve derived from BYD specifications. |
battery.sensor_battery_temperature
| Parameter | battery.sensor_battery_temperature |
|---|---|
| Description | Sensor/item identifier for battery temperature |
| Unit | Celsius (°C) |
| Valid Values | Temperature range: -30°C to 70°C |
| Default | "" (disabled) |
| Example | sensor.byd_battery_box_premium_hv_temperatur (BYD Battery Box) |
| Notes | Highly recommended for battery protection. Enables automatic temperature-based charging power reduction. Values outside the -30°C to 70°C range are ignored for safety. If not configured or sensor fails, temperature protection is disabled and only SOC-based curve is used. |
battery.price_euro_per_wh_accu
| Parameter | battery.price_euro_per_wh_accu |
|---|---|
| Description | Static price for battery energy storage |
| Unit | Euro per Wh (€/Wh) |
| Default | 0 |
| Notes | Can be used to shift optimization results based on available energy |
Battery Price Calculation Sensors
To enable dynamic price calculation, configure these sensors in the web UI ( Settings → Battery):
| Sensor | Description | Example |
|---|---|---|
battery_power_sensor |
Battery charge/discharge power (W) | sensor.battery_power |
pv_power_sensor |
Total PV generation (W) | sensor.total_pv_power |
grid_power_sensor |
Grid import/export (W) | sensor.grid_power |
load_power_sensor |
Household consumption (W) | sensor.household_load |
price_sensor |
Current electricity price | sensor.electricity_price |
[BATTERY-PRICE] Detected conventions: battery=... grid=...
and diagnostic lines mentioning
PV≈0 but PV attribution occurred. This indicates sensor misalignment previously — now automatically corrected.
battery.price_euro_per_wh_sensor
| Parameter | battery.price_euro_per_wh_sensor |
|---|---|
| Description | Sensor/item that exposes battery price dynamically |
| Unit | Euro per Wh (€/Wh) |
| Example | sensor.battery_price (Home Assistant) |
| Notes | If configured, overrides static price_euro_per_wh_accu value. Leave empty to use static price. |
Dynamic Battery Price Calculation
Dynamic Battery Price Calculation
EOS Connect can automatically calculate the real cost of energy in your battery by analyzing historical charging events using a Last-In, First-Out (LIFO) inventory model.
How it Works:
- Event Detection: The system scans historical data (default 96h) to identify "charging events" where battery power was above the
charging_threshold_w. - Source Attribution: For each event, it compares battery power with PV production and grid import. If grid import is significant (above
grid_charge_threshold_w), energy is attributed to grid charging at the market price. PV surplus energy is attributed to solar charging at zero cost by default (since PV generation has no per-kWh marginal cost). Optionally, you can assign the feed-in tariff as an opportunity cost for PV-sourced energy by enablingbattery_price_include_feedin— in that case the configuredprice.feed_in_priceis used as the PV energy cost. - Inventory Valuation (LIFO): Instead of a simple average, the system uses a Last-In, First-Out model. It looks at the most recent charging sessions that match your current battery level. This ensures the price reflects the actual "value" of the energy currently inside the battery.
- Optimizer Integration: The resulting price is used by the optimizer to decide when it's profitable to discharge the battery.
- Efficiency: To minimize API load, the system uses a two-step fetching strategy: it first fetches low-resolution data to find events, then high-resolution data only for specific periods when the battery was actually charging.
battery.price_calculation_enabled
| Parameter | battery.price_calculation_enabled |
|---|---|
| Description | Enable dynamic battery price calculation from historical data |
| Valid Values |
true - Analyze charging history to determine real energy costfalse - Use static price or sensor value
|
| Default | false |
| Notes | Uses LIFO (Last-In, First-Out) inventory model. Analyzes charging events to determine if energy came from PV surplus (free) or grid (at market price). Represents the cost to replace the energy currently stored in the battery. |
battery.price_update_interval
| Parameter | battery.price_update_interval |
|---|---|
| Description | Interval between dynamic price recalculations |
| Unit | Seconds |
| Default | 900 (15 minutes) |
battery.price_history_lookback_hours
| Parameter | battery.price_history_lookback_hours |
|---|---|
| Description | Number of hours to analyze for price calculation |
| Unit | Hours |
| Default | 96 |
battery.battery_power_sensor
| Parameter | battery.battery_power_sensor |
|---|---|
| Description | Sensor for battery power (required for dynamic price calculation) |
| Unit | Watts (W) - positive values must represent charging |
battery.pv_power_sensor
| Parameter | battery.pv_power_sensor |
|---|---|
| Description | Sensor for total PV power (required for dynamic price calculation) |
| Unit | Watts (W) |
battery.grid_power_sensor
| Parameter | battery.grid_power_sensor |
|---|---|
| Description | Sensor for grid power (required for dynamic price calculation) |
| Unit | Watts (W) - positive values represent import from grid |
battery.load_power_sensor
| Parameter | battery.load_power_sensor |
|---|---|
| Description | Sensor for household load power (required for dynamic price calculation) |
| Unit | Watts (W) |
battery.price_sensor
| Parameter | battery.price_sensor |
|---|---|
| Description | Sensor for current electricity price (required for dynamic price calculation) |
| Unit | Euro per kWh (€/kWh) or cents per kWh (ct/kWh) |
battery.charging_threshold_w
| Parameter | battery.charging_threshold_w |
|---|---|
| Description | Minimum battery power to consider as "charging" during analysis |
| Unit | Watts (W) |
| Default | 50.0 |
battery.grid_charge_threshold_w
| Parameter | battery.grid_charge_threshold_w |
|---|---|
| Description | Minimum grid import power to attribute charging to grid vs PV surplus |
| Unit | Watts (W) |
| Default | 100.0 |
battery.battery_price_include_feedin
| Parameter | battery.battery_price_include_feedin |
|---|---|
| Description | Include the feed-in tariff as an opportunity cost for PV-sourced energy in the battery price calculation |
| Valid Values |
false - PV-sourced energy costs €0 (default, free solar energy)true - PV-sourced energy is valued at price.feed_in_price (€/kWh) as opportunity cost
|
| Default | false |
| Notes | When enabled, the battery price will be higher when the battery was primarily charged from PV, reflecting the revenue that could have been earned by exporting that energy instead. Requires price.feed_in_price to be set correctly. |
Load Configuration
Configure how EOS Connect reads your household power consumption data.
load.source
| Parameter | load.source |
|---|---|
| Description | Data source for load power consumption |
| Valid Values | homeassistant, openhab, default |
| Default | default (uses static consumption profile) |
| Example | source: homeassistant |
load.url
| Parameter | load.url |
|---|---|
| Description | URL to your Home Assistant or OpenHAB instance |
| Valid Values | http://<hostname_or_ip>:<port> |
| Examples |
http://homeassistant:8123http://192.168.1.100:8080
|
load.access_token
| Parameter | load.access_token |
|---|---|
| Description | Long-lived access token for Home Assistant |
| Required | Yes for Home Assistant, optional for OpenHAB |
| Example | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... |
| Notes | In Home Assistant: Profile → Long-Lived Access Tokens → Create Token Leave empty if not needed: access_token: |
load.load_sensor
| Parameter | load.load_sensor |
|---|---|
| Description | Entity/item name for total household power consumption |
| Unit | Watts (W) or energy (Wh) for Home Assistant energy entities |
| Examples |
sensor.house_power (Home Assistant)PowerMeter_Load (OpenHAB)
|
| Notes | Represents overall net household load (total house consumption). Positive (consumption) or negative (feed-in) values are converted to absolute positive internally. Home Assistant energy entities (device_class: energy) are supported and converted to average power per time frame. Feature contributed by Dariush Forouher. |
load.car_charge_load_sensor
| Parameter | load.car_charge_load_sensor |
|---|---|
| Description | Entity/item for EV charger power consumption (optional) |
| Unit | Watts (W) |
| Example | sensor.wallbox_power |
| Notes | Separates controllable EV charging from base household load for more accurate optimization. This load is subtracted from the main load sensor value. Leave empty if not needed: car_charge_load_sensor: |
load.additional_load_1_sensor
| Parameter | load.additional_load_1_sensor |
|---|---|
| Description | Entity/item for additional controllable load (e.g., heat pump, dishwasher) |
| Unit | Watts (W) |
| Example | sensor.heatpump_power |
| Notes | Separates additional controllable devices from base household load. This load is subtracted from the main load sensor value. Leave empty if not needed: additional_load_1_sensor: |
load.additional_load_1_runtime
| Parameter | load.additional_load_1_runtime |
|---|---|
| Description | Expected runtime of additional load |
| Unit | Minutes |
| Default | 0 (not used) |
| Example | 120 (2 hours) |
| Notes | Helps optimization engine plan when to run the additional load |
load.additional_load_1_consumption
| Parameter | load.additional_load_1_consumption |
|---|---|
| Description | Energy consumption of additional load for ONE hour |
| Unit | Watt-hours (Wh) |
| Default | 0 (not used) |
| Example | 2000 (2 kWh per hour) |
Electricity Price Configuration
Configure dynamic electricity pricing for cost optimization.
price.source
| Parameter | price.source |
|---|---|
| Description | Provider for dynamic electricity prices |
| Valid Values |
tibber - Tibber APIsmartenergy_at - Austrian providerstromligning - Danish providerevcc - EVCC integrationfixed_24h - Custom 24-hour arraytimeseries - HTTP endpoint returning timeseries data (Home Assistant, custom API, etc.)default - Akkudoktor API
|
| Default | default |
timeseries source enables fetching electricity prices from any HTTP endpoint that returns timeseries data. This includes Home Assistant, custom HTTP APIs, and other integration points. See Timeseries Data Source Guide below for detailed configuration and examples.
price.token
| Parameter | price.token |
|---|---|
| Description | API token or configuration string for price provider |
| Valid Values |
Tibber: Your API token from developer.tibber.com Strømligning: supplierId/productId[/customerGroupId]
|
| Example | radius_c/velkommen_gron_el/c (Strømligning) |
| Notes | Leave empty if not needed: token: |
price.fixed_price_adder_ct
| Parameter | price.fixed_price_adder_ct |
|---|---|
| Description | Fixed cost addition per kWh (e.g., grid fees, taxes) |
| Unit | Cents per kWh (ct/kWh) |
| Default | 0 |
| Example | 8.5 (adds 8.5 ct/kWh) |
| Notes | Only use with source: default (Akkudoktor) to add fixed costs to base prices. Not applied to other price sources. |
price.relative_price_multiplier
| Parameter | price.relative_price_multiplier |
|---|---|
| Description | Percentage markup applied to (base price + fixed_price_adder_ct) |
| Valid Values | Decimal (e.g., 0.05 for 5%) |
| Default | 0 |
| Example | 0.19 (adds 19% VAT) |
| Notes | Only use with source: default (Akkudoktor) for percentage-based fees. Not applied to other price sources. |
price.fixed_24h_array
| Parameter | price.fixed_24h_array |
|---|---|
| Description | 24-hour array of fixed prices for each hour of the day |
| Unit | Cents per kWh (ct/kWh) |
| Valid Values | Comma-separated list of 24 values (no brackets) Hour 0 (00:00-01:00), Hour 1 (01:00-02:00), ..., Hour 23 (23:00-24:00) |
| Example |
10.5,10.5,10.5,10.5,10.5,23.0,
|
| Notes | Only use when source: fixed_24h |
price.feed_in_price
| Parameter | price.feed_in_price |
|---|---|
| Description | Fixed compensation for feeding energy back to the grid (used when feed_in_source is "fixed") |
| Unit | Cents per kWh (ct/kWh) |
| Example | 8 (8 cents per kWh) |
| Notes | Only used when feed_in_source: fixed. Must use the same tax/fee basis as your purchase prices. Typical range: 5-12 ct/kWh |
| Hot-reloadable | Yes — changes take effect immediately and trigger a new optimization run. No restart required. |
price.feed_in_source
| Parameter | price.feed_in_source |
|---|---|
| Description | Source for dynamic feed-in (export) prices |
| Valid Values |
fixed - Use fixed price from feed_in_priceelpris_dk - Elpris DK spot prices (Denmark only)epex_spot - EPEX-Spot prices via Akkudoktor APIevcc - EVCC published feed-in tariff (requires EVCC configured)
|
| Default | fixed |
| Hot-reloadable | Yes — switch sources immediately without restart. New prices are fetched instantly with the new source. |
| Notes | Dynamic sources significantly improve battery discharge timing during high-price periods. Changing sources via the web UI triggers immediate price update with new source (no restart needed). |
price.feed_in_zone
| Parameter | price.feed_in_zone |
|---|---|
| Description | Price zone for Elpris DK (Denmark) |
| Valid Values |
DK1 - Western Denmark (Jylland, Fyn)DK2 - Eastern Denmark (Sjælland, Bornholm)
|
| Default | DK1 |
| Hot-reloadable | Yes — zone changes take effect immediately without restart |
| Notes | Only used when feed_in_source: elpris_dk |
price.data_url
| Parameter | price.data_url |
|---|---|
| Description | Full HTTP endpoint URL for fetching price timeseries data |
| Required | Yes, when source: timeseries |
| Format | Must start with http:// or https:// |
| Example (Home Assistant) | http://homeassistant.local:8123/api/states/sensor.grid_prices |
| Example (Custom API) | https://api.example.com/v1/prices |
| Hot-reloadable | Yes — changes take effect immediately without restart |
price.data_path
| Parameter | price.data_path |
|---|---|
| Description | JSON path to the timeseries array in the API response (using dot notation) |
| Required | Yes, when source: timeseries |
| Format | Dot notation: object.nested.array |
| Example (Home Assistant) | attributes.data — accesses response["attributes"]["data"] |
| Example (Nested Array) | forecast[0].prices — accesses response["forecast"][0]["prices"] |
| Data Format Expected | JSON array: [{start, end, value}, ...]start: ISO8601 timestamp (e.g., "2024-06-12T14:00:00Z") end: ISO8601 timestamp (e.g., "2024-06-12T15:00:00Z") value: Price in EUR/Wh (e.g., 0.25) |
| Hot-reloadable | Yes — changes take effect immediately without restart |
price.data_token
| Parameter | price.data_token |
|---|---|
| Description | Optional Bearer token for API authentication (sent in Authorization header) |
| Required | No — only if the API requires authentication |
| Format | Bearer token string (ASCII only) |
| Example (Home Assistant) | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... |
| HTTP Behavior | If provided, sends header: Authorization: Bearer <token> |
| Security Note | Token must contain only ASCII characters (Latin-1 compatible) for HTTP header transmission |
| Hot-reloadable | Yes — changes take effect immediately without restart |
price.feed_in_static_adder
| Parameter | price.feed_in_static_adder |
|---|---|
| Description | Fixed adjustment to feed-in price (e.g., transport costs, taxes) |
| Unit | Cents per kWh (ct/kWh) |
| Valid Range | -10 to +10 ct/kWh |
| Default | 0 |
| Examples |
3.5 - Add 3.5 ct/kWh for transport costs-1.0 - Subtract 1 ct/kWh discount
|
| Notes | Hot-reloadable: Changes take effect immediately and trigger a new optimization run. Applied BEFORE multiplier. Only shown when feed_in_source is elpris_dk or epex_spot — not needed for fixed (just set the price directly). |
price.feed_in_multiplier
| Parameter | price.feed_in_multiplier |
|---|---|
| Description | Percentage multiplier for feed-in prices (e.g., discount strategy) |
| Valid Range | 0.5 to 1.5 (0.5 = 50%, 1.0 = no change, 1.5 = 150%) |
| Default | 1.0 |
| Examples |
0.95 - Use 95% of market price (conservative)1.05 - Use 105% of market price (aggressive)
|
| Notes | Hot-reloadable: Changes take effect immediately. Expert level setting. Applied AFTER static adder. Only shown when feed_in_source is elpris_dk or epex_spot — not needed for fixed. |
Dynamic Feed-In Pricing Comparison
| Source | Availability | Update Frequency | Typical Range | Best For |
|---|---|---|---|---|
fixed |
Worldwide | Manual | 5-12 ct/kWh | Simple tariffs, flat rates |
elpris_dk |
Denmark only | Daily 13:00 UTC | 1-80 ct/kWh | Danish households, volatile pricing |
epex_spot |
Europe (DE, AT, FR, etc.) | Every 15 minutes | -50 to +80 ct/kWh | Professional traders, maximum optimization |
evcc |
EVCC charger installations | Real-time from EVCC API | Depends on tariff | Users with EVCC charger, real-time feed-in tariffs |
Configuration Examples
# Example 1: Fixed German tariff
price:
feed_in_source: fixed
feed_in_price: 8 # 8 ct/kWh
# Example 2: Danish dynamic pricing with adjustment
price:
feed_in_source: elpris_dk
feed_in_zone: DK1
feed_in_static_adder: 2.5 # +2.5 ct/kWh for transport
feed_in_multiplier: 0.95 # Conservative: 95% of spot
# Example 3: EPEX-Spot with cost adjustment
price:
feed_in_source: epex_spot
feed_in_static_adder: -1.0 # -1 ct/kWh fee
feed_in_multiplier: 1.0 # Full spot price
# Example 4: EVCC real-time feed-in tariff
price:
feed_in_source: evcc # Requires EVCC URL configured
# EVCC feed-in prices are used as-is (no adjustments)
# The EVCC charger provides real-time tariff data
price.feed_in_negative_price_switch
| Parameter | price.feed_in_negative_price_switch |
|---|---|
| Description | How to handle negative electricity market prices for feed-in (battery export). When enabled, prevents exporting at a loss when market prices go negative. |
| Valid Values |
true - Set feed-in price to €0 when market price goes negative (don't export)false - Always use the configured feed-in price (including during negative price periods)
|
| Default | false |
| Notes | The market price reference varies based on the selected feed-in source: • fixed: Uses Akkudoktor market prices as reference • elpris_dk: Uses Elpris DK spot prices • epex_spot: Uses EPEX Spot prices • evcc: Not applicable (EVCC feed-in prices are used as-is, no negative price handling) Enable when you want to avoid exporting battery power during periods when the market pays to consume. |
Smart Price Prediction (Energyforecast.de)
How It Works
Instead of simple price repetition or fixed markups, EOS Connect:
- Learns the relationship between your primary source (e.g., Tibber) and EPEX spot prices
- Calculates both multiplicative factor (for VAT) and offset (for grid fees)
- Applies this learned pattern to future EPEX forecasts
customer_price = 2.1 × epex_spot + 9.5 ct/kWh. Tomorrow's EPEX forecast (12 ct/kWh) → Adapted price: 2.1 × 12 + 9.5 = 34.7 ct/kWh
When It Activates
- Primary Source First: Uses your configured source (Tibber, SmartEnergy, etc.)
- Smart Detection: Only triggers when tomorrow's prices aren't available
- Seamless: Real prices when available, intelligent predictions when needed
Configuration Parameters
price.energyforecast_enabled
| Parameter | price.energyforecast_enabled |
|---|---|
| Description | Enable smart price prediction with energyforecast.de |
| Valid Values |
true - Enable smart price predictionfalse - Disable (use simple price repetition)
|
| Default | false |
| Notes | Only used when primary source lacks tomorrow's prices |
price.energyforecast_token
| Parameter | price.energyforecast_token |
|---|---|
| Description | API token from energyforecast.de |
| How to Get | Register at energyforecast.de/api_keys |
| Default | demo_token |
| Notes |
Demo token: Limited rate limits, for testing only Free tier: 48-hour forecasts (sufficient for most users) Paid tier: 96-hour forecasts + higher limits EOS Connect automatically validates and warns if using demo_token in production. |
price.energyforecast_market_zone
| Parameter | price.energyforecast_market_zone |
|---|---|
| Description | European EPEX spot market zone |
| Valid Values |
DE-LU - Germany/LuxembourgAT - AustriaFR - FranceNL - NetherlandsBE - BelgiumPL - PolandDK1 - Denmark WestDK2 - Denmark East
|
| Default | DE-LU |
| Notes | Must match your location for accurate EPEX spot prices. Invalid zones automatically default to DE-LU with a warning. |
Example Configuration
price:
source: tibber
token: "YOUR_TIBBER_TOKEN"
feed_in_source: fixed
feed_in_price: 0.08
feed_in_negative_price_switch: true
# Smart price prediction with energyforecast.de
energyforecast_enabled: true
energyforecast_token: "YOUR_ENERGYFORECAST_TOKEN"
energyforecast_market_zone: "DE-LU"
Benefits
- Early optimization: Start at 11am instead of waiting for 1pm Tibber update
- Smart learning: Automatically adapts to YOUR grid fees and taxes
- Handles negatives: Correctly applies grid fees even when EPEX is negative
- No manual calibration: No need for
fixed_price_adder_ct - 31.4% more accurate: Than simple price repetition (validated with real data)
Technical Details
Adaptive Learning Algorithm:
- Uses linear regression:
customer_price = factor × epex_spot + offset - Factor (typically 1.5-3.0): Captures VAT and percentage markups
- Offset (typically 5-15 ct/kWh): Captures fixed grid fees and taxes
- Timestamp-based alignment ensures accuracy regardless of fetch timing
- Requires minimum 6 hours of overlapping data for learning
Safety Checks:
- Factor must be between 0.5 and 5.0
- Offset must be within ±50 ct/kWh
- Falls back to simple repetition if validation fails
Supported Price Sources:
- Tibber (EUR - with smart price prediction)
- SmartEnergy AT (EUR - with smart price prediction)
- Stromligning (DKK - currency not yet supported)
- Akkudoktor (no effect - uses optimization prices)
Limitations
- EUR prices only: Currently supports EUR-based price sources (Tibber, SmartEnergy AT)
- Currency conversion: Support for DKK (Stromligning) and other currencies will be added when requested by users
- Minimum overlap: Requires at least 6 hours of overlapping price data to learn the pattern
Troubleshooting
| Issue | Solution |
|---|---|
| Prediction not activating | Verify energyforecast_enabled: true and check logs for learning messages. Test before 1pm with Tibber. |
| "Insufficient overlap" | Need at least 6 hours of valid price data from primary source. Check primary source is returning data correctly. |
| "Factor outside valid range" | Suggests data quality issues. Check logs for actual learned values. Typical factors: 1.5-3.0. |
| "Access denied" error | Verify API token at energyforecast.de/api_keys. Try with demo_token to test connectivity. |
- Smart caching: API calls limited to maximum once per hour, with auto-call at midnight
- Typical usage: ~13 API calls/day when predictions needed (e.g., Tibber 00:00-13:00)
- Rate limit: Free tier = 50 calls/day (plenty of margin for safety)
- Note: Cached predictions used within each hour to avoid hitting rate limits
PV Forecast Configuration
Configure solar generation forecasts from various providers.
eos.source is set to eos_server. For evopt, temperature is not used in optimization. lat and lon remain mandatory for PV forecast accuracy.
pv_forecast_source.source
| Parameter | pv_forecast_source.source |
|---|---|
| Description | Provider for solar generation forecasts |
| Valid Values |
akkudoktor - Akkudoktor APIopenmeteo - Open-Meteoopenmeteo_local - Open-Meteo with local shadingforecast_solar - Forecast.Solarevcc - EVCC integrationsolcast - Solcastvictron - Victron VRM APItimeseries - HTTP endpoint returning timeseries data (Home Assistant, custom API, etc.)default - Built-in default forecast with fixed values (no external configuration needed)
|
| Default | akkudoktor |
- Required for:
akkudoktor,openmeteo,openmeteo_local,forecast_solar— these need latitude, longitude, and panel specifications - Not required for:
default,solcast,victron,evcc,timeseries— these configure their data elsewhere:default: Uses built-in fixed forecast values (no external data source)solcast,victron: Configure resource IDs in the PV Source sectionevcc: Retrieves data from your configured EVCC instancetimeseries: Uses direct data from an HTTP endpoint or Home Assistant
timeseries source enables fetching PV forecasts from any HTTP endpoint that returns timeseries data. This includes Home Assistant, custom HTTP APIs, and other integration points. See Timeseries Data Source Guide below for detailed configuration and examples.
pv_forecast_source.use_real_data_correction
| Parameter | pv_forecast_source.use_real_data_correction |
|---|---|
| Description | Apply the scaling factor from the EVCC forecast API to correct PV forecast values using real measured data. If disabled, no scaling is applied (scale = 1.0). |
| Valid Values | true (enabled), false (disabled) |
| Default | true |
| When to Enable | Enable for most users. Disabling is only recommended for debugging or if you want to ignore EVCC's real data correction and use raw forecast values. |
| Notes |
|
pv_forecast_source.api_key
| Parameter | pv_forecast_source.api_key |
|---|---|
| Description | API key for authentication (used by Solcast and Victron VRM) |
| Required | Yes, when source is solcast or victron |
| Notes |
Solcast: Obtain from solcast.com. Free accounts limited to 10 calls/day. Victron: Generate in VRM portal (Preferences → API tokens). Requires "Dynamic ESS" configured in VRM portal. |
pv_forecast_source.data_url
| Parameter | pv_forecast_source.data_url |
|---|---|
| Description | Full HTTP endpoint URL for fetching PV forecast timeseries data |
| Required | Yes, when source: timeseries |
| Format | Must start with http:// or https:// |
| Example (Home Assistant) | http://homeassistant.local:8123/api/states/sensor.pv_forecast |
| Example (Custom API) | https://api.example.com/v1/pv/forecast |
| Hot-reloadable | Yes — changes take effect immediately without restart |
pv_forecast_source.data_path
| Parameter | pv_forecast_source.data_path |
|---|---|
| Description | JSON path to the timeseries array in the API response (using dot notation) |
| Required | Yes, when source: timeseries |
| Format | Dot notation: object.nested.array |
| Example (Home Assistant) | attributes.data — accesses response["attributes"]["data"] |
| Example (Nested Array) | forecast[0].values — accesses response["forecast"][0]["values"] |
| Data Format Expected | JSON array: [{start, end, value}, ...]start: ISO8601 timestamp (e.g., "2024-06-12T14:00:00Z") end: ISO8601 timestamp (e.g., "2024-06-12T15:00:00Z") value: Power in Wh (e.g., 3600000 for 1 kWh) |
| Hot-reloadable | Yes — changes take effect immediately without restart |
pv_forecast_source.data_token
| Parameter | pv_forecast_source.data_token |
|---|---|
| Description | Optional Bearer token for API authentication (sent in Authorization header) |
| Required | No — only if the API requires authentication |
| Format | Bearer token string (ASCII only) |
| Example (Home Assistant) | eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... |
| HTTP Behavior | If provided, sends header: Authorization: Bearer <token> |
| Security Note | Token must contain only ASCII characters (Latin-1 compatible) for HTTP header transmission |
| Hot-reloadable | Yes — changes take effect immediately without restart |
pv_forecast[].resource_id
| Parameter | resource_id |
|---|---|
| Description | Installation identifier for Solcast (rooftop site) or Victron VRM (installation ID) |
| Required | Yes (when source is solcast or victron) |
| Example (Solcast) | abcd-efgh-1234-5678 |
| Example (Victron) | 123456 (your VRM installation ID) |
| Notes |
Solcast: Obtained from Solcast dashboard after configuring rooftop site Victron VRM: Found in VRM account settings. Requires "Dynamic ESS" configured in VRM portal. Important: For Victron, this ID should be in the first PV forecast entry in the array. |
api_key in pv_forecast_source. Automatically updates every 15 minutes.
| Parameter | name |
|---|---|
| Description | User-defined identifier for the PV installation |
| Required | Yes (all sources) |
| Example | Garden, Main Roof South |
| Notes | Must be unique if using multiple installations |
pv_forecast[].lat
| Parameter | lat |
|---|---|
| Description | Latitude of PV installation |
| Required | Yes (all sources - needed for temperature forecasts) |
| Example | 52.5200 |
pv_forecast[].lon
| Parameter | lon |
|---|---|
| Description | Longitude of PV installation |
| Required | Yes (all sources - needed for temperature forecasts) |
| Example | 13.4050 |
pv_forecast[].azimuth
| Parameter | azimuth |
|---|---|
| Description | Azimuth angle in degrees using the solar/PV industry standard convention |
| Convention |
|
| Unit | Degrees |
| Required | Yes (all sources except solcast, evcc) |
| Examples |
0 (South-facing)-45 (Southeast)90 (West-facing)-90 (East-facing)
|
| Important | Same convention for all providers: All supported PV forecast providers (akkudoktor, openmeteo, openmeteo_local, forecast_solar, evcc) use this same standard. No conversion needed when switching between providers. |
| Notes | For evcc/solcast, also configured in their native platforms, set to 0 in HA addon (South-facing) |
pv_forecast[].tilt
| Parameter | tilt |
|---|---|
| Description | Tilt angle (0=horizontal, 90=vertical) |
| Unit | Degrees |
| Required | Yes (all sources except solcast, evcc) |
| Example | 30 |
| Notes | For evcc/solcast, configured in their platforms, set to 25 in HA addon |
pv_forecast[].power
| Parameter | power |
|---|---|
| Description | PV installation power (peak Wp) |
| Unit | Watts (W) |
| Required | Yes (all sources except evcc, solcast) |
| Example | 4600 |
| Notes | For evcc/solcast, still needed for system scaling, set to 1000 in HA addon |
pv_forecast[].powerInverter
| Parameter | powerInverter |
|---|---|
| Description | Inverter power capacity |
| Unit | Watts (W) |
| Required | Yes (all sources except evcc, forecast_solar, solcast) |
| Example | 5000 |
| Notes | Set to 1000 in HA addon if not needed |
pv_forecast[].inverterEfficiency
| Parameter | inverterEfficiency |
|---|---|
| Description | Inverter efficiency |
| Valid Values | Decimal between 0 and 1 |
| Required | Yes (all sources except evcc, forecast_solar, solcast) |
| Example | 0.95 (95% efficient) |
| Notes | For evcc/forecast_solar/solcast, set to 1 in HA addon |
pv_forecast[].horizon
| Parameter | horizon |
|---|---|
| Description | Describes the shading/obstruction situation around your PV installation from all directions. Based on Akkudoktor Horizon Parameter. |
| Required | Yes (for openmeteo_local, forecast_solar), Optional for others |
| Default | [0]*36 (no shading) for openmeteo_local, [0]*24 (no shading) for forecast_solar |
| Format | Comma-separated string of angles in degrees |
Understanding the Horizon Parameter
The horizon parameter describes obstruction heights around your PV installation in different directions. Each value represents the elevation angle (height) of an obstacle that blocks sunlight from that direction.
Key Concept: If an obstacle (building, tree, mountain) has an elevation angle of 30° in the south direction, then:
- Your PV panel has NO free sight to the sun when sun is below 30° elevation
- Sunlight is blocked until the sun is higher than 30° above the horizon
- Only when the sun rises above 30° can it reach your panel from that direction
| Concept | Explanation |
|---|---|
| Azimuth direction |
|
| Elevation angle (the obstruction height) |
The angle from horizon UP to the top of the obstacle blocking the sun.
|
| Transparency | Optional: use "t" notation to add transparency (0.0 = opaque/fully blocked, 1.0 = fully transparent/no blocking). Example: 30t0.5 means obstacle blocks 50% of light until 30° elevation |
| Number of values |
Determines azimuth coverage per value: 360° ÷ number of values E.g., 18 values = 20° per segment, 36 values = 10° per segment |
Practical Examples
Example 1: Simple 4-segment shading (every 90° azimuth)
horizon: 10,20,10,15
Interpretation: Your PV has NO free sight to the sun until certain elevations:
• North direction (−180° to −90°): Sun blocked until 10° above horizon
• East direction (−90° to 0°): Sun blocked until 20° above horizon
• South direction (0° to 90°): Sun blocked until 10° above horizon
• West direction (90° to 180°): Sun blocked until 15° above horizon
Example 2: With transparency (partial blockage)
horizon: 10t0.3,15t0.8
Interpretation: Obstacle blocks PARTIALLY (light vegetation/semi-transparent):
• North to South (−180° to 0°): Can see through 30% of the obstacle (blocks 70%). No sight until sun is 10° up.
• South to North (0° to 180°): Can see through 80% of the obstacle (blocks only 20%). No sight until sun is 15° up.
Example 3: Fine-grained 18-segment shading (every 20° azimuth)
horizon: 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
Interpretation: Uniform obstruction in all directions:
• 18 values cover full 360°, each value represents 20° of azimuth
• Every direction: PV has NO free sight to sun until it is 10° above horizon (e.g., surrounded by terrain, hills)
Example 4: Realistic scenario (building/tree shading on south)
horizon: 0,0,0,0,0,0,0,0,50t0.4,70,0,0,0,0,0,0,0,0
Interpretation: Clear northern/eastern sky, but southern obstruction (building fronts south):
• 18 segments (20° each)
• Segments 1-8, 11-18 (North, East, West): Clear horizon (0°) = free sight to sun at any elevation
• Segment 9 (South direction): 50° elevation obstacle WITH 40% transparency = blocks 60% of sunlight, NO sight until sun is 50° up
• Segment 10 (South-adjacent): 70° elevation obstacle = blocks sun until it is 70° above horizon (significant shading during early/late day)
How to Determine Your Horizon Values
- Visual assessment: Stand at your PV installation and identify obstacles (trees, buildings, mountains) in each direction
- Measure obstacle HEIGHT: Use a smartphone app (e.g., clinometer/inclinometer) to measure the elevation angle of the top of each obstacle:
- Point the app at the top of the obstacle (roof edge, tree crown, mountain peak)
- The angle shown is the obstruction height – this is what you enter as the horizon value
- Example: Building top appears at 35° elevation angle → enter
35for that direction
- Assign to segments: Divide 360° by your number of values (e.g., 18 values = 20° per segment) and assign measured obstacle heights to each segment
- Test and refine: Start with measured values, then compare actual generation with forecast to fine-tune:
- If forecast is higher than reality → obstacles are higher than measured (increase values)
- If forecast is lower than reality → obstacles are lower than measured (decrease values)
MQTT Configuration
Configure MQTT broker connection and Home Assistant Auto Discovery.
mqtt.enabled
| Parameter | mqtt.enabled |
|---|---|
| Description | Enable or disable MQTT functionality |
| Valid Values |
true - Enable MQTTfalse - Disable MQTT
|
| Default | false |
mqtt.broker
| Parameter | mqtt.broker |
|---|---|
| Description | Address of the MQTT broker |
| Example | localhost, 192.168.1.10 |
mqtt.port
| Parameter | mqtt.port |
|---|---|
| Description | Port of the MQTT broker |
| Default | 1883 |
mqtt.user
| Parameter | mqtt.user |
|---|---|
| Description | Username for MQTT broker authentication |
| Example | mqtt_user |
| Notes | Optional - leave empty if broker doesn't require authentication |
mqtt.password
| Parameter | mqtt.password |
|---|---|
| Description | Password for MQTT broker authentication |
| Notes | Optional - leave empty if broker doesn't require authentication |
mqtt.tls
| Parameter | mqtt.tls |
|---|---|
| Description | Enable or disable TLS for secure MQTT connections |
| Valid Values |
true - Use TLS for secure connectionsfalse - Do not use TLS
|
| Default | false |
mqtt.ha_mqtt_auto_discovery
| Parameter | mqtt.ha_mqtt_auto_discovery |
|---|---|
| Description | Enable or disable Home Assistant MQTT Auto Discovery |
| Valid Values |
true - Enable Auto Discoveryfalse - Disable Auto Discovery
|
| Default | true |
| Notes | When enabled, EOS Connect automatically publishes device and entity configurations to Home Assistant |
mqtt.ha_mqtt_auto_discovery_prefix
| Parameter | mqtt.ha_mqtt_auto_discovery_prefix |
|---|---|
| Description | Prefix for Home Assistant MQTT Auto Discovery topics |
| Default | homeassistant |
| Notes | Only change if you've customized Home Assistant's discovery prefix |
Other Configuration Settings
General application settings and behavior.
refresh_time
| Parameter | refresh_time |
|---|---|
| Description | How often EOS Connect sends optimization requests to EOS server |
| Unit | Minutes |
| Default | 3 |
| Notes |
Controls update frequency. Works together with eos.time_frame:• refresh_time = how often to request optimization• time_frame = granularity of each optimization (900s=15min, 3600s=hourly)
|
time_zone
| Parameter | time_zone |
|---|---|
| Description | Time zone for the application |
| Default | Europe/Berlin |
| Example | America/New_York, Asia/Tokyo |
eos_connect_web_port
| Parameter | eos_connect_web_port |
|---|---|
| Description | Port for EOS Connect web server and API |
| Default | 8081 |
| Notes | Access web dashboard at http://your-server:8081 |
log_level
| Parameter | log_level |
|---|---|
| Description | Logging verbosity level |
| Valid Values |
debug - Detailed debugging informationinfo - General informational messageswarning - Warning messages onlyerror - Error messages only
|
| Default | info |
| Notes | Use debug for troubleshooting, info for normal operation |
request_timeout
| Parameter | request_timeout |
|---|---|
| Description | HTTP request timeout for Home Assistant and OpenHAB API calls |
| Valid Values | 5-120 (seconds) |
| Default | 10 |
| Notes | Increase this value if you experience frequent timeout errors when reading sensor data from Home Assistant or OpenHAB, especially when running on slower hardware (e.g., Synology NAS). Values outside the 5-120 range are automatically clamped to the valid range. |
eos_connect_web_port, time_zone, log_level) remain in config.yaml.
Understanding refresh_time and time_frame
Two Different Timing Controls
These two parameters control different aspects of optimization:
- refresh_time: Sets how often EOS Connect sends a new optimization request to the optimizer server (e.g., every 3 minutes)
- time_frame (in EOS section): Sets the granularity of the optimization and forecast arrays inside each request (e.g., 900 for 15-minute steps, 3600 for hourly steps)
The combination of refresh_time and time_frame allows you to control both how frequently the system updates and how detailed the optimization is.
Optimization Configuration
Important timing and configuration concepts for optimization requests and responses.
Understanding refresh_time and time_frame
Two Different Timing Controls
These two parameters control different aspects of optimization:
- refresh_time: Sets how often EOS Connect sends a new optimization request to the optimizer server (e.g., every 3 minutes)
- time_frame (in EOS section): Sets the granularity of the optimization and forecast arrays inside each request (e.g., 900 for 15-minute steps, 3600 for hourly steps)
The combination of refresh_time and time_frame allows you to control both how frequently the system updates and how detailed the optimization is.
Time Slot Configuration & Optimizer Constraints
The time_frame setting determines the granularity of optimization data:
| Time Frame | Array Length | Forecast Horizon | EOS Server | EVopt |
|---|---|---|---|---|
3600 (60 minutes) |
48 values | 2 days | Supported | Supported |
900 (15 minutes) |
192 values | 2 days (more granular) | Not Supported | Supported |
- EOS Server (Akkudoktor EOS): Only supports 60-minute slots (
time_frame: 3600). If you settime_frame: 900with EOS Server, it will be automatically corrected to 3600 at startup with a warning. - EVopt: Supports both 60-minute (
3600) and 15-minute (900) time frames for more granular optimization. Use 900 if you need more detailed control over battery charging/discharging and solar feed-in patterns.
- Use 3600s (hourly): If using EOS Server, or if you prefer simpler hourly optimization with lower computational cost
- Use 900s (15-min): If using EVopt and want finer-grained optimization for precise battery and solar control
EVCC as Price Source (price.source: evcc)
Use EVCC (Electric Vehicle Charging Controller) as your price source when you have an EVCC instance managing your electricity pricing or tariff data.
When to Use EVCC Price Source
- EVCC Integration: You already have EVCC configured with tariff/pricing data
- Unified Control: Want to use the same EVCC instance for both EV charging and battery optimization
- Automatic Tariff Sync: Tariff rates automatically synchronize between EVCC and EOS Connect
- Multiple Tariffs: Need access to both grid consumption prices and feed-in tariffs from EVCC
Configuration Steps
evcc.url.
- Configure EVCC Interface:
- Set
evcc.enabled: true - Set
evcc.urlto your EVCC instance (e.g.,http://evcc.local:7070)
- Set
- Enable EVCC Price Source:
- Set
price.source: evcc price.tokenshould remain empty (EVCC API doesn't require authentication)
- Set
- Optional - Add Feed-In Tariff (EVCC 0.132+):
- If your EVCC instance publishes
/api/tariff/feedindata, it will be used automatically for feed-in pricing - Set
price.feed_in_source: evccto use EVCC's published feed-in tariff
- If your EVCC instance publishes
EVCC Price Data Format
EVCC provides electricity prices via the grid tariff API endpoint with 15-minute resolution:
GET http://evcc.local:7070/api/tariff/grid
Response:
{
"rates": [
{
"start": "2026-06-15T00:00:00+02:00",
"end": "2026-06-15T00:15:00+02:00",
"value": 0.3236
},
{
"start": "2026-06-15T00:15:00+02:00",
"end": "2026-06-15T00:30:00+02:00",
"value": 0.3113
}
]
}
| Field | Description | Format |
|---|---|---|
| start | Start timestamp of the price period | ISO8601 with timezone (e.g., +02:00) |
| end | End timestamp of the price period | ISO8601 with timezone |
| value | Electricity price for that period | EUR/kWh (automatically converted to EUR/Wh internally) |
Price Unit Conversion
Important: EVCC provides prices in EUR/kWh. EOS Connect automatically converts these to EUR/Wh for internal calculations:
- EVCC price: 0.120 EUR/kWh
- Converted: 0.000120 EUR/Wh (÷ 1000)
- Display: Always shown in EUR/kWh in the web UI
Automatic Updates
EVCC prices are fetched:
- On startup: Initial price load
- Every refresh cycle: Default 10 minutes (configurable via
refresh_time) - On configuration change: When
price.sourceis changed to/fromevcc, prices are fetched immediately (hot-reload) - On EVCC URL change: Automatic reconnection with new URL
Troubleshooting EVCC Price Source
| Issue | Solution |
|---|---|
| No prices showing |
|
| EVCC connection timeout |
|
| Wrong prices after EVCC update |
|
| Price source won't switch |
|
Example Configuration (config.yaml)
evcc: enabled: true url: "http://evcc.local:7070" price: source: evcc token: # Leave empty for EVCC feed_in_source: evcc # Optional: if EVCC publishes /api/tariff/feedin
Unified Timeseries Data Source Guide
EOS Connect supports a flexible timeseries source for both electricity prices and PV forecasts. This unified approach allows you to fetch data from Home Assistant, custom HTTP APIs, or any endpoint that returns timeseries data in a standard format.
Timeseries Data Format
The timeseries source expects JSON data in this standard format:
{
"data": [
{
"start": "2024-06-12T14:00:00Z",
"end": "2024-06-12T15:00:00Z",
"value": 0.25
},
{
"start": "2024-06-12T15:00:00Z",
"end": "2024-06-12T16:00:00Z",
"value": 0.28
}
]
}
| Field | Description | Format |
|---|---|---|
| start | Start timestamp of the timeslot | ISO8601 (e.g., "2024-06-12T14:00:00Z" or Unix timestamp) |
| end | End timestamp of the timeslot | ISO8601 or Unix timestamp |
| value | For Prices: Price in EUR/Wh (e.g., 0.25 for 25 ct/kWh) For PV: Generated power in Wh for the timeslot |
Number (float) |
Home Assistant Integration
Home Assistant entity attributes can be accessed using the dot notation in data_path.
Price Example (Home Assistant)
| Configuration | Value |
|---|---|
price.source |
timeseries |
price.data_url |
http://homeassistant.local:8123/api/states/sensor.grid_prices |
price.data_path |
attributes.data |
price.data_token |
Your HA Long-Lived Access Token (optional if local) |
HA Entity Response Example:
{
"entity_id": "sensor.grid_prices",
"attributes": {
"data": [
{"start": "2024-06-12T14:00:00Z", "end": "2024-06-12T15:00:00Z", "value": 0.25},
{"start": "2024-06-12T15:00:00Z", "end": "2024-06-12T16:00:00Z", "value": 0.28}
]
}
}
PV Forecast Example (Home Assistant)
| Configuration | Value |
|---|---|
pv_forecast_source.source |
timeseries |
pv_forecast_source.data_url |
http://homeassistant.local:8123/api/states/sensor.solar_forecast |
pv_forecast_source.data_path |
attributes.forecast |
pv_forecast_source.data_token |
Your HA Long-Lived Access Token (optional if local) |
Custom HTTP API Integration
Connect to custom HTTP endpoints that return timeseries data. Supports authentication via Bearer tokens.
Example: Custom REST API
| Configuration | Value |
|---|---|
price.source |
timeseries |
price.data_url |
https://api.example.com/v1/prices/current |
price.data_path |
prices (or nested path like result.data) |
price.data_token |
Your API token (if required) |
API Response Example:
{
"prices": [
{"start": "2024-06-12T14:00:00Z", "end": "2024-06-12T15:00:00Z", "value": 0.25},
{"start": "2024-06-12T15:00:00Z", "end": "2024-06-12T16:00:00Z", "value": 0.28}
]
}
Testing Your Timeseries Configuration
Use the built-in connectivity test to validate your timeseries configuration before enabling it.
HTTP Request:
POST /api/config/test-timeseries
Content-Type: application/json
{
"source": "price",
"data_url": "http://homeassistant.local:8123/api/states/sensor.grid_prices",
"data_path": "attributes.data",
"data_token": "eyJhbGciOiJIUzI1NiI..."
}
Response (Success):
{
"success": true,
"message": "Successfully fetched 24 price values",
"sample_count": 24,
"first_entry": {
"start": "2024-06-12T14:00:00Z",
"end": "2024-06-12T15:00:00Z",
"value": 0.25
},
"last_entry": {
"start": "2024-06-13T14:00:00Z",
"end": "2024-06-13T15:00:00Z",
"value": 0.22
}
}
Error Handling & Retries
EOS Connect automatically handles transient API failures:
- Automatic Retries: Up to 3 attempts with exponential backoff (0.5s → 2s → 4s)
- Cache Fallback: If API fails, uses the last successfully fetched data
- Graceful Degradation: Continues running with cached data if available
- Error Logging: Issues are logged with timestamps for troubleshooting
Hot-Reload Support
All timeseries configuration fields support hot-reload — changes take effect immediately without restarting the application:
price.data_url,price.data_path,price.data_tokenpv_forecast_source.data_url,pv_forecast_source.data_path,pv_forecast_source.data_token
Changes are applied within 1-2 seconds on the next update cycle.
JSON Path Reference
Examples of how to specify data_path for different response structures:
| Response Structure | data_path | Notes |
|---|---|---|
{"data": [...]} |
data |
Top-level array |
{"attributes": {"data": [...]}} |
attributes.data |
Nested object (Home Assistant pattern) |
{"result": {"prices": [...]}} |
result.prices |
Multiple levels of nesting |
{"forecast": [{"data": [...]}]} |
forecast[0].data |
Array with indexed access |
Configuration Scenarios
Common setup scenarios and how to configure them using the web UI. For each scenario, follow the Setup Wizard or navigate to the corresponding sections in Settings.
Scenario 1: Basic Home Assistant Setup (Recommended)
The most common configuration for users with Home Assistant and a battery system.
- Optimizer: Leave as default (EOS Server)
- Data Source: Select Home Assistant, enter your HA URL and long-lived access token
- Battery: Select your battery SOC entity from HA, enter capacity and efficiency specs
- Load: Select your household load power entity
- Electricity Prices: Choose your price provider (Tibber, fixed prices, etc.)
- PV Forecasts: Enter location (lat/lon) and PV system specs (power, azimuth, tilt)
- Optional - Inverter Control: If you have a Victron or Fronius inverter, configure it here
- Optional - MQTT: Enable MQTT and HA auto-discovery for additional integrations
Scenario 2: Minimal Setup (Read-Only Monitoring)
Monitor battery optimization recommendations without hardware control. Useful for testing or observation-only setups.
- Data Source: Home Assistant (or OpenHAB)
- Battery: Configure only SOC entity and capacity
- Load: Select load sensor (or use default static profile if unavailable)
- Electricity Prices: Select price source
- PV Forecasts: Minimal: lat/lon only for location
- Leave blank: Inverter section (read-only mode)
Benefit: EOS Connect calculates and displays battery optimization targets. You can manually implement the recommendations or implement hardware control later.
Scenario 3: Using EVCC for PV Forecasts & Car Charging
Integrate EVCC as your PV forecast source and leverage it for EV charging coordination.
- Retrieve PV forecast data from EVCC instead of manual entry
- Get real-time car charging power consumption
- Coordinate battery optimization with EV charging decisions
- EVCC Section: Enter your EVCC server URL (e.g.,
http://192.168.1.100:7070) - PV Forecasts — Source: Select "EVCC"
- PV Forecasts — Configuration: Add one entry for your location with lat/lon (for temperature-based optimization)
- Load Section: Optionally set
car_charge_load_sensorto your wallbox power entity for better load tracking
Result: EOS Connect automatically fetches your PV systems and forecast data from EVCC, simplifying setup.
Scenario 4: Using Solcast for Detailed PV Forecasts
Integrate Solcast for high-accuracy solar irradiance forecasts from satellite data.
- Create a free account at solcast.com
- Add a "Rooftop Site" for each PV installation (define location, tilt, azimuth, capacity)
- Copy the Resource IDs from your rooftop sites
- Get your Solcast API key from account settings
- PV Forecasts — Source: Select "solcast"
- PV Forecasts — API Key: Paste your Solcast API key
- PV Forecasts — Configurations: For each PV installation, add:
- Name: "Main Roof" or "Garage East" (identify each installation)
- Resource ID: From your Solcast rooftop site
- Lat/Lon: Location coordinates (used for temperature-based optimization)
- Power, Azimuth, Tilt: System specs (for scaling calculations)
⚠️ Important - Solcast Rate Limiting:
- Free accounts: 10 API calls per day
- EOS Connect automatically extends refresh intervals to 2.5 hours to stay within limits
- If you exceed limits, the system uses the previous forecast until the next successful call
Scenario 5: Advanced Setup with Victron Inverter & Multiple PV Sites
Complete integration with Victron hardware, multiple PV installations, and real-time control.
- Data Source: Home Assistant (with Victron integration)
- Optimizer: Configure EOS Server address and port
- Battery: Select Victron battery SOC from HA entities
- Load: Select grid/AC load sensor
- Electricity Prices: Configure your price provider
- PV Forecasts: Add multiple installations:
- Installation 1: "South Roof" (5kW)
- Installation 2: "East Roof" (3kW)
- Inverter Section:
- Type: "victron"
- Address: Your Victron GX Device IP
- Battery Settings: Lower min SOC (e.g., 10%) for more aggressive optimization
- Optional — Dynamic Price Calculation: Enable battery price learning to value stored energy
Result: EOS Connect actively controls your Victron inverter/battery system based on prices and solar forecasts for all PV installations.
Scenario 6: MQTT Integration & Home Assistant Auto-Discovery
Stream EOS Connect data to MQTT and auto-discover devices in Home Assistant.
- MQTT Section:
- Enable MQTT: Toggle ON
- Broker: Your MQTT broker IP (e.g., 192.168.1.50)
- Port: MQTT port (default 1883)
- User/Password: MQTT credentials if required
- TLS: Enable if your broker uses TLS
- Home Assistant Auto-Discovery:
- Enable
ha_mqtt_auto_discovery - Leave prefix as "homeassistant" (unless customized in HA)
- Enable
- Restart: EOS Connect and HA will auto-discover the new MQTT devices
Result: EOS Connect publishes optimization data, battery targets, and system status to MQTT. Home Assistant automatically creates entities for:
- Battery charge/discharge targets
- Current optimization state
- System status and errors
Scenario 7: Custom Inverter Control via Home Assistant
Control any inverter or battery system through Home Assistant service calls. Useful for systems like Marstek, Sungrow, Goodwe, or custom ESPHome integrations.
- Your inverter/battery system must be integrated into Home Assistant with exposed entities (select, number, switch, etc.)
- Know the entity IDs and service calls needed to control your specific system
- Have Home Assistant admin access to create service call automations (or use Direct REST API if supported)
- Data Source Section: Set
type: homeassistant,url, andaccess_token. These credentials are automatically used by the inverter. - Inverter Section — Type: Select "homeassistant"
- Power Limits: Set max grid charge and PV charge rates in watts
- Service Call Sequences: For each control state (charge_from_grid, avoid_discharge, discharge_allowed):
- Enter a valid JSON array of HA service call objects
- Each call specifies: service domain, entity ID, and data
- Use
{{ power }}template variable indata_templatefor dynamic power from EOS - The web UI provides a JSON editor with real-time syntax validation
Example JSON for Marstek (charge_from_grid mode):
[
{
"service": "select.select_option",
"entity_id": "select.mt1_betriebsmodus",
"data": {"option": "Manuell"}
},
{
"service": "select.select_option",
"entity_id": "select.mt1_erzwungene_operation",
"data": {"option": "Zwangsladen"}
},
{
"service": "number.set_value",
"entity_id": "number.mt1_ziel_leistung_manuell",
"data_template": {"value": "{{ power }}"}
}
]
Result: EOS Connect sends optimized battery commands to Home Assistant, which executes your custom service call sequence on the inverter every control cycle.
Complete Parameter Reference
Auto-generated from the configuration schema. This table is always in sync with the latest codebase.
Loading parameter reference...