From bf64b0b477fe4d890c8941ad24108ff68c8efd05 Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Sun, 27 Sep 2026 07:56:40 +0200 Subject: [PATCH 1/2] refactor(control): remove the priority and weighted modes - #7 priority/weighted: remove ModePriority and ModeWeighted, State.PriorityOrder and Weights, distributePriority/distributeWeighted, their revision hashing, catalogue, contract registry and HA select entries, and the never-read batteries..weight setting and its Settings field. Priority held every battery at its measured power because nothing set its order. A stored priority or weighted mode boots as self_consumption, is saved back and logged once; the API, HA and the app refuse both. Their 60 golden records are dropped (611 -> 551, deletions only) and the e2e target-following step runs in self_consumption. - #34 HA mode: haCallbacks.SetMode now calls appModes.SetMode, so it goes through control.ApplyMode, only logs a failed save, still applies the export preference and replans without blocking the MQTT handler. - #36 UseCascade: delete the unread control.State field and its initializer. - #37 use_energy_dispatch: drop the deprecated key. Loading YAML or stored settings turns it into planner.legacy_dispatch (the old key still wins), DropRetiredSettings deletes it and battery weights from state.db, and one energyDispatchEnabled helper serves boot and hot reload, which no longer keeps the legacy path after the planner section is removed. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01MuerPFZFG88kgu8sWVHeq7 --- .changeset/remove-priority-weighted.md | 5 + contract/registry.yaml | 2 - docs/site-convention.md | 5 +- go/cmd/ftw/app_link.go | 5 +- go/cmd/ftw/app_link_test.go | 44 + go/cmd/ftw/control_state.go | 40 + go/cmd/ftw/control_state_test.go | 76 + go/cmd/ftw/main.go | 66 +- go/internal/api/api_test.go | 39 + go/internal/appproto/contract_gen.go | 2 - go/internal/config/config.go | 12 +- go/internal/config/config_test.go | 42 - go/internal/config/retired_control.go | 59 + go/internal/config/retired_control_test.go | 134 + go/internal/config/storage.go | 16 +- go/internal/control/control_test.go | 117 +- go/internal/control/dispatch.go | 109 +- go/internal/control/golden_dump_test.go | 120 +- go/internal/control/golden_test.go | 4 +- go/internal/control/modes_catalog.go | 2 - go/internal/control/modes_test.go | 8 +- go/internal/control/revision.go | 18 - go/internal/control/revision_test.go | 36 +- .../testdata/golden/seeded_reactive.json | 5647 ++++------------- .../control/testdata/golden/slew_limiter.json | 3960 ++---------- go/internal/ha/bridge_test.go | 2 - go/test/e2e/stack_test.go | 10 +- web/settings/tabs/batteries.js | 2 - 28 files changed, 2137 insertions(+), 8445 deletions(-) create mode 100644 .changeset/remove-priority-weighted.md create mode 100644 go/internal/config/retired_control.go create mode 100644 go/internal/config/retired_control_test.go diff --git a/.changeset/remove-priority-weighted.md b/.changeset/remove-priority-weighted.md new file mode 100644 index 000000000..eaae66e8f --- /dev/null +++ b/.changeset/remove-priority-weighted.md @@ -0,0 +1,5 @@ +--- +"ftw": minor +--- + +The `priority` and `weighted` control modes are removed. Priority never regulated, because nothing set its battery order: it held each battery at its measured power, so a battery that was discharging kept discharging into export when the house load dropped. A site that had either mode stored starts in manual self-consumption, saves that and logs it once; Home Assistant, the API and the app no longer accept either mode, and Settings no longer shows the per-battery weight field. Home Assistant mode changes now behave like the app's, so a mode that cannot be saved still reaches the planner and a replan no longer holds up other Home Assistant commands. The old `planner.use_energy_dispatch` key is converted to `planner.legacy_dispatch` on load and removed from stored settings, so a site that chose the legacy dispatch path keeps it. diff --git a/contract/registry.yaml b/contract/registry.yaml index dfb20e2b9..c7fe97838 100644 --- a/contract/registry.yaml +++ b/contract/registry.yaml @@ -147,8 +147,6 @@ modes: - { key: charge, tier: advanced } - { key: planner_self, tier: hidden } - { key: planner_cheap, tier: hidden } - - { key: priority, tier: hidden } - - { key: weighted, tier: hidden } # --------------------------------------------------------------------------- # Error codes the box sends. The box sends the code and args; this app owns all diff --git a/docs/site-convention.md b/docs/site-convention.md index e85182fd9..dac47d325 100644 --- a/docs/site-convention.md +++ b/docs/site-convention.md @@ -53,9 +53,8 @@ In self-consumption mode, the controller drives the site meter toward the grid target (normally 0 W): it charges from live surplus and may discharge to cover local load. It must not intentionally export via the battery; export should come from PV unless an explicit export-capable strategy is selected. -Other modes such as peak-shaving, weighted target-following, and arbitrage -may still issue negative battery targets when their contract calls for -discharge. +Other modes such as peak-shaving and arbitrage may still issue negative +battery targets when their contract calls for discharge. ## SI units everywhere diff --git a/go/cmd/ftw/app_link.go b/go/cmd/ftw/app_link.go index 0d802be35..21459f845 100644 --- a/go/cmd/ftw/app_link.go +++ b/go/cmd/ftw/app_link.go @@ -181,7 +181,8 @@ func (a appBoxInfo) Identity() appproto.Identity { // otherwise would be a spinner that never resolves. func (a appBoxInfo) Boot() *appproto.BootProgress { return nil } -// appModes applies a mode and reads it back. +// appModes applies a mode and reads it back. Home Assistant's mode command +// uses the same SetMode, so the two doors cannot drift apart. // // SetMode and ObservedMode are deliberately different questions: the first is // what was asked for, the second is what the box is running. cmd.result @@ -204,7 +205,7 @@ func (a *appModes) SetMode(ctx context.Context, m control.Mode) error { if a.state != nil { if err := a.state.SaveConfig("mode", string(m)); err != nil { - slog.Warn("app uplink could not persist the mode", "err", err) + slog.Warn("could not persist the mode", "mode", m, "err", err) } } if a.prefs != nil { diff --git a/go/cmd/ftw/app_link_test.go b/go/cmd/ftw/app_link_test.go index be88f10ff..26c0e7675 100644 --- a/go/cmd/ftw/app_link_test.go +++ b/go/cmd/ftw/app_link_test.go @@ -2,12 +2,15 @@ package main import ( "math" + "path/filepath" "sync" "testing" "time" + "github.com/srcfl/ftw/go/internal/config" "github.com/srcfl/ftw/go/internal/control" "github.com/srcfl/ftw/go/internal/loadpoint" + "github.com/srcfl/ftw/go/internal/state" "github.com/srcfl/ftw/go/internal/telemetry" ) @@ -231,6 +234,47 @@ func TestAppSetModeGoesThroughApplyMode(t *testing.T) { } } +// Home Assistant's mode command is the app's door. It used to be a third copy +// that returned when the mode could not be saved, before the export preference +// and the planner were told, so control ran one strategy while the planner +// planned another. +func TestHomeAssistantSetModeFinishesWhenTheModeCannotBeSaved(t *testing.T) { + _, ctrl := seedSite(t) + ctrl.PI = &control.PIController{} + ctrl.SetBatteryManualHold(control.BatteryManualHold{ + Driver: "battery", PowerW: -2000, ExpiresAt: time.Now().Add(time.Hour), + }) + st, err := state.Open(filepath.Join(t.TempDir(), "state.db")) + if err != nil { + t.Fatal(err) + } + if err := st.Close(); err != nil { + t.Fatal(err) + } + prefs := config.NewPlannerPrefs(config.ForecastTrustBalanced, config.BatteryExportNotAllowed, config.SafetyKDefault) + + callbacks := haCallbacks(t.Context(), ctrl, &sync.Mutex{}, st, nil, prefs) + if err := callbacks.SetMode(string(control.ModePlannerArbitrage)); err != nil { + t.Fatalf("SetMode: %v", err) + } + + if ctrl.Mode != control.ModePlannerArbitrage { + t.Fatalf("mode = %q", ctrl.Mode) + } + if _, active := ctrl.GetBatteryManualHold(time.Now()); active { + t.Fatal("the manual hold survived a mode change") + } + if _, export, _ := prefs.Get(); export != config.BatteryExportAllowed { + t.Fatalf("battery export = %q; the mode change stopped before the planner preference", export) + } + if err := callbacks.SetMode("priority"); err == nil { + t.Fatal("Home Assistant set a removed mode") + } + if ctrl.Mode != control.ModePlannerArbitrage { + t.Fatalf("a refused mode changed the state to %q", ctrl.Mode) + } +} + func TestAppSetModeRefusesAModeTheBoxDoesNotHave(t *testing.T) { _, ctrl := seedSite(t) modes := &appModes{ctrl: ctrl, ctrlMu: &sync.Mutex{}} diff --git a/go/cmd/ftw/control_state.go b/go/cmd/ftw/control_state.go index 0937aaa89..ab8eb85fc 100644 --- a/go/cmd/ftw/control_state.go +++ b/go/cmd/ftw/control_state.go @@ -1,11 +1,13 @@ package main import ( + "log/slog" "math" "strconv" "github.com/srcfl/ftw/go/internal/config" "github.com/srcfl/ftw/go/internal/control" + "github.com/srcfl/ftw/go/internal/state" ) func newControlStateFromConfig(cfg *config.Config) *control.State { @@ -60,3 +62,41 @@ func restoredGridTargetW(v string) (float64, bool) { } return f, true } + +// energyDispatchEnabled reports whether planner modes run the +// energy-allocation dispatch. planner.legacy_dispatch: true is the only way +// back to the PI-on-grid-target path, and a config without a planner section +// takes the default. Boot and hot reload both read it here so a reload cannot +// leave a site on a path a fresh boot would not choose. +func energyDispatchEnabled(cfg *config.Config) bool { + return cfg.Planner == nil || !cfg.Planner.LegacyDispatch +} + +// removedModes are control modes FTW no longer runs. Priority held every +// battery at its measured power, because nothing ever set its battery order, +// and weighted split equally because nothing set its weights. +var removedModes = map[string]bool{"priority": true, "weighted": true} + +// restoreStoredMode applies the mode saved in state.db. A removed mode becomes +// manual self-consumption and is saved back, so the stored mode matches what +// the site runs. Any other unknown value keeps the default mode, as before. +func restoreStoredMode(ctrl *control.State, st *state.Store) { + v, ok := st.LoadConfig("mode") + if !ok { + return + } + if m := control.Mode(v); control.IsValidMode(m) { + ctrl.Mode = m + return + } + if !removedModes[v] { + return + } + ctrl.Mode = control.ModeSelfConsumption + if err := st.SaveConfig("mode", string(ctrl.Mode)); err != nil { + slog.Warn("the stored control mode was removed; running self_consumption, but it could not be saved", + "stored", v, "err", err) + return + } + slog.Warn("the stored control mode was removed; running and saving self_consumption instead", "stored", v) +} diff --git a/go/cmd/ftw/control_state_test.go b/go/cmd/ftw/control_state_test.go index 661823b8a..959990760 100644 --- a/go/cmd/ftw/control_state_test.go +++ b/go/cmd/ftw/control_state_test.go @@ -1,6 +1,7 @@ package main import ( + "path/filepath" "reflect" "testing" "time" @@ -8,6 +9,7 @@ import ( "github.com/srcfl/ftw/go/internal/config" "github.com/srcfl/ftw/go/internal/control" "github.com/srcfl/ftw/go/internal/mpc" + "github.com/srcfl/ftw/go/internal/state" "github.com/srcfl/ftw/go/internal/telemetry" ) @@ -177,3 +179,77 @@ func TestRestoredGridTargetIgnoresNonFinite(t *testing.T) { t.Fatalf("restoredGridTargetW(-1500.0) = %v, %v; want -1500, true", f, ok) } } + +// Priority and weighted were removed. A site that stored one must boot into +// self-consumption and store it, not keep a mode no door accepts any more. +func TestRestoreStoredModeMapsRemovedModesToSelfConsumption(t *testing.T) { + for stored, want := range map[string]control.Mode{ + "priority": control.ModeSelfConsumption, + "weighted": control.ModeSelfConsumption, + "planner_arbitrage": control.ModePlannerArbitrage, + "peak_shaving": control.ModePeakShaving, + } { + t.Run(stored, func(t *testing.T) { + st, err := state.Open(filepath.Join(t.TempDir(), "state.db")) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = st.Close() }) + if err := st.SaveConfig("mode", stored); err != nil { + t.Fatal(err) + } + ctrl := control.NewState(0, 50, "meter") + ctrl.Mode = control.ModeIdle + + restoreStoredMode(ctrl, st) + + if ctrl.Mode != want { + t.Fatalf("mode = %q, want %q", ctrl.Mode, want) + } + if saved, _ := st.LoadConfig("mode"); saved != string(want) { + t.Fatalf("stored mode = %q, want %q", saved, want) + } + }) + } +} + +// A value FTW never had keeps the default and is left for an operator to see. +func TestRestoreStoredModeLeavesAnUnknownValueAlone(t *testing.T) { + st, err := state.Open(filepath.Join(t.TempDir(), "state.db")) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = st.Close() }) + if err := st.SaveConfig("mode", "turbo"); err != nil { + t.Fatal(err) + } + ctrl := control.NewState(0, 50, "meter") + + restoreStoredMode(ctrl, st) + + if ctrl.Mode != control.ModeSelfConsumption { + t.Fatalf("mode = %q, want the default", ctrl.Mode) + } + if saved, _ := st.LoadConfig("mode"); saved != "turbo" { + t.Fatalf("stored mode = %q, want it untouched", saved) + } +} + +// Boot and hot reload read the dispatch path from one place. A reload that +// removed the planner section used to keep the legacy path a fresh boot +// would not pick. +func TestEnergyDispatchEnabled(t *testing.T) { + for _, tc := range []struct { + name string + planner *config.Planner + want bool + }{ + {"no planner section", nil, true}, + {"planner without legacy_dispatch", &config.Planner{Enabled: true}, true}, + {"legacy_dispatch", &config.Planner{Enabled: true, LegacyDispatch: true}, false}, + } { + if got := energyDispatchEnabled(&config.Config{Planner: tc.planner}); got != tc.want { + t.Errorf("%s: energyDispatchEnabled = %v, want %v", tc.name, got, tc.want) + } + } +} diff --git a/go/cmd/ftw/main.go b/go/cmd/ftw/main.go index d718fcb3c..c622385e7 100644 --- a/go/cmd/ftw/main.go +++ b/go/cmd/ftw/main.go @@ -589,11 +589,7 @@ func main() { // have to be listed too — without them the strategy the user picked in // the UI (planner_self / planner_cheap / planner_arbitrage) is silently // dropped on restart and the dashboard appears to forget the selection. - if v, ok := st.LoadConfig("mode"); ok { - if m := control.Mode(v); control.IsValidMode(m) { - ctrl.Mode = m - } - } + restoreStoredMode(ctrl, st) storedTrust, _ := st.LoadConfig(config.StateKeyForecastTrust) storedExport, _ := st.LoadConfig(config.StateKeyBatteryExport) storedSafetyK, _ := st.LoadConfig(config.StateKeySafetyK) @@ -1144,13 +1140,10 @@ func main() { mpcSvc.MaxExportW = newCfg.Site.MaxExportW if newCfg.Planner != nil { applyPlannerScalars(mpcSvc, newCfg.Planner) - ctrlMu.Lock() - ctrl.UseEnergyDispatch = !newCfg.Planner.LegacyDispatch - if newCfg.Planner.UseEnergyDispatch != nil { - ctrl.UseEnergyDispatch = *newCfg.Planner.UseEnergyDispatch - } - ctrlMu.Unlock() } + ctrlMu.Lock() + ctrl.UseEnergyDispatch = energyDispatchEnabled(newCfg) + ctrlMu.Unlock() } if priceSvc != nil && newCfg.Price != nil { vat := newCfg.Price.VATPercent @@ -1862,20 +1855,10 @@ func main() { // the regulator (decides HOW batteries react — from live // telemetry, not plan forecasts). // `planner.legacy_dispatch: true` opts back to the old - // PI-on-grid-target path for emergency rollback. - // - // Back-compat: honor the deprecated `use_energy_dispatch` - // key when explicitly set. An operator who had - // `use_energy_dispatch: false` in their config before v0.27.0 - // chose legacy on purpose — don't silently flip them. - ctrl.UseEnergyDispatch = cfg.Planner == nil || !cfg.Planner.LegacyDispatch - if cfg.Planner != nil && cfg.Planner.UseEnergyDispatch != nil { - v := *cfg.Planner.UseEnergyDispatch - slog.Warn("planner.use_energy_dispatch is deprecated — use planner.legacy_dispatch: "+ - "true to opt out of the energy path instead. Honored for this run.", - "value", v) - ctrl.UseEnergyDispatch = v - } + // PI-on-grid-target path for emergency rollback. Config loading + // has already turned the removed `use_energy_dispatch` key into + // legacy_dispatch. + ctrl.UseEnergyDispatch = energyDispatchEnabled(cfg) // If the restored control mode is a planner variant, push the // corresponding mpc.Mode so the plan is built with the strategy // the user actually picked — not whatever cfg.planner.mode says. @@ -4197,35 +4180,14 @@ func restoreLatestMPCDiagnostic(st *state.Store, svc *mpc.Service, now time.Time // HA commands behave one way after boot and a different way after a // hot-reload, which is the kind of silent skew that's hardest to debug. func haCallbacks(ctx context.Context, ctrl *control.State, ctrlMu *sync.Mutex, st *state.Store, mpcSvc *mpc.Service, prefs *config.PlannerPrefs) ha.CommandCallbacks { + modes := &appModes{ctrl: ctrl, ctrlMu: ctrlMu, state: st, mpc: mpcSvc, prefs: prefs} return ha.CommandCallbacks{ + // Home Assistant changes the mode through the app's door: + // control.ApplyMode, which accepts exactly the set the HA discovery + // `select` advertises, then the saved mode, the export preference + // and a replan that does not hold up the MQTT handler. SetMode: func(m string) error { - mode := control.Mode(m) - // Accept exactly the set the HA discovery `select` advertises — - // control.AllModes via IsValidMode — so a planner_* option an - // operator picks in Home Assistant isn't silently rejected here. - // Mirror the full /api/mode side-effects (manual-hold + PI reset - // + MPC propagation); the two setters must behave identically or - // HA mode changes diverge from web-UI ones (#mode-drift). - if !control.IsValidMode(mode) { - return fmt.Errorf("unknown mode: %s", m) - } - ctrlMu.Lock() - ctrl.Mode = mode - ctrl.ClearBatteryManualHold() - if ctrl.PI != nil { - ctrl.PI.Reset() - } - ctrlMu.Unlock() - if err := st.SaveConfig("mode", m); err != nil { - return err - } - if prefs != nil { - prefs.ApplyExportFromMode(m, st.SaveConfig) - } - if mm, ok := control.PlannerMPCMode(mode); ok && mpcSvc != nil { - mpcSvc.SetMode(ctx, mm) - } - return nil + return modes.SetMode(ctx, control.Mode(m)) }, SetGridTarget: func(w float64) error { ctrlMu.Lock() diff --git a/go/internal/api/api_test.go b/go/internal/api/api_test.go index f2eaa7525..d5a27473f 100644 --- a/go/internal/api/api_test.go +++ b/go/internal/api/api_test.go @@ -859,6 +859,45 @@ func TestHandleSetModeAcceptsPassiveArbitrage(t *testing.T) { } } +// Priority mode held every battery at its measured power, because nothing set +// its battery order: a battery discharging when the load dropped kept +// discharging into export. Weighted was an equal split under another name. +// Both were removed, so the API must refuse them rather than run them. +func TestHandleSetModeRefusesRemovedModes(t *testing.T) { + st, err := state.Open(filepath.Join(t.TempDir(), "t.db")) + if err != nil { + t.Fatalf("state.Open: %v", err) + } + t.Cleanup(func() { _ = st.Close() }) + for _, mode := range []string{"priority", "weighted"} { + t.Run(mode, func(t *testing.T) { + ctrl := control.NewState(0, 50, "meter") + srv := New(&Deps{ + Ctrl: ctrl, + CtrlMu: &sync.Mutex{}, + State: st, + CfgMu: &sync.RWMutex{}, + Cfg: &config.Config{}, + }) + + req := httptest.NewRequest(http.MethodPost, "/api/mode", + strings.NewReader(`{"mode":"`+mode+`"}`)) + req.Header.Set("Content-Type", "application/json") + rr := httptest.NewRecorder() + srv.Handler().ServeHTTP(rr, req) + if rr.Code != http.StatusBadRequest { + t.Fatalf("status = %d, want 400; body: %s", rr.Code, rr.Body.String()) + } + if ctrl.Mode != control.ModeSelfConsumption { + t.Errorf("ctrl.Mode = %q after a refused mode, want self_consumption", ctrl.Mode) + } + if stored, ok := st.LoadConfig("mode"); ok { + t.Errorf("a refused mode was persisted as %q", stored) + } + }) + } +} + // 2026-05-24 evening regression: PI integrator state carried across an // operator mode switch, so the new mode inherited a saturated integral // from the previous mode's stuck-import accumulation and commanded diff --git a/go/internal/appproto/contract_gen.go b/go/internal/appproto/contract_gen.go index a2baa4526..1c301490a 100644 --- a/go/internal/appproto/contract_gen.go +++ b/go/internal/appproto/contract_gen.go @@ -250,6 +250,4 @@ var RegistryModeTiers = map[string]string{ "charge": "advanced", "planner_self": "hidden", "planner_cheap": "hidden", - "priority": "hidden", - "weighted": "hidden", } diff --git a/go/internal/config/config.go b/go/internal/config/config.go index 1ce648f53..774ecf9d9 100644 --- a/go/internal/config/config.go +++ b/go/internal/config/config.go @@ -756,14 +756,6 @@ type Planner struct { // respects the principle "plan allocates energy, EMS reacts to // live data". LegacyDispatch bool `yaml:"legacy_dispatch,omitempty" json:"legacy_dispatch,omitempty"` - - // UseEnergyDispatch is the deprecated inverse of LegacyDispatch. - // Pointer so we can distinguish "unset" (nil) from "explicitly - // false" (*false) — the latter matters because an operator who - // previously picked legacy dispatch must not be silently flipped - // to the energy path on upgrade. Honored with a startup WARN - // and will be removed after one release. - UseEnergyDispatch *bool `yaml:"use_energy_dispatch,omitempty" json:"use_energy_dispatch,omitempty"` } // Planner engines accepted by configuration. @@ -1253,7 +1245,6 @@ type Battery struct { SoCMax *float64 `yaml:"soc_max,omitempty" json:"soc_max,omitempty"` MaxChargeW *float64 `yaml:"max_charge_w,omitempty" json:"max_charge_w,omitempty"` MaxDischargeW *float64 `yaml:"max_discharge_w,omitempty" json:"max_discharge_w,omitempty"` - Weight *float64 `yaml:"weight,omitempty" json:"weight,omitempty"` } // MaskSecrets returns a copy of the config with sensitive fields (passwords, @@ -1483,6 +1474,9 @@ func Parse(data []byte, baseDir string) (*Config, error) { var retiredDrivers retiredDriverSettings _ = doc.Decode(&retiredDrivers) c.dropRetired(retiredDrivers) + var retiredControl retiredControlSettings + _ = doc.Decode(&retiredControl) + c.applyRetiredControl(retiredControl) // An omitted app_link section follows the new default. An explicit YAML // null was a valid opt-out before that default changed, so retain it as an // explicit disabled section instead of letting applyDefaults turn it on. diff --git a/go/internal/config/config_test.go b/go/internal/config/config_test.go index 0d9173fdf..86bb85cb9 100644 --- a/go/internal/config/config_test.go +++ b/go/internal/config/config_test.go @@ -218,47 +218,6 @@ func TestSiteTroubleshootingModeParses(t *testing.T) { } } -// TestDeprecatedUseEnergyDispatchParsesAsPointer covers the -// Codex P1 on PR #124: an operator who explicitly set -// `use_energy_dispatch: false` to pick legacy dispatch pre-v0.27 -// must not be silently flipped to the energy path on upgrade. The -// field lives on as a deprecated *bool so main.go can distinguish -// "unset" (nil) from "explicitly false" and honor prior intent. -func TestDeprecatedUseEnergyDispatchParsesAsPointer(t *testing.T) { - yaml := minimalYAML + ` -planner: - enabled: true - use_energy_dispatch: false -` - c, err := Parse([]byte(yaml), "/tmp") - if err != nil { - t.Fatal(err) - } - if c.Planner == nil { - t.Fatal("planner not parsed") - } - if c.Planner.UseEnergyDispatch == nil { - t.Fatal("UseEnergyDispatch should be non-nil when key is present") - } - if *c.Planner.UseEnergyDispatch != false { - t.Errorf("UseEnergyDispatch = %v, want false", *c.Planner.UseEnergyDispatch) - } -} - -func TestUseEnergyDispatchNilWhenUnset(t *testing.T) { - yaml := minimalYAML + ` -planner: - enabled: true -` - c, err := Parse([]byte(yaml), "/tmp") - if err != nil { - t.Fatal(err) - } - if c.Planner.UseEnergyDispatch != nil { - t.Errorf("UseEnergyDispatch should be nil when YAML omits the key, got %v", *c.Planner.UseEnergyDispatch) - } -} - func TestV2XPolicyParses(t *testing.T) { yaml := minimalYAML + ` v2x: @@ -608,7 +567,6 @@ weather: batteries: f: soc_min: 0.1 - weight: 2.0 ` c, err := Parse([]byte(yaml), ".") if err != nil { diff --git a/go/internal/config/retired_control.go b/go/internal/config/retired_control.go new file mode 100644 index 000000000..1aeaf37d0 --- /dev/null +++ b/go/internal/config/retired_control.go @@ -0,0 +1,59 @@ +package config + +import ( + "encoding/json" + "fmt" +) + +// retiredControlSettings reads two removed control settings from YAML or a +// stored document. The typed Config no longer has a place for either. +// +// planner.use_energy_dispatch was the inverse of planner.legacy_dispatch. A +// site that set it chose a dispatch path on purpose, so loading moves the +// choice onto legacy_dispatch instead of dropping it. The old key won over +// legacy_dispatch when both were set, and it still does. +// +// batteries..weight was meant for the removed weighted mode, which never +// received it. It steered nothing, so it is dropped without a notice. +type retiredControlSettings struct { + Planner *struct { + UseEnergyDispatch *bool `yaml:"use_energy_dispatch" json:"use_energy_dispatch"` + } `yaml:"planner" json:"planner"` +} + +// applyRetiredControl moves a use_energy_dispatch choice onto +// legacy_dispatch and says so once. +func (c *Config) applyRetiredControl(legacy retiredControlSettings) { + if legacy.Planner == nil || legacy.Planner.UseEnergyDispatch == nil { + return + } + if c.Planner == nil { + c.Planner = &Planner{} + } + c.Planner.LegacyDispatch = !*legacy.Planner.UseEnergyDispatch + c.Retired = append(c.Retired, fmt.Sprintf( + "planner.use_energy_dispatch was removed; it is kept as planner.legacy_dispatch: %t.", + c.Planner.LegacyDispatch)) +} + +// storedRetiredControl names the removed control settings a stored document +// still carries. +func storedRetiredControl(saved map[string]json.RawMessage) []string { + var removed []string + var planner map[string]json.RawMessage + if json.Unmarshal(saved["planner"], &planner) == nil { + if _, ok := planner["use_energy_dispatch"]; ok { + removed = append(removed, "planner.use_energy_dispatch, now planner.legacy_dispatch") + } + } + var batteries map[string]map[string]json.RawMessage + if json.Unmarshal(saved["batteries"], &batteries) == nil { + for _, battery := range batteries { + if _, ok := battery["weight"]; ok { + removed = append(removed, "battery weights of the removed weighted mode") + break + } + } + } + return removed +} diff --git a/go/internal/config/retired_control_test.go b/go/internal/config/retired_control_test.go new file mode 100644 index 000000000..0eb9f03f8 --- /dev/null +++ b/go/internal/config/retired_control_test.go @@ -0,0 +1,134 @@ +package config + +import ( + "encoding/json" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/srcfl/ftw/go/internal/state" +) + +// An operator who set use_energy_dispatch: false before v0.27 chose the legacy +// dispatch path on purpose. Removing the key must not flip that site to the +// energy path, and the old key kept winning over legacy_dispatch when both were +// set. +func TestUseEnergyDispatchLoadsAsLegacyDispatch(t *testing.T) { + for _, tc := range []struct { + name string + planner string + wantLegacy bool + wantNotice bool + }{ + {"false picks legacy", " use_energy_dispatch: false\n", true, true}, + {"true overrides legacy_dispatch", " legacy_dispatch: true\n use_energy_dispatch: true\n", false, true}, + {"unset leaves legacy_dispatch alone", " legacy_dispatch: true\n", true, false}, + {"neither set runs the energy path", "", false, false}, + } { + t.Run(tc.name, func(t *testing.T) { + c, err := Parse([]byte(minimalYAML+"planner:\n enabled: true\n"+tc.planner), "/tmp") + if err != nil { + t.Fatal(err) + } + if c.Planner.LegacyDispatch != tc.wantLegacy { + t.Fatalf("legacy_dispatch = %v, want %v", c.Planner.LegacyDispatch, tc.wantLegacy) + } + if got := len(c.Retired) == 1 && strings.Contains(c.Retired[0], "use_energy_dispatch"); got != tc.wantNotice { + t.Fatalf("retired notices = %q, want a use_energy_dispatch notice: %v", c.Retired, tc.wantNotice) + } + raw, err := json.Marshal(c) + if err != nil { + t.Fatal(err) + } + if strings.Contains(string(raw), "use_energy_dispatch") { + t.Fatalf("the removed key survives loading: %s", raw) + } + }) + } +} + +// Settings live in state.db after first boot. A stored use_energy_dispatch +// must keep steering the site through legacy_dispatch, and both it and the +// never-read battery weight must leave the stored document. +func TestStoredRetiredControlSettingsMigrateAndAreDeleted(t *testing.T) { + dir := t.TempDir() + path, database := filepath.Join(dir, "config.yaml"), filepath.Join(dir, "state.db") + if err := os.WriteFile(path, []byte(minimalYAML), 0600); err != nil { + t.Fatal(err) + } + cfg, err := Load(path) + if err != nil { + t.Fatal(err) + } + st, err := state.Open(database) + if err != nil { + t.Fatal(err) + } + defer st.Close() + if _, err := InitializeStorage(path, database, cfg, st); err != nil { + t.Fatal(err) + } + // Settings saved by a Core that still had both keys. + current, _, err := st.Configuration() + if err != nil { + t.Fatal(err) + } + var doc map[string]any + if err := json.Unmarshal(current.Document, &doc); err != nil { + t.Fatal(err) + } + stored := doc["config"].(map[string]any) + stored["planner"] = map[string]any{"enabled": true, "use_energy_dispatch": false} + stored["batteries"] = map[string]any{"ferroamp": map[string]any{"soc_min": 0.1, "weight": 2.0}} + raw, err := json.Marshal(doc) + if err != nil { + t.Fatal(err) + } + if _, err := st.SaveConfiguration(raw, current.Revision, nil); err != nil { + t.Fatal(err) + } + + loaded, err := Load(path) + if err != nil { + t.Fatalf("stored retired control settings stopped startup: %v", err) + } + if loaded.Planner == nil || !loaded.Planner.LegacyDispatch { + t.Fatalf("planner = %+v; the stored legacy choice no longer steers the site", loaded.Planner) + } + if len(loaded.Retired) != 1 { + t.Fatalf("retired notices = %q; want the use_energy_dispatch notice", loaded.Retired) + } + if _, err := InitializeStorage(path, database, loaded, st); err != nil { + t.Fatalf("startup storage check after migrating retired settings: %v", err) + } + + removed, err := DropRetiredSettings(st, path, loaded) + if err != nil || len(removed) != 2 { + t.Fatalf("DropRetiredSettings = %v, %v; want use_energy_dispatch and the battery weight", removed, err) + } + after, _, err := st.Configuration() + if err != nil { + t.Fatal(err) + } + if strings.Contains(string(after.Document), "use_energy_dispatch") || + strings.Contains(string(after.Document), `"weight"`) { + t.Fatalf("stored settings still carry removed control settings: %s", after.Document) + } + reloaded, err := Load(path) + if err != nil { + t.Fatal(err) + } + if !reloaded.Planner.LegacyDispatch { + t.Fatal("the legacy choice was lost when the old key was deleted") + } + if soc := reloaded.Batteries["ferroamp"].SoCMin; soc == nil || *soc != 0.1 { + t.Fatalf("battery soc_min = %v; deleting the weight lost the battery's other settings", soc) + } + if len(reloaded.Retired) != 0 { + t.Fatalf("retired notices after cleanup = %q", reloaded.Retired) + } + if removed, err := DropRetiredSettings(st, path, reloaded); err != nil || len(removed) != 0 { + t.Fatalf("second DropRetiredSettings = %v, %v; want nothing", removed, err) + } +} diff --git a/go/internal/config/storage.go b/go/internal/config/storage.go index faf823f48..75bd44b7d 100644 --- a/go/internal/config/storage.go +++ b/go/internal/config/storage.go @@ -39,6 +39,11 @@ func decodeStored(c state.Configuration, database, baseDir string) (*Config, err } _ = json.Unmarshal(c.Document, &legacy) cfg.dropRetired(legacy.Config) + var legacyControl struct { + Config retiredControlSettings `json:"config"` + } + _ = json.Unmarshal(c.Document, &legacyControl) + cfg.applyRetiredControl(legacyControl.Config) // This is the same typed config that was validated on save. Do not apply new // defaults during a storage-only reload: nil, false and zero stay distinct. if err := cfg.Validate(); err != nil { @@ -212,10 +217,11 @@ func SaveStored(st *state.Store, path string, cfg *Config) error { // DropRetiredSettings rewrites stored settings that still carry settings of a // removed feature. Ask why kept an OpenRouter key there; nothing reads it, so -// it must not stay in state.db and every backup. Device Support repositories -// and driver control opt-ins no longer do anything. Saving the typed Config, -// which loading already cleaned, writes the document without them. It names -// what it removed. +// it must not stay in state.db and every backup. Device Support repositories, +// driver control opt-ins and battery weights no longer do anything, and +// planner.use_energy_dispatch is now planner.legacy_dispatch. Saving the typed +// Config, which loading already cleaned, writes the document without them. It +// names what it removed. func DropRetiredSettings(st *state.Store, path string, cfg *Config) ([]string, error) { current, found, err := st.Configuration() if err != nil || !found { @@ -227,7 +233,7 @@ func DropRetiredSettings(st *state.Store, path string, cfg *Config) ([]string, e if err := json.Unmarshal(current.Document, &saved); err != nil { return nil, err } - removed := storedRetiredSettings(saved.Config) + removed := append(storedRetiredSettings(saved.Config), storedRetiredControl(saved.Config)...) if len(removed) == 0 { return nil, nil } diff --git a/go/internal/control/control_test.go b/go/internal/control/control_test.go index 29be6aabb..ab4260693 100644 --- a/go/internal/control/control_test.go +++ b/go/internal/control/control_test.go @@ -576,121 +576,6 @@ func TestProportionalUsesTotalDesired(t *testing.T) { } } -func TestPriorityDrainsPrimaryFirst(t *testing.T) { - bats := []batteryInfo{ - {driver: "primary", capacityWh: 15000, currentW: 0, soc: 0.5, online: true}, - {driver: "secondary", capacityWh: 10000, currentW: 0, soc: 0.5, online: true}, - } - // Small correction - primary should take it all - targets := distributePriority(bats, -1000, []string{"primary", "secondary"}) - var p, s float64 - for _, tg := range targets { - if tg.Driver == "primary" { - p = tg.TargetW - } - if tg.Driver == "secondary" { - s = tg.TargetW - } - } - if math.Abs(p+1000) > 1 { - t.Errorf("primary: got %f, want -1000", p) - } - if s != 0 { - t.Errorf("secondary: got %f, want 0", s) - } -} - -func TestPriorityOverflowsToSecondary(t *testing.T) { - bats := []batteryInfo{ - {driver: "primary", capacityWh: 15000, currentW: 0, soc: 0.5, online: true}, - {driver: "secondary", capacityWh: 10000, currentW: 0, soc: 0.5, online: true}, - } - // Big correction - primary saturates at -5000 (per-command cap), rest spills - targets := distributePriority(bats, -7000, []string{"primary", "secondary"}) - var p, s float64 - for _, tg := range targets { - if tg.Driver == "primary" { - p = tg.TargetW - } - if tg.Driver == "secondary" { - s = tg.TargetW - } - } - if p != -5000 { - t.Errorf("primary: got %f, want -5000", p) - } - if math.Abs(s+2000) > 1 { - t.Errorf("secondary: got %f, want -2000", s) - } -} - -func TestWeightedDistribution(t *testing.T) { - bats := []batteryInfo{ - {driver: "a", capacityWh: 10000, currentW: 0, soc: 0.5, online: true}, - {driver: "b", capacityWh: 10000, currentW: 0, soc: 0.5, online: true}, - } - weights := map[string]float64{"a": 0.8, "b": 0.2} - targets := distributeWeighted(bats, 1000, weights) - var a, b float64 - for _, tg := range targets { - if tg.Driver == "a" { - a = tg.TargetW - } - if tg.Driver == "b" { - b = tg.TargetW - } - } - if math.Abs(a-800) > 1 { - t.Errorf("a: got %f, want 800", a) - } - if math.Abs(b-200) > 1 { - t.Errorf("b: got %f, want 200", b) - } -} - -func TestWeightedDistributionReallocatesBlockedDirection(t *testing.T) { - tests := []struct { - name string - correction float64 - bats []batteryInfo - wantB float64 - }{ - { - name: "charge", - correction: 1000, - bats: []batteryInfo{ - {driver: "blocked", capacityWh: 10000, soc: 0.5, online: true, chargeBlocked: true}, - {driver: "capable", capacityWh: 10000, soc: 0.5, online: true}, - }, - wantB: 1000, - }, - { - name: "discharge", - correction: -1000, - bats: []batteryInfo{ - {driver: "blocked", capacityWh: 10000, soc: 0.5, online: true, dischargeBlocked: true}, - {driver: "capable", capacityWh: 10000, soc: 0.5, online: true}, - }, - wantB: -1000, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - targets := distributeWeighted(tt.bats, tt.correction, map[string]float64{ - "blocked": 1, - "capable": 1, - }) - got := targetsByDriver(targets) - if got["blocked"].TargetW != 0 || !got["blocked"].Clamped { - t.Errorf("blocked target = %+v, want 0 W clamped", got["blocked"]) - } - if got["capable"].TargetW != tt.wantB { - t.Errorf("capable TargetW = %.1f W, want %.1f W", got["capable"].TargetW, tt.wantB) - } - }) - } -} - // ---- Clamps ---- func TestClampWithSoCBlocksDischargeWhenEmpty(t *testing.T) { @@ -5301,7 +5186,7 @@ func TestMeterClampRespectsNonZeroGridTarget(t *testing.T) { {"ferroamp", 0, 0.5}, }) st := NewState(-3000, 50, "ferroamp") - st.Mode = ModeWeighted + st.Mode = ModeSelfConsumption st.SlewRateW = 100000 targets := ComputeDispatch(store, st, caps(map[string]float64{"ferroamp": 15200}), 11040) var sum float64 diff --git a/go/internal/control/dispatch.go b/go/internal/control/dispatch.go index a85ac2f61..bafe3a204 100644 --- a/go/internal/control/dispatch.go +++ b/go/internal/control/dispatch.go @@ -22,8 +22,6 @@ const ( ModeSelfConsumption Mode = "self_consumption" ModePeakShaving Mode = "peak_shaving" ModeCharge Mode = "charge" - ModePriority Mode = "priority" - ModeWeighted Mode = "weighted" // Planner modes: control loop pulls GridTargetW from the MPC plan // for the current 15-min slot. If the plan is stale (>30 min) or @@ -54,7 +52,7 @@ const ( func AllModes() []Mode { return []Mode{ ModeIdle, ModeSelfConsumption, ModePeakShaving, - ModeCharge, ModePriority, ModeWeighted, + ModeCharge, ModePlannerSelf, ModePlannerCheap, ModePlannerPassiveArbitrage, ModePlannerArbitrage, } @@ -381,11 +379,6 @@ type State struct { // Zero disables the margin (back-compat). SiteFuseSafetyA float64 - // For Priority mode - PriorityOrder []string - // For Weighted mode - Weights map[string]float64 - // Peak limit — enforced only in PeakShaving mode PeakLimitW float64 @@ -495,9 +488,6 @@ type State struct { LastTargets []DispatchTarget - // Cascade toggle — set by main.go based on whether models exist - UseCascade bool - // PlanTarget is consulted at the top of each control cycle when // Mode is a planner mode. Nil outside planner modes. Injected from // main.go — the control package doesn't need to know about mpc. @@ -1139,8 +1129,6 @@ func NewState(gridTargetW, gridToleranceW float64, siteMeter string) *State { GridTargetW: gridTargetW, GridToleranceW: gridToleranceW, SiteMeterDriver: siteMeter, - PriorityOrder: nil, - Weights: map[string]float64{}, PeakLimitW: 5000, EVChargingW: 0, PI: pi, @@ -1148,7 +1136,6 @@ func NewState(gridTargetW, gridToleranceW float64, siteMeter string) *State { SlewEnabled: true, MinDispatchIntervalS: 5, PrevTargets: map[string]float64{}, - UseCascade: true, } } @@ -1541,8 +1528,7 @@ func ComputeDispatch( // Distribution mode is decoupled from planner strategy in // the energy path — the operator-selected strategy drives // the plan's DP, distribution is always proportional across - // online batteries. If the operator wants priority or - // weighted, they use the manual modes, not a planner mode. + // online batteries. effectiveMode = ModeSelfConsumption state.PlanStale = false // Carve-out slots must chase grid=0, not the legacy @@ -2063,7 +2049,7 @@ func ComputeDispatch( totalCorrection = targetTotalW - currentTotal default: // Legacy PI-on-grid-target path. Used by: - // - manual modes (self_consumption, peak_shaving, priority, weighted) + // - manual modes (self_consumption, peak_shaving) // - planner_self (the "participate reactively" branch — idle-gate // already handled above) // - planner_cheap / planner_arbitrage when UseEnergyDispatch=false @@ -2076,8 +2062,7 @@ func ComputeDispatch( // (which polls a separate surplus number) sees nothing left to // claim — flap mode. The bias is only applied to the self- // consumption flavour: PeakShaving has its own peak-relative - // error, and other modes (Charge, Priority, Weighted) are out - // of scope for surplus-only semantics. + // error, and Charge is out of scope for surplus-only semantics. // // Three regions: // gridW < -reserveRemaining: exporting MORE than the reserve. @@ -2457,10 +2442,6 @@ func ComputeDispatch( switch effectiveMode { case ModeSelfConsumption, ModePeakShaving: raw = distributeProportional(onlineBats, totalCorrection, groupPV) - case ModePriority: - raw = distributePriority(onlineBats, totalCorrection, state.PriorityOrder) - case ModeWeighted: - raw = distributeWeighted(onlineBats, totalCorrection, state.Weights) } } @@ -3906,88 +3887,6 @@ func planHasNonDischargeIntent(state *State) bool { return false } -// distributePriority assigns correction to the primary battery first, falling -// back to secondaries only when saturated. -func distributePriority(bats []batteryInfo, totalCorrection float64, order []string) []DispatchTarget { - remaining := totalCorrection - out := make([]DispatchTarget, 0, len(bats)) - // Named order first - for _, name := range order { - for _, b := range bats { - if b.driver != name { - continue - } - t := b.currentW + remaining - clamped, was := clampWithSoC(t, b) - remaining -= clamped - b.currentW - out = append(out, DispatchTarget{Driver: b.driver, TargetW: clamped, Clamped: was}) - } - } - // Unmentioned batteries stay at their current power - for _, b := range bats { - seen := false - for _, o := range out { - if o.Driver == b.driver { - seen = true - break - } - } - if !seen { - out = append(out, DispatchTarget{Driver: b.driver, TargetW: b.currentW}) - } - } - return out -} - -// distributeWeighted splits by custom weights. Missing batteries default to weight=1. -func distributeWeighted(bats []batteryInfo, totalCorrection float64, weights map[string]float64) []DispatchTarget { - var currentTotal float64 - for _, b := range bats { - currentTotal += b.currentW - } - desiredTotal := currentTotal + totalCorrection - blockedForDirection := func(b batteryInfo) bool { - if desiredTotal > 0 { - return b.chargeBlocked - } - if desiredTotal < 0 { - return b.dischargeBlocked - } - return false - } - - var totalW float64 - for _, b := range bats { - if blockedForDirection(b) { - continue - } - w, ok := weights[b.driver] - if !ok { - w = 1.0 - } - totalW += w - } - - out := make([]DispatchTarget, 0, len(bats)) - for _, b := range bats { - if blockedForDirection(b) { - out = append(out, DispatchTarget{Driver: b.driver, TargetW: 0, Clamped: true}) - continue - } - if totalW <= 0 { - continue - } - w, ok := weights[b.driver] - if !ok { - w = 1.0 - } - t := desiredTotal * (w / totalW) - clamped, was := clampWithSoC(t, b) - out = append(out, DispatchTarget{Driver: b.driver, TargetW: clamped, Clamped: was}) - } - return out -} - // chargeAll forces every online battery to its per-driver MaxChargeW // (or MaxCommandW default when the driver doesn't override). Used by // the "Charge" manual mode as a sanity-check / pre-peak-fill knob. diff --git a/go/internal/control/golden_dump_test.go b/go/internal/control/golden_dump_test.go index c3448bb64..ae96c9960 100644 --- a/go/internal/control/golden_dump_test.go +++ b/go/internal/control/golden_dump_test.go @@ -96,32 +96,30 @@ type goldenLegacyPlan struct { } type goldenStateInputs struct { - Mode string `json:"mode"` - GridTargetW float64 `json:"grid_target_w"` - GridToleranceW float64 `json:"grid_tolerance_w"` - SlewRateW float64 `json:"slew_rate_w"` - SlewEnabled bool `json:"slew_enabled"` - MinDispatchIntervalS int `json:"min_dispatch_interval_s"` - HoldoffActive bool `json:"holdoff_active"` - UseEnergyDispatch bool `json:"use_energy_dispatch"` - EVChargingW float64 `json:"ev_charging_w"` - BatteryCoversEV bool `json:"battery_covers_ev"` - BatteryBoostEVChargingW float64 `json:"battery_boost_ev_charging_w"` - BatteryBoostReserveSoC float64 `json:"battery_boost_reserve_soc"` - EVSurplusOnlyReserveW float64 `json:"ev_surplus_only_reserve_w"` - EVSurplusOnlyChargingW float64 `json:"ev_surplus_only_charging_w,omitempty"` - PeakLimitW float64 `json:"peak_limit_w"` - PeakImportCeilingW float64 `json:"peak_import_ceiling_w"` - MaxExportW float64 `json:"max_export_w"` - SiteFuseAmps float64 `json:"site_fuse_amps"` - SiteFuseVoltage float64 `json:"site_fuse_voltage"` - SiteFusePhases int `json:"site_fuse_phases"` - SiteFuseSafetyA float64 `json:"site_fuse_safety_a"` - PVSurplusAbsorbSoCCap float64 `json:"pv_surplus_absorb_soc_cap"` - PVSurplusAbsorbThresholdW float64 `json:"pv_surplus_absorb_threshold_w"` - InverterGroups map[string]string `json:"inverter_groups,omitempty"` - PriorityOrder []string `json:"priority_order,omitempty"` - Weights map[string]float64 `json:"weights,omitempty"` + Mode string `json:"mode"` + GridTargetW float64 `json:"grid_target_w"` + GridToleranceW float64 `json:"grid_tolerance_w"` + SlewRateW float64 `json:"slew_rate_w"` + SlewEnabled bool `json:"slew_enabled"` + MinDispatchIntervalS int `json:"min_dispatch_interval_s"` + HoldoffActive bool `json:"holdoff_active"` + UseEnergyDispatch bool `json:"use_energy_dispatch"` + EVChargingW float64 `json:"ev_charging_w"` + BatteryCoversEV bool `json:"battery_covers_ev"` + BatteryBoostEVChargingW float64 `json:"battery_boost_ev_charging_w"` + BatteryBoostReserveSoC float64 `json:"battery_boost_reserve_soc"` + EVSurplusOnlyReserveW float64 `json:"ev_surplus_only_reserve_w"` + EVSurplusOnlyChargingW float64 `json:"ev_surplus_only_charging_w,omitempty"` + PeakLimitW float64 `json:"peak_limit_w"` + PeakImportCeilingW float64 `json:"peak_import_ceiling_w"` + MaxExportW float64 `json:"max_export_w"` + SiteFuseAmps float64 `json:"site_fuse_amps"` + SiteFuseVoltage float64 `json:"site_fuse_voltage"` + SiteFusePhases int `json:"site_fuse_phases"` + SiteFuseSafetyA float64 `json:"site_fuse_safety_a"` + PVSurplusAbsorbSoCCap float64 `json:"pv_surplus_absorb_soc_cap"` + PVSurplusAbsorbThresholdW float64 `json:"pv_surplus_absorb_threshold_w"` + InverterGroups map[string]string `json:"inverter_groups,omitempty"` } type goldenInputs struct { @@ -300,12 +298,6 @@ func runGoldenScenarioAt(sc goldenScenario, scenarioNow time.Time, slotDirective if len(groups) > 0 { st.InverterGroups = groups } - if len(si.PriorityOrder) > 0 { - st.PriorityOrder = si.PriorityOrder - } - if len(si.Weights) > 0 { - st.Weights = si.Weights - } if si.HoldoffActive { now := scenarioNow st.LastDispatch = &now @@ -1508,26 +1500,6 @@ func slewScenarios() []goldenScenario { Batteries: []goldenBattery{gb("ferroamp", 15200, 2000, 0.60), offB}, State: react(ModeSelfConsumption, 500), })) - pr := react(ModePriority, 500) - pr.PriorityOrder = []string{"sungrow", "ferroamp"} - out = append(out, mk("priority_split_with_slew", goldenInputs{ - FuseMaxW: 11040, GridW: 4000, - Batteries: []goldenBattery{ - gb("ferroamp", 15200, 2000, 0.60), - gb("sungrow", 9600, -1000, 0.60), - }, - State: pr, - })) - wt := react(ModeWeighted, 500) - wt.Weights = map[string]float64{"ferroamp": 2, "sungrow": 1} - out = append(out, mk("weighted_split_with_slew", goldenInputs{ - FuseMaxW: 11040, GridW: 4000, - Batteries: []goldenBattery{ - gb("ferroamp", 15200, 2000, 0.60), - gb("sungrow", 9600, -1000, 0.60), - }, - State: wt, - })) ps := react(ModePeakShaving, 500) ps.PeakLimitW = 3000 out = append(out, mk("peak_shaving_with_slew", goldenInputs{ @@ -1551,8 +1523,11 @@ func slewScenarios() []goldenScenario { // the combinations nobody did. Seeds are fixed, so the set is reproducible. func slewSeeded() []goldenScenario { rates := []float64{250, 500, 750, 1000, 1500, 2000, 3000} + // The empty slots held the removed priority and weighted modes. Their + // records were dropped and the rotation kept, so every other record + // keeps the seed and mode it was recorded with. modes := []Mode{ - ModeSelfConsumption, ModePeakShaving, ModePriority, ModeWeighted, + ModeSelfConsumption, ModePeakShaving, "", "", ModePlannerSelf, ModePlannerCheap, ModePlannerPassiveArbitrage, ModePlannerArbitrage, } strategies := map[Mode]string{ @@ -1566,6 +1541,9 @@ func slewSeeded() []goldenScenario { seed := int64(6000 + i) rng := rand.New(rand.NewSource(seed)) mode := modes[i%len(modes)] + if mode == "" { + continue + } n := 1 + rng.Intn(3) bats := seededBatteries(rng, n, 0.10, 0.90) // Put at least one battery well away from any plausible target, so @@ -1594,19 +1572,6 @@ func slewSeeded() []goldenScenario { switch mode { case ModePeakShaving: st.PeakLimitW = roundW(3000 + rng.Float64()*3000) - case ModePriority: - order := make([]string, len(bats)) - for j, b := range bats { - order[j] = b.Driver - } - rng.Shuffle(len(order), func(a, b int) { order[a], order[b] = order[b], order[a] }) - st.PriorityOrder = order - case ModeWeighted: - w := map[string]float64{} - for _, b := range bats { - w[b.Driver] = round1(0.5 + rng.Float64()*2.5) - } - st.Weights = w } // Fuse pressure on a quarter of the set: relief has to out-rank @@ -1691,12 +1656,18 @@ func seededBatteries(rng *rand.Rand, n int, socMin, socMax float64) []goldenBatt } func seededReactive() []goldenScenario { - modes := []Mode{ModeSelfConsumption, ModePeakShaving, ModeCharge, ModeIdle, ModePriority, ModeWeighted} + // The empty slots held the removed priority and weighted modes. Their + // records were dropped and the rotation kept, so every other record + // keeps the seed and mode it was recorded with. + modes := []Mode{ModeSelfConsumption, ModePeakShaving, ModeCharge, ModeIdle, "", ""} out := make([]goldenScenario, 0, 100) for i := 0; i < 100; i++ { seed := int64(1000 + i) rng := rand.New(rand.NewSource(seed)) mode := modes[i%len(modes)] + if mode == "" { + continue + } n := 1 + rng.Intn(3) bats := seededBatteries(rng, n, 0.05, 0.95) if n > 1 && rng.Float64() < 0.20 { @@ -1722,21 +1693,6 @@ func seededReactive() []goldenScenario { if mode == ModePeakShaving { st.PeakLimitW = roundW(3000 + rng.Float64()*4000) } - if mode == ModePriority { - order := make([]string, len(bats)) - for j, b := range bats { - order[j] = b.Driver - } - rng.Shuffle(len(order), func(a, b int) { order[a], order[b] = order[b], order[a] }) - st.PriorityOrder = order - } - if mode == ModeWeighted { - w := map[string]float64{} - for _, b := range bats { - w[b.Driver] = round1(0.5 + rng.Float64()*2.5) - } - st.Weights = w - } in := goldenInputs{ FuseMaxW: 11040, GridW: roundW(rng.Float64()*16000 - 8000), diff --git a/go/internal/control/golden_test.go b/go/internal/control/golden_test.go index 791c8814a..cde350a90 100644 --- a/go/internal/control/golden_test.go +++ b/go/internal/control/golden_test.go @@ -2,7 +2,7 @@ package control // Golden replay of ComputeDispatch. // -// testdata/golden/ holds 611 recorded dispatch ticks: nine families covering +// testdata/golden/ holds 551 recorded dispatch ticks: nine families covering // the reactive modes, all four planner modes, fuse pressure in both // directions, degraded siblings, EV and battery-boost reserves, the slew // limiter at rates a site actually runs, the three early exits meeting a @@ -64,7 +64,7 @@ const ( // goldenExpectedRecords guards against a half-written re-recording // silently shrinking the net. - goldenExpectedRecords = 611 + goldenExpectedRecords = 551 // goldenSlewBindingMarginW is how far a record's targets have to move // when the slew limiter is switched off before that record counts as diff --git a/go/internal/control/modes_catalog.go b/go/internal/control/modes_catalog.go index 41798e00c..79ac31284 100644 --- a/go/internal/control/modes_catalog.go +++ b/go/internal/control/modes_catalog.go @@ -58,7 +58,5 @@ func ModeCatalog() []ModeInfo { // Hidden — valid (API + HA + planner) but not surfaced as buttons. {ModePlannerSelf, "Planner (self)", "Forecast-driven self-consumption — never grid-charges, never exports.", TierHidden}, {ModePlannerCheap, "Planner (cheap)", "Forecast-driven — grid-charges during cheap hours, never exports.", TierHidden}, - {ModePriority, "Priority", "Fill the highest-priority battery first.", TierHidden}, - {ModeWeighted, "Weighted", "Distribute dispatch across batteries by configured weights.", TierHidden}, } } diff --git a/go/internal/control/modes_test.go b/go/internal/control/modes_test.go index 86f99c985..5151635e0 100644 --- a/go/internal/control/modes_test.go +++ b/go/internal/control/modes_test.go @@ -41,7 +41,7 @@ func TestPlannerMPCModeMapping(t *testing.T) { } } // Non-planner modes must report ok=false (zero-value mpc.Mode skipped). - for _, m := range []Mode{ModeIdle, ModeSelfConsumption, ModePeakShaving, ModeCharge, ModePriority, ModeWeighted, "garbage"} { + for _, m := range []Mode{ModeIdle, ModeSelfConsumption, ModePeakShaving, ModeCharge, "garbage"} { if mm, ok := PlannerMPCMode(m); ok { t.Errorf("PlannerMPCMode(%q) = (%q, true), want ok=false", m, mm) } @@ -56,7 +56,7 @@ func TestPlannerMPCModeMapping(t *testing.T) { func TestAllModesCoversPlannerModes(t *testing.T) { want := []Mode{ ModeIdle, ModeSelfConsumption, ModePeakShaving, - ModeCharge, ModePriority, ModeWeighted, + ModeCharge, ModePlannerSelf, ModePlannerCheap, ModePlannerPassiveArbitrage, ModePlannerArbitrage, } @@ -79,7 +79,9 @@ func TestIsValidModeAgreesWithAllModes(t *testing.T) { t.Errorf("IsValidMode(%q) = false, want true (mode is in AllModes)", m) } } - for _, bad := range []Mode{"", "planner", "self", "arbitrage", "PLANNER_ARBITRAGE"} { + // priority and weighted were removed: priority never regulated, because + // nothing set its battery order. No door may accept either again. + for _, bad := range []Mode{"", "planner", "self", "arbitrage", "PLANNER_ARBITRAGE", "priority", "weighted"} { if IsValidMode(bad) { t.Errorf("IsValidMode(%q) = true, want false", bad) } diff --git a/go/internal/control/revision.go b/go/internal/control/revision.go index 712847c70..7135e50d6 100644 --- a/go/internal/control/revision.go +++ b/go/internal/control/revision.go @@ -4,7 +4,6 @@ import ( "crypto/sha256" "encoding/binary" "math" - "sort" "sync" ) @@ -87,23 +86,6 @@ func fingerprint(s *State) [sha256.Size]byte { writeFloat(h, s.ManualEVChargingW) writeBool(h, s.BatteryCoversEV) - for _, name := range s.PriorityOrder { - writeString(h, name) - } - - // Sorted, because the same weights in a different map iteration order are - // the same weights, and a revision that moved on iteration order would - // make every command a conflict at random. - names := make([]string, 0, len(s.Weights)) - for name := range s.Weights { - names = append(names, name) - } - sort.Strings(names) - for _, name := range names { - writeString(h, name) - writeFloat(h, s.Weights[name]) - } - var sum [sha256.Size]byte copy(sum[:], h.Sum(nil)) return sum diff --git a/go/internal/control/revision_test.go b/go/internal/control/revision_test.go index 4b677d4d1..38be77df0 100644 --- a/go/internal/control/revision_test.go +++ b/go/internal/control/revision_test.go @@ -31,8 +31,6 @@ func TestEveryControllableFieldMovesTheRevision(t *testing.T) { MaxExportW: 0, ManualEVChargingW: 0, BatteryCoversEV: false, - PriorityOrder: []string{"a", "b"}, - Weights: map[string]float64{"a": 1}, } } @@ -45,8 +43,6 @@ func TestEveryControllableFieldMovesTheRevision(t *testing.T) { "max export": func(s *State) { s.MaxExportW = 8000 }, "manual ev": func(s *State) { s.ManualEVChargingW = 3000 }, "covers ev": func(s *State) { s.BatteryCoversEV = true }, - "priority": func(s *State) { s.PriorityOrder = []string{"b", "a"} }, - "weights": func(s *State) { s.Weights = map[string]float64{"a": 2} }, } { t.Run(name, func(t *testing.T) { var rev Revision @@ -67,7 +63,7 @@ func TestEveryControllableFieldMovesTheRevision(t *testing.T) { // second would make every command a conflict. func TestWorkingStateLeavesTheRevisionAlone(t *testing.T) { var rev Revision - s := &State{Mode: ModeSelfConsumption, Weights: map[string]float64{"a": 1}} + s := &State{Mode: ModeSelfConsumption} before := rev.Observe(s) s.EVChargingW = 4200 @@ -80,33 +76,3 @@ func TestWorkingStateLeavesTheRevisionAlone(t *testing.T) { t.Fatalf("revision went %d → %d on per-tick state alone", before, after) } } - -// Map iteration order is not a change. Without the sort this test fails -// intermittently, which is the worst way to find out. -func TestWeightOrderIsNotAChange(t *testing.T) { - var rev Revision - weights := map[string]float64{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5} - - before := rev.Observe(&State{Mode: ModeSelfConsumption, Weights: weights}) - for i := 0; i < 50; i++ { - copied := make(map[string]float64, len(weights)) - for k, v := range weights { - copied[k] = v - } - if after := rev.Observe(&State{Mode: ModeSelfConsumption, Weights: copied}); after != before { - t.Fatalf("revision moved to %d on iteration order alone", after) - } - } -} - -// Two adjacent strings must not be able to run together into a third pair's -// bytes, or a rename plus an edit could cancel out. -func TestFieldBoundariesAreHashed(t *testing.T) { - var rev Revision - before := rev.Observe(&State{Mode: ModeSelfConsumption, PriorityOrder: []string{"ab", "c"}}) - after := rev.Observe(&State{Mode: ModeSelfConsumption, PriorityOrder: []string{"a", "bc"}}) - - if after == before { - t.Fatal("two different priority orders fingerprinted the same") - } -} diff --git a/go/internal/control/testdata/golden/seeded_reactive.json b/go/internal/control/testdata/golden/seeded_reactive.json index 1ae4f4ffc..3eca0de8b 100644 --- a/go/internal/control/testdata/golden/seeded_reactive.json +++ b/go/internal/control/testdata/golden/seeded_reactive.json @@ -2,7 +2,7 @@ "family": "seeded_reactive", "generated_by": "FTW_GOLDEN_DUMP=1 go test ./internal/control/ -run TestGoldenDump", "ftw_commit": "68c5b6125898bb9da70728b8921259c87e96171d", - "record_count": 100, + "record_count": 68, "records": [ { "scenario_id": "seeded_reactive/000_self_consumption", @@ -371,232 +371,6 @@ "projected_grid_w": 2465 } }, - { - "scenario_id": "seeded_reactive/004_priority", - "seed": 1004, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 3644, - "pv": [ - { - "driver": "pv-0", - "power_w": -3407 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -3131, - "soc": 0.28, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": 3072, - "soc": 0.12, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 15200, - "current_w": 3480, - "soc": 0.27, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 8000, - "max_discharge_w": 3000 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1284, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "sungrow", - "pixii", - "ferroamp" - ] - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -3131, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 3480, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 1788, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 3421, - "battery_target_sum_w": 2137, - "raw_grid_w": 3644, - "projected_grid_w": 2360 - } - }, - { - "scenario_id": "seeded_reactive/005_weighted", - "seed": 1005, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -2939, - "pv": [ - { - "driver": "pv-0", - "power_w": -284 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": -138, - "soc": 0.88, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 15200, - "current_w": -2485, - "soc": 0.1, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "weighted", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 0.7, - "sungrow": 2.9 - } - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -167.14444444444442, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -692.4555555555555, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -2623, - "battery_target_sum_w": -859.5999999999999, - "raw_grid_w": -2939, - "projected_grid_w": -1175.6 - } - }, { "scenario_id": "seeded_reactive/006_self_consumption", "seed": 1006, @@ -998,40 +772,52 @@ } }, { - "scenario_id": "seeded_reactive/010_priority", - "seed": 1010, + "scenario_id": "seeded_reactive/012_self_consumption", + "seed": 1012, "inputs": { "fuse_max_w": 11040, - "grid_w": -1226, + "grid_w": -5092, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 1507, - "soc": 0.26, + "capacity_wh": 9600, + "current_w": 3617, + "soc": 0.54, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 5000, + "max_discharge_w": 2000 }, { "driver": "sungrow", "capacity_wh": 15200, - "current_w": -1268, - "soc": 0.8, + "current_w": 2676, + "soc": 0.9, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 5000, + "max_discharge_w": 3000 + }, + { + "driver": "pixii", + "capacity_wh": 10000, + "current_w": -3317, + "soc": 0.57, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 2000, + "max_discharge_w": 5000 } ], "state": { - "mode": "priority", - "grid_target_w": 0, + "mode": "self_consumption", + "grid_target_w": 454, "grid_tolerance_w": 50, "slew_rate_w": 100000, "slew_enabled": true, @@ -1051,22 +837,23 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "sungrow" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 2242.6, + "target_w": 1738.9241379310345, + "clamped": false + }, + { + "driver": "pixii", + "target_w": 1811.3793103448277, "clamped": false }, { "driver": "sungrow", - "target_w": -1268, + "target_w": 2753.296551724138, "clamped": false } ], @@ -1088,30 +875,24 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 239, - "battery_target_sum_w": 974.5999999999999, - "raw_grid_w": -1226, - "projected_grid_w": -490.4000000000001 + "battery_current_w": 2976, + "battery_target_sum_w": 6303.6, + "raw_grid_w": -5092, + "projected_grid_w": -1764.3999999999996 } }, { - "scenario_id": "seeded_reactive/011_weighted", - "seed": 1011, + "scenario_id": "seeded_reactive/013_peak_shaving", + "seed": 1013, "inputs": { "fuse_max_w": 11040, - "grid_w": 3218, - "pv": [ - { - "driver": "pv-0", - "power_w": -600 - } - ], + "grid_w": -1103, "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": -3523, - "soc": 0.85, + "current_w": -1273, + "soc": 0.7, "online": true, "device_fault": false, "discharge_blocked": false, @@ -1121,229 +902,9 @@ }, { "driver": "sungrow", - "capacity_wh": 15200, - "current_w": 1126, - "soc": 0.36, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 9600, - "current_w": 1800, - "soc": 0.73, - "online": false, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "weighted", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": false, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.8, - "pixii": 1.7, - "sungrow": 1.7 - } - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -2225.7257142857147, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -2102.074285714286, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -2397, - "battery_target_sum_w": -4327.800000000001, - "raw_grid_w": 3218, - "projected_grid_w": 1287.199999999999 - } - }, - { - "scenario_id": "seeded_reactive/012_self_consumption", - "seed": 1012, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -5092, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 9600, - "current_w": 3617, - "soc": 0.54, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 2000 - }, - { - "driver": "sungrow", - "capacity_wh": 15200, - "current_w": 2676, - "soc": 0.9, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 3000 - }, - { - "driver": "pixii", - "capacity_wh": 10000, - "current_w": -3317, - "soc": 0.57, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 5000 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 454, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 1738.9241379310345, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 1811.3793103448277, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 2753.296551724138, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 2976, - "battery_target_sum_w": 6303.6, - "raw_grid_w": -5092, - "projected_grid_w": -1764.3999999999996 - } - }, - { - "scenario_id": "seeded_reactive/013_peak_shaving", - "seed": 1013, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -1103, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -1273, - "soc": 0.7, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -3369, - "soc": 0.48, + "capacity_wh": 5000, + "current_w": -3369, + "soc": 0.48, "online": true, "device_fault": false, "discharge_blocked": false, @@ -1604,30 +1165,30 @@ } }, { - "scenario_id": "seeded_reactive/016_priority", - "seed": 1016, + "scenario_id": "seeded_reactive/018_self_consumption", + "seed": 1018, "inputs": { "fuse_max_w": 11040, - "grid_w": 5773, + "grid_w": 7276, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 9600, - "current_w": -1849, - "soc": 0.68, + "capacity_wh": 15200, + "current_w": 246, + "soc": 0.54, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 5000 + "max_charge_w": 0, + "max_discharge_w": 0 } ], "state": { - "mode": "priority", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 100000, + "slew_rate_w": 1152, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -1645,16 +1206,13 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -5000, + "target_w": -906, "clamped": true } ], @@ -1678,36 +1236,24 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -1849, - "battery_target_sum_w": -5000, - "raw_grid_w": 5773, - "projected_grid_w": 2622 + "battery_current_w": 246, + "battery_target_sum_w": -906, + "raw_grid_w": 7276, + "projected_grid_w": 6124 } }, { - "scenario_id": "seeded_reactive/017_weighted", - "seed": 1017, + "scenario_id": "seeded_reactive/019_peak_shaving", + "seed": 1019, "inputs": { "fuse_max_w": 11040, - "grid_w": -6282, + "grid_w": 2491, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": 3120, - "soc": 0.83, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 8000, - "max_discharge_w": 2000 - }, - { - "driver": "sungrow", - "capacity_wh": 15200, - "current_w": -3591, - "soc": 0.84, + "capacity_wh": 10000, + "current_w": -2660, + "soc": 0.23, "online": true, "device_fault": false, "discharge_blocked": false, @@ -1717,7 +1263,7 @@ } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 100000, @@ -1730,7 +1276,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 4378, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -1738,173 +1284,10 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 2.5, - "sungrow": 1.7 - } + "pv_surplus_absorb_threshold_w": 0 } }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 1963.2142857142856, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 1334.985714285714, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -471, - "battery_target_sum_w": 3298.2, - "raw_grid_w": -6282, - "projected_grid_w": -2512.8 - } - }, - { - "scenario_id": "seeded_reactive/018_self_consumption", - "seed": 1018, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 7276, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 246, - "soc": 0.54, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1152, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -906, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 246, - "battery_target_sum_w": -906, - "raw_grid_w": 7276, - "projected_grid_w": 6124 - } - }, - { - "scenario_id": "seeded_reactive/019_peak_shaving", - "seed": 1019, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 2491, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -2660, - "soc": 0.23, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 4378, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [], + "per_driver_targets": [], "clamp_attributions": { "clamped_drivers": [], "all_targets_zero_clamped": false, @@ -2134,47 +1517,23 @@ } }, { - "scenario_id": "seeded_reactive/022_priority", - "seed": 1022, + "scenario_id": "seeded_reactive/024_self_consumption", + "seed": 1024, "inputs": { "fuse_max_w": 11040, - "grid_w": -780, + "grid_w": -5430, "pv": [ { "driver": "pv-0", - "power_w": -3664 + "power_w": -4974 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": -3181, - "soc": 0.69, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -2908, - "soc": 0.75, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 9600, - "current_w": 3480, - "soc": 0.69, + "capacity_wh": 10000, + "current_w": -1086, + "soc": 0.57, "online": true, "device_fault": false, "discharge_blocked": false, @@ -2184,10 +1543,10 @@ } ], "state": { - "mode": "priority", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 856, + "slew_rate_w": 100000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -2205,28 +1564,13 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "sungrow", - "pixii" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -2713, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 3480, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -2908, + "target_w": 2172, "clamped": false } ], @@ -2248,59 +1592,35 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -2609, - "battery_target_sum_w": -2141, - "raw_grid_w": -780, - "projected_grid_w": -312 + "battery_current_w": -1086, + "battery_target_sum_w": 2172, + "raw_grid_w": -5430, + "projected_grid_w": -2172 } }, { - "scenario_id": "seeded_reactive/023_weighted", - "seed": 1023, + "scenario_id": "seeded_reactive/025_peak_shaving", + "seed": 1025, "inputs": { "fuse_max_w": 11040, - "grid_w": 1742, + "grid_w": -4199, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -195, - "soc": 0.37, + "capacity_wh": 15200, + "current_w": 1994, + "soc": 0.26, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, "max_charge_w": 2000, "max_discharge_w": 3000 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -419, - "soc": 0.16, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 9600, - "current_w": -3597, - "soc": 0.88, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 } ], "state": { - "mode": "weighted", - "grid_target_w": 0, + "mode": "peak_shaving", + "grid_target_w": 60, "grid_tolerance_w": 50, "slew_rate_w": 100000, "slew_enabled": true, @@ -2312,7 +1632,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3515, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -2320,33 +1640,20 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.2, - "pixii": 0.8, - "sungrow": 1.5 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -1802.1257142857141, - "clamped": false - }, - { - "driver": "pixii", - "target_w": -1201.4171428571428, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -2252.657142857143, - "clamped": false + "target_w": 2000, + "clamped": true } ], "clamp_attributions": { - "clamped_drivers": [], + "clamped_drivers": [ + "ferroamp" + ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -2363,182 +1670,22 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -4211, - "battery_target_sum_w": -5256.2, - "raw_grid_w": 1742, - "projected_grid_w": 696.8000000000002 + "battery_current_w": 1994, + "battery_target_sum_w": 2000, + "raw_grid_w": -4199, + "projected_grid_w": -4193 } }, { - "scenario_id": "seeded_reactive/024_self_consumption", - "seed": 1024, + "scenario_id": "seeded_reactive/026_charge", + "seed": 1026, "inputs": { "fuse_max_w": 11040, - "grid_w": -5430, + "grid_w": -5692, "pv": [ { "driver": "pv-0", - "power_w": -4974 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -1086, - "soc": 0.57, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 2172, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -1086, - "battery_target_sum_w": 2172, - "raw_grid_w": -5430, - "projected_grid_w": -2172 - } - }, - { - "scenario_id": "seeded_reactive/025_peak_shaving", - "seed": 1025, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -4199, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 1994, - "soc": 0.26, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 3000 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 60, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3515, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 2000, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 1994, - "battery_target_sum_w": 2000, - "raw_grid_w": -4199, - "projected_grid_w": -4193 - } - }, - { - "scenario_id": "seeded_reactive/026_charge", - "seed": 1026, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -5692, - "pv": [ - { - "driver": "pv-0", - "power_w": -3839 + "power_w": -3839 } ], "batteries": [ @@ -2738,31 +1885,31 @@ } }, { - "scenario_id": "seeded_reactive/028_priority", - "seed": 1028, + "scenario_id": "seeded_reactive/030_self_consumption", + "seed": 1030, "inputs": { "fuse_max_w": 11040, - "grid_w": -6734, + "grid_w": -3496, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 1431, - "soc": 0.72, + "capacity_wh": 5000, + "current_w": 3059, + "soc": 0.1, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 5000, + "max_discharge_w": 5000 } ], "state": { - "mode": "priority", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 100000, - "slew_enabled": false, + "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, "use_energy_dispatch": false, @@ -2779,10 +1926,7 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ @@ -2812,44 +1956,56 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 1431, + "battery_current_w": 3059, "battery_target_sum_w": 5000, - "raw_grid_w": -6734, - "projected_grid_w": -3165 + "raw_grid_w": -3496, + "projected_grid_w": -1555 } }, { - "scenario_id": "seeded_reactive/029_weighted", - "seed": 1029, + "scenario_id": "seeded_reactive/031_peak_shaving", + "seed": 1031, "inputs": { "fuse_max_w": 11040, - "grid_w": -3452, + "grid_w": -7694, "pv": [ { "driver": "pv-0", - "power_w": -5042 + "power_w": -4511 } ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": -3910, - "soc": 0.4, + "current_w": -1830, + "soc": 0.23, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, "max_charge_w": 0, "max_discharge_w": 0 + }, + { + "driver": "sungrow", + "capacity_wh": 9600, + "current_w": -1068, + "soc": 0.58, + "online": false, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 2000, + "max_discharge_w": 3000 } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 100000, - "slew_enabled": true, + "slew_enabled": false, "min_dispatch_interval_s": 0, "holdoff_active": false, "use_energy_dispatch": false, @@ -2858,7 +2014,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3329, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -2866,16 +2022,13 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -1838.8000000000002, + "target_w": 2786.3999999999996, "clamped": false } ], @@ -2897,37 +2050,67 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -3910, - "battery_target_sum_w": -1838.8000000000002, - "raw_grid_w": -3452, - "projected_grid_w": -1380.8000000000002 + "battery_current_w": -1830, + "battery_target_sum_w": 2786.3999999999996, + "raw_grid_w": -7694, + "projected_grid_w": -3077.6000000000004 } }, { - "scenario_id": "seeded_reactive/030_self_consumption", - "seed": 1030, + "scenario_id": "seeded_reactive/032_charge", + "seed": 1032, "inputs": { "fuse_max_w": 11040, - "grid_w": -3496, + "grid_w": 1783, + "pv": [ + { + "driver": "pv-0", + "power_w": -4859 + } + ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": 3059, - "soc": 0.1, + "capacity_wh": 15200, + "current_w": -2720, + "soc": 0.85, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 5000 + "max_charge_w": 0, + "max_discharge_w": 0 + }, + { + "driver": "sungrow", + "capacity_wh": 15200, + "current_w": 14, + "soc": 0.47, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 0, + "max_discharge_w": 0 + }, + { + "driver": "pixii", + "capacity_wh": 15200, + "current_w": 280, + "soc": 0.13, + "online": false, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 0, + "max_discharge_w": 0 } ], "state": { - "mode": "self_consumption", + "mode": "charge", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 100000, + "slew_rate_w": 819, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -2951,13 +2134,19 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 5000, + "target_w": 3275.5, + "clamped": true + }, + { + "driver": "sungrow", + "target_w": 3275.5, "clamped": true } ], "clamp_attributions": { "clamped_drivers": [ - "ferroamp" + "ferroamp", + "sungrow" ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, @@ -2965,40 +2154,40 @@ "plan_stale": false, "fuse_saturated": false, "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, + "fuse_hold_latched": true, + "fuse_hold_max_charge_w": 6551, "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, + "import_ceiling_binding": true, "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 3059, - "battery_target_sum_w": 5000, - "raw_grid_w": -3496, - "projected_grid_w": -1555 + "battery_current_w": -2706, + "battery_target_sum_w": 6551, + "raw_grid_w": 1783, + "projected_grid_w": 11040 } }, { - "scenario_id": "seeded_reactive/031_peak_shaving", - "seed": 1031, + "scenario_id": "seeded_reactive/033_idle", + "seed": 1033, "inputs": { "fuse_max_w": 11040, - "grid_w": -7694, + "grid_w": -1112, "pv": [ { "driver": "pv-0", - "power_w": -4511 + "power_w": -661 } ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": -1830, - "soc": 0.23, + "current_w": 484, + "soc": 0.56, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3008,23 +2197,23 @@ }, { "driver": "sungrow", - "capacity_wh": 9600, - "current_w": -1068, - "soc": 0.58, + "capacity_wh": 10000, + "current_w": 1938, + "soc": 0.93, "online": false, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 3000 + "max_charge_w": 0, + "max_discharge_w": 0 } ], "state": { - "mode": "peak_shaving", - "grid_target_w": 0, + "mode": "idle", + "grid_target_w": -26, "grid_tolerance_w": 50, "slew_rate_w": 100000, - "slew_enabled": false, + "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, "use_energy_dispatch": false, @@ -3033,7 +2222,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3329, + "peak_limit_w": 5000, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -3047,7 +2236,7 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 2786.3999999999996, + "target_w": 0, "clamped": false } ], @@ -3069,30 +2258,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -1830, - "battery_target_sum_w": 2786.3999999999996, - "raw_grid_w": -7694, - "projected_grid_w": -3077.6000000000004 + "battery_current_w": 484, + "battery_target_sum_w": 0, + "raw_grid_w": -1112, + "projected_grid_w": -1596 } }, { - "scenario_id": "seeded_reactive/032_charge", - "seed": 1032, + "scenario_id": "seeded_reactive/036_self_consumption", + "seed": 1036, "inputs": { "fuse_max_w": 11040, - "grid_w": 1783, + "grid_w": 4963, "pv": [ { "driver": "pv-0", - "power_w": -4859 + "power_w": -4078 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -2720, - "soc": 0.85, + "capacity_wh": 9600, + "current_w": -318, + "soc": 0.09, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3103,8 +2292,8 @@ { "driver": "sungrow", "capacity_wh": 15200, - "current_w": 14, - "soc": 0.47, + "current_w": 163, + "soc": 0.5, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3114,10 +2303,10 @@ }, { "driver": "pixii", - "capacity_wh": 15200, - "current_w": 280, - "soc": 0.13, - "online": false, + "capacity_wh": 9600, + "current_w": 1878, + "soc": 0.77, + "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, @@ -3126,10 +2315,10 @@ } ], "state": { - "mode": "charge", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 819, + "slew_rate_w": 100000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -3153,60 +2342,68 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 3275.5, - "clamped": true + "target_w": -350.17674418604656, + "clamped": false + }, + { + "driver": "pixii", + "target_w": -350.17674418604656, + "clamped": false }, { "driver": "sungrow", - "target_w": 3275.5, - "clamped": true + "target_w": -554.4465116279071, + "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "sungrow" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, "plan_stale": false, "fuse_saturated": false, "fuse_ev_max_w": 0, - "fuse_hold_latched": true, - "fuse_hold_max_charge_w": 6551, + "fuse_hold_latched": false, + "fuse_hold_max_charge_w": 0, "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, - "import_ceiling_binding": true, + "import_ceiling_binding": false, "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -2706, - "battery_target_sum_w": 6551, - "raw_grid_w": 1783, - "projected_grid_w": 11040 + "battery_current_w": 1723, + "battery_target_sum_w": -1254.8000000000002, + "raw_grid_w": 4963, + "projected_grid_w": 1985.1999999999998 } }, { - "scenario_id": "seeded_reactive/033_idle", - "seed": 1033, + "scenario_id": "seeded_reactive/037_peak_shaving", + "seed": 1037, "inputs": { "fuse_max_w": 11040, - "grid_w": -1112, - "pv": [ - { - "driver": "pv-0", - "power_w": -661 - } - ], + "grid_w": 4979, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 484, - "soc": 0.56, + "capacity_wh": 15200, + "current_w": -3209, + "soc": 0.69, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 5000, + "max_discharge_w": 3000 + }, + { + "driver": "sungrow", + "capacity_wh": 9600, + "current_w": 2215, + "soc": 0.39, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3215,10 +2412,10 @@ "max_discharge_w": 0 }, { - "driver": "sungrow", - "capacity_wh": 10000, - "current_w": 1938, - "soc": 0.93, + "driver": "pixii", + "capacity_wh": 9600, + "current_w": -1225, + "soc": 0.61, "online": false, "device_fault": false, "discharge_blocked": false, @@ -3228,8 +2425,8 @@ } ], "state": { - "mode": "idle", - "grid_target_w": -26, + "mode": "peak_shaving", + "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 100000, "slew_enabled": true, @@ -3241,7 +2438,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 4354, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -3255,7 +2452,12 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 0, + "target_w": -839.0645161290323, + "clamped": false + }, + { + "driver": "sungrow", + "target_w": -529.9354838709677, "clamped": false } ], @@ -3277,30 +2479,24 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 484, - "battery_target_sum_w": 0, - "raw_grid_w": -1112, - "projected_grid_w": -1596 + "battery_current_w": -994, + "battery_target_sum_w": -1369, + "raw_grid_w": 4979, + "projected_grid_w": 4604 } }, { - "scenario_id": "seeded_reactive/034_priority", - "seed": 1034, + "scenario_id": "seeded_reactive/038_charge", + "seed": 1038, "inputs": { "fuse_max_w": 11040, - "grid_w": 892, - "pv": [ - { - "driver": "pv-0", - "power_w": -1156 - } - ], + "grid_w": 636, "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": -2420, - "soc": 0.69, + "current_w": 1933, + "soc": 0.82, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3310,21 +2506,9 @@ }, { "driver": "sungrow", - "capacity_wh": 15200, - "current_w": 3848, - "soc": 0.57, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", "capacity_wh": 9600, - "current_w": -3950, - "soc": 0.28, + "current_w": 3608, + "soc": 0.61, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3334,10 +2518,10 @@ } ], "state": { - "mode": "priority", - "grid_target_w": 0, + "mode": "charge", + "grid_target_w": 456, "grid_tolerance_w": 50, - "slew_rate_w": 100000, + "slew_rate_w": 857, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -3355,28 +2539,18 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "sungrow", - "pixii", - "ferroamp" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -2420, - "clamped": false - }, - { - "driver": "pixii", - "target_w": -3950, + "target_w": 5000, "clamped": false }, { "driver": "sungrow", - "target_w": 3312.8, + "target_w": 5000, "clamped": false } ], @@ -3398,42 +2572,24 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -2522, - "battery_target_sum_w": -3057.2, - "raw_grid_w": 892, - "projected_grid_w": 356.8000000000002 + "battery_current_w": 5541, + "battery_target_sum_w": 10000, + "raw_grid_w": 636, + "projected_grid_w": 5095 } }, { - "scenario_id": "seeded_reactive/035_weighted", - "seed": 1035, + "scenario_id": "seeded_reactive/039_idle", + "seed": 1039, "inputs": { "fuse_max_w": 11040, - "grid_w": -4761, - "pv": [ - { - "driver": "pv-0", - "power_w": -5011 - } - ], + "grid_w": -5371, "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": 2696, - "soc": 0.4, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 8000 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -1823, - "soc": 0.12, + "current_w": -2847, + "soc": 0.53, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3443,10 +2599,10 @@ } ], "state": { - "mode": "weighted", - "grid_target_w": -348, + "mode": "idle", + "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 100000, + "slew_rate_w": 539, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -3464,22 +2620,13 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.3, - "sungrow": 2 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 1386.9818181818184, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 2133.818181818182, + "target_w": 0, "clamped": false } ], @@ -3501,30 +2648,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 873, - "battery_target_sum_w": 3520.8, - "raw_grid_w": -4761, - "projected_grid_w": -2113.2 + "battery_current_w": -2847, + "battery_target_sum_w": 0, + "raw_grid_w": -5371, + "projected_grid_w": -2524 } }, { - "scenario_id": "seeded_reactive/036_self_consumption", - "seed": 1036, + "scenario_id": "seeded_reactive/042_self_consumption", + "seed": 1042, "inputs": { "fuse_max_w": 11040, - "grid_w": 4963, + "grid_w": -2984, "pv": [ { "driver": "pv-0", - "power_w": -4078 + "power_w": -1484 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 9600, - "current_w": -318, - "soc": 0.09, + "capacity_wh": 15200, + "current_w": -1671, + "soc": 0.07, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3535,31 +2682,19 @@ { "driver": "sungrow", "capacity_wh": 15200, - "current_w": 163, - "soc": 0.5, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 9600, - "current_w": 1878, - "soc": 0.77, - "online": true, + "current_w": 3775, + "soc": 0.08, + "online": false, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 5000, + "max_discharge_w": 3000 } ], "state": { "mode": "self_consumption", - "grid_target_w": 0, + "grid_target_w": -140, "grid_tolerance_w": 50, "slew_rate_w": 100000, "slew_enabled": true, @@ -3585,17 +2720,7 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -350.17674418604656, - "clamped": false - }, - { - "driver": "pixii", - "target_w": -350.17674418604656, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -554.4465116279071, + "target_w": 35.40000000000009, "clamped": false } ], @@ -3617,48 +2742,54 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 1723, - "battery_target_sum_w": -1254.8000000000002, - "raw_grid_w": 4963, - "projected_grid_w": 1985.1999999999998 + "battery_current_w": -1671, + "battery_target_sum_w": 35.40000000000009, + "raw_grid_w": -2984, + "projected_grid_w": -1277.6 } }, { - "scenario_id": "seeded_reactive/037_peak_shaving", - "seed": 1037, + "scenario_id": "seeded_reactive/043_peak_shaving", + "seed": 1043, "inputs": { "fuse_max_w": 11040, - "grid_w": 4979, + "grid_w": 2567, + "pv": [ + { + "driver": "pv-0", + "power_w": -1592 + } + ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 15200, - "current_w": -3209, - "soc": 0.69, + "current_w": 1435, + "soc": 0.66, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 3000 + "max_charge_w": 0, + "max_discharge_w": 0 }, { "driver": "sungrow", - "capacity_wh": 9600, - "current_w": 2215, - "soc": 0.39, + "capacity_wh": 5000, + "current_w": -2644, + "soc": 0.45, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 3000, + "max_discharge_w": 8000 }, { "driver": "pixii", - "capacity_wh": 9600, - "current_w": -1225, - "soc": 0.61, + "capacity_wh": 15200, + "current_w": -2071, + "soc": 0.88, "online": false, "device_fault": false, "discharge_blocked": false, @@ -3671,7 +2802,7 @@ "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 100000, + "slew_rate_w": 1383, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -3681,7 +2812,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 4354, + "peak_limit_w": 4493, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -3692,18 +2823,7 @@ "pv_surplus_absorb_threshold_w": 0 } }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -839.0645161290323, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -529.9354838709677, - "clamped": false - } - ], + "per_driver_targets": [], "clamp_attributions": { "clamped_drivers": [], "all_targets_zero_clamped": false, @@ -3722,24 +2842,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -994, - "battery_target_sum_w": -1369, - "raw_grid_w": 4979, - "projected_grid_w": 4604 + "battery_current_w": -1209, + "battery_target_sum_w": 0, + "raw_grid_w": 2567, + "projected_grid_w": 2567 } }, { - "scenario_id": "seeded_reactive/038_charge", - "seed": 1038, + "scenario_id": "seeded_reactive/044_charge", + "seed": 1044, "inputs": { "fuse_max_w": 11040, - "grid_w": 636, + "grid_w": -6563, + "pv": [ + { + "driver": "pv-0", + "power_w": -3522 + } + ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": 1933, - "soc": 0.82, + "current_w": -1454, + "soc": 0.35, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3749,23 +2875,35 @@ }, { "driver": "sungrow", - "capacity_wh": 9600, - "current_w": 3608, - "soc": 0.61, + "capacity_wh": 5000, + "current_w": -1235, + "soc": 0.42, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, "max_charge_w": 0, "max_discharge_w": 0 + }, + { + "driver": "pixii", + "capacity_wh": 15200, + "current_w": 2846, + "soc": 0.28, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 5000, + "max_discharge_w": 2000 } ], "state": { "mode": "charge", - "grid_target_w": 456, + "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 857, - "slew_enabled": true, + "slew_rate_w": 100000, + "slew_enabled": false, "min_dispatch_interval_s": 0, "holdoff_active": false, "use_energy_dispatch": false, @@ -3791,6 +2929,11 @@ "target_w": 5000, "clamped": false }, + { + "driver": "pixii", + "target_w": 5000, + "clamped": false + }, { "driver": "sungrow", "target_w": 5000, @@ -3815,24 +2958,36 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 5541, - "battery_target_sum_w": 10000, - "raw_grid_w": 636, - "projected_grid_w": 5095 + "battery_current_w": 157, + "battery_target_sum_w": 15000, + "raw_grid_w": -6563, + "projected_grid_w": 8280 } }, { - "scenario_id": "seeded_reactive/039_idle", - "seed": 1039, + "scenario_id": "seeded_reactive/045_idle", + "seed": 1045, "inputs": { "fuse_max_w": 11040, - "grid_w": -5371, + "grid_w": 176, "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": -2847, - "soc": 0.53, + "current_w": 3780, + "soc": 0.51, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 5000, + "max_discharge_w": 8000 + }, + { + "driver": "sungrow", + "capacity_wh": 5000, + "current_w": 627, + "soc": 0.73, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3843,9 +2998,9 @@ ], "state": { "mode": "idle", - "grid_target_w": 0, + "grid_target_w": 247, "grid_tolerance_w": 50, - "slew_rate_w": 539, + "slew_rate_w": 100000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -3871,6 +3026,11 @@ "driver": "ferroamp", "target_w": 0, "clamped": false + }, + { + "driver": "sungrow", + "target_w": 0, + "clamped": false } ], "clamp_attributions": { @@ -3891,30 +3051,24 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -2847, + "battery_current_w": 4407, "battery_target_sum_w": 0, - "raw_grid_w": -5371, - "projected_grid_w": -2524 + "raw_grid_w": 176, + "projected_grid_w": -4231 } }, { - "scenario_id": "seeded_reactive/040_priority", - "seed": 1040, + "scenario_id": "seeded_reactive/048_self_consumption", + "seed": 1048, "inputs": { "fuse_max_w": 11040, - "grid_w": 1533, - "pv": [ - { - "driver": "pv-0", - "power_w": -2117 - } - ], + "grid_w": -3272, "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": -3720, - "soc": 0.22, + "current_w": 3021, + "soc": 0.07, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3924,9 +3078,9 @@ }, { "driver": "sungrow", - "capacity_wh": 10000, - "current_w": -573, - "soc": 0.89, + "capacity_wh": 15200, + "current_w": -941, + "soc": 0.33, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3936,9 +3090,9 @@ }, { "driver": "pixii", - "capacity_wh": 10000, - "current_w": -2765, - "soc": 0.49, + "capacity_wh": 5000, + "current_w": -1524, + "soc": 0.46, "online": true, "device_fault": false, "discharge_blocked": false, @@ -3948,10 +3102,10 @@ } ], "state": { - "mode": "priority", - "grid_target_w": 452, + "mode": "self_consumption", + "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 100000, + "slew_rate_w": 518, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -3969,2256 +3123,32 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "pixii", - "ferroamp", - "sungrow" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -3720, - "clamped": false + "target_w": 2503, + "clamped": true }, { "driver": "pixii", - "target_w": -3413.6000000000004, - "clamped": false + "target_w": -1006, + "clamped": true }, { "driver": "sungrow", - "target_w": -573, - "clamped": false + "target_w": -423, + "clamped": true } ], "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -7058, - "battery_target_sum_w": -7706.6, - "raw_grid_w": 1533, - "projected_grid_w": 884.3999999999996 - } - }, - { - "scenario_id": "seeded_reactive/041_weighted", - "seed": 1041, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -1710, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 9600, - "current_w": -627, - "soc": 0.38, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "weighted", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.8 - } - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 399, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -627, - "battery_target_sum_w": 399, - "raw_grid_w": -1710, - "projected_grid_w": -684 - } - }, - { - "scenario_id": "seeded_reactive/042_self_consumption", - "seed": 1042, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -2984, - "pv": [ - { - "driver": "pv-0", - "power_w": -1484 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -1671, - "soc": 0.07, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 15200, - "current_w": 3775, - "soc": 0.08, - "online": false, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 3000 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": -140, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 35.40000000000009, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -1671, - "battery_target_sum_w": 35.40000000000009, - "raw_grid_w": -2984, - "projected_grid_w": -1277.6 - } - }, - { - "scenario_id": "seeded_reactive/043_peak_shaving", - "seed": 1043, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 2567, - "pv": [ - { - "driver": "pv-0", - "power_w": -1592 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 1435, - "soc": 0.66, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -2644, - "soc": 0.45, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 8000 - }, - { - "driver": "pixii", - "capacity_wh": 15200, - "current_w": -2071, - "soc": 0.88, - "online": false, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1383, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 4493, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -1209, - "battery_target_sum_w": 0, - "raw_grid_w": 2567, - "projected_grid_w": 2567 - } - }, - { - "scenario_id": "seeded_reactive/044_charge", - "seed": 1044, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -6563, - "pv": [ - { - "driver": "pv-0", - "power_w": -3522 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -1454, - "soc": 0.35, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -1235, - "soc": 0.42, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 15200, - "current_w": 2846, - "soc": 0.28, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 2000 - } - ], - "state": { - "mode": "charge", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": false, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 5000, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 5000, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 5000, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 157, - "battery_target_sum_w": 15000, - "raw_grid_w": -6563, - "projected_grid_w": 8280 - } - }, - { - "scenario_id": "seeded_reactive/045_idle", - "seed": 1045, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 176, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 3780, - "soc": 0.51, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 8000 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": 627, - "soc": 0.73, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "idle", - "grid_target_w": 247, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 0, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 0, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 4407, - "battery_target_sum_w": 0, - "raw_grid_w": 176, - "projected_grid_w": -4231 - } - }, - { - "scenario_id": "seeded_reactive/046_priority", - "seed": 1046, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -2810, - "pv": [ - { - "driver": "pv-0", - "power_w": -1066 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 925, - "soc": 0.22, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 10000, - "current_w": 2583, - "soc": 0.3, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 5000, - "current_w": -3352, - "soc": 0.88, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "pixii", - "sungrow" - ] - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 2611, - "clamped": false - }, - { - "driver": "pixii", - "target_w": -3352, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 2583, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 156, - "battery_target_sum_w": 1842, - "raw_grid_w": -2810, - "projected_grid_w": -1124 - } - }, - { - "scenario_id": "seeded_reactive/047_weighted", - "seed": 1047, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 4964, - "pv": [ - { - "driver": "pv-0", - "power_w": -4248 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -1982, - "soc": 0.81, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 9600, - "current_w": -3052, - "soc": 0.9, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 5000, - "current_w": -430, - "soc": 0.61, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "weighted", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 0.8, - "pixii": 2.7, - "sungrow": 1.6 - } - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -1324.2980392156865, - "clamped": false - }, - { - "driver": "pixii", - "target_w": -4469.505882352942, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -2648.596078431373, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -5464, - "battery_target_sum_w": -8442.400000000001, - "raw_grid_w": 4964, - "projected_grid_w": 1985.5999999999985 - } - }, - { - "scenario_id": "seeded_reactive/048_self_consumption", - "seed": 1048, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -3272, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 3021, - "soc": 0.07, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 15200, - "current_w": -941, - "soc": 0.33, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 5000, - "current_w": -1524, - "soc": 0.46, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 518, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 2503, - "clamped": true - }, - { - "driver": "pixii", - "target_w": -1006, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": -423, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "pixii", - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 556, - "battery_target_sum_w": 1074, - "raw_grid_w": -3272, - "projected_grid_w": -2754 - } - }, - { - "scenario_id": "seeded_reactive/049_peak_shaving", - "seed": 1049, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -1648, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -1887, - "soc": 0.7, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 15200, - "current_w": 1015, - "soc": 0.31, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 5000 - }, - { - "driver": "pixii", - "capacity_wh": 9600, - "current_w": 1360, - "soc": 0.32, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 5000 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1863, - "slew_enabled": false, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3827, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 424.367816091954, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 407.39310344827584, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 645.0390804597702, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 488, - "battery_target_sum_w": 1476.8000000000002, - "raw_grid_w": -1648, - "projected_grid_w": -659.1999999999998 - } - }, - { - "scenario_id": "seeded_reactive/050_charge", - "seed": 1050, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 299, - "pv": [ - { - "driver": "pv-0", - "power_w": -5918 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -2785, - "soc": 0.41, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": 2315, - "soc": 0.66, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 9600, - "current_w": 2263, - "soc": 0.61, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "charge", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 4178, - "clamped": true - }, - { - "driver": "pixii", - "target_w": 4178, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": 4178, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "pixii", - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": true, - "fuse_hold_max_charge_w": 12534, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": true, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 1793, - "battery_target_sum_w": 12534, - "raw_grid_w": 299, - "projected_grid_w": 11040 - } - }, - { - "scenario_id": "seeded_reactive/051_idle", - "seed": 1051, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -1951, - "pv": [ - { - "driver": "pv-0", - "power_w": -5346 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 9600, - "current_w": 434, - "soc": 0.09, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 3000 - } - ], - "state": { - "mode": "idle", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 0, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 434, - "battery_target_sum_w": 0, - "raw_grid_w": -1951, - "projected_grid_w": -2385 - } - }, - { - "scenario_id": "seeded_reactive/052_priority", - "seed": 1052, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 3528, - "pv": [ - { - "driver": "pv-0", - "power_w": -2828 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -471, - "soc": 0.25, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 2000 - }, - { - "driver": "sungrow", - "capacity_wh": 9600, - "current_w": -1805, - "soc": 0.81, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 8000 - }, - { - "driver": "pixii", - "capacity_wh": 9600, - "current_w": -196, - "soc": 0.14, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "pixii", - "sungrow", - "ferroamp" - ] - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -471, - "clamped": false - }, - { - "driver": "pixii", - "target_w": -2312.8, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -1805, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -2472, - "battery_target_sum_w": -4588.8, - "raw_grid_w": 3528, - "projected_grid_w": 1411.1999999999998 - } - }, - { - "scenario_id": "seeded_reactive/053_weighted", - "seed": 1053, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 86, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 2655, - "soc": 0.84, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 9600, - "current_w": 245, - "soc": 0.25, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "weighted", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1547, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.5, - "sungrow": 1.2 - } - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 1582.4444444444443, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 1265.9555555555555, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 2900, - "battery_target_sum_w": 2848.3999999999996, - "raw_grid_w": 86, - "projected_grid_w": 34.399999999999636 - } - }, - { - "scenario_id": "seeded_reactive/054_self_consumption", - "seed": 1054, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 2236, - "pv": [ - { - "driver": "pv-0", - "power_w": -759 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -375, - "soc": 0.55, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": -295, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -1893.6, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -375, - "battery_target_sum_w": -1893.6, - "raw_grid_w": 2236, - "projected_grid_w": 717.4000000000001 - } - }, - { - "scenario_id": "seeded_reactive/055_peak_shaving", - "seed": 1055, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -4476, - "pv": [ - { - "driver": "pv-0", - "power_w": -1055 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -3234, - "soc": 0.24, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 8000, - "max_discharge_w": 8000 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1564, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 6709, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -1670, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -3234, - "battery_target_sum_w": -1670, - "raw_grid_w": -4476, - "projected_grid_w": -2912 - } - }, - { - "scenario_id": "seeded_reactive/056_charge", - "seed": 1056, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 5866, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 1875, - "soc": 0.38, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -2590, - "soc": 0.27, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 8000, - "max_discharge_w": 5000 - }, - { - "driver": "pixii", - "capacity_wh": 10000, - "current_w": -2553, - "soc": 0.78, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "charge", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 529.4444444444445, - "clamped": true - }, - { - "driver": "pixii", - "target_w": 529.4444444444445, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": 847.1111111111112, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "pixii", - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": true, - "fuse_hold_max_charge_w": 1906, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": true, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -3268, - "battery_target_sum_w": 1906, - "raw_grid_w": 5866, - "projected_grid_w": 11040 - } - }, - { - "scenario_id": "seeded_reactive/057_idle", - "seed": 1057, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -696, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -888, - "soc": 0.07, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 3000 - } - ], - "state": { - "mode": "idle", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": false, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 0, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -888, - "battery_target_sum_w": 0, - "raw_grid_w": -696, - "projected_grid_w": 192 - } - }, - { - "scenario_id": "seeded_reactive/058_priority", - "seed": 1058, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -4913, - "pv": [ - { - "driver": "pv-0", - "power_w": -1011 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -3796, - "soc": 0.68, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 15200, - "current_w": 1476, - "soc": 0.16, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 5000, - "current_w": -775, - "soc": 0.35, - "online": false, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "sungrow", - "pixii" - ] - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -848.1999999999998, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 1476, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -2320, - "battery_target_sum_w": 627.8000000000002, - "raw_grid_w": -4913, - "projected_grid_w": -1965.1999999999998 - } - }, - { - "scenario_id": "seeded_reactive/059_weighted", - "seed": 1059, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -1504, - "pv": [ - { - "driver": "pv-0", - "power_w": -4324 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -701, - "soc": 0.81, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 5000 - }, - { - "driver": "sungrow", - "capacity_wh": 9600, - "current_w": 3932, - "soc": 0.06, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "weighted", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 0.6, - "sungrow": 2.8 - } - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 729.4235294117647, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 3403.976470588235, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 3231, - "battery_target_sum_w": 4133.4, - "raw_grid_w": -1504, - "projected_grid_w": -601.6000000000004 - } - }, - { - "scenario_id": "seeded_reactive/060_self_consumption", - "seed": 1060, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 4905, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -1729, - "soc": 0.53, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -2205, - "soc": 0.25, - "online": false, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -4672, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -1729, - "battery_target_sum_w": -4672, - "raw_grid_w": 4905, - "projected_grid_w": 1962 - } - }, - { - "scenario_id": "seeded_reactive/061_peak_shaving", - "seed": 1061, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 7889, - "pv": [ - { - "driver": "pv-0", - "power_w": -3646 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 1393, - "soc": 0.24, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 10000, - "current_w": -342, - "soc": 0.15, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 5000, - "current_w": 1936, - "soc": 0.86, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 86, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3589, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 162.8, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 81.4, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 162.8, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 2987, - "battery_target_sum_w": 407, - "raw_grid_w": 7889, - "projected_grid_w": 5309 - } - }, - { - "scenario_id": "seeded_reactive/062_charge", - "seed": 1062, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -3243, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 490, - "soc": 0.81, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 8000, - "max_discharge_w": 2000 - } + "clamped_drivers": [ + "ferroamp", + "pixii", + "sungrow" ], - "state": { - "mode": "charge", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 8000, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -6235,30 +3165,24 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 490, - "battery_target_sum_w": 8000, - "raw_grid_w": -3243, - "projected_grid_w": 4267 + "battery_current_w": 556, + "battery_target_sum_w": 1074, + "raw_grid_w": -3272, + "projected_grid_w": -2754 } }, { - "scenario_id": "seeded_reactive/063_idle", - "seed": 1063, + "scenario_id": "seeded_reactive/049_peak_shaving", + "seed": 1049, "inputs": { "fuse_max_w": 11040, - "grid_w": -2944, - "pv": [ - { - "driver": "pv-0", - "power_w": -4277 - } - ], + "grid_w": -1648, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 3755, - "soc": 0.07, + "capacity_wh": 10000, + "current_w": -1887, + "soc": 0.7, "online": true, "device_fault": false, "discharge_blocked": false, @@ -6268,35 +3192,35 @@ }, { "driver": "sungrow", - "capacity_wh": 5000, - "current_w": 2663, - "soc": 0.08, + "capacity_wh": 15200, + "current_w": 1015, + "soc": 0.31, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 8000, - "max_discharge_w": 3000 + "max_charge_w": 5000, + "max_discharge_w": 5000 }, { "driver": "pixii", - "capacity_wh": 5000, - "current_w": -478, - "soc": 0.89, + "capacity_wh": 9600, + "current_w": 1360, + "soc": 0.32, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 2000 + "max_charge_w": 2000, + "max_discharge_w": 5000 } ], "state": { - "mode": "idle", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, + "slew_rate_w": 1863, + "slew_enabled": false, "min_dispatch_interval_s": 0, "holdoff_active": false, "use_energy_dispatch": false, @@ -6305,7 +3229,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3827, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -6319,17 +3243,17 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 0, + "target_w": 424.367816091954, "clamped": false }, { "driver": "pixii", - "target_w": 0, + "target_w": 407.39310344827584, "clamped": false }, { "driver": "sungrow", - "target_w": 0, + "target_w": 645.0390804597702, "clamped": false } ], @@ -6351,30 +3275,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 5940, - "battery_target_sum_w": 0, - "raw_grid_w": -2944, - "projected_grid_w": -8884 + "battery_current_w": 488, + "battery_target_sum_w": 1476.8000000000002, + "raw_grid_w": -1648, + "projected_grid_w": -659.1999999999998 } }, { - "scenario_id": "seeded_reactive/064_priority", - "seed": 1064, + "scenario_id": "seeded_reactive/050_charge", + "seed": 1050, "inputs": { "fuse_max_w": 11040, - "grid_w": -2479, + "grid_w": 299, "pv": [ { "driver": "pv-0", - "power_w": -4423 + "power_w": -5918 } ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": 869, - "soc": 0.65, + "current_w": -2785, + "soc": 0.41, "online": true, "device_fault": false, "discharge_blocked": false, @@ -6384,23 +3308,35 @@ }, { "driver": "sungrow", - "capacity_wh": 15200, - "current_w": -3363, - "soc": 0.64, + "capacity_wh": 5000, + "current_w": 2315, + "soc": 0.66, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 5000 + "max_charge_w": 0, + "max_discharge_w": 0 + }, + { + "driver": "pixii", + "capacity_wh": 9600, + "current_w": 2263, + "soc": 0.61, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 0, + "max_discharge_w": 0 } ], "state": { - "mode": "priority", + "mode": "charge", "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 100000, - "slew_enabled": false, + "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, "use_energy_dispatch": false, @@ -6417,104 +3353,85 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "sungrow", - "ferroamp" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 869, - "clamped": false + "target_w": 4178, + "clamped": true + }, + { + "driver": "pixii", + "target_w": 4178, + "clamped": true }, { "driver": "sungrow", - "target_w": -1875.6, - "clamped": false + "target_w": 4178, + "clamped": true } ], "clamp_attributions": { - "clamped_drivers": [], + "clamped_drivers": [ + "ferroamp", + "pixii", + "sungrow" + ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, "plan_stale": false, "fuse_saturated": false, "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, + "fuse_hold_latched": true, + "fuse_hold_max_charge_w": 12534, "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, + "import_ceiling_binding": true, "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -2494, - "battery_target_sum_w": -1006.5999999999999, - "raw_grid_w": -2479, - "projected_grid_w": -991.5999999999999 + "battery_current_w": 1793, + "battery_target_sum_w": 12534, + "raw_grid_w": 299, + "projected_grid_w": 11040 } }, { - "scenario_id": "seeded_reactive/065_weighted", - "seed": 1065, + "scenario_id": "seeded_reactive/051_idle", + "seed": 1051, "inputs": { "fuse_max_w": 11040, - "grid_w": 6788, + "grid_w": -1951, "pv": [ { "driver": "pv-0", - "power_w": -4383 + "power_w": -5346 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -2034, - "soc": 0.37, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -971, - "soc": 0.12, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", "capacity_wh": 9600, - "current_w": -2675, - "soc": 0.59, + "current_w": 434, + "soc": 0.09, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 5000, + "max_discharge_w": 3000 } ], "state": { - "mode": "weighted", + "mode": "idle", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1607, + "slew_rate_w": 100000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -6532,35 +3449,18 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 2, - "pixii": 3, - "sungrow": 2 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { - "driver": "ferroamp", - "target_w": -2786.5142857142855, - "clamped": false - }, - { - "driver": "pixii", - "target_w": -4179.771428571428, + "driver": "ferroamp", + "target_w": 0, "clamped": false - }, - { - "driver": "sungrow", - "target_w": -2578, - "clamped": true } ], "clamp_attributions": { - "clamped_drivers": [ - "sungrow" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -6577,53 +3477,41 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -5680, - "battery_target_sum_w": -9544.285714285714, - "raw_grid_w": 6788, - "projected_grid_w": 2923.7142857142862 + "battery_current_w": 434, + "battery_target_sum_w": 0, + "raw_grid_w": -1951, + "projected_grid_w": -2385 } }, { - "scenario_id": "seeded_reactive/066_self_consumption", - "seed": 1066, + "scenario_id": "seeded_reactive/054_self_consumption", + "seed": 1054, "inputs": { "fuse_max_w": 11040, - "grid_w": -2601, + "grid_w": 2236, "pv": [ { "driver": "pv-0", - "power_w": -2959 + "power_w": -759 } ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": 2954, - "soc": 0.5, + "current_w": -375, + "soc": 0.55, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, "max_charge_w": 0, "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": 830, - "soc": 0.13, - "online": false, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 } ], "state": { "mode": "self_consumption", - "grid_target_w": 0, + "grid_target_w": -295, "grid_tolerance_w": 50, "slew_rate_w": 100000, "slew_enabled": true, @@ -6649,7 +3537,7 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 4514.6, + "target_w": -1893.6, "clamped": false } ], @@ -6671,43 +3559,43 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 2954, - "battery_target_sum_w": 4514.6, - "raw_grid_w": -2601, - "projected_grid_w": -1040.3999999999996 + "battery_current_w": -375, + "battery_target_sum_w": -1893.6, + "raw_grid_w": 2236, + "projected_grid_w": 717.4000000000001 } }, { - "scenario_id": "seeded_reactive/067_peak_shaving", - "seed": 1067, + "scenario_id": "seeded_reactive/055_peak_shaving", + "seed": 1055, "inputs": { "fuse_max_w": 11040, - "grid_w": -6933, + "grid_w": -4476, "pv": [ { "driver": "pv-0", - "power_w": -4714 + "power_w": -1055 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 62, - "soc": 0.21, + "capacity_wh": 10000, + "current_w": -3234, + "soc": 0.24, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 3000 + "max_charge_w": 8000, + "max_discharge_w": 8000 } ], "state": { "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1889, + "slew_rate_w": 1564, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -6717,7 +3605,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 4372, + "peak_limit_w": 6709, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -6731,7 +3619,7 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 1951, + "target_w": -1670, "clamped": true } ], @@ -6755,42 +3643,36 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 62, - "battery_target_sum_w": 1951, - "raw_grid_w": -6933, - "projected_grid_w": -5044 + "battery_current_w": -3234, + "battery_target_sum_w": -1670, + "raw_grid_w": -4476, + "projected_grid_w": -2912 } }, { - "scenario_id": "seeded_reactive/068_charge", - "seed": 1068, + "scenario_id": "seeded_reactive/056_charge", + "seed": 1056, "inputs": { "fuse_max_w": 11040, - "grid_w": 1412, - "pv": [ - { - "driver": "pv-0", - "power_w": -3934 - } - ], + "grid_w": 5866, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -2858, - "soc": 0.8, + "capacity_wh": 10000, + "current_w": 1875, + "soc": 0.38, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 2000 + "max_charge_w": 0, + "max_discharge_w": 0 }, { "driver": "sungrow", - "capacity_wh": 10000, - "current_w": -3604, - "soc": 0.67, + "capacity_wh": 5000, + "current_w": -2590, + "soc": 0.27, "online": true, "device_fault": false, "discharge_blocked": false, @@ -6801,8 +3683,8 @@ { "driver": "pixii", "capacity_wh": 10000, - "current_w": -1982, - "soc": 0.92, + "current_w": -2553, + "soc": 0.78, "online": true, "device_fault": false, "discharge_blocked": false, @@ -6815,7 +3697,7 @@ "mode": "charge", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 704, + "slew_rate_w": 100000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -6839,17 +3721,17 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 328.8888888888889, + "target_w": 529.4444444444445, "clamped": true }, { "driver": "pixii", - "target_w": 328.8888888888889, + "target_w": 529.4444444444445, "clamped": true }, { "driver": "sungrow", - "target_w": 526.2222222222223, + "target_w": 847.1111111111112, "clamped": true } ], @@ -6866,7 +3748,7 @@ "fuse_saturated": false, "fuse_ev_max_w": 0, "fuse_hold_latched": true, - "fuse_hold_max_charge_w": 1184, + "fuse_hold_max_charge_w": 1906, "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, @@ -6875,38 +3757,38 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -8444, - "battery_target_sum_w": 1184, - "raw_grid_w": 1412, + "battery_current_w": -3268, + "battery_target_sum_w": 1906, + "raw_grid_w": 5866, "projected_grid_w": 11040 } }, { - "scenario_id": "seeded_reactive/069_idle", - "seed": 1069, + "scenario_id": "seeded_reactive/057_idle", + "seed": 1057, "inputs": { "fuse_max_w": 11040, - "grid_w": -3162, + "grid_w": -696, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 375, - "soc": 0.5, + "capacity_wh": 15200, + "current_w": -888, + "soc": 0.07, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 3000, + "max_discharge_w": 3000 } ], "state": { "mode": "idle", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1085, - "slew_enabled": true, + "slew_rate_w": 100000, + "slew_enabled": false, "min_dispatch_interval_s": 0, "holdoff_active": false, "use_energy_dispatch": false, @@ -6951,24 +3833,24 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 375, + "battery_current_w": -888, "battery_target_sum_w": 0, - "raw_grid_w": -3162, - "projected_grid_w": -3537 + "raw_grid_w": -696, + "projected_grid_w": 192 } }, { - "scenario_id": "seeded_reactive/070_priority", - "seed": 1070, + "scenario_id": "seeded_reactive/060_self_consumption", + "seed": 1060, "inputs": { "fuse_max_w": 11040, - "grid_w": 1572, + "grid_w": 4905, "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": -512, - "soc": 0.63, + "current_w": -1729, + "soc": 0.53, "online": true, "device_fault": false, "discharge_blocked": false, @@ -6978,10 +3860,10 @@ }, { "driver": "sungrow", - "capacity_wh": 15200, - "current_w": 715, - "soc": 0.9, - "online": true, + "capacity_wh": 5000, + "current_w": -2205, + "soc": 0.25, + "online": false, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, @@ -6990,7 +3872,7 @@ } ], "state": { - "mode": "priority", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 100000, @@ -7011,22 +3893,13 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "sungrow" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -1455.2, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 715, + "target_w": -4672, "clamped": false } ], @@ -7048,24 +3921,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 203, - "battery_target_sum_w": -740.2, - "raw_grid_w": 1572, - "projected_grid_w": 628.8 + "battery_current_w": -1729, + "battery_target_sum_w": -4672, + "raw_grid_w": 4905, + "projected_grid_w": 1962 } }, { - "scenario_id": "seeded_reactive/071_weighted", - "seed": 1071, + "scenario_id": "seeded_reactive/061_peak_shaving", + "seed": 1061, "inputs": { "fuse_max_w": 11040, - "grid_w": 124, + "grid_w": 7889, + "pv": [ + { + "driver": "pv-0", + "power_w": -3646 + } + ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 9600, - "current_w": 2584, - "soc": 0.34, + "capacity_wh": 10000, + "current_w": 1393, + "soc": 0.24, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7075,9 +3954,9 @@ }, { "driver": "sungrow", - "capacity_wh": 15200, - "current_w": 2577, - "soc": 0.88, + "capacity_wh": 10000, + "current_w": -342, + "soc": 0.15, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7087,9 +3966,9 @@ }, { "driver": "pixii", - "capacity_wh": 15200, - "current_w": 744, - "soc": 0.8, + "capacity_wh": 5000, + "current_w": 1936, + "soc": 0.86, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7099,8 +3978,8 @@ } ], "state": { - "mode": "weighted", - "grid_target_w": 0, + "mode": "peak_shaving", + "grid_target_w": 86, "grid_tolerance_w": 50, "slew_rate_w": 100000, "slew_enabled": true, @@ -7112,7 +3991,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3589, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -7120,28 +3999,23 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 2.2, - "pixii": 1.8, - "sungrow": 2.1 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 2102.839344262295, + "target_w": 162.8, "clamped": false }, { "driver": "pixii", - "target_w": 1720.504918032787, + "target_w": 81.4, "clamped": false }, { "driver": "sungrow", - "target_w": 2007.2557377049181, + "target_w": 162.8, "clamped": false } ], @@ -7163,67 +4037,37 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 5905, - "battery_target_sum_w": 5830.6, - "raw_grid_w": 124, - "projected_grid_w": 49.600000000000364 + "battery_current_w": 2987, + "battery_target_sum_w": 407, + "raw_grid_w": 7889, + "projected_grid_w": 5309 } }, { - "scenario_id": "seeded_reactive/072_self_consumption", - "seed": 1072, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 274, - "pv": [ - { - "driver": "pv-0", - "power_w": -4244 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": 1615, - "soc": 0.93, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -3498, - "soc": 0.36, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, + "scenario_id": "seeded_reactive/062_charge", + "seed": 1062, + "inputs": { + "fuse_max_w": 11040, + "grid_w": -3243, + "batteries": [ { - "driver": "pixii", + "driver": "ferroamp", "capacity_wh": 15200, - "current_w": 3646, - "soc": 0.6, + "current_w": 490, + "soc": 0.81, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 8000, + "max_discharge_w": 2000 } ], "state": { - "mode": "self_consumption", + "mode": "charge", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1188, + "slew_rate_w": 100000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -7247,26 +4091,12 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 427, - "clamped": true - }, - { - "driver": "pixii", - "target_w": 2458, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": -2310, - "clamped": true + "target_w": 8000, + "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "pixii", - "sungrow" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -7283,37 +4113,67 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 1763, - "battery_target_sum_w": 575, - "raw_grid_w": 274, - "projected_grid_w": -914 + "battery_current_w": 490, + "battery_target_sum_w": 8000, + "raw_grid_w": -3243, + "projected_grid_w": 4267 } }, { - "scenario_id": "seeded_reactive/073_peak_shaving", - "seed": 1073, + "scenario_id": "seeded_reactive/063_idle", + "seed": 1063, "inputs": { "fuse_max_w": 11040, - "grid_w": 422, + "grid_w": -2944, + "pv": [ + { + "driver": "pv-0", + "power_w": -4277 + } + ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 15200, - "current_w": -3292, - "soc": 0.19, + "current_w": 3755, + "soc": 0.07, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, "max_charge_w": 0, "max_discharge_w": 0 + }, + { + "driver": "sungrow", + "capacity_wh": 5000, + "current_w": 2663, + "soc": 0.08, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 8000, + "max_discharge_w": 3000 + }, + { + "driver": "pixii", + "capacity_wh": 5000, + "current_w": -478, + "soc": 0.89, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 3000, + "max_discharge_w": 2000 } ], "state": { - "mode": "peak_shaving", + "mode": "idle", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1253, + "slew_rate_w": 100000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -7323,7 +4183,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 6729, + "peak_limit_w": 5000, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -7334,7 +4194,23 @@ "pv_surplus_absorb_threshold_w": 0 } }, - "per_driver_targets": [], + "per_driver_targets": [ + { + "driver": "ferroamp", + "target_w": 0, + "clamped": false + }, + { + "driver": "pixii", + "target_w": 0, + "clamped": false + }, + { + "driver": "sungrow", + "target_w": 0, + "clamped": false + } + ], "clamp_attributions": { "clamped_drivers": [], "all_targets_zero_clamped": false, @@ -7353,30 +4229,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -3292, + "battery_current_w": 5940, "battery_target_sum_w": 0, - "raw_grid_w": 422, - "projected_grid_w": 422 + "raw_grid_w": -2944, + "projected_grid_w": -8884 } }, { - "scenario_id": "seeded_reactive/074_charge", - "seed": 1074, + "scenario_id": "seeded_reactive/066_self_consumption", + "seed": 1066, "inputs": { "fuse_max_w": 11040, - "grid_w": 2011, + "grid_w": -2601, "pv": [ { "driver": "pv-0", - "power_w": -2353 + "power_w": -2959 } ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": 1817, - "soc": 0.78, + "current_w": 2954, + "soc": 0.5, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7386,21 +4262,9 @@ }, { "driver": "sungrow", - "capacity_wh": 9600, - "current_w": -508, - "soc": 0.45, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 8000, - "max_discharge_w": 2000 - }, - { - "driver": "pixii", "capacity_wh": 5000, - "current_w": -2564, - "soc": 0.18, + "current_w": 830, + "soc": 0.13, "online": false, "device_fault": false, "discharge_blocked": false, @@ -7410,7 +4274,7 @@ } ], "state": { - "mode": "charge", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 100000, @@ -7437,67 +4301,65 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 3976.1538461538457, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": 6361.846153846153, - "clamped": true + "target_w": 4514.6, + "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "sungrow" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, "plan_stale": false, "fuse_saturated": false, "fuse_ev_max_w": 0, - "fuse_hold_latched": true, - "fuse_hold_max_charge_w": 10338, + "fuse_hold_latched": false, + "fuse_hold_max_charge_w": 0, "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, - "import_ceiling_binding": true, + "import_ceiling_binding": false, "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 1309, - "battery_target_sum_w": 10338, - "raw_grid_w": 2011, - "projected_grid_w": 11040 + "battery_current_w": 2954, + "battery_target_sum_w": 4514.6, + "raw_grid_w": -2601, + "projected_grid_w": -1040.3999999999996 } }, { - "scenario_id": "seeded_reactive/075_idle", - "seed": 1075, + "scenario_id": "seeded_reactive/067_peak_shaving", + "seed": 1067, "inputs": { "fuse_max_w": 11040, - "grid_w": -197, + "grid_w": -6933, + "pv": [ + { + "driver": "pv-0", + "power_w": -4714 + } + ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -948, - "soc": 0.53, + "capacity_wh": 15200, + "current_w": 62, + "soc": 0.21, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 2000 + "max_charge_w": 3000, + "max_discharge_w": 3000 } ], "state": { - "mode": "idle", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 100000, + "slew_rate_w": 1889, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -7507,7 +4369,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 4372, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -7521,12 +4383,14 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 0, - "clamped": false + "target_w": 1951, + "clamped": true } ], "clamp_attributions": { - "clamped_drivers": [], + "clamped_drivers": [ + "ferroamp" + ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -7543,37 +4407,67 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -948, - "battery_target_sum_w": 0, - "raw_grid_w": -197, - "projected_grid_w": 751 + "battery_current_w": 62, + "battery_target_sum_w": 1951, + "raw_grid_w": -6933, + "projected_grid_w": -5044 } }, { - "scenario_id": "seeded_reactive/076_priority", - "seed": 1076, + "scenario_id": "seeded_reactive/068_charge", + "seed": 1068, "inputs": { "fuse_max_w": 11040, - "grid_w": 1866, + "grid_w": 1412, + "pv": [ + { + "driver": "pv-0", + "power_w": -3934 + } + ], "batteries": [ { "driver": "ferroamp", + "capacity_wh": 15200, + "current_w": -2858, + "soc": 0.8, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 5000, + "max_discharge_w": 2000 + }, + { + "driver": "sungrow", "capacity_wh": 10000, - "current_w": -3866, - "soc": 0.24, + "current_w": -3604, + "soc": 0.67, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, "max_charge_w": 8000, "max_discharge_w": 5000 + }, + { + "driver": "pixii", + "capacity_wh": 10000, + "current_w": -1982, + "soc": 0.92, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 0, + "max_discharge_w": 0 } ], "state": { - "mode": "priority", + "mode": "charge", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1681, + "slew_rate_w": 704, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -7591,55 +4485,66 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -4985.6, - "clamped": false + "target_w": 328.8888888888889, + "clamped": true + }, + { + "driver": "pixii", + "target_w": 328.8888888888889, + "clamped": true + }, + { + "driver": "sungrow", + "target_w": 526.2222222222223, + "clamped": true } ], "clamp_attributions": { - "clamped_drivers": [], + "clamped_drivers": [ + "ferroamp", + "pixii", + "sungrow" + ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, "plan_stale": false, "fuse_saturated": false, "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, + "fuse_hold_latched": true, + "fuse_hold_max_charge_w": 1184, "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, + "import_ceiling_binding": true, "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -3866, - "battery_target_sum_w": -4985.6, - "raw_grid_w": 1866, - "projected_grid_w": 746.3999999999996 + "battery_current_w": -8444, + "battery_target_sum_w": 1184, + "raw_grid_w": 1412, + "projected_grid_w": 11040 } }, { - "scenario_id": "seeded_reactive/077_weighted", - "seed": 1077, + "scenario_id": "seeded_reactive/069_idle", + "seed": 1069, "inputs": { "fuse_max_w": 11040, - "grid_w": -3843, + "grid_w": -3162, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": -771, - "soc": 0.38, + "capacity_wh": 10000, + "current_w": 375, + "soc": 0.5, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7649,10 +4554,10 @@ } ], "state": { - "mode": "weighted", + "mode": "idle", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 862, + "slew_rate_w": 1085, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -7670,23 +4575,18 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 0.9 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 91, - "clamped": true + "target_w": 0, + "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -7703,30 +4603,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -771, - "battery_target_sum_w": 91, - "raw_grid_w": -3843, - "projected_grid_w": -2981 + "battery_current_w": 375, + "battery_target_sum_w": 0, + "raw_grid_w": -3162, + "projected_grid_w": -3537 } }, { - "scenario_id": "seeded_reactive/078_self_consumption", - "seed": 1078, + "scenario_id": "seeded_reactive/072_self_consumption", + "seed": 1072, "inputs": { "fuse_max_w": 11040, - "grid_w": 3104, + "grid_w": 274, "pv": [ { "driver": "pv-0", - "power_w": -1699 + "power_w": -4244 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -1771, - "soc": 0.09, + "capacity_wh": 5000, + "current_w": 1615, + "soc": 0.93, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7736,9 +4636,9 @@ }, { "driver": "sungrow", - "capacity_wh": 15200, - "current_w": -374, - "soc": 0.84, + "capacity_wh": 5000, + "current_w": -3498, + "soc": 0.36, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7748,9 +4648,9 @@ }, { "driver": "pixii", - "capacity_wh": 9600, - "current_w": 2815, - "soc": 0.81, + "capacity_wh": 15200, + "current_w": 3646, + "soc": 0.6, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7763,7 +4663,7 @@ "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1369, + "slew_rate_w": 1188, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -7787,23 +4687,25 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -453.112, - "clamped": false + "target_w": 427, + "clamped": true }, { "driver": "pixii", - "target_w": 1446, + "target_w": 2458, "clamped": true }, { "driver": "sungrow", - "target_w": -453.112, - "clamped": false + "target_w": -2310, + "clamped": true } ], "clamp_attributions": { "clamped_drivers": [ - "pixii" + "ferroamp", + "pixii", + "sungrow" ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, @@ -7821,24 +4723,24 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 670, - "battery_target_sum_w": 539.7759999999998, - "raw_grid_w": 3104, - "projected_grid_w": 2973.776 + "battery_current_w": 1763, + "battery_target_sum_w": 575, + "raw_grid_w": 274, + "projected_grid_w": -914 } }, { - "scenario_id": "seeded_reactive/079_peak_shaving", - "seed": 1079, + "scenario_id": "seeded_reactive/073_peak_shaving", + "seed": 1073, "inputs": { "fuse_max_w": 11040, - "grid_w": -5080, + "grid_w": 422, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 1324, - "soc": 0.67, + "capacity_wh": 15200, + "current_w": -3292, + "soc": 0.19, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7851,7 +4753,7 @@ "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 100000, + "slew_rate_w": 1253, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -7861,7 +4763,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3853, + "peak_limit_w": 6729, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -7872,13 +4774,7 @@ "pv_surplus_absorb_threshold_w": 0 } }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 4372, - "clamped": false - } - ], + "per_driver_targets": [], "clamp_attributions": { "clamped_drivers": [], "all_targets_zero_clamped": false, @@ -7897,30 +4793,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 1324, - "battery_target_sum_w": 4372, - "raw_grid_w": -5080, - "projected_grid_w": -2032 + "battery_current_w": -3292, + "battery_target_sum_w": 0, + "raw_grid_w": 422, + "projected_grid_w": 422 } }, { - "scenario_id": "seeded_reactive/080_charge", - "seed": 1080, + "scenario_id": "seeded_reactive/074_charge", + "seed": 1074, "inputs": { "fuse_max_w": 11040, - "grid_w": 3555, + "grid_w": 2011, "pv": [ { "driver": "pv-0", - "power_w": -2609 + "power_w": -2353 } ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": 439, - "soc": 0.83, + "current_w": 1817, + "soc": 0.78, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7930,13 +4826,25 @@ }, { "driver": "sungrow", - "capacity_wh": 15200, - "current_w": 3165, - "soc": 0.76, + "capacity_wh": 9600, + "current_w": -508, + "soc": 0.45, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, + "max_charge_w": 8000, + "max_discharge_w": 2000 + }, + { + "driver": "pixii", + "capacity_wh": 5000, + "current_w": -2564, + "soc": 0.18, + "online": false, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, "max_charge_w": 0, "max_discharge_w": 0 } @@ -7945,7 +4853,7 @@ "mode": "charge", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1086, + "slew_rate_w": 100000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -7969,63 +4877,60 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 5000, - "clamped": false + "target_w": 3976.1538461538457, + "clamped": true }, { "driver": "sungrow", - "target_w": 5000, - "clamped": false + "target_w": 6361.846153846153, + "clamped": true } ], "clamp_attributions": { - "clamped_drivers": [], + "clamped_drivers": [ + "ferroamp", + "sungrow" + ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, "plan_stale": false, "fuse_saturated": false, "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, + "fuse_hold_latched": true, + "fuse_hold_max_charge_w": 10338, "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, + "import_ceiling_binding": true, "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 3604, - "battery_target_sum_w": 10000, - "raw_grid_w": 3555, - "projected_grid_w": 9951 + "battery_current_w": 1309, + "battery_target_sum_w": 10338, + "raw_grid_w": 2011, + "projected_grid_w": 11040 } }, { - "scenario_id": "seeded_reactive/081_idle", - "seed": 1081, + "scenario_id": "seeded_reactive/075_idle", + "seed": 1075, "inputs": { "fuse_max_w": 11040, - "grid_w": -61, - "pv": [ - { - "driver": "pv-0", - "power_w": -380 - } - ], + "grid_w": -197, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 9600, - "current_w": 3706, - "soc": 0.51, + "capacity_wh": 10000, + "current_w": -948, + "soc": 0.53, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 8000 + "max_charge_w": 5000, + "max_discharge_w": 2000 } ], "state": { @@ -8078,30 +4983,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 3706, + "battery_current_w": -948, "battery_target_sum_w": 0, - "raw_grid_w": -61, - "projected_grid_w": -3767 + "raw_grid_w": -197, + "projected_grid_w": 751 } }, { - "scenario_id": "seeded_reactive/082_priority", - "seed": 1082, + "scenario_id": "seeded_reactive/078_self_consumption", + "seed": 1078, "inputs": { "fuse_max_w": 11040, - "grid_w": 510, + "grid_w": 3104, "pv": [ { "driver": "pv-0", - "power_w": -1642 + "power_w": -1699 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": 801, - "soc": 0.22, + "capacity_wh": 15200, + "current_w": -1771, + "soc": 0.09, "online": true, "device_fault": false, "discharge_blocked": false, @@ -8111,9 +5016,21 @@ }, { "driver": "sungrow", + "capacity_wh": 15200, + "current_w": -374, + "soc": 0.84, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 0, + "max_discharge_w": 0 + }, + { + "driver": "pixii", "capacity_wh": 9600, - "current_w": -642, - "soc": 0.86, + "current_w": 2815, + "soc": 0.81, "online": true, "device_fault": false, "discharge_blocked": false, @@ -8123,10 +5040,10 @@ } ], "state": { - "mode": "priority", - "grid_target_w": -261, + "mode": "self_consumption", + "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1233, + "slew_rate_w": 1369, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -8144,27 +5061,30 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "sungrow", - "ferroamp" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 800.9999999999999, + "target_w": -453.112, "clamped": false }, + { + "driver": "pixii", + "target_w": 1446, + "clamped": true + }, { "driver": "sungrow", - "target_w": -1104.6, + "target_w": -453.112, "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [], + "clamped_drivers": [ + "pixii" + ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -8181,30 +5101,24 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 159, - "battery_target_sum_w": -303.6, - "raw_grid_w": 510, - "projected_grid_w": 47.39999999999998 + "battery_current_w": 670, + "battery_target_sum_w": 539.7759999999998, + "raw_grid_w": 3104, + "projected_grid_w": 2973.776 } }, { - "scenario_id": "seeded_reactive/083_weighted", - "seed": 1083, + "scenario_id": "seeded_reactive/079_peak_shaving", + "seed": 1079, "inputs": { "fuse_max_w": 11040, - "grid_w": -2668, - "pv": [ - { - "driver": "pv-0", - "power_w": -3236 - } - ], + "grid_w": -5080, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -2071, - "soc": 0.8, + "capacity_wh": 10000, + "current_w": 1324, + "soc": 0.67, "online": true, "device_fault": false, "discharge_blocked": false, @@ -8214,8 +5128,8 @@ } ], "state": { - "mode": "weighted", - "grid_target_w": 412, + "mode": "peak_shaving", + "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 100000, "slew_enabled": true, @@ -8227,7 +5141,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3853, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -8235,16 +5149,13 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.6 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -223, + "target_w": 4372, "clamped": false } ], @@ -8266,49 +5177,55 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -2071, - "battery_target_sum_w": -223, - "raw_grid_w": -2668, - "projected_grid_w": -820 + "battery_current_w": 1324, + "battery_target_sum_w": 4372, + "raw_grid_w": -5080, + "projected_grid_w": -2032 } }, { - "scenario_id": "seeded_reactive/084_self_consumption", - "seed": 1084, + "scenario_id": "seeded_reactive/080_charge", + "seed": 1080, "inputs": { "fuse_max_w": 11040, - "grid_w": 2910, + "grid_w": 3555, + "pv": [ + { + "driver": "pv-0", + "power_w": -2609 + } + ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": 2896, - "soc": 0.06, + "current_w": 439, + "soc": 0.83, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 8000 + "max_charge_w": 0, + "max_discharge_w": 0 }, { "driver": "sungrow", - "capacity_wh": 9600, - "current_w": 2913, - "soc": 0.2, + "capacity_wh": 15200, + "current_w": 3165, + "soc": 0.76, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 3000 + "max_charge_w": 0, + "max_discharge_w": 0 } ], "state": { - "mode": "self_consumption", + "mode": "charge", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 100000, + "slew_rate_w": 1086, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -8332,12 +5249,12 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 2072.9591836734694, + "target_w": 5000, "clamped": false }, { "driver": "sungrow", - "target_w": 1990.0408163265306, + "target_w": 5000, "clamped": false } ], @@ -8359,49 +5276,43 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 5809, - "battery_target_sum_w": 4063, - "raw_grid_w": 2910, - "projected_grid_w": 1164 + "battery_current_w": 3604, + "battery_target_sum_w": 10000, + "raw_grid_w": 3555, + "projected_grid_w": 9951 } }, { - "scenario_id": "seeded_reactive/085_peak_shaving", - "seed": 1085, + "scenario_id": "seeded_reactive/081_idle", + "seed": 1081, "inputs": { "fuse_max_w": 11040, - "grid_w": -1716, + "grid_w": -61, + "pv": [ + { + "driver": "pv-0", + "power_w": -380 + } + ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -22, - "soc": 0.65, + "capacity_wh": 9600, + "current_w": 3706, + "soc": 0.51, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 5000, + "max_charge_w": 3000, "max_discharge_w": 8000 - }, - { - "driver": "sungrow", - "capacity_wh": 15200, - "current_w": -3664, - "soc": 0.63, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 } ], "state": { - "mode": "peak_shaving", + "mode": "idle", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1020, + "slew_rate_w": 100000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -8411,7 +5322,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5979, + "peak_limit_w": 5000, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -8425,20 +5336,12 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -1042, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": -2644, - "clamped": true + "target_w": 0, + "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "sungrow" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -8455,46 +5358,46 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -3686, - "battery_target_sum_w": -3686, - "raw_grid_w": -1716, - "projected_grid_w": -1716 + "battery_current_w": 3706, + "battery_target_sum_w": 0, + "raw_grid_w": -61, + "projected_grid_w": -3767 } }, { - "scenario_id": "seeded_reactive/086_charge", - "seed": 1086, + "scenario_id": "seeded_reactive/084_self_consumption", + "seed": 1084, "inputs": { "fuse_max_w": 11040, - "grid_w": 5170, + "grid_w": 2910, "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": -2915, - "soc": 0.36, + "current_w": 2896, + "soc": 0.06, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 5000, + "max_discharge_w": 8000 }, { "driver": "sungrow", - "capacity_wh": 15200, - "current_w": -1801, - "soc": 0.29, + "capacity_wh": 9600, + "current_w": 2913, + "soc": 0.2, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 3000, + "max_discharge_w": 3000 } ], "state": { - "mode": "charge", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 100000, @@ -8521,78 +5424,63 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 577, - "clamped": true + "target_w": 2072.9591836734694, + "clamped": false }, { "driver": "sungrow", - "target_w": 577, - "clamped": true + "target_w": 1990.0408163265306, + "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "sungrow" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, "plan_stale": false, "fuse_saturated": false, "fuse_ev_max_w": 0, - "fuse_hold_latched": true, - "fuse_hold_max_charge_w": 1154, + "fuse_hold_latched": false, + "fuse_hold_max_charge_w": 0, "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, - "import_ceiling_binding": true, + "import_ceiling_binding": false, "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -4716, - "battery_target_sum_w": 1154, - "raw_grid_w": 5170, - "projected_grid_w": 11040 + "battery_current_w": 5809, + "battery_target_sum_w": 4063, + "raw_grid_w": 2910, + "projected_grid_w": 1164 } }, { - "scenario_id": "seeded_reactive/087_idle", - "seed": 1087, + "scenario_id": "seeded_reactive/085_peak_shaving", + "seed": 1085, "inputs": { "fuse_max_w": 11040, - "grid_w": 1306, + "grid_w": -1716, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 322, - "soc": 0.49, + "capacity_wh": 10000, + "current_w": -22, + "soc": 0.65, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 5000, + "max_discharge_w": 8000 }, { "driver": "sungrow", - "capacity_wh": 9600, - "current_w": 92, - "soc": 0.66, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", "capacity_wh": 15200, - "current_w": -1310, - "soc": 0.18, + "current_w": -3664, + "soc": 0.63, "online": true, "device_fault": false, "discharge_blocked": false, @@ -8602,10 +5490,10 @@ } ], "state": { - "mode": "idle", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 100000, + "slew_rate_w": 1020, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -8615,7 +5503,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 5979, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -8629,22 +5517,20 @@ "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 0, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 0, - "clamped": false + "target_w": -1042, + "clamped": true }, { "driver": "sungrow", - "target_w": 0, - "clamped": false + "target_w": -2644, + "clamped": true } ], "clamp_attributions": { - "clamped_drivers": [], + "clamped_drivers": [ + "ferroamp", + "sungrow" + ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -8661,30 +5547,24 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -896, - "battery_target_sum_w": 0, - "raw_grid_w": 1306, - "projected_grid_w": 2202 + "battery_current_w": -3686, + "battery_target_sum_w": -3686, + "raw_grid_w": -1716, + "projected_grid_w": -1716 } }, { - "scenario_id": "seeded_reactive/088_priority", - "seed": 1088, + "scenario_id": "seeded_reactive/086_charge", + "seed": 1086, "inputs": { "fuse_max_w": 11040, - "grid_w": -5978, - "pv": [ - { - "driver": "pv-0", - "power_w": -4754 - } - ], + "grid_w": 5170, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -571, - "soc": 0.19, + "capacity_wh": 10000, + "current_w": -2915, + "soc": 0.36, "online": true, "device_fault": false, "discharge_blocked": false, @@ -8694,9 +5574,9 @@ }, { "driver": "sungrow", - "capacity_wh": 5000, - "current_w": 2518, - "soc": 0.67, + "capacity_wh": 15200, + "current_w": -1801, + "soc": 0.29, "online": true, "device_fault": false, "discharge_blocked": false, @@ -8706,10 +5586,10 @@ } ], "state": { - "mode": "priority", + "mode": "charge", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1201, + "slew_rate_w": 100000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -8727,27 +5607,24 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "sungrow", - "ferroamp" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 533.8000000000002, - "clamped": false + "target_w": 577, + "clamped": true }, { "driver": "sungrow", - "target_w": 3719, + "target_w": 577, "clamped": true } ], "clamp_attributions": { "clamped_drivers": [ + "ferroamp", "sungrow" ], "all_targets_zero_clamped": false, @@ -8756,34 +5633,58 @@ "plan_stale": false, "fuse_saturated": false, "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, + "fuse_hold_latched": true, + "fuse_hold_max_charge_w": 1154, "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, + "import_ceiling_binding": true, "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 1947, - "battery_target_sum_w": 4252.8, - "raw_grid_w": -5978, - "projected_grid_w": -3672.2 + "battery_current_w": -4716, + "battery_target_sum_w": 1154, + "raw_grid_w": 5170, + "projected_grid_w": 11040 } }, { - "scenario_id": "seeded_reactive/089_weighted", - "seed": 1089, + "scenario_id": "seeded_reactive/087_idle", + "seed": 1087, "inputs": { "fuse_max_w": 11040, - "grid_w": 5556, + "grid_w": 1306, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 2573, - "soc": 0.78, + "capacity_wh": 15200, + "current_w": 322, + "soc": 0.49, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 0, + "max_discharge_w": 0 + }, + { + "driver": "sungrow", + "capacity_wh": 9600, + "current_w": 92, + "soc": 0.66, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 0, + "max_discharge_w": 0 + }, + { + "driver": "pixii", + "capacity_wh": 15200, + "current_w": -1310, + "soc": 0.18, "online": true, "device_fault": false, "discharge_blocked": false, @@ -8793,10 +5694,10 @@ } ], "state": { - "mode": "weighted", + "mode": "idle", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1034, + "slew_rate_w": 100000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -8814,23 +5715,28 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.3 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 1539, - "clamped": true + "target_w": 0, + "clamped": false + }, + { + "driver": "pixii", + "target_w": 0, + "clamped": false + }, + { + "driver": "sungrow", + "target_w": 0, + "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -8847,10 +5753,10 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 2573, - "battery_target_sum_w": 1539, - "raw_grid_w": 5556, - "projected_grid_w": 4522 + "battery_current_w": -896, + "battery_target_sum_w": 0, + "raw_grid_w": 1306, + "projected_grid_w": 2202 } }, { @@ -9234,203 +6140,6 @@ "projected_grid_w": -2784 } }, - { - "scenario_id": "seeded_reactive/094_priority", - "seed": 1094, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 6929, - "pv": [ - { - "driver": "pv-0", - "power_w": -3041 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -3923, - "soc": 0.17, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -2200, - "soc": 0.73, - "online": false, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 5000 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": false, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "sungrow" - ] - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -5000, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -3923, - "battery_target_sum_w": -5000, - "raw_grid_w": 6929, - "projected_grid_w": 5852 - } - }, - { - "scenario_id": "seeded_reactive/095_weighted", - "seed": 1095, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -668, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 1177, - "soc": 0.78, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -247, - "soc": 0.59, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "weighted", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 100000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 0.7, - "sungrow": 0.9 - } - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 582.2249999999999, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 748.5749999999999, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 930, - "battery_target_sum_w": 1330.7999999999997, - "raw_grid_w": -668, - "projected_grid_w": -267.2000000000003 - } - }, { "scenario_id": "seeded_reactive/096_self_consumption", "seed": 1096, diff --git a/go/internal/control/testdata/golden/slew_limiter.json b/go/internal/control/testdata/golden/slew_limiter.json index ba62d2b07..896d7f298 100644 --- a/go/internal/control/testdata/golden/slew_limiter.json +++ b/go/internal/control/testdata/golden/slew_limiter.json @@ -2,7 +2,7 @@ "family": "slew_limiter", "generated_by": "FTW_GOLDEN_DUMP=1 go test ./internal/control/ -run TestGoldenDump", "ftw_commit": "15f9edc3b973d7b9151e88d63575a9b7d615a0b3", - "record_count": 155, + "record_count": 127, "records": [ { "scenario_id": "slew/anchor_charging_wants_discharge_250", @@ -3956,205 +3956,6 @@ "projected_grid_w": 2500 } }, - { - "scenario_id": "slew/priority_split_with_slew", - "seed": 0, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 4000, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 2000, - "soc": 0.6, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 9600, - "current_w": -1000, - "soc": 0.6, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 500, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "sungrow", - "ferroamp" - ] - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 2000, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -1500, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 1000, - "battery_target_sum_w": 500, - "raw_grid_w": 4000, - "projected_grid_w": 3500 - } - }, - { - "scenario_id": "slew/weighted_split_with_slew", - "seed": 0, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 4000, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 2000, - "soc": 0.6, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 9600, - "current_w": -1000, - "soc": 0.6, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "weighted", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 500, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 2, - "sungrow": 1 - } - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 1500, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": -500, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 1000, - "battery_target_sum_w": 1000, - "raw_grid_w": 4000, - "projected_grid_w": 4000 - } - }, { "scenario_id": "slew/peak_shaving_with_slew", "seed": 0, @@ -4425,273 +4226,35 @@ } }, { - "scenario_id": "slew/seeded_001_peak_shaving", - "seed": 6001, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -3636, - "pv": [ - { - "driver": "pv-0", - "power_w": -3326 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": -357, - "soc": 0.38, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 3000 - }, - { - "driver": "sungrow", - "capacity_wh": 15200, - "current_w": 5177, - "soc": 0.17, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 5000, - "current_w": -2758, - "soc": 0.61, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 2000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 4520, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 841.984126984127, - "clamped": false - }, - { - "driver": "pixii", - "target_w": -758, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": 3177, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "pixii", - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 2062, - "battery_target_sum_w": 3260.984126984127, - "raw_grid_w": -3636, - "projected_grid_w": -2437.015873015873 - } - }, - { - "scenario_id": "slew/seeded_002_priority", - "seed": 6002, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 310, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 3861, - "soc": 0.1, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 15200, - "current_w": 3512, - "soc": 0.48, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 9600, - "current_w": 2132, - "soc": 0.87, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 2000 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 750, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 5380, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "pixii", - "sungrow" - ] - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 4611, - "clamped": true - }, - { - "driver": "pixii", - "target_w": 2882, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": 4262, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "pixii", - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 9505, - "battery_target_sum_w": 11755, - "raw_grid_w": 310, - "projected_grid_w": 2560 - } - }, - { - "scenario_id": "slew/seeded_003_weighted", - "seed": 6003, + "scenario_id": "slew/seeded_001_peak_shaving", + "seed": 6001, "inputs": { "fuse_max_w": 11040, - "grid_w": -3277, + "grid_w": -3636, "pv": [ { "driver": "pv-0", - "power_w": -6595 + "power_w": -3326 } ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 5000, - "current_w": 1865, - "soc": 0.24, + "current_w": -357, + "soc": 0.38, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 2000, + "max_discharge_w": 3000 }, { "driver": "sungrow", - "capacity_wh": 9600, - "current_w": 4283, - "soc": 0.48, + "capacity_wh": 15200, + "current_w": 5177, + "soc": 0.17, "online": true, "device_fault": false, "discharge_blocked": false, @@ -4701,9 +4264,9 @@ }, { "driver": "pixii", - "capacity_wh": 9600, - "current_w": -970, - "soc": 0.33, + "capacity_wh": 5000, + "current_w": -2758, + "soc": 0.61, "online": true, "device_fault": false, "discharge_blocked": false, @@ -4713,7 +4276,7 @@ } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 2000, @@ -4726,7 +4289,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 4520, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -4734,34 +4297,28 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 2.9, - "pixii": 1, - "sungrow": 1.2 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 3865, - "clamped": true + "target_w": 841.984126984127, + "clamped": false }, { "driver": "pixii", - "target_w": 1030, + "target_w": -758, "clamped": true }, { "driver": "sungrow", - "target_w": 2283, + "target_w": 3177, "clamped": true } ], "clamp_attributions": { "clamped_drivers": [ - "ferroamp", "pixii", "sungrow" ], @@ -4781,10 +4338,10 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 5178, - "battery_target_sum_w": 7178, - "raw_grid_w": -3277, - "projected_grid_w": -1277 + "battery_current_w": 2062, + "battery_target_sum_w": 3260.984126984127, + "raw_grid_w": -3636, + "projected_grid_w": -2437.015873015873 } }, { @@ -5217,237 +4774,13 @@ "driver": "pv-0", "power_w": -8204 } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": -1775, - "soc": 0.88, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1500, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -939.2, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -1775, - "battery_target_sum_w": -939.2, - "raw_grid_w": -1393, - "projected_grid_w": -557.2 - } - }, - { - "scenario_id": "slew/seeded_009_peak_shaving", - "seed": 6009, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -5450, - "pv": [ - { - "driver": "pv-0", - "power_w": -8738 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -2564, - "soc": 0.63, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": 2, - "soc": 0.51, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 3000 - }, - { - "driver": "pixii", - "capacity_wh": 15200, - "current_w": -1790, - "soc": 0.48, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1500, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3578, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -1064, - "clamped": true - }, - { - "driver": "pixii", - "target_w": -544.5827814569536, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -179.13907284768214, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -4352, - "battery_target_sum_w": -1787.7218543046358, - "raw_grid_w": -5450, - "projected_grid_w": -2885.7218543046356 - } - }, - { - "scenario_id": "slew/seeded_010_priority", - "seed": 6010, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 328, - "pv": [ - { - "driver": "pv-0", - "power_w": -6887 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 9600, - "current_w": -2520, - "soc": 0.74, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -3233, - "soc": 0.39, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, + ], + "batteries": [ { - "driver": "pixii", + "driver": "ferroamp", "capacity_wh": 5000, - "current_w": 3114, - "soc": 0.74, + "current_w": -1775, + "soc": 0.88, "online": true, "device_fault": false, "discharge_blocked": false, @@ -5457,10 +4790,10 @@ } ], "state": { - "mode": "priority", - "grid_target_w": 27, + "mode": "self_consumption", + "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 500, + "slew_rate_w": 1500, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -5478,28 +4811,13 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "pixii", - "sungrow" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -2700.6, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 3114, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -3233, + "target_w": -939.2, "clamped": false } ], @@ -5521,30 +4839,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -2639, - "battery_target_sum_w": -2819.6, - "raw_grid_w": 328, - "projected_grid_w": 147.4000000000001 + "battery_current_w": -1775, + "battery_target_sum_w": -939.2, + "raw_grid_w": -1393, + "projected_grid_w": -557.2 } }, { - "scenario_id": "slew/seeded_011_weighted", - "seed": 6011, + "scenario_id": "slew/seeded_009_peak_shaving", + "seed": 6009, "inputs": { "fuse_max_w": 11040, - "grid_w": 4498, + "grid_w": -5450, "pv": [ { "driver": "pv-0", - "power_w": -5276 + "power_w": -8738 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 607, - "soc": 0.49, + "capacity_wh": 10000, + "current_w": -2564, + "soc": 0.63, "online": true, "device_fault": false, "discharge_blocked": false, @@ -5554,9 +4872,21 @@ }, { "driver": "sungrow", - "capacity_wh": 10000, - "current_w": -1993, - "soc": 0.8, + "capacity_wh": 5000, + "current_w": 2, + "soc": 0.51, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 3000, + "max_discharge_w": 3000 + }, + { + "driver": "pixii", + "capacity_wh": 15200, + "current_w": -1790, + "soc": 0.48, "online": true, "device_fault": false, "discharge_blocked": false, @@ -5566,7 +4896,7 @@ } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 1500, @@ -5579,7 +4909,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3578, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -5587,22 +4917,23 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.3, - "sungrow": 0.8 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -893, + "target_w": -1064, "clamped": true }, + { + "driver": "pixii", + "target_w": -544.5827814569536, + "clamped": false + }, { "driver": "sungrow", - "target_w": -1556.1142857142856, + "target_w": -179.13907284768214, "clamped": false } ], @@ -5626,10 +4957,10 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -1386, - "battery_target_sum_w": -2449.114285714286, - "raw_grid_w": 4498, - "projected_grid_w": 3434.885714285714 + "battery_current_w": -4352, + "battery_target_sum_w": -1787.7218543046358, + "raw_grid_w": -5450, + "projected_grid_w": -2885.7218543046356 } }, { @@ -6064,207 +5395,16 @@ "online": true, "device_fault": false, "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 5000 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 974, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": -1790, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -816, - "battery_target_sum_w": -816, - "raw_grid_w": -3714, - "projected_grid_w": -3714 - } - }, - { - "scenario_id": "slew/seeded_017_peak_shaving", - "seed": 6017, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -2954, - "pv": [ - { - "driver": "pv-0", - "power_w": -1006 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 2676, - "soc": 0.52, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 5000 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -835, - "soc": 0.85, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 750, - "slew_enabled": false, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3220, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 2000, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": 1204.4666666666667, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 1841, - "battery_target_sum_w": 3204.4666666666667, - "raw_grid_w": -2954, - "projected_grid_w": -1590.5333333333333 - } - }, - { - "scenario_id": "slew/seeded_018_priority", - "seed": 6018, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -5767, - "pv": [ - { - "driver": "pv-0", - "power_w": -1441 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": 3782, - "soc": 0.26, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "charge_blocked": false, + "max_charge_w": 2000, + "max_discharge_w": 5000 } ], "state": { - "mode": "priority", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 250, + "slew_rate_w": 1000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -6282,22 +5422,25 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 4032, + "target_w": 974, + "clamped": true + }, + { + "driver": "sungrow", + "target_w": -1790, "clamped": true } ], "clamp_attributions": { "clamped_drivers": [ - "ferroamp" + "ferroamp", + "sungrow" ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, @@ -6315,56 +5458,56 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 3782, - "battery_target_sum_w": 4032, - "raw_grid_w": -5767, - "projected_grid_w": -5517 + "battery_current_w": -816, + "battery_target_sum_w": -816, + "raw_grid_w": -3714, + "projected_grid_w": -3714 } }, { - "scenario_id": "slew/seeded_019_weighted", - "seed": 6019, + "scenario_id": "slew/seeded_017_peak_shaving", + "seed": 6017, "inputs": { "fuse_max_w": 11040, - "grid_w": -1669, + "grid_w": -2954, "pv": [ { "driver": "pv-0", - "power_w": -4922 + "power_w": -1006 } ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 10000, - "current_w": -4080, - "soc": 0.77, + "current_w": 2676, + "soc": 0.52, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 2000 + "max_charge_w": 2000, + "max_discharge_w": 5000 }, { "driver": "sungrow", "capacity_wh": 5000, - "current_w": 3451, - "soc": 0.28, + "current_w": -835, + "soc": 0.85, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 3000 + "max_charge_w": 0, + "max_discharge_w": 0 } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 500, - "slew_enabled": true, + "slew_rate_w": 750, + "slew_enabled": false, "min_dispatch_interval_s": 0, "holdoff_active": false, "use_energy_dispatch": false, @@ -6373,7 +5516,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3220, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -6381,29 +5524,24 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.8, - "sungrow": 1.6 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -2000, + "target_w": 2000, "clamped": true }, { "driver": "sungrow", - "target_w": 2951, - "clamped": true + "target_w": 1204.4666666666667, + "clamped": false } ], "clamp_attributions": { "clamped_drivers": [ - "ferroamp", - "sungrow" + "ferroamp" ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, @@ -6421,10 +5559,10 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -629, - "battery_target_sum_w": 951, - "raw_grid_w": -1669, - "projected_grid_w": -89 + "battery_current_w": 1841, + "battery_target_sum_w": 3204.4666666666667, + "raw_grid_w": -2954, + "projected_grid_w": -1590.5333333333333 } }, { @@ -6889,213 +6027,19 @@ "driver": "sungrow", "capacity_wh": 15200, "current_w": -2925, - "soc": 0.18, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 15200, - "current_w": -4916, - "soc": 0.51, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -33, - "clamped": true - }, - { - "driver": "pixii", - "target_w": -3916, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": -3124.8792079207924, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "pixii" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -6874, - "battery_target_sum_w": -7073.879207920792, - "raw_grid_w": 2386, - "projected_grid_w": 2186.1207920792076 - } - }, - { - "scenario_id": "slew/seeded_025_peak_shaving", - "seed": 6025, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -1028, - "pv": [ - { - "driver": "pv-0", - "power_w": -1192 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -1925, - "soc": 0.74, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 5000 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -3825, - "soc": 0.16, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 3000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3606, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -3422.133333333333, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -1711.0666666666666, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -5750, - "battery_target_sum_w": -5133.2, - "raw_grid_w": -1028, - "projected_grid_w": -411.1999999999998 - } - }, - { - "scenario_id": "slew/seeded_026_priority", - "seed": 6026, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -13276, - "pv": [ - { - "driver": "pv-0", - "power_w": -3605 - } - ], - "batteries": [ + "soc": 0.18, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 0, + "max_discharge_w": 0 + }, { - "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": 3783, - "soc": 0.49, + "driver": "pixii", + "capacity_wh": 15200, + "current_w": -4916, + "soc": 0.51, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7105,10 +6049,10 @@ } ], "state": { - "mode": "priority", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 250, + "slew_rate_w": 1000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -7126,22 +6070,30 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 4033, + "target_w": -33, + "clamped": true + }, + { + "driver": "pixii", + "target_w": -3916, "clamped": true + }, + { + "driver": "sungrow", + "target_w": -3124.8792079207924, + "clamped": false } ], "clamp_attributions": { "clamped_drivers": [ - "ferroamp" + "ferroamp", + "pixii" ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, @@ -7159,30 +6111,42 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 3783, - "battery_target_sum_w": 4033, - "raw_grid_w": -13276, - "projected_grid_w": -13026 + "battery_current_w": -6874, + "battery_target_sum_w": -7073.879207920792, + "raw_grid_w": 2386, + "projected_grid_w": 2186.1207920792076 } }, { - "scenario_id": "slew/seeded_027_weighted", - "seed": 6027, + "scenario_id": "slew/seeded_025_peak_shaving", + "seed": 6025, "inputs": { "fuse_max_w": 11040, - "grid_w": -994, + "grid_w": -1028, "pv": [ { "driver": "pv-0", - "power_w": -5783 + "power_w": -1192 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 5025, - "soc": 0.61, + "capacity_wh": 10000, + "current_w": -1925, + "soc": 0.74, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 3000, + "max_discharge_w": 5000 + }, + { + "driver": "sungrow", + "capacity_wh": 5000, + "current_w": -3825, + "soc": 0.16, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7192,10 +6156,10 @@ } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 750, + "slew_rate_w": 3000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -7205,7 +6169,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3606, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -7213,23 +6177,23 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.1 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 5000, - "clamped": true + "target_w": -3422.133333333333, + "clamped": false + }, + { + "driver": "sungrow", + "target_w": -1711.0666666666666, + "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -7246,10 +6210,10 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 5025, - "battery_target_sum_w": 5000, - "raw_grid_w": -994, - "projected_grid_w": -1019 + "battery_current_w": -5750, + "battery_target_sum_w": -5133.2, + "raw_grid_w": -1028, + "projected_grid_w": -411.1999999999998 } }, { @@ -7763,187 +6727,10 @@ "max_discharge_w": 2000 }, { - "driver": "pixii", - "capacity_wh": 10000, - "current_w": 465, - "soc": 0.38, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 2000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 2311, - "clamped": true - }, - { - "driver": "pixii", - "target_w": -123.84105960264901, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -1701, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 1075, - "battery_target_sum_w": 486.158940397351, - "raw_grid_w": 2415, - "projected_grid_w": 1826.158940397351 - } - }, - { - "scenario_id": "slew/seeded_033_peak_shaving", - "seed": 6033, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 172, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": -1658, - "soc": 0.21, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 250, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5853, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -1658, - "battery_target_sum_w": 0, - "raw_grid_w": 172, - "projected_grid_w": 172 - } - }, - { - "scenario_id": "slew/seeded_034_priority", - "seed": 6034, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -12119, - "pv": [ - { - "driver": "pv-0", - "power_w": -2437 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -2489, - "soc": 0.33, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", + "driver": "pixii", "capacity_wh": 10000, - "current_w": -507, - "soc": 0.66, + "current_w": 465, + "soc": 0.38, "online": true, "device_fault": false, "discharge_blocked": false, @@ -7953,10 +6740,10 @@ } ], "state": { - "mode": "priority", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 250, + "slew_rate_w": 2000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -7974,22 +6761,23 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "sungrow" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -1563.0600873998544, + "target_w": 2311, "clamped": true }, + { + "driver": "pixii", + "target_w": -123.84105960264901, + "clamped": false + }, { "driver": "sungrow", - "target_w": -353.9399126001457, + "target_w": -1701, "clamped": true } ], @@ -8004,64 +6792,34 @@ "plan_stale": false, "fuse_saturated": false, "fuse_ev_max_w": 0, - "fuse_hold_latched": true, + "fuse_hold_latched": false, "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 1917, + "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, "import_ceiling_binding": false, - "export_ceiling_binding": true + "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -2996, - "battery_target_sum_w": -1917, - "raw_grid_w": -12119, - "projected_grid_w": -11040 + "battery_current_w": 1075, + "battery_target_sum_w": 486.158940397351, + "raw_grid_w": 2415, + "projected_grid_w": 1826.158940397351 } }, { - "scenario_id": "slew/seeded_035_weighted", - "seed": 6035, + "scenario_id": "slew/seeded_033_peak_shaving", + "seed": 6033, "inputs": { "fuse_max_w": 11040, - "grid_w": -1922, - "pv": [ - { - "driver": "pv-0", - "power_w": -7987 - } - ], + "grid_w": 172, "batteries": [ { "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -313, - "soc": 0.87, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 9600, - "current_w": 1831, - "soc": 0.51, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 3000 - }, - { - "driver": "pixii", - "capacity_wh": 15200, - "current_w": -824, - "soc": 0.67, + "capacity_wh": 5000, + "current_w": -1658, + "soc": 0.21, "online": true, "device_fault": false, "discharge_blocked": false, @@ -8071,7 +6829,7 @@ } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 250, @@ -8084,7 +6842,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 5853, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -8092,37 +6850,12 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 2.4, - "pixii": 1.9, - "sungrow": 0.7 - } + "pv_surplus_absorb_threshold_w": 0 } }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -63, - "clamped": true - }, - { - "driver": "pixii", - "target_w": -574, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": 1581, - "clamped": true - } - ], + "per_driver_targets": [], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "pixii", - "sungrow" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -8139,10 +6872,10 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 694, - "battery_target_sum_w": 944, - "raw_grid_w": -1922, - "projected_grid_w": -1672 + "battery_current_w": -1658, + "battery_target_sum_w": 0, + "raw_grid_w": 172, + "projected_grid_w": 172 } }, { @@ -8618,195 +7351,15 @@ "pv": [ { "driver": "pv-0", - "power_w": -4075 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 5025, - "soc": 0.76, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 750, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 5000, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 5025, - "battery_target_sum_w": 5000, - "raw_grid_w": -3377, - "projected_grid_w": -3402 - } - }, - { - "scenario_id": "slew/seeded_041_peak_shaving", - "seed": 6041, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 13291, - "pv": [ - { - "driver": "pv-0", - "power_w": -2758 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": -2283, - "soc": 0.11, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 500, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3796, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -4534, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": true, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -2283, - "battery_target_sum_w": -4534, - "raw_grid_w": 13291, - "projected_grid_w": 11040 - } - }, - { - "scenario_id": "slew/seeded_042_priority", - "seed": 6042, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -13135, - "pv": [ - { - "driver": "pv-0", - "power_w": -5601 + "power_w": -4075 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -4637, - "soc": 0.62, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", "capacity_wh": 10000, - "current_w": -844, - "soc": 0.79, + "current_w": 5025, + "soc": 0.76, "online": true, "device_fault": false, "discharge_blocked": false, @@ -8816,10 +7369,10 @@ } ], "state": { - "mode": "priority", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 500, + "slew_rate_w": 750, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -8837,29 +7390,19 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "sungrow" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -2812.2629993977116, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": -573.7370006022887, + "target_w": 5000, "clamped": true } ], "clamp_attributions": { "clamped_drivers": [ - "ferroamp", - "sungrow" + "ferroamp" ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, @@ -8867,40 +7410,40 @@ "plan_stale": false, "fuse_saturated": false, "fuse_ev_max_w": 0, - "fuse_hold_latched": true, + "fuse_hold_latched": false, "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 3386, + "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, "import_ceiling_binding": false, - "export_ceiling_binding": true + "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -5481, - "battery_target_sum_w": -3386.0000000000005, - "raw_grid_w": -13135, - "projected_grid_w": -11040 + "battery_current_w": 5025, + "battery_target_sum_w": 5000, + "raw_grid_w": -3377, + "projected_grid_w": -3402 } }, { - "scenario_id": "slew/seeded_043_weighted", - "seed": 6043, + "scenario_id": "slew/seeded_041_peak_shaving", + "seed": 6041, "inputs": { "fuse_max_w": 11040, - "grid_w": -4013, + "grid_w": 13291, "pv": [ { "driver": "pv-0", - "power_w": -4087 + "power_w": -2758 } ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 5000, - "current_w": 4158, - "soc": 0.37, + "current_w": -2283, + "soc": 0.11, "online": true, "device_fault": false, "discharge_blocked": false, @@ -8910,10 +7453,10 @@ } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 750, + "slew_rate_w": 500, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -8923,7 +7466,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3796, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -8931,16 +7474,13 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 0.8 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 4908, + "target_w": -4534, "clamped": true } ], @@ -8960,14 +7500,14 @@ "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, + "import_ceiling_binding": true, "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 4158, - "battery_target_sum_w": 4908, - "raw_grid_w": -4013, - "projected_grid_w": -3263 + "battery_current_w": -2283, + "battery_target_sum_w": -4534, + "raw_grid_w": 13291, + "projected_grid_w": 11040 } }, { @@ -9432,244 +7972,34 @@ "grid_w": -5213, "pv": [ { - "driver": "pv-0", - "power_w": -8103 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 9600, - "current_w": 3682, - "soc": 0.63, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 4772, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 4682, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 3682, - "battery_target_sum_w": 4682, - "raw_grid_w": -5213, - "projected_grid_w": -4213 - } - }, - { - "scenario_id": "slew/seeded_049_peak_shaving", - "seed": 6049, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 15964, - "pv": [ - { - "driver": "pv-0", - "power_w": -6774 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 4517, - "soc": 0.35, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 3000, - "max_discharge_w": 2000 - }, - { - "driver": "sungrow", - "capacity_wh": 9600, - "current_w": -3885, - "soc": 0.71, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 750, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3800, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -549.8649227568003, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": -3742.1350772432006, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": true, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": true, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 632, - "battery_target_sum_w": -4292.000000000001, - "raw_grid_w": 15964, - "projected_grid_w": 11040 - } - }, - { - "scenario_id": "slew/seeded_050_priority", - "seed": 6050, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -1328, - "pv": [ - { - "driver": "pv-0", - "power_w": -3695 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -1592, - "soc": 0.89, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", + "driver": "pv-0", + "power_w": -8103 + } + ], + "batteries": [ + { + "driver": "ferroamp", "capacity_wh": 9600, - "current_w": 4447, - "soc": 0.29, + "current_w": 3682, + "soc": 0.63, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, "max_charge_w": 0, "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 15200, - "current_w": 2469, - "soc": 0.35, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 2000 } ], "state": { - "mode": "priority", + "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 500, + "slew_rate_w": 1000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, "use_energy_dispatch": false, - "ev_charging_w": 0, + "ev_charging_w": 4772, "battery_covers_ev": false, "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, @@ -9682,34 +8012,19 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "pixii", - "sungrow", - "ferroamp" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -1592, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 2969, + "target_w": 4682, "clamped": true - }, - { - "driver": "sungrow", - "target_w": 4447, - "clamped": false } ], "clamp_attributions": { "clamped_drivers": [ - "pixii" + "ferroamp" ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, @@ -9727,48 +8042,42 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 5324, - "battery_target_sum_w": 5824, - "raw_grid_w": -1328, - "projected_grid_w": -828 + "battery_current_w": 3682, + "battery_target_sum_w": 4682, + "raw_grid_w": -5213, + "projected_grid_w": -4213 } }, { - "scenario_id": "slew/seeded_051_weighted", - "seed": 6051, + "scenario_id": "slew/seeded_049_peak_shaving", + "seed": 6049, "inputs": { "fuse_max_w": 11040, - "grid_w": 4704, + "grid_w": 15964, + "pv": [ + { + "driver": "pv-0", + "power_w": -6774 + } + ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 5000, - "current_w": 5365, - "soc": 0.6, + "capacity_wh": 10000, + "current_w": 4517, + "soc": 0.35, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 3000, + "max_discharge_w": 2000 }, { "driver": "sungrow", - "capacity_wh": 15200, - "current_w": -504, - "soc": 0.58, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 5000, - "current_w": -2624, - "soc": 0.11, + "capacity_wh": 9600, + "current_w": -3885, + "soc": 0.71, "online": true, "device_fault": false, "discharge_blocked": false, @@ -9778,10 +8087,10 @@ } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 2000, + "slew_rate_w": 750, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -9791,7 +8100,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3800, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -9799,35 +8108,25 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.3, - "pixii": 0.6, - "sungrow": 2.1 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 3365, - "clamped": true - }, - { - "driver": "pixii", - "target_w": -624, + "target_w": -549.8649227568003, "clamped": true }, { "driver": "sungrow", - "target_w": -307.33500000000004, - "clamped": false + "target_w": -3742.1350772432006, + "clamped": true } ], "clamp_attributions": { "clamped_drivers": [ "ferroamp", - "pixii" + "sungrow" ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, @@ -9835,20 +8134,20 @@ "plan_stale": false, "fuse_saturated": false, "fuse_ev_max_w": 0, - "fuse_hold_latched": false, + "fuse_hold_latched": true, "fuse_hold_max_charge_w": 0, "fuse_hold_max_discharge_w": 0, "per_phase_overage_w": 0, "effective_import_ceiling_w": 11040, "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, + "import_ceiling_binding": true, "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 2237, - "battery_target_sum_w": 2433.665, - "raw_grid_w": 4704, - "projected_grid_w": 4900.665 + "battery_current_w": 632, + "battery_target_sum_w": -4292.000000000001, + "raw_grid_w": 15964, + "projected_grid_w": 11040 } }, { @@ -10360,194 +8659,19 @@ "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 5400, - "soc": 0.6, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 5000 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 3000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3375, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 5400, - "battery_target_sum_w": 0, - "raw_grid_w": 78, - "projected_grid_w": 78 - } - }, - { - "scenario_id": "slew/seeded_058_priority", - "seed": 6058, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -1896, - "pv": [ - { - "driver": "pv-0", - "power_w": -1995 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -2034, - "soc": 0.32, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 3000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 5865, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp" - ] - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 966, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -2034, - "battery_target_sum_w": 966, - "raw_grid_w": -1896, - "projected_grid_w": 1104 - } - }, - { - "scenario_id": "slew/seeded_059_weighted", - "seed": 6059, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -4109, - "pv": [ - { - "driver": "pv-0", - "power_w": -6101 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -3667, - "soc": 0.46, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 5000 - }, - { - "driver": "sungrow", - "capacity_wh": 10000, - "current_w": -1465, - "soc": 0.58, + "capacity_wh": 15200, + "current_w": 5400, + "soc": 0.6, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 5000, + "max_discharge_w": 5000 } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, "slew_rate_w": 3000, @@ -10555,12 +8679,12 @@ "min_dispatch_interval_s": 0, "holdoff_active": false, "use_energy_dispatch": false, - "ev_charging_w": 4282, + "ev_charging_w": 0, "battery_covers_ev": false, "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3375, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -10568,29 +8692,12 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 2.7, - "sungrow": 2.5 - } + "pv_surplus_absorb_threshold_w": 0 } }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -667, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": -46.826923076922895, - "clamped": false - } - ], + "per_driver_targets": [], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -10607,10 +8714,10 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -5132, - "battery_target_sum_w": -713.8269230769229, - "raw_grid_w": -4109, - "projected_grid_w": 309.17307692307713 + "battery_current_w": 5400, + "battery_target_sum_w": 0, + "raw_grid_w": 78, + "projected_grid_w": 78 } }, { @@ -11184,247 +9291,10 @@ ], "clamp_attributions": { "clamped_drivers": [ - "ferroamp", - "pixii", - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 8183, - "battery_target_sum_w": 7183, - "raw_grid_w": -1282, - "projected_grid_w": -2282 - } - }, - { - "scenario_id": "slew/seeded_065_peak_shaving", - "seed": 6065, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -2095, - "pv": [ - { - "driver": "pv-0", - "power_w": -4589 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 913, - "soc": 0.89, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 10000, - "current_w": 2305, - "soc": 0.56, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 3000 - }, - { - "driver": "pixii", - "capacity_wh": 5000, - "current_w": 1764, - "soc": 0.78, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 3000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 4970, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 2495.6000000000004, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 1247.8000000000002, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 2495.6000000000004, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 4982, - "battery_target_sum_w": 6239.000000000001, - "raw_grid_w": -2095, - "projected_grid_w": -837.9999999999991 - } - }, - { - "scenario_id": "slew/seeded_066_priority", - "seed": 6066, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -626, - "pv": [ - { - "driver": "pv-0", - "power_w": -8457 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -1995, - "soc": 0.21, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 15200, - "current_w": -3413, - "soc": 0.16, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 5000, - "current_w": 4747, - "soc": 0.14, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 500, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "sungrow", - "pixii", - "ferroamp" - ] - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -1995, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 4747, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": -3037.4, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], + "ferroamp", + "pixii", + "sungrow" + ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -11441,30 +9311,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -661, - "battery_target_sum_w": -285.4000000000001, - "raw_grid_w": -626, - "projected_grid_w": -250.4000000000001 + "battery_current_w": 8183, + "battery_target_sum_w": 7183, + "raw_grid_w": -1282, + "projected_grid_w": -2282 } }, { - "scenario_id": "slew/seeded_067_weighted", - "seed": 6067, + "scenario_id": "slew/seeded_065_peak_shaving", + "seed": 6065, "inputs": { "fuse_max_w": 11040, - "grid_w": -4836, + "grid_w": -2095, "pv": [ { "driver": "pv-0", - "power_w": -6795 + "power_w": -4589 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 3115, - "soc": 0.76, + "capacity_wh": 10000, + "current_w": 913, + "soc": 0.89, "online": true, "device_fault": false, "discharge_blocked": false, @@ -11475,20 +9345,20 @@ { "driver": "sungrow", "capacity_wh": 10000, - "current_w": -2168, - "soc": 0.11, + "current_w": 2305, + "soc": 0.56, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 + "max_charge_w": 5000, + "max_discharge_w": 3000 }, { "driver": "pixii", "capacity_wh": 5000, - "current_w": 3341, - "soc": 0.41, + "current_w": 1764, + "soc": 0.78, "online": true, "device_fault": false, "discharge_blocked": false, @@ -11498,10 +9368,10 @@ } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1000, + "slew_rate_w": 3000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -11511,7 +9381,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 4970, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -11519,36 +9389,28 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 2.4, - "pixii": 1.3, - "sungrow": 0.6 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 4012.8, + "target_w": 2495.6000000000004, "clamped": false }, { "driver": "pixii", - "target_w": 2341, - "clamped": true + "target_w": 1247.8000000000002, + "clamped": false }, { "driver": "sungrow", - "target_w": -1168, - "clamped": true + "target_w": 2495.6000000000004, + "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [ - "pixii", - "sungrow" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -11565,10 +9427,10 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 4288, - "battery_target_sum_w": 5185.8, - "raw_grid_w": -4836, - "projected_grid_w": -3938.2 + "battery_current_w": 4982, + "battery_target_sum_w": 6239.000000000001, + "raw_grid_w": -2095, + "projected_grid_w": -837.9999999999991 } }, { @@ -12021,218 +9883,7 @@ "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 792, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": -624, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 1674, - "battery_target_sum_w": 168, - "raw_grid_w": 4870, - "projected_grid_w": 3364 - } - }, - { - "scenario_id": "slew/seeded_073_peak_shaving", - "seed": 6073, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -2638, - "pv": [ - { - "driver": "pv-0", - "power_w": -6552 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 3700, - "soc": 0.73, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 10000, - "current_w": 1809, - "soc": 0.29, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 10000, - "current_w": -1242, - "soc": 0.65, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 3000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 4911, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 2526.05, - "clamped": false - }, - { - "driver": "pixii", - "target_w": 1661.8750000000002, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 1661.8750000000002, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 4267, - "battery_target_sum_w": 5849.8, - "raw_grid_w": -2638, - "projected_grid_w": -1055.1999999999998 - } - }, - { - "scenario_id": "slew/seeded_074_priority", - "seed": 6074, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 3879, - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": -2999, - "soc": 0.48, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 10000, - "current_w": 3201, - "soc": 0.83, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 750, + "slew_rate_w": 1000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -12250,22 +9901,18 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "sungrow" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -3749, + "target_w": 792, "clamped": true }, { "driver": "sungrow", - "target_w": 2874.6, + "target_w": -624, "clamped": false } ], @@ -12289,30 +9936,30 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 202, - "battery_target_sum_w": -874.4000000000001, - "raw_grid_w": 3879, - "projected_grid_w": 2802.6 + "battery_current_w": 1674, + "battery_target_sum_w": 168, + "raw_grid_w": 4870, + "projected_grid_w": 3364 } }, { - "scenario_id": "slew/seeded_075_weighted", - "seed": 6075, + "scenario_id": "slew/seeded_073_peak_shaving", + "seed": 6073, "inputs": { "fuse_max_w": 11040, - "grid_w": -4599, + "grid_w": -2638, "pv": [ { "driver": "pv-0", - "power_w": -1374 + "power_w": -6552 } ], "batteries": [ { "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 2097, - "soc": 0.2, + "capacity_wh": 15200, + "current_w": 3700, + "soc": 0.73, "online": true, "device_fault": false, "discharge_blocked": false, @@ -12322,21 +9969,21 @@ }, { "driver": "sungrow", - "capacity_wh": 5000, - "current_w": -2952, - "soc": 0.43, + "capacity_wh": 10000, + "current_w": 1809, + "soc": 0.29, "online": true, "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 5000, - "max_discharge_w": 3000 + "max_charge_w": 0, + "max_discharge_w": 0 }, { "driver": "pixii", "capacity_wh": 10000, - "current_w": 1540, - "soc": 0.69, + "current_w": -1242, + "soc": 0.65, "online": true, "device_fault": false, "discharge_blocked": false, @@ -12346,10 +9993,10 @@ } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 250, + "slew_rate_w": 3000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -12359,7 +10006,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 4911, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -12367,37 +10014,28 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 2.8, - "pixii": 1.2, - "sungrow": 2.5 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 1847, - "clamped": true + "target_w": 2526.05, + "clamped": false }, { "driver": "pixii", - "target_w": 1290, - "clamped": true + "target_w": 1661.8750000000002, + "clamped": false }, { "driver": "sungrow", - "target_w": -2702, - "clamped": true + "target_w": 1661.8750000000002, + "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "pixii", - "sungrow" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -12414,10 +10052,10 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 685, - "battery_target_sum_w": 435, - "raw_grid_w": -4599, - "projected_grid_w": -4849 + "battery_current_w": 4267, + "battery_target_sum_w": 5849.8, + "raw_grid_w": -2638, + "projected_grid_w": -1055.1999999999998 } }, { @@ -12882,224 +10520,15 @@ "device_fault": false, "discharge_blocked": false, "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "self_consumption", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -2869, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -1869, - "battery_target_sum_w": -2869, - "raw_grid_w": 1799, - "projected_grid_w": 799 - } - }, - { - "scenario_id": "slew/seeded_081_peak_shaving", - "seed": 6081, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -1903, - "pv": [ - { - "driver": "pv-0", - "power_w": -3373 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": -3144, - "soc": 0.18, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 10000, - "current_w": 221, - "soc": 0.29, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 3000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 5639, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 3983, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": -144, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": 635.7936507936507, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -2923, - "battery_target_sum_w": 491.7936507936507, - "raw_grid_w": -1903, - "projected_grid_w": 1511.7936507936506 - } - }, - { - "scenario_id": "slew/seeded_082_priority", - "seed": 6082, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -5396, - "pv": [ - { - "driver": "pv-0", - "power_w": -5880 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 9600, - "current_w": 3870, - "soc": 0.72, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 3000 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": 4026, - "soc": 0.38, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 9600, - "current_w": -1369, - "soc": 0.38, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 2000 + "max_charge_w": 0, + "max_discharge_w": 0 } ], "state": { - "mode": "priority", - "grid_target_w": -301, + "mode": "self_consumption", + "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 2000, + "slew_rate_w": 1000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -13117,36 +10546,19 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "ferroamp", - "sungrow", - "pixii" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 2000, - "clamped": true - }, - { - "driver": "pixii", - "target_w": 631, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": 5000, + "target_w": -2869, "clamped": true } ], "clamp_attributions": { "clamped_drivers": [ - "ferroamp", - "pixii", - "sungrow" + "ferroamp" ], "all_targets_zero_clamped": false, "plan_sign_intent": 0, @@ -13164,30 +10576,42 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 6527, - "battery_target_sum_w": 7631, - "raw_grid_w": -5396, - "projected_grid_w": -4292 + "battery_current_w": -1869, + "battery_target_sum_w": -2869, + "raw_grid_w": 1799, + "projected_grid_w": 799 } }, { - "scenario_id": "slew/seeded_083_weighted", - "seed": 6083, + "scenario_id": "slew/seeded_081_peak_shaving", + "seed": 6081, "inputs": { "fuse_max_w": 11040, - "grid_w": 12092, + "grid_w": -1903, "pv": [ { "driver": "pv-0", - "power_w": -6170 + "power_w": -3373 } ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 15200, - "current_w": -1908, - "soc": 0.43, + "current_w": -3144, + "soc": 0.18, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 0, + "max_discharge_w": 0 + }, + { + "driver": "sungrow", + "capacity_wh": 10000, + "current_w": 221, + "soc": 0.29, "online": true, "device_fault": false, "discharge_blocked": false, @@ -13197,20 +10621,20 @@ } ], "state": { - "mode": "weighted", + "mode": "peak_shaving", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 2000, + "slew_rate_w": 3000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, "use_energy_dispatch": false, - "ev_charging_w": 0, + "ev_charging_w": 5639, "battery_covers_ev": false, "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 3983, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -13218,17 +10642,19 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.4 - } + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": -3908, + "target_w": -144, "clamped": true + }, + { + "driver": "sungrow", + "target_w": 635.7936507936507, + "clamped": false } ], "clamp_attributions": { @@ -13251,10 +10677,10 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": -1908, - "battery_target_sum_w": -3908, - "raw_grid_w": 12092, - "projected_grid_w": 10092 + "battery_current_w": -2923, + "battery_target_sum_w": 491.7936507936507, + "raw_grid_w": -1903, + "projected_grid_w": 1511.7936507936506 } }, { @@ -13755,206 +11181,7 @@ "mode": "self_consumption", "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 3000, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 2810.9, - "clamped": false - }, - { - "driver": "sungrow", - "target_w": 2810.9, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 4453, - "battery_target_sum_w": 5621.8, - "raw_grid_w": -1948, - "projected_grid_w": -779.1999999999998 - } - }, - { - "scenario_id": "slew/seeded_089_peak_shaving", - "seed": 6089, - "inputs": { - "fuse_max_w": 11040, - "grid_w": 5638, - "pv": [ - { - "driver": "pv-0", - "power_w": -2527 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 5104, - "soc": 0.48, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 10000, - "current_w": -615, - "soc": 0.6, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "peak_shaving", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 500, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5929, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0 - } - }, - "per_driver_targets": [], - "clamp_attributions": { - "clamped_drivers": [], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 4489, - "battery_target_sum_w": 0, - "raw_grid_w": 5638, - "projected_grid_w": 5638 - } - }, - { - "scenario_id": "slew/seeded_090_priority", - "seed": 6090, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -4533, - "pv": [ - { - "driver": "pv-0", - "power_w": -5088 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 10000, - "current_w": 2633, - "soc": 0.2, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": 4906, - "soc": 0.88, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "pixii", - "capacity_wh": 15200, - "current_w": -163, - "soc": 0.67, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 305, - "grid_tolerance_w": 50, - "slew_rate_w": 750, + "slew_rate_w": 3000, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -13972,36 +11199,23 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "sungrow", - "ferroamp", - "pixii" - ] + "pv_surplus_absorb_threshold_w": 0 } }, "per_driver_targets": [ { "driver": "ferroamp", - "target_w": 3383, - "clamped": true - }, - { - "driver": "pixii", - "target_w": 278.7999999999993, + "target_w": 2810.9, "clamped": false }, { "driver": "sungrow", - "target_w": 5000, - "clamped": true + "target_w": 2810.9, + "clamped": false } ], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "sungrow" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -14018,30 +11232,42 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 7376, - "battery_target_sum_w": 8661.8, - "raw_grid_w": -4533, - "projected_grid_w": -3247.2000000000007 + "battery_current_w": 4453, + "battery_target_sum_w": 5621.8, + "raw_grid_w": -1948, + "projected_grid_w": -779.1999999999998 } }, { - "scenario_id": "slew/seeded_091_weighted", - "seed": 6091, + "scenario_id": "slew/seeded_089_peak_shaving", + "seed": 6089, "inputs": { "fuse_max_w": 11040, - "grid_w": -5129, + "grid_w": 5638, "pv": [ { "driver": "pv-0", - "power_w": -2372 + "power_w": -2527 } ], "batteries": [ { "driver": "ferroamp", "capacity_wh": 15200, - "current_w": 3526, - "soc": 0.34, + "current_w": 5104, + "soc": 0.48, + "online": true, + "device_fault": false, + "discharge_blocked": false, + "charge_blocked": false, + "max_charge_w": 0, + "max_discharge_w": 0 + }, + { + "driver": "sungrow", + "capacity_wh": 10000, + "current_w": -615, + "soc": 0.6, "online": true, "device_fault": false, "discharge_blocked": false, @@ -14051,10 +11277,10 @@ } ], "state": { - "mode": "weighted", - "grid_target_w": 430, + "mode": "peak_shaving", + "grid_target_w": 0, "grid_tolerance_w": 50, - "slew_rate_w": 1500, + "slew_rate_w": 500, "slew_enabled": true, "min_dispatch_interval_s": 0, "holdoff_active": false, @@ -14064,7 +11290,7 @@ "battery_boost_ev_charging_w": 0, "battery_boost_reserve_soc": 0, "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, + "peak_limit_w": 5929, "peak_import_ceiling_w": 0, "max_export_w": 0, "site_fuse_amps": 0, @@ -14072,23 +11298,12 @@ "site_fuse_phases": 0, "site_fuse_safety_a": 0, "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 1.9 - } + "pv_surplus_absorb_threshold_w": 0 } }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 5000, - "clamped": true - } - ], + "per_driver_targets": [], "clamp_attributions": { - "clamped_drivers": [ - "ferroamp" - ], + "clamped_drivers": [], "all_targets_zero_clamped": false, "plan_sign_intent": 0, "plan_sign_floor_zeroed": false, @@ -14105,10 +11320,10 @@ "export_ceiling_binding": false }, "site_totals": { - "battery_current_w": 3526, - "battery_target_sum_w": 5000, - "raw_grid_w": -5129, - "projected_grid_w": -3655 + "battery_current_w": 4489, + "battery_target_sum_w": 0, + "raw_grid_w": 5638, + "projected_grid_w": 5638 } }, { @@ -14749,235 +11964,6 @@ "projected_grid_w": 11040 } }, - { - "scenario_id": "slew/seeded_098_priority", - "seed": 6098, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -3751, - "pv": [ - { - "driver": "pv-0", - "power_w": -3527 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 1498, - "soc": 0.84, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - }, - { - "driver": "sungrow", - "capacity_wh": 5000, - "current_w": 848, - "soc": 0.81, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 2000 - }, - { - "driver": "pixii", - "capacity_wh": 9600, - "current_w": -4311, - "soc": 0.59, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "priority", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 750, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "priority_order": [ - "pixii", - "sungrow", - "ferroamp" - ] - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 1498, - "clamped": false - }, - { - "driver": "pixii", - "target_w": -3561, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": 848, - "clamped": false - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "pixii" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": -1965, - "battery_target_sum_w": -1215, - "raw_grid_w": -3751, - "projected_grid_w": -3001 - } - }, - { - "scenario_id": "slew/seeded_099_weighted", - "seed": 6099, - "inputs": { - "fuse_max_w": 11040, - "grid_w": -2245, - "pv": [ - { - "driver": "pv-0", - "power_w": -7679 - } - ], - "batteries": [ - { - "driver": "ferroamp", - "capacity_wh": 15200, - "current_w": 4131, - "soc": 0.59, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 2000, - "max_discharge_w": 2000 - }, - { - "driver": "sungrow", - "capacity_wh": 9600, - "current_w": 2303, - "soc": 0.42, - "online": true, - "device_fault": false, - "discharge_blocked": false, - "charge_blocked": false, - "max_charge_w": 0, - "max_discharge_w": 0 - } - ], - "state": { - "mode": "weighted", - "grid_target_w": 0, - "grid_tolerance_w": 50, - "slew_rate_w": 1500, - "slew_enabled": true, - "min_dispatch_interval_s": 0, - "holdoff_active": false, - "use_energy_dispatch": false, - "ev_charging_w": 0, - "battery_covers_ev": false, - "battery_boost_ev_charging_w": 0, - "battery_boost_reserve_soc": 0, - "ev_surplus_only_reserve_w": 0, - "peak_limit_w": 5000, - "peak_import_ceiling_w": 0, - "max_export_w": 0, - "site_fuse_amps": 0, - "site_fuse_voltage": 0, - "site_fuse_phases": 0, - "site_fuse_safety_a": 0, - "pv_surplus_absorb_soc_cap": 0, - "pv_surplus_absorb_threshold_w": 0, - "weights": { - "ferroamp": 0.8, - "sungrow": 2.3 - } - } - }, - "per_driver_targets": [ - { - "driver": "ferroamp", - "target_w": 2000, - "clamped": true - }, - { - "driver": "sungrow", - "target_w": 3803, - "clamped": true - } - ], - "clamp_attributions": { - "clamped_drivers": [ - "ferroamp", - "sungrow" - ], - "all_targets_zero_clamped": false, - "plan_sign_intent": 0, - "plan_sign_floor_zeroed": false, - "plan_stale": false, - "fuse_saturated": false, - "fuse_ev_max_w": 0, - "fuse_hold_latched": false, - "fuse_hold_max_charge_w": 0, - "fuse_hold_max_discharge_w": 0, - "per_phase_overage_w": 0, - "effective_import_ceiling_w": 11040, - "effective_export_ceiling_w": 11040, - "import_ceiling_binding": false, - "export_ceiling_binding": false - }, - "site_totals": { - "battery_current_w": 6434, - "battery_target_sum_w": 5803, - "raw_grid_w": -2245, - "projected_grid_w": -2876 - } - }, { "scenario_id": "slew/seeded_100_planner_self", "seed": 6100, diff --git a/go/internal/ha/bridge_test.go b/go/internal/ha/bridge_test.go index 2a139a456..8140e4d32 100644 --- a/go/internal/ha/bridge_test.go +++ b/go/internal/ha/bridge_test.go @@ -80,8 +80,6 @@ func TestModeOptionsIncludePublishedPlannerModes(t *testing.T) { "self_consumption", "peak_shaving", "charge", - "priority", - "weighted", "planner_self", "planner_cheap", "planner_passive_arbitrage", diff --git a/go/test/e2e/stack_test.go b/go/test/e2e/stack_test.go index 3525623fe..9279683d7 100644 --- a/go/test/e2e/stack_test.go +++ b/go/test/e2e/stack_test.go @@ -720,11 +720,11 @@ func TestE2E_FullStack(t *testing.T) { t.Errorf("expected 2 drivers, got %+v", status["drivers"]) } - // 3. In a manual target-following mode, set a positive grid target - // (import more) — batteries should CHARGE (site convention: - // + = charge = load that adds to grid import). - if code := s.postJSON("/api/mode", map[string]any{"mode": "weighted"}, nil); code != 200 { - t.Errorf("mode weighted POST: %d", code) + // 3. In manual self-consumption, which follows the grid target, set a + // positive grid target (import more) — batteries should CHARGE (site + // convention: + = charge = load that adds to grid import). + if code := s.postJSON("/api/mode", map[string]any{"mode": "self_consumption"}, nil); code != 200 { + t.Errorf("mode self_consumption POST: %d", code) } if code := s.postJSON("/api/target", map[string]any{"grid_target_w": 3000}, nil); code != 200 { t.Errorf("target POST: %d", code) diff --git a/web/settings/tabs/batteries.js b/web/settings/tabs/batteries.js index cc23a972f..8b29a933f 100644 --- a/web/settings/tabs/batteries.js +++ b/web/settings/tabs/batteries.js @@ -26,8 +26,6 @@ field("Max discharge (W)", "batteries." + d.name + ".max_discharge_w", "number", "", "Peak discharge rate the driver will command. Defaults to 0.5C.") + '' + - field("Weight (for weighted mode)", "batteries." + d.name + ".weight", "number", 1, - "Share of correction this battery takes when control mode is 'weighted'. 1.0 = equal with other batteries.") + ''; } }); From 7374432b489ec998db93e26b9671341f8c19413e Mon Sep 17 00:00:00 2001 From: Fredrik Ahlgren Date: Sun, 27 Sep 2026 09:04:36 +0200 Subject: [PATCH 2/2] chore: drop an accidental node_modules symlink Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01MuerPFZFG88kgu8sWVHeq7 --- node_modules | 1 - 1 file changed, 1 deletion(-) delete mode 120000 node_modules diff --git a/node_modules b/node_modules deleted file mode 120000 index a589db83b..000000000 --- a/node_modules +++ /dev/null @@ -1 +0,0 @@ -/home/fredde/repos/ftw/node_modules \ No newline at end of file