From b50f0d4ac09e6b93853fe7e80b018e503b1be3d8 Mon Sep 17 00:00:00 2001 From: andig Date: Sun, 20 Nov 2022 14:16:09 +0100 Subject: [PATCH] Add Etrel Duo (#5223) --- charger/etrel.go | 31 ++++++++++++++------- templates/definition/charger/etrel-duo.yaml | 22 +++++++++++++++ templates/docs/charger/etrel-duo_0.yaml | 14 ++++++++++ 3 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 templates/definition/charger/etrel-duo.yaml create mode 100644 templates/docs/charger/etrel-duo_0.yaml diff --git a/charger/etrel.go b/charger/etrel.go index 9529ea809..921e969a6 100644 --- a/charger/etrel.go +++ b/charger/etrel.go @@ -53,6 +53,7 @@ const ( type Etrel struct { log *util.Logger conn *modbus.Connection + base uint16 current float32 } @@ -62,19 +63,25 @@ func init() { // NewEtrelFromConfig creates a Etrel charger from generic config func NewEtrelFromConfig(other map[string]interface{}) (api.Charger, error) { - cc := modbus.TcpSettings{ - ID: 1, + cc := struct { + Connector int + modbus.TcpSettings + }{ + Connector: 1, + TcpSettings: modbus.TcpSettings{ + ID: 1, + }, } if err := util.DecodeOther(other, &cc); err != nil { return nil, err } - return NewEtrel(cc.URI, cc.ID) + return NewEtrel(cc.Connector, cc.URI, cc.ID) } // NewEtrel creates a Etrel charger -func NewEtrel(uri string, id uint8) (*Etrel, error) { +func NewEtrel(connector int, uri string, id uint8) (*Etrel, error) { conn, err := modbus.NewConnection(uri, "", "", 0, modbus.Tcp, id) if err != nil { return nil, err @@ -93,12 +100,16 @@ func NewEtrel(uri string, id uint8) (*Etrel, error) { current: 6, } + if connector == 2 { + wb.base = 100 + } + return wb, nil } // Status implements the api.Charger interface func (wb *Etrel) Status() (api.ChargeStatus, error) { - b, err := wb.conn.ReadInputRegisters(etrelRegChargeStatus, 1) + b, err := wb.conn.ReadInputRegisters(wb.base+etrelRegChargeStatus, 1) if err != nil { return api.StatusNone, err } @@ -129,7 +140,7 @@ func (wb *Etrel) Status() (api.ChargeStatus, error) { // Enabled implements the api.Charger interface func (wb *Etrel) Enabled() (bool, error) { - b, err := wb.conn.ReadInputRegisters(etrelRegTargetCurrent, 2) + b, err := wb.conn.ReadInputRegisters(wb.base+etrelRegTargetCurrent, 2) if err != nil { return false, err } @@ -151,7 +162,7 @@ func (wb *Etrel) setCurrent(current float32) error { b := make([]byte, 4) binary.BigEndian.PutUint32(b, math.Float32bits(current)) - _, err := wb.conn.WriteMultipleRegisters(etrelRegMaxCurrent, 2, b) + _, err := wb.conn.WriteMultipleRegisters(wb.base+etrelRegMaxCurrent, 2, b) return err } @@ -182,7 +193,7 @@ var _ api.ChargeTimer = (*Etrel)(nil) // ChargingTime implements the api.ChargeTimer interface func (wb *Etrel) ChargingTime() (time.Duration, error) { - b, err := wb.conn.ReadInputRegisters(etrelRegChargeTime, 4) + b, err := wb.conn.ReadInputRegisters(wb.base+etrelRegChargeTime, 4) if err != nil { return 0, err } @@ -194,7 +205,7 @@ var _ api.Meter = (*Etrel)(nil) // CurrentPower implements the api.Meter interface func (wb *Etrel) CurrentPower() (float64, error) { - b, err := wb.conn.ReadInputRegisters(etrelRegPower, 2) + b, err := wb.conn.ReadInputRegisters(wb.base+etrelRegPower, 2) if err != nil { return 0, err } @@ -206,7 +217,7 @@ var _ api.ChargeRater = (*Etrel)(nil) // ChargedEnergy implements the api.ChargeRater interface func (wb *Etrel) ChargedEnergy() (float64, error) { - b, err := wb.conn.ReadInputRegisters(etrelRegSessionEnergy, 2) + b, err := wb.conn.ReadInputRegisters(wb.base+etrelRegSessionEnergy, 2) if err != nil { return 0, err } diff --git a/templates/definition/charger/etrel-duo.yaml b/templates/definition/charger/etrel-duo.yaml new file mode 100644 index 000000000..37937a7fa --- /dev/null +++ b/templates/definition/charger/etrel-duo.yaml @@ -0,0 +1,22 @@ +template: etrel-duo +products: + - brand: Etrel + description: + generic: INCH Duo +capabilities: ["mA"] +requirements: + evcc: ["sponsorship"] + description: + de: Die Wallbox muss sich im "Power" Modus befinden. + en: The charger must be switched to "Power" charging mode. +params: + - name: connector + default: 1 + - name: host + required: true + - name: port + default: 502 +render: | + type: etrel + connector: {{ .connector }} + uri: {{ .host }}:{{ .port }} diff --git a/templates/docs/charger/etrel-duo_0.yaml b/templates/docs/charger/etrel-duo_0.yaml new file mode 100644 index 000000000..b67c292f3 --- /dev/null +++ b/templates/docs/charger/etrel-duo_0.yaml @@ -0,0 +1,14 @@ +product: + brand: Etrel + description: INCH Duo +capabilities: ["mA"] +requirements: ["sponsorship"] +description: | + Die Wallbox muss sich im "Power" Modus befinden. +render: + - default: | + type: template + template: etrel-duo + connector: 1 # Optional + host: 192.0.2.2 # IP-Adresse oder Hostname + port: 502 # Port # Optional