From e333e98cb38cade37f1614c2bbe2a21225e419dc Mon Sep 17 00:00:00 2001 From: andig Date: Tue, 27 Jul 2021 13:17:15 +0200 Subject: [PATCH 1/2] Wallbe: fix meter readings --- charger/wallbe.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/charger/wallbe.go b/charger/wallbe.go index bf65628271..10b518b91e 100644 --- a/charger/wallbe.go +++ b/charger/wallbe.go @@ -1,7 +1,6 @@ package charger import ( - "encoding/binary" "fmt" "math" "strings" @@ -11,6 +10,7 @@ import ( "github.com/andig/evcc/util" "github.com/andig/evcc/util/modbus" "github.com/volkszaehler/mbmd/encoding" + "github.com/volkszaehler/mbmd/meters/rs485" ) const ( @@ -184,21 +184,21 @@ func (wb *Wallbe) ChargingTime() (time.Duration, error) { } // 2 words, least significant word first - secs := uint64(b[3])<<16 | uint64(b[2])<<24 | uint64(b[1]) | uint64(b[0])<<8 + secs := uint64(b[1]) | uint64(b[0])<<8 | uint64(b[3])<<16 | uint64(b[2])<<24 return time.Duration(time.Duration(secs) * time.Second), nil } func (wb *Wallbe) decodeReading(b []byte) float64 { - v := binary.BigEndian.Uint32(b) + 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)) - // assuming high register first - if wb.encoding == encodingSDM { - bits := uint32(b[3])<<0 | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24 - f := math.Float32frombits(bits) - return float64(f) + default: + // low word first + return rs485.RTUUint32ToFloat64Swapped(b) } - - return float64(v) } // currentPower implements the api.Meter interface From 18f3dd3b231662e1017458ea1e3c90827e5af045 Mon Sep 17 00:00:00 2001 From: andig Date: Wed, 28 Jul 2021 08:32:55 +0200 Subject: [PATCH 2/2] Add decimal places --- charger/wallbe.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/charger/wallbe.go b/charger/wallbe.go index 10b518b91e..c9d56e8b78 100644 --- a/charger/wallbe.go +++ b/charger/wallbe.go @@ -1,6 +1,7 @@ package charger import ( + "encoding/binary" "fmt" "math" "strings" @@ -23,8 +24,9 @@ const ( wbRegMaxCurrent = 528 // Holding wbRegFirmware = 149 // Firmware - wbRegPower = 120 // power reading - wbRegEnergy = 128 // energy reading + wbRegPower = 120 // power reading + wbRegEnergy = 128 // energy reading + wbRegEnergyDecimals = 904 // energy reading decimals encodingSDM = "sdm" ) @@ -208,7 +210,7 @@ func (wb *Wallbe) currentPower() (float64, error) { return 0, err } - return wb.decodeReading(b), err + return wb.decodeReading(b), nil } // totalEnergy implements the api.MeterEnergy interface @@ -218,7 +220,18 @@ func (wb *Wallbe) totalEnergy() (float64, error) { return 0, err } - return wb.decodeReading(b), err + res := wb.decodeReading(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 + } + + return res, nil } // currents implements the api.MeterCurrent interface