Skip to content

Commit

Permalink
Add connector
Browse files Browse the repository at this point in the history
  • Loading branch information
andig committed Jun 22, 2024
1 parent f8e9582 commit 99af80d
Showing 1 changed file with 41 additions and 33 deletions.
74 changes: 41 additions & 33 deletions charger/em2go.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -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)
Expand All @@ -93,16 +100,17 @@ 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 (
phases1p3p func(int) 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
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand All @@ -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
}

Expand All @@ -164,15 +172,15 @@ 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
}

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
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand Down Expand Up @@ -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
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand All @@ -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))
}
}

0 comments on commit 99af80d

Please sign in to comment.