Skip to content

Release Notes

Buy Me A Coffee

This page shows recent highlights. The full changelog on GitHub contains every version with complete details.


v0.9.9

Issues: #335, #336

  • Fix: ENERGY_GUARD daily sensors permanently zeroed after gateway reconnect (WIT 15K): A hours × 2 kWh/h heuristic incorrectly flagged large-system legitimate daily totals (e.g. 50 kWh at 2pm) as stale and reset all energy sensors to 0 for a 15-minute window. Only an exact match against yesterday's final total is now used as a stale indicator.

  • Fix: ENERGY_GUARD spike threshold too low for WIT 15K: The 20 kWh rejection threshold blocked the first valid post-reconnect read on high-output profiles. WIT profiles now use an 80 kWh threshold — above a full day's production for residential WIT, far below any real word-tear glitch (which produces thousands of kWh).

  • Fix: MOD/MID-XH Grid Import Energy Total missing and incorrect (Issue #336): Registers 3069/3070 (energy_to_user_total) were absent from the MOD profile despite the surrounding 3067–3074 energy block being present. The coordinator fell back to the VPP range (31120/31121), which returns a different value on MID 15KTL3-XH hardware and oscillates due to non-atomic word reads — causing the sensor to drop backward and corrupt the HA energy dashboard. Registers 3069/3070 are now defined, restoring the stable 3000-range source.

  • Hardware contributor credit: @Wojak129 — WIT 15KTL3 field testing, DTC 5603 hardware confirmation, VPP register scanning, and official Growatt protocol documentation that shaped the WIT implementation. Credited in README.


v0.9.8

Issues: #335

  • Safety fix: WIT vpp_export_limit_power_rate clamped to 0–100%: Negative values on register 30201 trigger WIT warning 401 and a fault state requiring a service technician reset. Minimum is now 0% (zero export).

  • Fix: WIT Export Limit (W) write entity removed: Register 203 is not writable on WIT firmware regardless of VPP enable state. The misleading number entity is removed; stale entities are cleaned up automatically on upgrade.


v0.9.7

Note: WIT TOU schedule entities are new and untested on hardware. Please report any issues on #331.

  • Improvement: WIT TOU period start/end times use proper HA time pickers: Start and end time entities are now native HH:MM time pickers instead of number inputs requiring minutes since midnight. Existing v0.9.6 number entities are removed automatically on upgrade.

v0.9.6

Note: WIT TOU schedule entities are new and untested on hardware. Please report any issues on #331.

  • Feature: WIT VPP Time-of-Use schedule controls (Issue #331): Ten TOU periods now exposed — start/end time pickers and power level (−100% to +100%, negative = discharge). Setting negative power during peak hours achieves zero grid import within grid regulations. Periods 1–10 supported (30412–30441), written via FC16.

v0.9.5

  • Fix: inverter_status entity shows energy total instead of status code (Issue #316): The data extraction code used min_addr (the lowest register address in the profile) as the status register address, assuming it always corresponds to the inverter status. The status is now looked up by name (inverter_status) making it robust to any profile register ordering.

  • Fix: WIT vpp_export_limit_w write rejected by inverter (Issue #320): Register 203 only accepts FC16 (Write Multiple Registers); FC06 (Write Single Register) returns Illegal Function. The write now uses the correct function code.

  • Fix: SPH TL3 battery charge/discharge energy sensors always 0 on V2.01 profile (Issue #324): The battery register range detector scored VPP (31000+) higher than the fallback (1000+) range because it looked for battery_discharge_today_low but the SPH TL3 profile names those registers discharge_energy_today_low. The fallback range missed the score points, VPP won, and daily energy read from a range where those registers don't exist. Both naming variants are now included in the scoring list.

  • Fix: WIT battery_voltage_bms 10× too high on standard BMS firmware (Issue #332): The v0.9.4 scale change broke OEM BMS users (YE1.0 firmware) while fixing JK BMS users. Scale reverted to 0.1 with runtime auto-detection: if the BMS voltage reads less than 20% of the inverter's own battery voltage, it is automatically multiplied by 10. Both firmware variants now work with no user configuration.


v0.9.4

  • Feature: MIN TL-XH priority mode control (Issue #311): Register 3018 hardware-confirmed on MIN 4200TL-XH: Load First (0), Battery First (2), Grid First (3). Appears as a select entity under the Battery device.

  • Fix: WIT battery_voltage_bms reads 1/10th of actual (Issue #323): Register 8095 scale corrected from 0.1 to 1 — WIT/JK BMS returns whole volts, not tenths.

  • Fix: WIT solar_total_power spikes to 429 MW (Issue #323): 32-bit unsigned overflow when the inverter sends a small negative value at night. Register pair regs 1–2 now treated as signed — resolves to ≈ −0.1 W instead of 429,496,729.5 W.

  • Fix: WIT vpp_export_limit_w entity always Unknown (Issue #323): Holding register 203 was defined in the WIT profile but never read. Now polled each cycle and stored; the number entity shows the current export limit and accepts writes.

  • Fix: Grid import/export and load sensors missing on SPH 3/6kW and 7/10kW (Issue #326): Power-flow registers 1015–1038 were present in SPH_8000_10000_HU and V2.01 profiles but absent from SPH_3000_6000 and SPH_7000_10000. Both base profiles now include power_to_user, power_to_load, power_to_grid, and self_consumption_power.

  • Fix: Spurious WARNING log before every control write (Issue #327): "Socket not open, attempting reconnect" downgraded from WARNING to DEBUG — the socket closing between read cycles is by design, not a fault.


v0.9.3

  • Fix: TCP receive buffer flush on reconnect (Issue #317): After an HA restart, RS485-to-TCP adapters that buffer stale responses from a previous session caused repeated transaction ID mismatch errors. The integration now drains the adapter's receive buffer immediately after each connect() call.

  • Fix: Grid Connection Status shows Unknown on WIT inverters (Issue #319): Added VPP register 31000 (equipment_status) to the WIT profile. Improved fallback logic so profiles without register 31000 correctly report "On-grid" for legacy status codes 0 (Waiting) and 1 (Normal).


v0.9.2

  • Feature: Battery First / Grid First SOC limit controls on MIN TL-XH (PR #311): Two new number controls confirmed against V1.39: batt_first_charge_stopped_soc (H3048, 0–100%) stops charging at a set SOC in Battery First mode; grid_first_discharge_stopped_soc (H3067, 1–100%) stops discharging at a set SOC in Grid First mode (V1.39: US model / firmware ZACA-08+). batt_first_charge_power_rate (H3047) is now also available on TL-XH (was MOD/MID only). All appear as sliders under the Battery device.

  • Feature: Grid Connection Status sensor (PR #311): New text sensor on hybrid profiles with VPP equipment status (SPH, SPM, MOD, MIN TL-XH, WIT, SPA, SPE, MID V2.01). Reports On-grid / Off-grid / Unknown / Offline under the Grid device.


v0.9.1

⚠️ BREAKING CHANGE — affects all users. Grid Export Power and Grid Import Power have had their values swapped in all previous versions. After upgrading, each will read the opposite direction. Swap any automations, dashboard cards, or Energy Dashboard slots that reference either sensor. Users with Invert Grid Power enabled should also disable it (Settings → Devices & Services → Growatt Modbus → Configure).

New profiles:

  • Growatt 3000–15000TL3-S (Issue #299): Three-phase grid-tied string inverter (3–15 kW, legacy protocol). PV inputs, per-phase AC output (R/S/T), temperature, energy. Auto-detected via DTC 2049.

  • MIC 2500–5500MTL-S (Issue #304): Single-phase dual-string grid-tied (2.5–5.5 kW, legacy V3.05). Second PV string confirmed at regs 7–8. Auto-detected via DTC 210. Inverter rejects block reads — max_block_size: 1 mode handles this automatically (see fix below).

  • MID Hybrid (11–30kW) (Issue #313): MID 11–30KTL3-XH and MID 8–15KTL3-XHL/JP share DTC 5400 with MOD 3–10KTL3-XH and use identical registers. Added as a named manual-selection option ("MID Hybrid (11–30kW)") for MID users. Auto-detection continues to route DTC 5400 to MOD Hybrid.

Fixes:

  • Breaking fix: grid_export_power and grid_import_power swapped on all profiles (Issue #302): Both sensors had inverted formulas in all previous versions. On hybrid profiles the symptom was visible — during import, grid_export_power showed the import magnitude. On grid-tied models (MIN, MIC, MID), grid_export_power silently read zero. The signed grid_power sensor and daily energy sensors were unaffected. Also fixes the setup wizard's grid orientation detection which was enabling Invert Grid Power for the wrong case.

  • Fix: MIC 2500–5500MTL-S entities all unavailable (Issue #304): Inverter rejects any Modbus read of more than one register (ExceptionResponse, Illegal Function). Fixed by adding per-profile max_block_size: 1 support — profiles with this flag use sparse read mode, reading only defined register addresses one at a time. All other profiles unchanged.

  • Fix: Inverter Status shows wrong text on hybrid inverters (Issue #305): The status sensor used a single code table for all families. Hybrid inverters use the VPP V2.01 map where code 5 = "PV On-Grid" (not "Standby") and code 1 = "Self-Test" (not "Normal"). Fixed by selecting the correct table at runtime: STATUS_CODES for grid-tied, HYBRID_STATUS_CODES for hybrid, SPF_STATUS_CODES for off-grid.

  • Fix: SPH/SPM 8000–10000TL-HU auto-detection fails (Issue #303): DTC 21303 (firmware UL2.21) was missing from the DTC map, causing fallthrough to register probing which could misidentify the SPH HU as a MIC. Fixed by mapping DTC 21303 → sph_8000_10000_hu.

  • Fix: house_consumption returns solar generation on SPH/SPM HU (Issue #303): The HU variant does not populate power_to_load. The fallback to self_consumption_power (reg 1037/1038) was wrong — on UL2.21 it reports solar self-consumption, not total house load. Removed the intermediate step; integration now goes directly to solar + discharge − charge + import − export.

  • Fix: Remote Charge/Discharge Power slider rejects negative values (Issue #306): Register 30409 encodes discharge as negative (e.g. −80% = 0xFFB0). Code was passing a raw negative Python int to pymodbus (expects unsigned 16-bit). Fixed with value & 0xFFFF conversion and aligned read-back verification.

  • Fix: energy_today rises through the night on SPH hybrid inverters (Issue #307): Register 53/54 counts total AC output including battery discharge. The integration uses per-MPPT registers instead, but the guard checked pv*_energy_today > 0 — after midnight reset all MPPT values are 0, the guard failed, and the code fell back to reg 53/54 which climbed all night. Fixed by gating on register address existence, not value; the MPPT sum is always used on hybrid profiles.

  • Fix: MID 15–25kW PV3 missing from base profile (Issue #313): Base profile MID_15000_25000TL3_X was missing PV3 registers 11–14. Confirmed from the Issue #313 scan. MID models with a third MPPT string now show pv3_voltage, pv3_current, and pv3_power on both base and V2.01 profiles.


v0.9.0

  • Fix: Universal Scanner DTC registers showing as zero on fresh TCP connection: The DTC identification registers (holding 30000 and holding 43) frequently returned 0 in scan output even though read_register always worked. The scanner opens a new raw TCP connection that displaces the coordinator's session; the inverter returns 0 until it settles. Fixed with a post-connect warmup delay and end-of-scan settled re-reads — by the time the full range scan completes the inverter's Modbus state is stable. Also fixes garbled firmware version (holding 9-11) from the same cause.

  • Fix: VPP battery charge/discharge today swapped on SPH V2.01 profiles (Issue #300): battery_charge_today and battery_discharge_today from VPP registers 31202 and 31206 were labelled the wrong way round on sph_3000_6000_v201 and sph_7000_10000_v201. VPP Protocol V2.01 specifies 31202 as daily charge and 31206 as daily discharge. The legacy storage-range registers (1052/1053 and 1056/1057) were always correct; only the VPP-sourced entities were affected.

  • Feature: Universal Scanner now includes holding register scan (0-124 and 1000-1124): The export_register_dump scanner now reads holding registers (FC03) for the base range (0-124) and control range (1000-1124). These contain writable controls including ac_charge_enable (H1092), TOU time period slots (H1100-H1108), charge/discharge power rates, and scheduling windows. Holding register rows appear in the CSV with an H-prefix and a Suggested Match column populated from the active profile's register definitions.


v0.8.9

  • Fix: WIT all entities unavailable after upgrading to v0.8.8 (Issue #295): Two related bugs in the v0.8.8 register scan sizing affected WIT inverters. First, the base range check included WIT's 875-range registers, causing a ~999-register read that exceeded the Modbus limit. Second, WIT's base range extends to address 188, which also exceeds 125. Both fixed: 875-999 is now excluded from the base range check, and base ranges over 125 registers are now read in chunks. WIT/WIS models only.

  • Feature: Universal Scanner configurable block size: The export_register_dump service now has a Block Size field (125, 25, or 1 register per request; default 125). Use 25 or 1 for inverters that reject large block reads — older RS485 models and some TL3-S units return Illegal Function on 125-register requests. Smaller blocks scan every register individually at the cost of scan time.

  • Feature: Universal Scanner always reports both DTC registers: The notification and CSV now always show both VPP DTC (holding 30000) and legacy DTC (holding 43), making it easier to diagnose unknown or dual-protocol inverters.


v0.8.8

  • Feature: Configurable inter-request Modbus delay (Issue #294): A new Modbus Request Delay field (50–1000 ms, default 250 ms) is available in Options (Settings → Devices & Services → Growatt Modbus → Configure). Users seeing transaction_id mismatch errors or inverter fault log entries caused by Modbus traffic should increase this to 500–1000 ms. Takes effect immediately without restart.

  • Fix: Profile-driven input register block sizing: The base (0–N) and storage (1000–N) input register reads now request only as many registers as the active profile actually defines, rather than always reading 125. Reduces Modbus payload size and poll time.

  • Fix: VPP holding register retry throttling: VPP-range holding registers (30100, 30200–30201, 30407–30410) that return no response on the first read of a session are skipped for the rest of that session, preventing repeated unanswered requests from causing transaction-ID mismatches. Retried on the next HA restart.

  • Fix: priority_mode sensor displays mode name instead of raw integer: Shows "Load First", "Battery First", or "Grid First" instead of 0 / 1 / 2.

  • Feature: Export Limit Fallback Power Rate writable number control (holding register 3000): Available on MIN TL-X, MIN TL-XH, MIC 600–3300TL-X, and TL-XH 3000–10000 profiles (and all V2.01 variants). Reads and writes the fallback output power cap (0–100%) the inverter applies when export limitation control fails. Appears under the Grid device as a configuration entity.


v0.8.7

  • Fix: priority_mode (register 1044) demoted to read-only sensor (Issue #293): V1.39 protocol specifies holding register 1044 as read-only. SPH 3–6kW, SPH 7–10kW, and SPH-TL3 profiles incorrectly exposed it as a writable select entity. It is now a read-only diagnostic sensor under the Battery device. WIT (register 30476) and MOD (input register 3144) were already read-only and are unchanged.

  • Feature: SPH V2.01 remote power control registers (Issue #286): Registers 30407–30410 are now exposed on sph_3000_6000_v201 and sph_7000_10000_v201 as writable entities: remote_power_control_enable (on/off), remote_power_control_charging_time (0–1440 min), remote_charge_and_discharge_power (−100 to +100%), and vpp_ac_charge_enable (disabled/PV priority/AC priority). Enables time-limited charge/discharge overrides and AC charging mode control from HA automations.

  • Feature: Battery voltage range option in integration settings: A new Battery Voltage Range dropdown is available in Options (Settings → Devices & Services → Growatt Modbus → Configure): Auto-detect (default), Standard battery (under 600 V), or High-voltage battery (600–950 V, e.g. ARK). Use the High-voltage option when VPP register 31214 does not respond and register 3169 is reading ~10× too low due to a 16-bit overflow.

  • Feature: MID TL3-X V2.01 PV3 string sensors: pv3_voltage, pv3_current, and pv3_power are now available on the mid_15000_25000tl3_x_v201 profile via VPP registers 31018–31021.

  • Fix: MOD TL3-XH battery voltage 10× too high on standard battery systems (Issue #287): v0.8.0 changed register 3169 scale to 0.1 to fix high-voltage ARK battery readings (600–950 V). This broke units with standard 200–300 V batteries, producing readings 10× too high (e.g. 2500 V instead of 250 V). Register 3169 reverted to 0.01 V/unit. VPP register 31214 is now a higher-priority candidate in the voltage selection logic — when it responds it correctly covers both battery voltage ranges. The plausibility ceiling is raised from 800 V to 1100 V so HV readings are not discarded.


v0.8.5

  • Fix: MOD TL3-X and TL3-XH ac_power reported Phase R only: Both profiles had the total-power alias on the Phase R register instead of the three-phase total register (35/36). ac_power now correctly reflects full three-phase output.

  • Fix: Midnight ENERGY_GUARD retained previous-day small daily totals until morning: Daily totals under the 20 kWh spike threshold (e.g. charge_energy_today) were accepted into retention from the pre-reset inverter poll, then held as stale values until sunrise caused a backward step and HA recorder warnings. A 10-minute midnight grace window now suppresses all non-zero daily totals until the inverter has reset its own counters.

  • Feature: Inverter clock drift notification: On first connection each session the coordinator compares the inverter's system time registers to HA time. If drift exceeds 5 minutes a persistent HA notification is raised, explaining the impact on daily energy counters and how to fix it.

  • Breaking change: MID TL3-X grid export/import source corrected (Issue #242): grid_export_power and grid_import_power on MID grid-tied models (DTC 5001/5002 — MID 15–50KTL3-X, MID 20–30KTL3-X2) now read from VPP Meter Power (31112/31113) rather than Active Power (31100/31101). Active Power is the inverter's own AC output; Meter Power is the actual metered grid exchange. With a connected Growatt smart meter, export/import values will now be correct. Without a smart meter, these entities will read 0 — use ac_power / solar_total_power for inverter output monitoring. Hybrid models (SPH, MOD-XH, WIT) are unaffected.

  • Fix: Daily energy totals drop to 0 and show backward steps after mid-day inverter reconnect (Issue #284): When the inverter briefly goes offline mid-day and comes back online, ENERGY_GUARD retention was unconditionally cleared, leaving daily counters unprotected against the transient 0-reads that occur while the inverter repopulates its registers. Sensors dropped to 0 then recovered to a value slightly below the pre-offline reading, causing total_increasing recorder warnings in HA. Fixed by only clearing retention on morning wakeups (before 10:00) where stale-value detection is needed. Mid-day wakeups now preserve retention. The morning stale-detection path (Issue #225) is unaffected.

  • Fix: DTC 5001 misdetected as MIC (Issue #242): MID 17–25KTL3-X and related grid-tied MID/MOD-X models were falling through to MIC micro-inverter detection because DTC 5001 was not in the detection map. All missing DTC codes from Growatt VPP 2.03 Table 3-1 have been added: 5001/5002/5003 (MID/MOD/MAC-X grid-tied), 5600/5801 (large commercial WIT/WIS), 3503/3504 (SPH HU/HUB), 3701/3715/3716 (SPA AU/AUB/BL).

  • Fix: Lifetime energy totals show brief backward step after HA restart (Issue #285): energy_total and other lifetime counters are now written to HA storage immediately after each poll where their retained value changes, rather than via a background task that could be lost if HA restarted between polls. Eliminates the transient total_increasing backward-step warning seen on restart.


v0.8.4

  • Debug: [ENERGY_GUARD] diagnostic logging for energy counter protection (Issue #228): Searchable log entries now trace every accept/retain/spike-reject decision in the daily energy protection logic, plus the wake-up retention-clear event and stale-value debounce window. Helps diagnose inverters (e.g. MOD12-KTL3-HU) that accumulate overnight import values which then drop to zero at morning startup. Enable with custom_components.growatt_modbus: debug and search logs for ENERGY_GUARD.

v0.8.3

  • Fix (Issue #283): SPH 3–6kW and 7–10kW battery registers corrected: Input registers 13–19 in the 0–124 range were mislabelled as battery registers. Per V1.39 protocol they are PV3–PV5 channel registers. Battery data moved to the correct storage-range registers: discharge power (1009–1010), charge power (1011–1012), battery voltage (1013), SOC (1014), battery temperature (1040). Fixes wrong battery_power, battery_soc, and battery_voltage readings on SPH 3600 TL-UP and similar models.

v0.8.2

  • Fix: Critical set_battery_mode service was non-functional (F-001/F-002): The VPP write logic had been spliced into get_register_data, leaving set_battery_mode as a registered no-op. sync_tou_schedule had an orphaned _read() closure referencing undefined variables — a latent NameError on the success path. All three function bodies restructured.
  • Fix: services.yaml field mismatches (F-006/F-007): Removed three phantom services never registered in Python. Fixed set_battery_mode, write_registers, and sync_tou_schedule field definitions — each now matches the Python schema exactly.
  • Fix: Holding register reads omitted slave ID (F-003): read_holding_registers() now passes slave_id with a pymodbus compatibility fallback. Five auto_detection.py raw client calls switched to the wrapper.
  • Fix: WIT cooldown timestamp now set after successful write (F-005): Previously a failed write would block subsequent writes for the full 30-second cooldown unnecessarily.
  • Fix: Binary sensor is_on uses coordinator.is_online (F-018), duplicate coordinator property removed (F-021), explicit disconnect() on entry unload added (F-022).
  • Docs: battery-scheduling.md read_register examples corrected — wrong field names (register_address, count) replaced with the actual schema field (register).
  • Feat (Issue #282): WIT registers 235–238 exposed as read-only diagnostic sensorsntognd_detect, nonstd_vac_enable, enable_spec_set, fast_mppt_enable visible on the Inverter device. Intentionally read-only: these registers control safety-critical grid-protection behaviour; incorrect writes risk grid-code violations or hardware damage. All four are disabled by default and require explicit opt-in.
  • Fix (Issue #131): grid_first_discharge_power_rate range corrected to 1–100% — register 3036 on MOD TL3-XH is a percentage value; values above 100 cause an unknown inverter error. Number entity clamped accordingly.

v0.8.1

  • Fix (Issue #228): Daily energy spike at inverter startup eliminated. The midnight 32-bit register reset briefly produced garbage readings (e.g. 79 kWh) that were stored as the day's retained total. A 20 kWh/poll spike guard now rejects these with a WARNING log entry.

v0.8.0

  • Fix (Issue #228): MOD TL3-XH battery voltage scale corrected from 0.01 to 0.1. Hardware operates at 600–950 V — the previous scale overflows a 16-bit register above 655 V, producing readings ~10× too low (e.g. 73 V instead of 733 V).
  • Feat (Issue #131): MOD TL3-XH — two new battery mode power rate controls: grid_first_discharge_power_rate (register 3036, 1–255) and batt_first_charge_power_rate (register 3047, 1–100%). Appear as number entities under the Battery device.
  • Refactor: VPP V2.01 shared register block extraction (Phase 3) — new vpp_v201.py shared block library used across SPH, MIN, TL-XH, SPH-TL3, and MID V2.01 profiles. Also fixed two previously missing SPH-TL3 registers: ipm_temp_vpp (31131), boost_temp_vpp (31132), and active_power_rate_vpp (30114) — all confirmed responding in hardware scans.

v0.7.9

  • Feat: Documentation migrated to GitHub Pages at 0xaha.github.io/Growatt_ModbusTCP. README slimmed to installation essentials with a link to the full docs.
  • Feat: Register read and disconnect log messages promoted from DEBUG to INFO — successful polls are now visible without enabling debug logging.
  • Refactor: Template-generated sensor definitions — PV string (1/2/3) and three-phase R/S/T sensor groups replaced with helper functions, reducing sensor.py by ~100 lines. CI test updated to parse grep-index comments for statically-analysing generated keys.
  • Refactor: Profile key alias mechanism — PROFILE_ALIASES dict in device_profiles.py maps retired profile keys to canonical replacements. First alias: mod_6000_15000tl3_xh_v201mod_6000_15000tl3_xh (identical register map and sensors). Config entries are silently updated on startup.

v0.7.8

  • Feat: INFO-level startup logging — single log line summarising active profile, connection, scan interval, and polled register ranges without needing debug mode.
  • Feat: CI sensor integrity tests (pytest) — three automated tests verify sensor definitions, device map assignments, and sensor group consistency on every push.
  • Fix: ac_voltage_rs/st/tr three-phase line-to-line voltage sensors were wired end-to-end but missing from SENSOR_DEFINITIONS; added as diagnostic sensors.
  • Fix: V2.01 profile incorrectly assigned to non-VPP inverters — introduced vpp_protocol_confirmed flag; automatic migration downgrades affected entries on startup with a one-time WARNING log.
  • Chore: Removed orphaned SENSOR_DEVICE_MAP entries for legacy BMS register variants.

v0.7.7

  • Refactor: Composite sensor group constants — introduced GRID_TIED_1P_SENSORS, HYBRID_1P_SENSORS, HYBRID_3P_SENSORS to eliminate 17 verbatim-repeated sensor union blocks across profiles. Net: −201 lines in device_profiles.py. No runtime behaviour change.

v0.7.6

  • Refactor: Extracted SPE_OFFGRID_SENSORS constant for the spe_8000_12000_es profile, with comments documenting deviations from SPF_OFFGRID_SENSORS. No runtime behaviour change.

v0.7.5

  • Fix: SPH-TL3 power flow corrections — grid_import_power and grid_export_power sign handling normalised to match other hybrid profiles.

v0.7.4

  • Feat: Per-string energy sensors (pv1_energy_today, pv2_energy_today) added for profiles that expose them via registers.
  • Fix: Register mapping corrections for several SPH and MOD profiles.

v0.7.3

  • Feat: SPH-TL3 TOU scheduling controls — time period entities for battery charge/discharge scheduling.
  • Feat: Translations for 20 languages.

View the full release history on GitHub →