From 99af80d9cb942ce71776305c79822ff6d2f1678a Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 22 Jun 2024 10:09:27 +0200 Subject: [PATCH] Add connector --- charger/em2go.go | 74 +++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/charger/em2go.go b/charger/em2go.go index 1ff1f17970..88e7e21a71 100644 --- a/charger/em2go.go +++ b/charger/em2go.go @@ -32,8 +32,9 @@ import ( // Em2Go charger implementation type Em2Go struct { - log *util.Logger - conn *modbus.Connection + log *util.Logger + conn *modbus.Connection + offset uint16 } const ( @@ -66,19 +67,25 @@ func init() { // NewEm2GoFromConfig creates a Em2Go charger from generic config func NewEm2GoFromConfig(other map[string]interface{}) (api.Charger, error) { - cc := modbus.TcpSettings{ - ID: 255, + cc := struct { + modbus.TcpSettings `mapstructure:",squash"` + Connector uint16 + }{ + TcpSettings: modbus.TcpSettings{ + ID: 255, + }, + Connector: 1, } if err := util.DecodeOther(other, &cc); err != nil { return nil, err } - return NewEm2Go(cc.URI, cc.ID) + return NewEm2Go(cc.URI, cc.ID, cc.Connector) } // NewEm2Go creates Em2Go charger -func NewEm2Go(uri string, slaveID uint8) (api.Charger, error) { +func NewEm2Go(uri string, slaveID uint8, connector uint16) (api.Charger, error) { uri = util.DefaultPort(uri, 502) conn, err := modbus.NewConnection(uri, "", "", 0, modbus.Tcp, slaveID) @@ -93,8 +100,9 @@ func NewEm2Go(uri string, slaveID uint8) (api.Charger, error) { conn.Logger(log.TRACE) wb := &Em2Go{ - log: log, - conn: conn, + log: log, + conn: conn, + offset: 256 * (connector - 1), } var ( @@ -102,7 +110,7 @@ func NewEm2Go(uri string, slaveID uint8) (api.Charger, error) { phasesG func() (int, error) ) - if _, err := wb.conn.ReadHoldingRegisters(em2GoRegPhases, 1); err == nil { + if _, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegPhases, 1); err == nil { phases1p3p = wb.phases1p3p phasesG = wb.getPhases } @@ -112,7 +120,7 @@ func NewEm2Go(uri string, slaveID uint8) (api.Charger, error) { // Status implements the api.Charger interface func (wb *Em2Go) Status() (api.ChargeStatus, error) { - b, err := wb.conn.ReadHoldingRegisters(em2GoRegStatus, 1) + b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegStatus, 1) if err != nil { return api.StatusNone, err } @@ -133,7 +141,7 @@ func (wb *Em2Go) Status() (api.ChargeStatus, error) { // Enabled implements the api.Charger interface func (wb *Em2Go) Enabled() (bool, error) { - b, err := wb.conn.ReadHoldingRegisters(em2GoRegChargeCommand, 1) + b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegChargeCommand, 1) if err != nil { return false, err } @@ -148,7 +156,7 @@ func (wb *Em2Go) Enable(enable bool) error { b := make([]byte, 2) binary.BigEndian.PutUint16(b, map[bool]uint16{true: 1, false: 2}[enable]) - _, err := wb.conn.WriteMultipleRegisters(em2GoRegChargeCommand, 1, b) + _, err := wb.conn.WriteMultipleRegisters(wb.offset+em2GoRegChargeCommand, 1, b) return err } @@ -164,7 +172,7 @@ 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) + _, err := wb.conn.WriteMultipleRegisters(wb.offset+em2GoRegCurrentLimit, 1, b) return err } @@ -172,7 +180,7 @@ var _ api.CurrentGetter = (*Em2Go)(nil) // GetMaxCurrent implements the api.CurrentGetter interface func (wb Em2Go) GetMaxCurrent() (float64, error) { - b, err := wb.conn.ReadHoldingRegisters(em2GoRegCurrentLimit, 1) + b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegCurrentLimit, 1) if err != nil { return 0, err } @@ -184,7 +192,7 @@ var _ api.Meter = (*Em2Go)(nil) // CurrentPower implements the api.Meter interface func (wb *Em2Go) CurrentPower() (float64, error) { - b, err := wb.conn.ReadHoldingRegisters(em2GoRegPower, 2) + b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegPower, 2) if err != nil { return 0, err } @@ -196,7 +204,7 @@ var _ api.MeterEnergy = (*Em2Go)(nil) // TotalEnergy implements the api.MeterEnergy interface func (wb *Em2Go) TotalEnergy() (float64, error) { - b, err := wb.conn.ReadHoldingRegisters(em2GoRegEnergy, 2) + b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegEnergy, 2) if err != nil { return 0, err } @@ -209,7 +217,7 @@ func (wb *Em2Go) getPhaseValues(reg uint16) (float64, float64, float64, error) { var res [3]float64 for i := range 3 { - b, err := wb.conn.ReadHoldingRegisters(reg+2*uint16(i), 1) + b, err := wb.conn.ReadHoldingRegisters(wb.offset+reg+2*uint16(i), 1) if err != nil { return 0, 0, 0, err } @@ -238,7 +246,7 @@ var _ api.ChargeRater = (*Em2Go)(nil) // ChargedEnergy implements the api.ChargeRater interface func (wb *Em2Go) ChargedEnergy() (float64, error) { - b, err := wb.conn.ReadHoldingRegisters(em2GoRegChargedEnergy, 2) + b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegChargedEnergy, 2) if err != nil { return 0, err } @@ -250,7 +258,7 @@ var _ api.ChargeTimer = (*Em2Go)(nil) // ChargeDuration implements the api.ChargeTimer interface func (wb *Em2Go) ChargeDuration() (time.Duration, error) { - b, err := wb.conn.ReadHoldingRegisters(em2GoRegChargeDuration, 2) + b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegChargeDuration, 2) if err != nil { return 0, err } @@ -263,13 +271,13 @@ func (wb *Em2Go) phases1p3p(phases int) error { b := make([]byte, 2) binary.BigEndian.PutUint16(b, uint16(phases)) - _, err := wb.conn.WriteMultipleRegisters(em2GoRegPhases, 1, b) + _, err := wb.conn.WriteMultipleRegisters(wb.offset+em2GoRegPhases, 1, b) return err } // getPhases implements the api.PhaseGetter interface func (wb *Em2Go) getPhases() (int, error) { - b, err := wb.conn.ReadHoldingRegisters(em2GoRegPhases, 1) + b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegPhases, 1) if err != nil { return 0, err } @@ -281,46 +289,46 @@ var _ api.Diagnosis = (*Em2Go)(nil) // Diagnose implements the api.Diagnosis interface func (wb *Em2Go) Diagnose() { - if b, err := wb.conn.ReadHoldingRegisters(em2GoRegStatus, 1); err == nil { + if b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegStatus, 1); err == nil { fmt.Printf("\tCharging Station Status:\t%d\n", binary.BigEndian.Uint16(b)) } - if b, err := wb.conn.ReadHoldingRegisters(em2GoRegConnectorState, 1); err == nil { + if b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegConnectorState, 1); err == nil { fmt.Printf("\tConnector State:\t%d\n", binary.BigEndian.Uint16(b)) } - if b, err := wb.conn.ReadHoldingRegisters(em2GoRegErrorCode, 1); err == nil { + if b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegErrorCode, 1); err == nil { fmt.Printf("\tError Code:\t%d\n", binary.BigEndian.Uint16(b)) } - if b, err := wb.conn.ReadHoldingRegisters(em2GoRegMaxCurrent, 1); err == nil { + if b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegMaxCurrent, 1); err == nil { fmt.Printf("\tEVSE Max. Current:\t%.1fA\n", float64(binary.BigEndian.Uint16(b)/10)) } - if b, err := wb.conn.ReadHoldingRegisters(em2GoRegMaxCurrent, 1); err == nil { + if b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegMaxCurrent, 1); err == nil { fmt.Printf("\tEVSE Min. Current:\t%.1fA\n", float64(binary.BigEndian.Uint16(b)/10)) } - if b, err := wb.conn.ReadHoldingRegisters(em2GoRegCableMaxCurrent, 1); err == nil { + if b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegCableMaxCurrent, 1); err == nil { fmt.Printf("\tCable Max. Current:\t%.1fA\n", float64(binary.BigEndian.Uint16(b)/10)) } var serial []byte for reg := 0; reg < 8; reg++ { - b, err := wb.conn.ReadHoldingRegisters(em2GoRegSerial+2*uint16(reg), 2) + b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegSerial+2*uint16(reg), 2) if err != nil { return } serial = append(serial, b...) } fmt.Printf("\tSerial: %s\n", string(serial)) - if b, err := wb.conn.ReadHoldingRegisters(em2GoRegSafeCurrent, 1); err == nil { + if b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegSafeCurrent, 1); err == nil { fmt.Printf("\tSafe Current:\t%.1fA\n", float64(binary.BigEndian.Uint16(b)/10)) } - if b, err := wb.conn.ReadHoldingRegisters(em2GoRegCommTimeout, 1); err == nil { + if b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegCommTimeout, 1); err == nil { fmt.Printf("\tConnection Timeout:\t%d\n", binary.BigEndian.Uint16(b)) } - if b, err := wb.conn.ReadHoldingRegisters(em2GoRegCurrentLimit, 1); err == nil { + if b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegCurrentLimit, 1); err == nil { fmt.Printf("\tCurrent Limit:\t%.1fA\n", float64(binary.BigEndian.Uint16(b)/10)) } - if b, err := wb.conn.ReadHoldingRegisters(em2GoRegChargeMode, 1); err == nil { + if b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegChargeMode, 1); err == nil { fmt.Printf("\tCharge Mode:\t%d\n", binary.BigEndian.Uint16(b)) } - if b, err := wb.conn.ReadHoldingRegisters(em2GoRegChargeCommand, 1); err == nil { + if b, err := wb.conn.ReadHoldingRegisters(wb.offset+em2GoRegChargeCommand, 1); err == nil { fmt.Printf("\tCharge Command:\t%d\n", binary.BigEndian.Uint16(b)) } }