evcc-io/core/prioritizer/prioritizer.go

53 lines
1.1 KiB
Go

package prioritizer
import (
"fmt"
"sync"
"github.com/evcc-io/evcc/api"
"github.com/evcc-io/evcc/core/loadpoint"
"github.com/evcc-io/evcc/util"
)
type Prioritizer struct {
mu sync.Mutex
log *util.Logger
demand map[loadpoint.API]float64
}
func New(log *util.Logger) *Prioritizer {
return &Prioritizer{
log: log,
demand: make(map[loadpoint.API]float64),
}
}
func (p *Prioritizer) UpdateChargePowerFlexibility(lp loadpoint.API, rates api.Rates) {
if power := lp.GetChargePowerFlexibility(rates); power >= 0 {
p.mu.Lock()
p.demand[lp] = power
p.mu.Unlock()
}
}
func (p *Prioritizer) GetChargePowerFlexibility(lp loadpoint.API) float64 {
prio := lp.EffectivePriority()
var (
reduceBy float64
msg string
)
for lp, power := range p.demand {
if lp.EffectivePriority() < prio && power > 0 {
reduceBy += power
msg += fmt.Sprintf("%.0fW from %s at prio %d, ", power, lp.GetTitle(), lp.EffectivePriority())
}
}
if p.log != nil && reduceBy > 0 {
p.log.DEBUG.Printf("lp %s at prio %d gets additional %stotal %.0fW\n", lp.GetTitle(), lp.EffectivePriority(), msg, reduceBy)
}
return reduceBy
}