From 10ad187618ab69f0730a005fedcf97c6b2ed1538 Mon Sep 17 00:00:00 2001 From: premultiply <4681172+premultiply@users.noreply.github.com> Date: Sat, 3 May 2025 22:20:46 +0200 Subject: [PATCH] Mennekes-Compact: fix reboot and phase switching (#20579) Co-authored-by: andig --- charger/mennekes-compact.go | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/charger/mennekes-compact.go b/charger/mennekes-compact.go index 39495f41b..3989d167d 100644 --- a/charger/mennekes-compact.go +++ b/charger/mennekes-compact.go @@ -44,7 +44,7 @@ const ( mennekesRegEvseState = 0x0100 // uint16 mennekesRegAuthorizationStatus = 0x0101 // uint16 mennekesRegCpState = 0x0108 // uint16 - mennekesRegChargingCurrentEM = 0x0302 // float32 + mennekesRegChargingCurrentEM = 0x0302 // float32 [Heartbeat] mennekesRegPhaseOptionsHW = 0x030C // uint16 mennekesRegGridPhasesConnected = 0x0311 // uint16 mennekesRegAuthorization = 0x0312 // uint16 @@ -53,9 +53,9 @@ const ( mennekesRegPower = 0x0512 // float32 mennekesRegChargedEnergySession = 0x0B02 // float32 mennekesRegDurationSession = 0x0B04 // uint32 - mennekesRegHeartbeat = 0x0D00 // uint16 + mennekesRegHeartbeat = 0x0D00 // uint16 [Heartbeat] mennekesRegRequestedPhases = 0x0D04 // uint16 - mennekesRegChargingReleaseEM = 0x0D05 // uint16 + mennekesRegChargingReleaseEM = 0x0D05 // uint16 [Heartbeat] mennekesRegChargedEnergyTotal = 0x1000 // float32 mennekesAllowed = 1 @@ -148,13 +148,19 @@ func (wb *MennekesCompact) Status() (api.ChargeStatus, error) { switch status := encoding.Uint16(b); status { case 1: return api.StatusA, nil - case 2, 3, 4: return api.StatusB, nil - case 5: return api.StatusC, nil - + case 6: + b := make([]byte, 4) + if _, err := wb.conn.WriteMultipleRegisters(mennekesRegChargingCurrentEM, 2, b); err != nil { + return api.StatusNone, err + } + if _, err := wb.conn.WriteSingleRegister(mennekesRegChargingReleaseEM, mennekesAllowed); err != nil { + return api.StatusNone, err + } + return api.StatusNone, nil default: return api.StatusNone, fmt.Errorf("invalid status: %d", status) } @@ -280,7 +286,17 @@ func (wb *MennekesCompact) phases1p3p(phases int) error { u = 1 } + // temporarily disable charger during phase switching + if en, err := wb.Enabled(); err == nil && en { + if err := wb.Enable(false); err != nil { + return err + } + + defer wb.Enable(true) + } + _, err := wb.conn.WriteSingleRegister(mennekesRegRequestedPhases, u) + return err }