From 575915c6fcdb695816521424ed22f86731888ec1 Mon Sep 17 00:00:00 2001 From: premultiply Date: Wed, 29 Dec 2021 09:53:15 +0100 Subject: [PATCH] Wallbe: remove SDM float decoding workaround (#2110) --- charger/wallbe.go | 52 ++++++------------- .../definition/charger/wallbe-meter.yaml | 1 - .../charger/wallbe-pre2019-meter.yaml | 2 +- .../definition/charger/wallbe-pre2019.yaml | 2 +- templates/definition/charger/wallbe-sdm.yaml | 23 -------- templates/definition/charger/wallbe.yaml | 1 - templates/docs/charger/wallbe-sdm.yaml | 5 -- 7 files changed, 18 insertions(+), 68 deletions(-) delete mode 100644 templates/definition/charger/wallbe-sdm.yaml delete mode 100644 templates/docs/charger/wallbe-sdm.yaml diff --git a/charger/wallbe.go b/charger/wallbe.go index b24d3fe96..6beb33030 100644 --- a/charger/wallbe.go +++ b/charger/wallbe.go @@ -3,8 +3,6 @@ package charger import ( "encoding/binary" "fmt" - "math" - "strings" "time" "github.com/evcc-io/evcc/api" @@ -26,8 +24,6 @@ const ( wbRegPower = 120 // power reading wbRegEnergy = 128 // energy reading wbRegEnergyDecimals = 904 // energy reading decimals - - encodingSDM = "sdm" ) var wbRegCurrents = []uint16{114, 116, 118} // current readings @@ -37,9 +33,8 @@ var wbRegCurrents = []uint16{114, 116, 118} // current readings // Phoenix EV-CC-AC1-M3-CBC-RCM-ETH controller. // It uses Modbus TCP to communicate with the wallbox at modbus client id 255. type Wallbe struct { - conn *modbus.Connection - factor int64 - encoding string + conn *modbus.Connection + factor int64 } func init() { @@ -55,11 +50,12 @@ func NewWallbeFromConfig(other map[string]interface{}) (api.Charger, error) { Legacy bool Meter struct { Power, Energy, Currents bool - Encoding string + Encoding interface{} } }{ URI: "192.168.0.8:502", } + if err := util.DecodeOther(other, &cc); err != nil { return nil, err } @@ -69,6 +65,10 @@ func NewWallbeFromConfig(other map[string]interface{}) (api.Charger, error) { return nil, err } + if cc.Meter.Encoding != nil { + util.NewLogger("wallbe").WARN.Printf("encoding is deprecated and will be removed in a future release. Use firmware 01.04.21 instead.") + } + if cc.Legacy { wb.factor = 1 } @@ -93,11 +93,6 @@ func NewWallbeFromConfig(other map[string]interface{}) (api.Charger, error) { maxCurrentMillis = wb.maxCurrentMillis } - // special case for SDM meters - if encoding := strings.ToLower(cc.Meter.Encoding); strings.HasPrefix(encoding, encodingSDM) { - wb.encoding = encodingSDM - } - return decorateWallbe(wb, currentPower, totalEnergy, currents, maxCurrentMillis), nil } @@ -189,19 +184,6 @@ func (wb *Wallbe) ChargingTime() (time.Duration, error) { return time.Duration(secs) * time.Second, nil } -func (wb *Wallbe) decodeReading(b []byte) float64 { - switch wb.encoding { - case encodingSDM: - // high word first - bits := uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24 - return float64(math.Float32frombits(bits)) - - default: - // low word first - return rs485.RTUUint32ToFloat64Swapped(b) - } -} - // currentPower implements the api.Meter interface func (wb *Wallbe) currentPower() (float64, error) { b, err := wb.conn.ReadInputRegisters(wbRegPower, 2) @@ -209,7 +191,7 @@ func (wb *Wallbe) currentPower() (float64, error) { return 0, err } - return wb.decodeReading(b), nil + return rs485.RTUUint32ToFloat64Swapped(b), nil } // totalEnergy implements the api.MeterEnergy interface @@ -219,17 +201,15 @@ func (wb *Wallbe) totalEnergy() (float64, error) { return 0, err } - res := wb.decodeReading(b) + res := rs485.RTUUint32ToFloat64Swapped(b) - if wb.encoding != encodingSDM { - b, err := wb.conn.ReadHoldingRegisters(wbRegEnergyDecimals, 1) - if err != nil { - return 0, err - } - - res += float64(binary.BigEndian.Uint16(b)) / 1e3 + d, err := wb.conn.ReadHoldingRegisters(wbRegEnergyDecimals, 1) + if err != nil { + return 0, err } + res += float64(binary.BigEndian.Uint16(d)) / 1e3 + return res, nil } @@ -242,7 +222,7 @@ func (wb *Wallbe) currents() (float64, float64, float64, error) { return 0, 0, 0, err } - currents = append(currents, wb.decodeReading(b)) + currents = append(currents, rs485.RTUUint32ToFloat64Swapped(b)) } return currents[0], currents[1], currents[2], nil diff --git a/templates/definition/charger/wallbe-meter.yaml b/templates/definition/charger/wallbe-meter.yaml index c143fd5e5..7083f5583 100644 --- a/templates/definition/charger/wallbe-meter.yaml +++ b/templates/definition/charger/wallbe-meter.yaml @@ -14,7 +14,6 @@ params: render: | type: wallbe uri: {{ .host }}:{{ .port }} - legacy: false # set only for older Wallbe devices (pre ~2019, old controller firmware) meter: # only if a charge meter is connected to the controller power: true energy: true diff --git a/templates/definition/charger/wallbe-pre2019-meter.yaml b/templates/definition/charger/wallbe-pre2019-meter.yaml index a86e73a3c..c978c5b18 100644 --- a/templates/definition/charger/wallbe-pre2019-meter.yaml +++ b/templates/definition/charger/wallbe-pre2019-meter.yaml @@ -14,7 +14,7 @@ params: render: | type: wallbe uri: {{ .host }}:{{ .port }} - legacy: true # set only for older Wallbe devices (pre ~2019, old controller firmware) + legacy: true # set only for older Wallbe devices (pre ~2019, old controller firmware) meter: # only if a charge meter is connected to the controller power: true energy: true diff --git a/templates/definition/charger/wallbe-pre2019.yaml b/templates/definition/charger/wallbe-pre2019.yaml index 0c6242a09..52ccbf07c 100644 --- a/templates/definition/charger/wallbe-pre2019.yaml +++ b/templates/definition/charger/wallbe-pre2019.yaml @@ -14,4 +14,4 @@ params: render: | type: wallbe uri: {{ .host }}:{{ .port }} - legacy: true # set only for older Wallbe devices (pre ~2019, old controller firmware) + legacy: true # set only for older Wallbe devices (pre ~2019, old controller firmware) diff --git a/templates/definition/charger/wallbe-sdm.yaml b/templates/definition/charger/wallbe-sdm.yaml deleted file mode 100644 index 36a10b828..000000000 --- a/templates/definition/charger/wallbe-sdm.yaml +++ /dev/null @@ -1,23 +0,0 @@ -template: wallbe-sdm -description: Wallbe (Eco, Pro) with SDM Meter -requirements: - description: - en: The Wallbe must be connected using Ethernet and the DIP switch 10 must be set to 'ON'. - de: Die Wallbox muss über ein Netzwerkkabel angebunden sein und im Gerät muss der DIP Schalter 10 auf 'ON' gestellt sein. - uri: https://docs.evcc.io/docs/devices/chargers#wallbe-ecopro -params: -- name: host - required: true - example: 192.0.2.2 -- name: port - default: 502 -render: | - type: wallbe - uri: {{ .host }}:{{ .port }} - legacy: false # set only for older Wallbe devices (pre ~2019, old controller firmware) - meter: # only if a charge meter is connected to the controller - power: true - energy: true - currents: true - encoding: sdm # add only when SDM meter is connected, see https://github.com/evcc-io/evcc/discussions/1398 - \ No newline at end of file diff --git a/templates/definition/charger/wallbe.yaml b/templates/definition/charger/wallbe.yaml index 45d5b0029..8def77291 100644 --- a/templates/definition/charger/wallbe.yaml +++ b/templates/definition/charger/wallbe.yaml @@ -14,4 +14,3 @@ params: render: | type: wallbe uri: {{ .host }}:{{ .port }} - legacy: false # set only for older Wallbe devices (pre ~2019, old controller firmware) diff --git a/templates/docs/charger/wallbe-sdm.yaml b/templates/docs/charger/wallbe-sdm.yaml deleted file mode 100644 index 27c97c325..000000000 --- a/templates/docs/charger/wallbe-sdm.yaml +++ /dev/null @@ -1,5 +0,0 @@ -type: template -template: wallbe-sdm -description: Wallbe (Eco, Pro) with SDM Meter -host: 192.0.2.2 -port: 502 \ No newline at end of file