diff --git a/.changeset/energyplan-0-5-0.md b/.changeset/energyplan-0-5-0.md new file mode 100644 index 000000000..abdfe50e9 --- /dev/null +++ b/.changeset/energyplan-0-5-0.md @@ -0,0 +1,5 @@ +--- +"ftw": patch +--- + +Update the bundled Energyplan planner to 0.5.0. On a small box such as a Raspberry Pi 4, plans with a car get better within the 0.5 s budget: time that the solver's LP phases cannot use now goes to improving the plan Core gets. A car that cannot charge is planned with the exact battery method, and a car a fraction of a watt-hour short of its goal no longer restarts the charger. The planner keeps a valid plan when its solver fails, reports `gap_satisfied` when it meets Core's gap, fixes a wrong demand-charge sign for the running hour, and closes two ways it could report an unproven optimum. Core still validates every plan. diff --git a/go/internal/mpc/energyplan_fault_test.go b/go/internal/mpc/energyplan_fault_test.go index 2fb34ef77..c5d689218 100644 --- a/go/internal/mpc/energyplan_fault_test.go +++ b/go/internal/mpc/energyplan_fault_test.go @@ -57,7 +57,7 @@ func TestNativeEnergyplanEVRecoveryFallbackFaults(t *testing.T) { t.Cleanup(func() { _ = external.Close() }) wrapper := &EnergyplanOptimizer{ExternalOptimizer: external} health, err := wrapper.Health(context.Background()) - if err != nil || health.Version != "0.4.10" { + if err != nil || health.Version != "0.5.0" { t.Fatalf("bundle health=%+v err=%v", health, err) } svc := shadowTestService(t) diff --git a/go/internal/mpc/energyplan_test.go b/go/internal/mpc/energyplan_test.go index 3c51ccbed..841f1e6db 100644 --- a/go/internal/mpc/energyplan_test.go +++ b/go/internal/mpc/energyplan_test.go @@ -95,7 +95,7 @@ func TestNativeEnergyplanDownsideAndAsyncShadow(t *testing.T) { svc := shadowTestService(t) svc.Optimizer = o info, err := svc.Optimizer.(*EnergyplanOptimizer).Health(context.Background()) - if err != nil || info.Name != "ftw-solver" || info.Version != "0.4.10" { + if err != nil || info.Name != "ftw-solver" || info.Version != "0.5.0" { t.Fatalf("bundled worker health: %+v %v", info, err) } start := time.Now().UTC().Truncate(time.Hour) diff --git a/optimizer/native/README.md b/optimizer/native/README.md index 2a1bd9b94..6619ec34a 100644 --- a/optimizer/native/README.md +++ b/optimizer/native/README.md @@ -8,7 +8,7 @@ The [Energyplan contract](../../docs/energyplan-contract.md) defines the shared planning and forecast boundary, result meanings, units and failure rules. Core owns it; Energyplan keeps an identical copy. -Energyplan 0.4.10 uses the Home Use Binary License in `bundle/LICENSE.txt`. It +Energyplan 0.5.0 uses the Home Use Binary License in `bundle/LICENSE.txt`. It permits private household use with FTW and free noncommercial redistribution for that use. Commercial use, OEM bundles, paid installation and services need a separate written license from Sourceful Labs AB. FTW's AGPL code has a diff --git a/optimizer/native/bundle/ftw-solver-darwin-arm64 b/optimizer/native/bundle/ftw-solver-darwin-arm64 index a9d718a49..74f1ae6d7 100755 Binary files a/optimizer/native/bundle/ftw-solver-darwin-arm64 and b/optimizer/native/bundle/ftw-solver-darwin-arm64 differ diff --git a/optimizer/native/bundle/ftw-solver-linux-amd64 b/optimizer/native/bundle/ftw-solver-linux-amd64 index f6853760d..3a3b70253 100755 Binary files a/optimizer/native/bundle/ftw-solver-linux-amd64 and b/optimizer/native/bundle/ftw-solver-linux-amd64 differ diff --git a/optimizer/native/bundle/ftw-solver-linux-arm64 b/optimizer/native/bundle/ftw-solver-linux-arm64 index 68f1bea0a..e6df0f0db 100755 Binary files a/optimizer/native/bundle/ftw-solver-linux-arm64 and b/optimizer/native/bundle/ftw-solver-linux-arm64 differ diff --git a/optimizer/native/bundle/manifest.json b/optimizer/native/bundle/manifest.json index ff77d9427..8f5a90f7f 100644 --- a/optimizer/native/bundle/manifest.json +++ b/optimizer/native/bundle/manifest.json @@ -1,9 +1,9 @@ { "schema_version": 1, "product": "energyplan", - "version": "0.4.10", + "version": "0.5.0", "source_repository": "srcfl/energyplan", - "source_commit": "2c8c777620036b6e5be8e2b17f79a0e3733e1100", + "source_commit": "4ad5804a9bbaabe3ddff0a64fff1009ed359f580", "rustc": "rustc 1.95.0 (59807616e 2026-04-14)", "protocol_version": 1, "forecast_protocol_version": 1, @@ -39,16 +39,16 @@ "bytes": 15377 }, "ftw-solver-darwin-arm64": { - "sha256": "927d82bba7bfa935c0165cf396a0e9abbee7df4d784567b0405b664dd76126aa", - "bytes": 1356016 + "sha256": "be7bdb3fb4dd0dd5d941c483bc5d29e4395fd0a09d10d9dbd86093da23d2188d", + "bytes": 1422560 }, "ftw-solver-linux-amd64": { - "sha256": "62fec8f22bbb3cea94d644b4cf8a102c6d33c0f76e2092f5dfbdf9f2b8b83566", - "bytes": 1751368 + "sha256": "63db6fdb40db1d8e2c992ff04393488ba8d19c9d1e124367b53dad73e045cb6c", + "bytes": 1819336 }, "ftw-solver-linux-arm64": { - "sha256": "92033f003014b2f56b104c2601fa45f91d972c5179880d45847c03190a92b6d6", - "bytes": 1405744 + "sha256": "1294944402313bb42b504fad8b1687015415a3cf6f27c45761b6cffd40e98e0b", + "bytes": 1457536 }, "rust-runtime/COPYRIGHT-library.html": { "sha256": "90567e2718bf7fd65a71a3a43c5596488e80e5f51ed02bfea6fec54458b5f3d1",