0.8.4
Changes Made by @pvandenh
New Entities & Service — DLB Mode Control
- select.dlb_mode — Dropdown to switch between DLB Box, Full Speed, Hybrid, and Pure PV modes
- switch.extreme_mode — Enables/disables Extreme Mode (reduces or stops charging when home load is high)
- switch.night_mode — Enables/disables automatic full-speed charging during a configured nightly window
- number.hybrid_current — Sets the current limit (1–32A) used in Hybrid mode; immediately resends config if already in Hybrid mode
- number.night_start_hour — Sets the hour Night Mode begins (0–23, whole hours only)
- number.night_end_hour — Sets the hour Night Mode ends (0–23, whole hours only)
- beny_wifi.set_dlb_config service — Full programmatic control over all DLB config fields; all parameters optional — only supplied fields are changed
All DLB entities are only created when the user has confirmed their charger has the physical DLB module installed (see Config Flow changes below).
Bug Fixes
- Fixed DLB fetch crashing the full coordinator update — The DLB UDP request was nested inside the same try/except as the primary charger data fetch. A DLB timeout would discard all already-fetched sensor data and mark the entire update as failed. The - DLB fetch is now isolated in its own try/except so a DLB failure only affects DLB sensors
- Fixed DLB power values reporting ~10× too high — All four DLB power fields were being divided by 10, giving values in decawatts rather than kilowatts. Confirmed via energy balance analysis (solar + grid = house). Divisor corrected to 100 for all DLB power fields
- Fixed spurious DLB power spikes (~653 kW) — The charger sends 0xFF00–0xFFFF range values as error sentinels when DLB data is temporarily unavailable. These were being converted to large float values and triggering the spike filter. Sentinel values are now detected in communication.py before conversion and returned as None, causing the sensor to silently retain its last valid reading
- Fixed DLB config resetting to defaults on every HA restart — The _dlb_config cache was always initialised to hardcoded defaults on startup. Config is now persisted to config_entry.options after every successful async_set_dlb_config call and restored from there on startup
- Replaced deprecated asyncio.get_event_loop() — All coordinator async executor calls used the deprecated form. Replaced throughout with asyncio.get_running_loop() as required by Python 3.10+
Config Flow Changes
- Added max_current_min / max_current_max fields — Configurable lower and upper bounds for the charging current slider (defaults: 6A / 32A). These are set once at integration setup and respected by both the number entity and the send button's range validation
- Added dlb checkbox — "DLB module installed?" — DLB is a separate physical hardware module that only some chargers support, and only when physically attached. The config flow now requires explicit confirmation before enabling DLB entities, preventing phantom entities for users who have a DLB-capable model but no module installed. Defaults to unchecked
- Bumped config flow VERSION to 2 to invalidate any cached flow snapshots when upgrading from v0.8.3
Protocol Discovery
- Reverse-engineered 0x6b message type — A single unified DLB config command carrying all mode state in one 18-byte UDP message:
byte11: Extreme Mode flag (0x01 = on, 0x00 = off)
byte12: DLB mode — 0xff = DLB Box, 0x63 = Full Speed, 0x00 = Pure PV, 0x01–0x20 = Hybrid with that value as the current limit in amps
byte13: Night Mode flag (0x01 = on, 0x00 = off)
byte14: Night Mode start hour (e.g. 0x16 = 22 = 10pm)
byte15: Night Mode end hour (e.g. 0x06 = 6am) - Confirmed GET_DLB_CONFIG is unsupported — A read command was attempted and the charger responded with a denial packet (message_id=8). Config persistence via config_entry.options is used instead
- Confirmed DLB power encoding is 10W units — Raw field values divided by 100 give kW. Verified against known solar output and confirmed by energy balance across multiple packet snapshots
- Confirmed house_power is charger-calculated — Computed by the charger as solar + grid before encoding; not independently measured
- Added SERVER_MESSAGE.SEND_DLB_CONFIG — Parsing for the 0x6b / message_id=18 ACK. Parsed after every async_set_dlb_config call to confirm the charger applied the config