40 lines
921 B
Go
40 lines
921 B
Go
package wrapper
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/andig/evcc/api"
|
|
)
|
|
|
|
// CompositeMeter decorates a Meter with MeterEnergy.
|
|
type CompositeMeter struct {
|
|
api.Meter
|
|
api.MeterEnergy
|
|
}
|
|
|
|
// ChargeMeter is a replacement for a physical charge meter.
|
|
// It uses the charger's actual or max current to calculate power consumption.
|
|
type ChargeMeter struct {
|
|
sync.Mutex
|
|
Phases int64
|
|
Voltage 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) {
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
m.power = currentToPower(float64(current), m.Voltage, m.Phases)
|
|
}
|
|
|
|
// CurrentPower implements the Meter.CurrentPower interface
|
|
func (m *ChargeMeter) CurrentPower() (float64, error) {
|
|
m.Lock()
|
|
defer m.Unlock()
|
|
return m.power, nil
|
|
}
|