MCPcopy Create free account
hub / github.com/evcc-io/evcc / optimizerUpdate

Method optimizerUpdate

core/site_optimizer.go:149–336  ·  view source on GitHub ↗
(battery []types.Measurement)

Source from the content-addressed store, hash-verified

147}
148
149func (site *Site) optimizerUpdate(battery []types.Measurement) error {
150 solarTariff := site.GetTariff(api.TariffUsageSolar)
151 solar := currentRates(solarTariff)
152
153 grid := currentRates(site.GetTariff(api.TariffUsageGrid))
154 feedIn := currentRates(site.GetTariff(api.TariffUsageFeedIn))
155
156 minLen := lo.Min([]int{len(grid), len(feedIn)})
157 // exclude empty solar forecast from minLen
158 if solarTariff != nil && len(solar) > 0 {
159 minLen = min(minLen, len(solar))
160 }
161
162 uri := cmp.Or(os.Getenv("OPTIMIZER_URI"), OPTIMIZER_URI)
163 if uri == OPTIMIZER_URI {
164 // limit to 2 days for sake of performance
165 minLen = min(2*96, minLen)
166 }
167
168 if expectedSlots := 8; minLen < expectedSlots {
169 if solarTariff != nil {
170 return fmt.Errorf("not enough forecast slots for meaningful optimization: %d < %d (grid=%d, feedIn=%d, solar=%d)", minLen, expectedSlots, len(grid), len(feedIn), len(solar))
171 }
172 return fmt.Errorf("not enough forecast slots for meaningful optimization: %d < %d (grid=%d, feedIn=%d)", minLen, expectedSlots, len(grid), len(feedIn))
173 }
174
175 now := time.Now()
176 dt := timeSteps(minLen, now)
177 firstSlotDuration := time.Duration(dt[0]) * time.Second
178
179 site.log.DEBUG.Printf("optimizer: optimizing %d slots until %v: grid=%d, feedIn=%d, solar=%d, first slot: %v",
180 minLen,
181 grid[minLen-1].End.Local(),
182 len(grid), len(feedIn), len(solar),
183 firstSlotDuration,
184 )
185
186 gt, err := site.homeProfile(minLen)
187 if err != nil {
188 return err
189 }
190
191 // allow empty solar forecast
192 ft := lo.RepeatBy(minLen, func(i int) float32 { return float32(0) })
193 if solarTariff != nil && len(solar) > 0 {
194 solarEnergy, err := solarRatesToEnergy(solar)
195 if err != nil {
196 return err
197 }
198
199 ft = prorate(scaleAndPrune(solarEnergy, site.solarScale(), minLen), firstSlotDuration)
200 }
201
202 req := optimizer.OptimizationInput{
203 Strategy: optimizer.OptimizerStrategy{
204 ChargingStrategy: optimizer.OptimizerStrategyChargingStrategy(site.GetOptimizerChargingStrategy()),
205 DischargingStrategy: optimizer.OptimizerStrategyDischargingStrategyDischargeBeforeImport,
206 },

Callers 1

optimizerUpdateAsyncMethod · 0.95

Calls 15

GetTariffMethod · 0.95
homeProfileMethod · 0.95
solarScaleMethod · 0.95
LoadpointsMethod · 0.95
loadpointRequestMethod · 0.95
batteryRequestMethod · 0.95
publishMethod · 0.95
NewClientFunction · 0.92
IsAuthorizedFunction · 0.92
currentRatesFunction · 0.85

Tested by

no test coverage detected