From ec91e5261e7c22a3ef64a9e137555134ba7896a9 Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 3 Nov 2024 11:47:36 +0100 Subject: [PATCH] Em2Go: work around current being reset (#17050) --- charger/em2go.go | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/charger/em2go.go b/charger/em2go.go index 2a4e413f3..47887facd 100644 --- a/charger/em2go.go +++ b/charger/em2go.go @@ -34,7 +34,7 @@ import ( type Em2Go struct { log *util.Logger conn *modbus.Connection - current int64 + current uint16 workaround bool phases int } @@ -99,7 +99,7 @@ func NewEm2Go(uri string, slaveID uint8) (api.Charger, error) { wb := &Em2Go{ log: log, conn: conn, - current: 6, + current: 60, workaround: false, } @@ -177,19 +177,29 @@ func (wb *Em2Go) Enable(enable bool) error { } // re-set 1p if required - if wb.workaround && wb.phases == 1 && enable { - binary.BigEndian.PutUint16(b, uint16(wb.phases)) - if _, err := wb.conn.WriteMultipleRegisters(em2GoRegPhases, 1, b); err != nil { - return err + if wb.workaround && enable { + if wb.phases == 1 { + binary.BigEndian.PutUint16(b, uint16(wb.phases)) + if _, err := wb.conn.WriteMultipleRegisters(em2GoRegPhases, 1, b); err != nil { + return err + } } // send default current - return wb.MaxCurrent(wb.current) + return wb.setCurrent(wb.current) } return nil } +func (wb *Em2Go) setCurrent(current uint16) error { + b := make([]byte, 2) + binary.BigEndian.PutUint16(b, current) + + _, err := wb.conn.WriteMultipleRegisters(em2GoRegCurrentLimit, 1, b) + return err +} + // MaxCurrent implements the api.Charger interface func (wb *Em2Go) MaxCurrent(current int64) error { return wb.maxCurrentMillis(float64(current)) @@ -197,10 +207,11 @@ func (wb *Em2Go) MaxCurrent(current int64) error { // maxCurrentMillis implements the api.ChargerEx interface func (wb *Em2Go) maxCurrentMillis(current float64) error { - b := make([]byte, 2) - binary.BigEndian.PutUint16(b, uint16(10*current)) - - _, err := wb.conn.WriteMultipleRegisters(em2GoRegCurrentLimit, 1, b) + curr := uint16(current * 10) + err := wb.setCurrent(curr) + if err == nil { + wb.current = curr + } return err }