Added tests for SMA meter (#142)

- Restructure a bit to make it testable
- Added unit test for new `updatePower` method
This commit is contained in:
Andreas Linde 2020-05-13 14:24:38 +02:00 • committed by GitHub
parent 6a241eec3b
commit 43af2e93d3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 77 additions and 23 deletions

View file

@ -93,6 +93,33 @@ func (sm *SMA) waitForInitialValue() {
}
}
// update the actual meter data
func (sm *SMA) updatePower(msg sma.Telegram) {
sm.mux.Lock()
if sm.powerO != "" {
// use user-defined obis
if power, ok := msg.Values[sm.powerO]; ok {
sm.power = power
sm.updated = time.Now()
}
} else {
sm.power = msg.Values[sma.ImportPower] - msg.Values[sma.ExportPower]
sm.updated = time.Now()
}
if sm.energyO != "" {
if energy, ok := msg.Values[sm.energyO]; ok {
sm.energy = energy
sm.updated = time.Now()
} else {
sm.log.WARN.Println("missing obis for energy")
}
}
sm.mux.Unlock()
}
// receive processes the channel message containing the multicast data
func (sm *SMA) receive() {
for msg := range sm.recv {
@ -100,29 +127,7 @@ func (sm *SMA) receive() {
continue
}
sm.mux.Lock()
if sm.powerO != "" {
// use user-defined obis
if power, ok := msg.Values[sm.powerO]; ok {
sm.power = power
sm.updated = time.Now()
}
} else {
sm.power = msg.Values[sma.ImportPower] - msg.Values[sma.ExportPower]
sm.updated = time.Now()
}
if sm.energyO != "" {
if energy, ok := msg.Values[sm.energyO]; ok {
sm.energy = energy
sm.updated = time.Now()
} else {
sm.log.WARN.Println("missing obis for energy")
}
}
sm.mux.Unlock()
sm.updatePower(msg)
}
}

49
meter/sma_test.go Normal file
View file

@ -0,0 +1,49 @@
package meter
import (
"testing"
"github.com/andig/evcc/meter/sma"
"github.com/andig/evcc/util"
)
func TestSMAUpdatePower(t *testing.T) {
tests := []struct {
name string
messsage sma.Telegram
wantPower float64
}{
{
"success export",
sma.Telegram{
Values: map[string]float64{
"1:1.4.0": 0,
"1:2.4.0": 37.9,
},
},
-37.9,
},
{
"success import",
sma.Telegram{
Values: map[string]float64{
"1:1.4.0": 20,
"1:2.4.0": 0,
},
},
20,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
sm := &SMA{
log: util.NewLogger("sma "),
}
sm.updatePower(tt.messsage)
if sm.power != tt.wantPower {
t.Errorf("Listener.processMessage() got %v, want %v", sm.power, tt.wantPower)
}
})
}
}