Optimizer: publish results as single MQTT message (#28610)

This commit is contained in:
jr42 2026-03-27 17:47:46 +01:00 • committed by GitHub
parent 13152b4243
commit f4932f9fbe
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2,6 +2,7 @@ package core
import (
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
@ -34,6 +35,22 @@ var (
mu atomic.Uint32
)
// optimizerResult wraps the optimizer publish payload to implement BytesMarshaler.
// This ensures publishComplex serializes it as a single JSON message instead of
// recursively decomposing each struct field and array element into individual MQTT
// topics (~1,500 messages per optimizer run).
type optimizerResult struct {
Req optimizer.OptimizationInput `json:"req"`
Res optimizer.OptimizationResult `json:"res"`
Details requestDetails `json:"details"`
}
var _ api.BytesMarshaler = (*optimizerResult)(nil)
func (r optimizerResult) MarshalBytes() ([]byte, error) {
return json.Marshal(r)
}
type batteryType string
const (
@ -243,11 +260,7 @@ func (site *Site) optimizerUpdate(battery []types.Measurement) error {
return errors.New(string(resp.JSON200.Status))
}
site.publish("evopt", struct {
Req optimizer.OptimizationInput `json:"req"`
Res optimizer.OptimizationResult `json:"res"`
Details requestDetails `json:"details"`
}{
site.publish("evopt", optimizerResult{
Req: req,
Res: *resp.JSON200,
Details: details,