From 3980d5c442012d5abe9bf06268b2a370aa574bcf Mon Sep 17 00:00:00 2001 From: andig Date: Tue, 23 Jun 2026 11:20:39 +0200 Subject: [PATCH] Revert "GoodWe: remove non-functional wallbox phase switching (#30790)" This reverts commit 3aac67bdd0f635c116c660c900ae6508e50e73e4. --- charger/goodwe.go | 40 ++++++++++++++----- .../definition/charger/goodwe-wallbox.yaml | 2 +- 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/charger/goodwe.go b/charger/goodwe.go index 06898d86d..2aa1b6ac3 100644 --- a/charger/goodwe.go +++ b/charger/goodwe.go @@ -46,17 +46,18 @@ type GoodWe struct { } const ( - goodweRegVoltages = 10009 // U16 ×0.1 V, 3 regs (L1/L2/L3) - goodweRegCurrents = 10012 // U16 ×0.1 A, 3 regs (L1/L2/L3) - goodweRegActualPower = 10015 // U16 ×0.1 kW - goodweRegStatus = 10017 // U16 enum (see status mapping) - goodweRegMaxPower = 10029 // U16 ×0.1 kW, raw range [14,220] - goodweRegChargeMode = 10032 // U16 (0=fast, 1=PV, 2=PV+battery) - goodweRegPowerSpec = 10058 // U16 (0=7kW, 1=11kW, 2=22kW) - goodweRegPhaseSpec = 10059 // U16 (0=3p, 1=1p) - goodweRegRfid = 10500 // 7 regs ASCII (14-byte card UID) - goodweRegChargeCommand = 10060 // U16 (1=stop, 2=start) - goodweRegTotalEnergy = 10065 // U32 ×0.1 kWh, 2 regs + goodweRegVoltages = 10009 // U16 ×0.1 V, 3 regs (L1/L2/L3) + goodweRegCurrents = 10012 // U16 ×0.1 A, 3 regs (L1/L2/L3) + goodweRegActualPower = 10015 // U16 ×0.1 kW + goodweRegStatus = 10017 // U16 enum (see status mapping) + goodweRegPhaseSwEnabled = 10023 // U16 (0=Off, 1=On) + goodweRegMaxPower = 10029 // U16 ×0.1 kW, raw range [14,220] + goodweRegChargeMode = 10032 // U16 (0=fast, 1=PV, 2=PV+battery) + goodweRegPowerSpec = 10058 // U16 (0=7kW, 1=11kW, 2=22kW) + goodweRegPhaseSpec = 10059 // U16 (0=3p, 1=1p) + goodweRegRfid = 10500 // 7 regs ASCII (14-byte card UID) + goodweRegChargeCommand = 10060 // U16 (1=stop, 2=start) + goodweRegTotalEnergy = 10065 // U32 ×0.1 kWh, 2 regs goodweChargeStop = 1 goodweChargeStart = 2 @@ -134,6 +135,18 @@ func NewGoodWe(ctx context.Context, uri string, slaveID uint8) (api.Charger, err log.WARN.Printf("read hw phase count failed, defaulting to 3-phase: %v", err) } + // only 3-phase hardware can do 1p/3p switching; conditionally register phase switching + // based on hardware capability. On read error, fall back to fixed-phase operation. + if wb.phases == 3 { + if b, err := wb.conn.ReadHoldingRegisters(goodweRegPhaseSwEnabled, 1); err == nil { + if binary.BigEndian.Uint16(b) == 1 { + implement.Has(wb, implement.PhaseSwitcher(wb.phases1p3p)) + } + } else { + log.WARN.Printf("read phase switch config failed, disabling dynamic phase switching: %v", err) + } + } + // force "fast" charging mode so evcc fully controls power setpoint if _, err := wb.conn.WriteSingleRegister(goodweRegChargeMode, goodweChargeModeFast); err != nil { return nil, fmt.Errorf("set charge mode: %w", err) @@ -255,6 +268,11 @@ func (wb *GoodWe) Voltages() (float64, float64, float64, error) { return wb.phaseValues(goodweRegVoltages, 10) } +func (wb *GoodWe) phases1p3p(phases int) error { + wb.phases = phases + return nil +} + var _ api.Identifier = (*GoodWe)(nil) // Identify implements api.Identifier (RFID UID, 14-byte NUL-padded ASCII). diff --git a/templates/definition/charger/goodwe-wallbox.yaml b/templates/definition/charger/goodwe-wallbox.yaml index dbd28a1d3..e9ca504b5 100644 --- a/templates/definition/charger/goodwe-wallbox.yaml +++ b/templates/definition/charger/goodwe-wallbox.yaml @@ -3,7 +3,7 @@ products: - brand: GoodWe description: generic: HCA Wallbox (Gen2) -capabilities: ["mA", "rfid", "meter"] +capabilities: ["mA", "rfid", "1p3p", "meter"] requirements: evcc: ["sponsorship"] description: