Added
- Entity-mode dashboard support: four new optional entity mappings — battery charge power, battery discharge power, grid consumption power, and grid feed-in power — populate the overview card's grid and battery sections in entity/modbus mode.
- Automatic unit conversion in entity mode: the entity coordinator reads
unit_of_measurementfrom each source entity and converts to the expected coordinator unit (e.g. W→kW, Wh→kWh) using HA's built-inPowerConverter,EnergyConverter, andTemperatureConverter.
Changed
- Force operations unified with smart sessions:
force_chargeandforce_dischargenow create smart sessions internally with afull_powerflag, gaining circuit breaker protection, restart recovery, UI state, and sensor visibility. Thepowerparameter has been removed — force operations always charge/discharge at maximum inverter power.
Fixed
- Grid direction swap with external generation (issue #3): installations with additional solar inverters not visible to FoxESS could show grid consumption and feed-in swapped. Now falls back to
gridStatuswhen the power balance diverges >3× from the actual grid reading. - Discharge deferred start with feedin target: the feedin energy cap caused incorrect deferred start timing in two scenarios — starting too early (full SoC energy used instead of feedin drain time) and staying deferred too long in tight windows (feedin cap over-deferring when the SoC deadline already exceeded the window).
- Force operation premature WebSocket connection: force ops opened the WS connection at service call time, before the schedule was applied. Now starts through the smart session listener.
clear_overrides30s timeout: WS linger dispatched as background task to avoid blocking the service call.
Improved
- WebSocket plausibility filter: anomalous WS messages (power values diverging >10× from the last accepted value) now filtered at the WS layer rather than the coordinator. Keeps data-source-specific logic out of the brand-agnostic coordinator.
- Architectural lint enforcement: semgrep rules and pre-commit hooks enforce module size budget (2000 lines), typed config access (
IntegrationConfig), typed domain data access (_dd(hass)), and brand-import boundaries. - E2E timing-based worker balancing: greedy bin-packing distributes tests across CI workers by estimated time, and new pushes cancel in-progress E2E workflows.