From 32bc279dbab8a69601dfe824bb07bdf7786eef6d Mon Sep 17 00:00:00 2001 From: andig Date: Sat, 2 May 2020 11:02:10 +0200 Subject: [PATCH] Simplify dummy meter to use power instead of current --- core/loadpoint.go | 28 +++++++++++++--------------- core/wrapper/chargemeter.go | 14 ++++---------- core/wrapper/chargemeter_test.go | 25 ++++++------------------- 3 files changed, 23 insertions(+), 44 deletions(-) diff --git a/core/loadpoint.go b/core/loadpoint.go index 2dde7a6d2..ccf4d7edc 100644 --- a/core/loadpoint.go +++ b/core/loadpoint.go @@ -204,19 +204,20 @@ func (lp *LoadPoint) evChargeStopHandler() { // evChargeCurrentHandler updates proxy charge meter's charge current. // If physical charge meter is present this handler is not used. -func (lp *LoadPoint) evChargeCurrentHandler(m *wrapper.ChargeMeter) func(para ...interface{}) { - return func(para ...interface{}) { - current := para[0].(int64) +// It assumes that the charge meter cannot consume more than total household consumption +func (lp *LoadPoint) evChargeCurrentHandler(m *wrapper.ChargeMeter) func(current int64) { + return func(current int64) { + power := float64(current*lp.Phases) * lp.Voltage + if !lp.enabled || lp.status != api.StatusC { - current = 0 - } - if current > 0 { + power = 0 + } else if power > 0 { // limit available power to generation plus consumption/ minus delivery - availablePower := math.Abs(lp.pvPower) + lp.availableBatteryPower() + lp.gridPower - availableCurrent := int64(powerToCurrent(availablePower, lp.Voltage, lp.Phases)) - current = min(current, availableCurrent) + consumedPower := math.Abs(lp.pvPower) + lp.availableBatteryPower() + lp.gridPower + power = math.Min(power, consumedPower) } - m.SetChargeCurrent(current) + + m.SetPower(power) } } @@ -243,13 +244,10 @@ func (lp *LoadPoint) Prepare(uiChan chan<- Param, notificationChan chan<- push.E if mt, ok := lp.charger.(api.Meter); ok { lp.chargeMeter = mt } else { - mt := &wrapper.ChargeMeter{ - Phases: lp.Phases, - Voltage: lp.Voltage, - } + mt := &wrapper.ChargeMeter{} _ = lp.bus.Subscribe(evChargeCurrent, lp.evChargeCurrentHandler(mt)) _ = lp.bus.Subscribe(evStopCharge, func() { - mt.SetChargeCurrent(0) + mt.SetPower(0) }) lp.chargeMeter = mt } diff --git a/core/wrapper/chargemeter.go b/core/wrapper/chargemeter.go index d905a6d43..e2dc948c0 100644 --- a/core/wrapper/chargemeter.go +++ b/core/wrapper/chargemeter.go @@ -8,20 +8,14 @@ import ( // It uses the charger's actual or max current to calculate power consumption. type ChargeMeter struct { sync.Mutex - Phases int64 - Voltage float64 - power float64 + power float64 } -func currentToPower(current, voltage float64, phases int64) float64 { - return float64(phases) * current * voltage -} - -// SetChargeCurrent updates meter's current power based on actual current -func (m *ChargeMeter) SetChargeCurrent(current int64) { +// SetPower updates meter's current power +func (m *ChargeMeter) SetPower(power float64) { m.Lock() defer m.Unlock() - m.power = currentToPower(float64(current), m.Voltage, m.Phases) + m.power = power } // CurrentPower implements the Meter.CurrentPower interface diff --git a/core/wrapper/chargemeter_test.go b/core/wrapper/chargemeter_test.go index 62468516a..a02bd2338 100644 --- a/core/wrapper/chargemeter_test.go +++ b/core/wrapper/chargemeter_test.go @@ -6,31 +6,18 @@ import ( "github.com/golang/mock/gomock" ) -func TestProxyMeterSinglePhase(t *testing.T) { +func TestProxyChargeMeter(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() - tc := []struct { - phases int64 - voltage float64 - current int64 - power float64 - }{ - {1, 100, 10, 1000}, - {3, 200, 1, 600}, - } + tc := []float64{600, 1000, 2000} + m := ChargeMeter{} - for _, tc := range tc { - m := ChargeMeter{ - Phases: tc.phases, - Voltage: tc.voltage, - } + for _, f := range tc { + m.SetPower(f) - m.SetChargeCurrent(tc.current) - - if p, err := m.CurrentPower(); p != tc.power || err != nil { + if p, err := m.CurrentPower(); p != f || err != nil { t.Errorf("power: %.1f %v", p, err) } } - }