Describe the bug
Two separate issues with plugin_solax_ev_charger.py on an X3-HAC 22kW (Gen2, ARM v2.03), polled as a dedicated hub over Modbus TCP directly to the charger's own LAN address.
Reads are otherwise excellent: communication_success_rate sits at 100.0 % and all 27 enabled sensors return plausible values every 10 s. Writes work too - see Additional context.
1. charge_added_cumulative is off by exactly a factor of 65536 (hi/lo word swap)
sensor.<hub>_ev_charger_charge_added_cumulative 21 141 913.6 kWh
The same charger read through the separate solax_http custom integration (local HTTP API, entirely independent code path) reports the lifetime total as:
sensor.solax_api_charge_added_total 322.6 kWh
And 322.6 x 65536 = 21 141 913.6 - an exact match, not an approximation. Classic symptom of the two 16-bit halves of a 32-bit register being combined in the wrong order.
Related: charge_added_total reads 0.0 kWh at the same moment, while the real lifetime total is 322.6 kWh. So the register that actually holds the lifetime figure appears to be the one mapped to charge_added_cumulative, and charge_added_total looks mislabelled or mapped to a register this firmware does not populate.
PRs #2178 and #2227 touched EVC energy word order, but this sensor is still wrong in 2026.07.4.
2. Register 0x634 (Timer Boost Start Time) never responds
Repeating several times per hour, see the log section below.
In plugin_solax_ev_charger.py, 0x634 is declared twice - once as a SolaXEVChargerModbusTimeEntityDescription and once as a SolaXEVChargerModbusSensorEntityDescription - both with wordcount=2, for Timer Boost Start Time.
The charger answers every other register fine but never this one. Raising time_out from 5 to 15 seconds in the hub options changed nothing: the message still reads after 1 retries, so the retry count appears fixed at 1 and the extra latency budget is not the issue. Either this X3-HAC firmware does not implement that register block, or the address / wordcount is off for Gen2 hardware.
Side effect worth noting: communication_health flips to Degraded while communication_success_rate stays at 100.0 %. Those two contradict each other.
Integration Version
2026.07.4
Homeassistant core version
2026.7.4
Inverter brand
SolaX Power
Plugin used
plugin_solax_ev_charger.py
Serial prefix
Charger: 5030M0011A0102 (X3-HAC 22kW, hardware Gen2). Inverter on site, separate hub, not involved: X3-Ultra-25kW, prefix H3BF
Inverter firmware versions
Charger: ARM v2.03. Inverter (separate hub, for context): DSP 31.04 ARM 31.04-31.10, Gen5
Connection Method
Modbus TCP, tcp type, directly to the charger own LAN address on port 502, read_modbus_addr 70, scan intervals 10/10/10 s, time_out 5 s. Second hub, alongside an inverter hub pointing at a different gateway address.
Dongle firmware
N/A - the charger is reached over its built-in network interface, not a Pocket WiFi dongle
Detailed Error Log
Logger: custom_components.solax_modbus
Source: custom_components/solax_modbus/init.py
Error: device: 70 address: 0x634 -> Modbus Error: [Input/Output]
No response received after 1 retries, continue with next request
Additional context
Writes do work on this setup - I mention it because issue #2225 might suggest otherwise for EV chargers, and I do not want to muddy that report. Writing number.<hub>_ev_charger_max_charge_current (register 0x668) from 32 A to 30 A and back was accepted and held, and the change was confirmed independently by the solax_http integration reading the same charger over HTTP. So the value genuinely reached the device.
One behaviour I could not fully explain, in case it rings a bell: select.<hub>_ev_charger_charger_use_mode (register 0x60D) shows Fast optimistically, then returns to Stop at the next poll. This is with no vehicle connected (run_mode = Available).
No error is logged for 0x60D - the only errors during the test were the unrelated 0x634 ones. I also ruled out interference from my own automations: none of the ones that can set this register fired during the test window (checked via last_triggered), and solax_http never reported Fast either.
So I cannot tell whether the charger silently rejects the write, or accepts it and immediately resets to Stop because no car is plugged in. Writes to 0x668 on the same device do stick, so it is not a general write problem. I will retest with a vehicle connected and report back - flagging it here in case the expected behaviour of 0x60D on an idle charger is already known.
Describe the bug
Two separate issues with
plugin_solax_ev_charger.pyon an X3-HAC 22kW (Gen2, ARM v2.03), polled as a dedicated hub over Modbus TCP directly to the charger's own LAN address.Reads are otherwise excellent:
communication_success_ratesits at 100.0 % and all 27 enabled sensors return plausible values every 10 s. Writes work too - see Additional context.1.
charge_added_cumulativeis off by exactly a factor of 65536 (hi/lo word swap)The same charger read through the separate
solax_httpcustom integration (local HTTP API, entirely independent code path) reports the lifetime total as:And 322.6 x 65536 = 21 141 913.6 - an exact match, not an approximation. Classic symptom of the two 16-bit halves of a 32-bit register being combined in the wrong order.
Related:
charge_added_totalreads0.0 kWhat the same moment, while the real lifetime total is 322.6 kWh. So the register that actually holds the lifetime figure appears to be the one mapped tocharge_added_cumulative, andcharge_added_totallooks mislabelled or mapped to a register this firmware does not populate.PRs #2178 and #2227 touched EVC energy word order, but this sensor is still wrong in 2026.07.4.
2. Register
0x634(Timer Boost Start Time) never respondsRepeating several times per hour, see the log section below.
In
plugin_solax_ev_charger.py,0x634is declared twice - once as aSolaXEVChargerModbusTimeEntityDescriptionand once as aSolaXEVChargerModbusSensorEntityDescription- both withwordcount=2, for Timer Boost Start Time.The charger answers every other register fine but never this one. Raising
time_outfrom 5 to 15 seconds in the hub options changed nothing: the message still readsafter 1 retries, so the retry count appears fixed at 1 and the extra latency budget is not the issue. Either this X3-HAC firmware does not implement that register block, or the address / wordcount is off for Gen2 hardware.Side effect worth noting:
communication_healthflips toDegradedwhilecommunication_success_ratestays at100.0 %. Those two contradict each other.Integration Version
2026.07.4
Homeassistant core version
2026.7.4
Inverter brand
SolaX Power
Plugin used
plugin_solax_ev_charger.py
Serial prefix
Charger: 5030M0011A0102 (X3-HAC 22kW, hardware Gen2). Inverter on site, separate hub, not involved: X3-Ultra-25kW, prefix H3BF
Inverter firmware versions
Charger: ARM v2.03. Inverter (separate hub, for context): DSP 31.04 ARM 31.04-31.10, Gen5
Connection Method
Modbus TCP, tcp type, directly to the charger own LAN address on port 502, read_modbus_addr 70, scan intervals 10/10/10 s, time_out 5 s. Second hub, alongside an inverter hub pointing at a different gateway address.
Dongle firmware
N/A - the charger is reached over its built-in network interface, not a Pocket WiFi dongle
Detailed Error Log
Logger: custom_components.solax_modbus
Source: custom_components/solax_modbus/init.py
Error: device: 70 address: 0x634 -> Modbus Error: [Input/Output]
No response received after 1 retries, continue with next request
Additional context
Writes do work on this setup - I mention it because issue #2225 might suggest otherwise for EV chargers, and I do not want to muddy that report. Writing
number.<hub>_ev_charger_max_charge_current(register0x668) from 32 A to 30 A and back was accepted and held, and the change was confirmed independently by thesolax_httpintegration reading the same charger over HTTP. So the value genuinely reached the device.One behaviour I could not fully explain, in case it rings a bell:
select.<hub>_ev_charger_charger_use_mode(register0x60D) showsFastoptimistically, then returns toStopat the next poll. This is with no vehicle connected (run_mode=Available).No error is logged for
0x60D- the only errors during the test were the unrelated0x634ones. I also ruled out interference from my own automations: none of the ones that can set this register fired during the test window (checked vialast_triggered), andsolax_httpnever reportedFasteither.So I cannot tell whether the charger silently rejects the write, or accepts it and immediately resets to
Stopbecause no car is plugged in. Writes to0x668on the same device do stick, so it is not a general write problem. I will retest with a vehicle connected and report back - flagging it here in case the expected behaviour of0x60Don an idle charger is already known.