Forecast: allow multiple solar tariffs (#18920)

This commit is contained in:
andig 2025-02-18 15:26:26 +01:00 • committed by GitHub
parent 2808a29c84
commit 70dca20f47
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 274 additions and 51 deletions

View file

@ -768,6 +768,35 @@ func configureTariff(u api.TariffUsage, conf config.Typed, t *api.Tariff) error
return nil
}
func configureSolarTariff(conf []config.Typed, t *api.Tariff) error {
var eg errgroup.Group
tt := make([]api.Tariff, len(conf))
for i, conf := range conf {
eg.Go(func() error {
if conf.Type == "" {
return errors.New("missing type")
}
name := fmt.Sprintf("%s-%s-%d", api.TariffUsageSolar, tariff.Name(conf), i)
res, err := tariffInstance(name, conf)
if err != nil {
return &DeviceError{name, err}
}
tt[i] = res
return nil
})
}
if err := eg.Wait(); err != nil {
return err
}
*t = tariff.NewCombined(tt)
return nil
}
func configureTariffs(conf globalconfig.Tariffs) (*tariff.Tariffs, error) {
// migrate settings
if settings.Exists(keys.Tariffs) {
@ -789,7 +818,11 @@ func configureTariffs(conf globalconfig.Tariffs) (*tariff.Tariffs, error) {
eg.Go(func() error { return configureTariff(api.TariffUsageFeedIn, conf.FeedIn, &tariffs.FeedIn) })
eg.Go(func() error { return configureTariff(api.TariffUsageCo2, conf.Co2, &tariffs.Co2) })
eg.Go(func() error { return configureTariff(api.TariffUsagePlanner, conf.Planner, &tariffs.Planner) })
eg.Go(func() error { return configureTariff(api.TariffUsageSolar, conf.Solar, &tariffs.Solar) })
if len(conf.Solar) == 1 {
eg.Go(func() error { return configureTariff(api.TariffUsageSolar, conf.Solar[0], &tariffs.Planner) })
} else {
eg.Go(func() error { return configureSolarTariff(conf.Solar, &tariffs.Solar) })
}
if err := eg.Wait(); err != nil {
return nil, &ClassError{ClassTariff, err}