core: retry optimizer when battery measurements are not yet ready (#31276)
Some checks failed
Release / call-build-workflow (push) Has been cancelled
Release / Publish Docker :release (push) Has been cancelled
Release / Github & APT (push) Has been cancelled
Release / Demo (push) Has been cancelled
Release / Hassio Addon (push) Has been cancelled

This commit is contained in:
Ingo 2026-06-28 09:29:45 +02:00 • committed by GitHub
parent e4316fd2b7
commit ede1248b64
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -110,6 +110,10 @@ type requestDetails struct {
const slotsPerHour = float64(time.Hour / tariff.SlotDuration)
// errOptimizerNotReady means battery measurements aren't available yet (e.g. at
// startup); the slot gate is left open so the next cycle retries.
var errOptimizerNotReady = errors.New("battery measurements not ready")
func (site *Site) optimizerUpdateAsync() {
if !mu.TryLock() {
return
@ -123,12 +127,17 @@ func (site *Site) optimizerUpdateAsync() {
var err error
defer func() {
optimizerUpdated = time.Now()
if r := recover(); r != nil {
err = fmt.Errorf("panic %v", r)
}
// not ready yet: keep the gate open for an immediate retry next cycle
if errors.Is(err, errOptimizerNotReady) {
return
}
optimizerUpdated = time.Now()
if err != nil {
site.log.ERROR.Println("optimizer:", err)
}
@ -258,9 +267,13 @@ func (site *Site) optimizerUpdate(battery []types.Measurement) error {
add(site.batteryRequest(dev, b, grid, minLen, firstSlotDuration))
}
// empty request- all loadpoints disabled
if len(req.Batteries) == 0 {
return nil
// meters configured but measurements not in yet: retry instead of
// consuming the slot gate
if len(site.batteryMeters) > 0 {
return errOptimizerNotReady
}
return nil // nothing to optimize
}
httpClient := request.NewClient(site.log)