diff --git a/core/site_optimizer.go b/core/site_optimizer.go index 59f3f4ee8..bf3bc8cc4 100644 --- a/core/site_optimizer.go +++ b/core/site_optimizer.go @@ -102,11 +102,11 @@ func (site *Site) optimizerUpdate(battery []measurement) error { } req := evopt.OptimizationInput{ - Strategy: &evopt.OptimizerStrategy{ - ChargingStrategy: lo.ToPtr(evopt.ChargeBeforeExport), + Strategy: evopt.OptimizerStrategy{ + ChargingStrategy: evopt.ChargeBeforeExport, // AttenuateGridPeaks }, - EtaC: &eta, - EtaD: &eta, + EtaC: eta, + EtaD: eta, TimeSeries: evopt.TimeSeries{ Dt: dt, Gt: asFloat32(gt), @@ -130,7 +130,7 @@ func (site *Site) optimizerUpdate(battery []measurement) error { } bat := evopt.BatteryConfig{ - ChargeFromGrid: lo.ToPtr(true), + ChargeFromGrid: true, CMin: float32(lp.EffectiveMinPower()), CMax: float32(lp.EffectiveMaxPower()), @@ -140,7 +140,7 @@ func (site *Site) optimizerUpdate(battery []measurement) error { } if profile := loadpointProfile(lp, firstSlotDuration, minLen); profile != nil { - bat.PDemand = lo.ToPtr(asFloat32(profile)) + bat.PDemand = asFloat32(profile) } detail := batteryDetail{ @@ -191,8 +191,8 @@ func (site *Site) optimizerUpdate(battery []measurement) error { if ts := lp.EffectivePlanTime(); !ts.IsZero() { // TODO precise slot placement if slot := int(time.Until(ts) / time.Hour); slot < minLen { - bat.SGoal = lo.ToPtr(lo.RepeatBy(minLen, func(_ int) float32 { return 0 })) - (*bat.SGoal)[slot] = float32(goal) + bat.SGoal = lo.RepeatBy(minLen, func(_ int) float32 { return 0 }) + bat.SGoal[slot] = float32(goal) } else { site.log.WARN.Printf("plan beyond forecast range: %.1f at %v", goal, ts.Round(time.Minute)) } @@ -222,7 +222,7 @@ func (site *Site) optimizerUpdate(battery []measurement) error { instance := dev.Instance() if _, ok := instance.(api.BatteryController); ok { - bat.ChargeFromGrid = lo.ToPtr(true) + bat.ChargeFromGrid = true } if m, ok := instance.(api.BatteryMaxPowerGetter); ok { @@ -261,12 +261,12 @@ func (site *Site) optimizerUpdate(battery []measurement) error { return err } - if resp.StatusCode() == http.StatusInternalServerError && resp.JSON500.Message != nil { - return errors.New(*resp.JSON500.Message) + if resp.StatusCode() == http.StatusInternalServerError { + return errors.New(resp.JSON500.Message) } - if resp.StatusCode() == http.StatusBadRequest && resp.JSON400.Message != nil { - return errors.New(*resp.JSON400.Message) + if resp.StatusCode() == http.StatusBadRequest { + return errors.New(resp.JSON400.Message) } if resp.StatusCode() != http.StatusOK { @@ -289,7 +289,7 @@ func (site *Site) optimizerUpdate(battery []measurement) error { } // continuousDemand creates a slice of power demands depending on loadpoint mode -func continuousDemand(lp loadpoint.API, minLen int) *[]float32 { +func continuousDemand(lp loadpoint.API, minLen int) []float32 { if lp.GetStatus() != api.StatusC { return nil } @@ -299,9 +299,9 @@ func continuousDemand(lp loadpoint.API, minLen int) *[]float32 { pwr = lp.EffectiveMinPower() } - return lo.ToPtr(lo.RepeatBy(minLen, func(_ int) float32 { + return lo.RepeatBy(minLen, func(_ int) float32 { return float32(pwr) - })) + }) } // loadpointProfile returns the loadpoint's charging profile in Wh diff --git a/go.mod b/go.mod index 9ab681584..2099dc83d 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/Masterminds/sprig/v3 v3.3.0 github.com/PuerkitoBio/goquery v1.10.3 github.com/WulfgarW/sensonet v0.0.5 - github.com/andig/evopt v0.0.0-20250820184747-c28617953a3c + github.com/andig/evopt v0.0.0-20250826111338-a682fe44ebd6 github.com/andig/go-powerwall v0.2.1-0.20230808194509-dd70cdb6e140 github.com/andig/gosunspec v0.0.0-20240918203654-860ce51d602b github.com/andig/mbserver v0.0.0-20230310211055-1d29cbb5820e @@ -38,7 +38,7 @@ require ( github.com/evcc-io/rct v0.1.2-0.20250315164247-d2f41b161785 github.com/evcc-io/tesla-proxy-client v0.0.0-20240221194046-4168b3759701 github.com/fatih/structs v1.1.0 - github.com/getkin/kin-openapi v0.132.0 + github.com/getkin/kin-openapi v0.133.0 github.com/glebarez/sqlite v1.11.0 github.com/go-http-utils/etag v0.0.0-20161124023236-513ea8f21eb1 github.com/go-playground/validator/v10 v10.27.0 @@ -94,7 +94,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 github.com/spf13/pflag v1.0.7 github.com/spf13/viper v1.20.1 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.0 github.com/teslamotors/vehicle-command v0.4.0 github.com/traefik/yaegi v0.16.1 github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c @@ -104,7 +104,7 @@ require ( go.uber.org/mock v0.6.0 go.yaml.in/yaml/v4 v4.0.0-rc.1 golang.org/x/crypto v0.41.0 - golang.org/x/crypto/x509roots/fallback v0.0.0-20250819201203-a4d1237429d6 + golang.org/x/crypto/x509roots/fallback v0.0.0-20250826074233-8f580defa01d golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b golang.org/x/net v0.43.0 golang.org/x/oauth2 v0.30.0 @@ -228,6 +228,7 @@ require ( github.com/teivah/onecontext v1.3.0 // indirect github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + github.com/woodsbury/decimal128 v1.3.0 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect gitlab.com/c0b/go-ordered-json v0.0.0-20201030195603-febf46534d5a // indirect go.uber.org/multierr v1.11.0 // indirect diff --git a/go.sum b/go.sum index 8a2eff65b..819bbe9e0 100644 --- a/go.sum +++ b/go.sum @@ -33,8 +33,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/andig/evopt v0.0.0-20250820184747-c28617953a3c h1:tEJUsri5R7OP/Zs9P1eh1uASs6oStsZJIrKFF3bofV0= -github.com/andig/evopt v0.0.0-20250820184747-c28617953a3c/go.mod h1:TE4sjD3Fxu4Jn49ecE6H6EdHliJA5KnkRfY6WGdHBu0= +github.com/andig/evopt v0.0.0-20250826111338-a682fe44ebd6 h1:Hlbl1VKFoRD7sBoOpjgLOuT5mqTl3hbj80+JtzDWUlI= +github.com/andig/evopt v0.0.0-20250826111338-a682fe44ebd6/go.mod h1:C05cTe1ffvaip2xNNHMJSy/OtGT/NH1sXQgmV/7be8k= github.com/andig/go-powerwall v0.2.1-0.20230808194509-dd70cdb6e140 h1:C93T8vg7CN4Q4BBDbBMOvBoTYBA+CaBEvlY2SZF8aa0= github.com/andig/go-powerwall v0.2.1-0.20230808194509-dd70cdb6e140/go.mod h1:Xk09mD+7RTCuuHMX5RxlqgEUeh9oZdIX0rL0qiY6l/4= github.com/andig/gosunspec v0.0.0-20240918203654-860ce51d602b h1:81UMfM949I7StrRay7YDUZazY8M1u/JHkzwcFEjiilQ= @@ -212,8 +212,8 @@ github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/ github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= -github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk= -github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= +github.com/getkin/kin-openapi v0.133.0 h1:pJdmNohVIJ97r4AUFtEXRXwESr8b0bD721u/Tz6k8PQ= +github.com/getkin/kin-openapi v0.133.0/go.mod h1:boAciF6cXk5FhPqe/NQeBTeenbjqU4LhWBf09ILVvWE= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= @@ -730,8 +730,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.0 h1:ib4sjIrwZKxE5u/Japgo/7SJV3PvgjGiRNAvTVGqQl8= +github.com/stretchr/testify v1.11.0/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/suapapa/go_eddystone v1.3.1/go.mod h1:bXC11TfJOS+3g3q/Uzd7FKd5g62STQEfeEIhcKe4Qy8= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= @@ -755,6 +755,8 @@ github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAh github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= github.com/volkszaehler/mbmd v0.0.0-20250808161051-499ae856f44e h1:I70valHO57SjmIBUDH94MzbJfevj2rZ2fN2YrZ8IwB4= github.com/volkszaehler/mbmd v0.0.0-20250808161051-499ae856f44e/go.mod h1:egeAZti78O7U6QcdDPze5NHiiLdPSviw6YA7rsNYSMQ= +github.com/woodsbury/decimal128 v1.3.0 h1:8pffMNWIlC0O5vbyHWFZAt5yWvWcrHA+3ovIIjVWss0= +github.com/woodsbury/decimal128 v1.3.0/go.mod h1:C5UTmyTjW3JftjUFzOVhC20BEQa2a4ZKOB5I6Zjb+ds= github.com/writeas/go-strip-markdown/v2 v2.1.1 h1:hAxUM21Uhznf/FnbVGiJciqzska6iLei22Ijc3q2e28= github.com/writeas/go-strip-markdown/v2 v2.1.1/go.mod h1:UvvgPJgn1vvN8nWuE5e7v/+qmDu3BSVnKAB6Gl7hFzA= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= @@ -815,8 +817,8 @@ golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= -golang.org/x/crypto/x509roots/fallback v0.0.0-20250819201203-a4d1237429d6 h1:iTIEVbzeHZCptt9thMezyKscM0BOGoteemO3otGPnFM= -golang.org/x/crypto/x509roots/fallback v0.0.0-20250819201203-a4d1237429d6/go.mod h1:MEIPiCnxvQEjA4astfaKItNwEVZA5Ki+3+nyGbJ5N18= +golang.org/x/crypto/x509roots/fallback v0.0.0-20250826074233-8f580defa01d h1:earVicuMOnaYH+t9T1PeRhC0LHHPGXXTDD7NEEP/Pb4= +golang.org/x/crypto/x509roots/fallback v0.0.0-20250826074233-8f580defa01d/go.mod h1:MEIPiCnxvQEjA4astfaKItNwEVZA5Ki+3+nyGbJ5N18= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=