From 0aa9b0162de37f4d5b78b2f2277fa68010e3d8ae Mon Sep 17 00:00:00 2001 From: premultiply <4681172+premultiply@users.noreply.github.com> Date: Tue, 23 Aug 2022 09:07:57 +0200 Subject: [PATCH] Heidelberg: fix locking (#4117) --- charger/heidelberg-ec.go | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/charger/heidelberg-ec.go b/charger/heidelberg-ec.go index 5be8b92d67..7acebf30a3 100644 --- a/charger/heidelberg-ec.go +++ b/charger/heidelberg-ec.go @@ -131,6 +131,19 @@ func (wb *HeidelbergEC) Status() (api.ChargeStatus, error) { case 9: return api.StatusE, nil case 10: + // ensure RemoteLock is disabled after wake-up + l, err := wb.conn.ReadInputRegisters(hecRegRemoteLock, 1) + if err != nil { + return api.StatusNone, err + } + if binary.BigEndian.Uint16(l) != 1 { + // unlock + err = wb.set(hecRegRemoteLock, 1) + if err != nil { + return api.StatusNone, err + } + } + if wb.wakeup { // keep status B2 during wakeup return api.StatusB, nil @@ -273,13 +286,14 @@ var _ api.Resurrector = (*HeidelbergEC)(nil) // WakeUp implements the api.Resurrector interface func (wb *HeidelbergEC) WakeUp() error { // force status F by locking - err := wb.set(hecRegRemoteLock, 0) - if err == nil { - // Always takes at least ~10 sec to return to normal operation + if wb.set(hecRegRemoteLock, 0) == nil { + // Takes at least ~10 sec to return to normal operation // after locking even if unlocking immediately. wb.wakeup = true - // return to normal operation by unlocking after ~10 sec - err = wb.set(hecRegRemoteLock, 1) } + + // return to normal operation by unlocking after ~10 sec + err := wb.set(hecRegRemoteLock, 1) + return err }