From 3d75b91909255cb16c46fafe8116c01923d88c6f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 16 Oct 2026 09:39:59 +0000 Subject: [PATCH] chore(release): version packages --- .changeset/bundle-vehicle-drivers.md | 5 ----- .changeset/car-contract.md | 5 ----- .changeset/car-says-plugged-here.md | 5 ----- .changeset/cars-in-core.md | 5 ----- .changeset/caution-off-visible.md | 5 ----- .changeset/cloud-quic.md | 5 ----- .changeset/send-on-arrival.md | 5 ----- CHANGELOG.md | 15 +++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 10 files changed, 18 insertions(+), 38 deletions(-) delete mode 100644 .changeset/bundle-vehicle-drivers.md delete mode 100644 .changeset/car-contract.md delete mode 100644 .changeset/car-says-plugged-here.md delete mode 100644 .changeset/cars-in-core.md delete mode 100644 .changeset/caution-off-visible.md delete mode 100644 .changeset/cloud-quic.md delete mode 100644 .changeset/send-on-arrival.md diff --git a/.changeset/bundle-vehicle-drivers.md b/.changeset/bundle-vehicle-drivers.md deleted file mode 100644 index b2e682381..000000000 --- a/.changeset/bundle-vehicle-drivers.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Bundle the vehicle drivers that say where a car is plugged in: `home_assistant_vehicle` (new: a car's level, cable and place from a Home Assistant automation over MQTT), `tesla_cloud`, `teslamate_vehicle` and `vag_vehicle`, and the updated `tesla_vehicle`. They report the charge cable, and where they can, whether the car is at this site, so the box can name the plugged-in car by its own word. A car at 1 % no longer reads as full. They do nothing until configured, and none wakes a car. diff --git a/.changeset/car-contract.md b/.changeset/car-contract.md deleted file mode 100644 index 2aec165ee..000000000 --- a/.changeset/car-contract.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -The contract names cars apart from chargers: the car's fields, where its level comes from, how the box knows which car is on a charger, the car ops, the `car.which` push and FTW Cloud's `car` class with an opaque car id. docs/cars.md describes them. The box does not keep cars yet. diff --git a/.changeset/car-says-plugged-here.md b/.changeset/car-says-plugged-here.md deleted file mode 100644 index 92382838d..000000000 --- a/.changeset/car-says-plugged-here.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -A car can say it was plugged in here. Vehicle drivers may report when their source read the car's cable go in (`plugged_since_ms`) and how far the car is from the site (`site_distance_m`; up to 300 m is here, over 5 km is elsewhere). `host.site_location()` gives the site's position to a signed vehicle driver, so the car's coordinates stay in the driver; Home Assistant's `vehicle_json` leaves out where the car is. The box names a car by its own word even when the report arrives late, but not when two chargers saw a plug-in in the same minute, and never a car that was read elsewhere after the plug-in. A reading from before the plug-in no longer makes the only car a visitor, and a tap over the box's visitor verdict stays. The driver card shows a car's level in percent when the driver sends a fraction. diff --git a/.changeset/cars-in-core.md b/.changeset/cars-in-core.md deleted file mode 100644 index 2e2adcf14..000000000 --- a/.changeset/cars-in-core.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -The box keeps cars apart from its chargers. A car's level is its own: a reading from the car stays exact until 1 kWh has reached it, however old the reading, so a nine-minute-old 14 % with nothing delivered since shows as "from the car". The box knows which car is on a charger from the charger's identifier, the car's own report, the only car, or one tap after it asks (`car.which`), and the plan takes that car's capacity, goal, surplus choice and power limit. On first start the box makes Car 1 from each charger's settings and a car from each vehicle profile, and binds each vehicle driver by VIN or to the only car. The charger routes and ops act on the session's car for this release, so apps already installed keep working. diff --git a/.changeset/caution-off-visible.md b/.changeset/caution-off-visible.md deleted file mode 100644 index 27a5e103d..000000000 --- a/.changeset/caution-off-visible.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -When the planning style asks for forecast caution and the plan has to use the point forecast instead, the plan now says so: the box page shows "Caution off" and the app's plan message carries `cautionOff`. It clears once caution works again. A cautious plan is no longer refused just because the car charges while the battery discharges: dispatch already keeps the battery off a protected car. With a car plugged in, an accepted cautious plan now takes one Energyplan solve instead of two; a refused one still takes two. The forecast archive no longer credits the live meter's current load to Core's recovery, and a lasting caution fault no longer rewrites its failure record on every replan. diff --git a/.changeset/cloud-quic.md b/.changeset/cloud-quic.md deleted file mode 100644 index ebe6e17b4..000000000 --- a/.changeset/cloud-quic.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -The FTW Cloud uplink tries QUIC on UDP 443 first and falls back to the WebSocket when UDP does not get through within 250 ms, remembering per network which one opened. A QUIC session that ends before `hello_ok`, or that the path drops within a minute of it, puts the WebSocket first on that network for a day. Over QUIC, `hb` and a `live` without its source table go as datagrams, and the tunnel's bulk on a stream of its own, so history never holds up a command. Noise sessions accept frames up to 1024 out of order, since bulk can overtake lane 0. `GET /api/cloud` says which transport carries the link. The registry names them in `cloud_transports`. diff --git a/.changeset/send-on-arrival.md b/.changeset/send-on-arrival.md deleted file mode 100644 index 2d9ecd760..000000000 --- a/.changeset/send-on-arrival.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -A phone whose session runs through FTW Cloud now gets a frame as each driver poll lands, instead of on the box's next one-second pulse, with a beat each second when no poll comes. A frame goes on every poll whether or not a value changed, so its timing shows the poll rhythm and never which reading moved. While a phone watches, the readable copy's `live` also goes when a reading lands, still at most once a second. Sessions over the relay keep their fixed cadence. Lane 0's invariant changes from "fixed length and cadence" to "fixed length; fixed cadence over the relay". diff --git a/CHANGELOG.md b/CHANGELOG.md index 93dfe83fc..1cc21d0e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +## 0.145.0 + +### Minor Changes + +- f206613: Bundle the vehicle drivers that say where a car is plugged in: `home_assistant_vehicle` (new: a car's level, cable and place from a Home Assistant automation over MQTT), `tesla_cloud`, `teslamate_vehicle` and `vag_vehicle`, and the updated `tesla_vehicle`. They report the charge cable, and where they can, whether the car is at this site, so the box can name the plugged-in car by its own word. A car at 1 % no longer reads as full. They do nothing until configured, and none wakes a car. +- 4675e4d: A car can say it was plugged in here. Vehicle drivers may report when their source read the car's cable go in (`plugged_since_ms`) and how far the car is from the site (`site_distance_m`; up to 300 m is here, over 5 km is elsewhere). `host.site_location()` gives the site's position to a signed vehicle driver, so the car's coordinates stay in the driver; Home Assistant's `vehicle_json` leaves out where the car is. The box names a car by its own word even when the report arrives late, but not when two chargers saw a plug-in in the same minute, and never a car that was read elsewhere after the plug-in. A reading from before the plug-in no longer makes the only car a visitor, and a tap over the box's visitor verdict stays. The driver card shows a car's level in percent when the driver sends a fraction. +- b568635: The box keeps cars apart from its chargers. A car's level is its own: a reading from the car stays exact until 1 kWh has reached it, however old the reading, so a nine-minute-old 14 % with nothing delivered since shows as "from the car". The box knows which car is on a charger from the charger's identifier, the car's own report, the only car, or one tap after it asks (`car.which`), and the plan takes that car's capacity, goal, surplus choice and power limit. On first start the box makes Car 1 from each charger's settings and a car from each vehicle profile, and binds each vehicle driver by VIN or to the only car. The charger routes and ops act on the session's car for this release, so apps already installed keep working. +- 4a1d81d: A phone whose session runs through FTW Cloud now gets a frame as each driver poll lands, instead of on the box's next one-second pulse, with a beat each second when no poll comes. A frame goes on every poll whether or not a value changed, so its timing shows the poll rhythm and never which reading moved. While a phone watches, the readable copy's `live` also goes when a reading lands, still at most once a second. Sessions over the relay keep their fixed cadence. Lane 0's invariant changes from "fixed length and cadence" to "fixed length; fixed cadence over the relay". + +### Patch Changes + +- d232ddb: The contract names cars apart from chargers: the car's fields, where its level comes from, how the box knows which car is on a charger, the car ops, the `car.which` push and FTW Cloud's `car` class with an opaque car id. docs/cars.md describes them. The box does not keep cars yet. +- d9d7b0a: When the planning style asks for forecast caution and the plan has to use the point forecast instead, the plan now says so: the box page shows "Caution off" and the app's plan message carries `cautionOff`. It clears once caution works again. A cautious plan is no longer refused just because the car charges while the battery discharges: dispatch already keeps the battery off a protected car. With a car plugged in, an accepted cautious plan now takes one Energyplan solve instead of two; a refused one still takes two. The forecast archive no longer credits the live meter's current load to Core's recovery, and a lasting caution fault no longer rewrites its failure record on every replan. +- 8fdc990: The FTW Cloud uplink tries QUIC on UDP 443 first and falls back to the WebSocket when UDP does not get through within 250 ms, remembering per network which one opened. A QUIC session that ends before `hello_ok`, or that the path drops within a minute of it, puts the WebSocket first on that network for a day. Over QUIC, `hb` and a `live` without its source table go as datagrams, and the tunnel's bulk on a stream of its own, so history never holds up a command. Noise sessions accept frames up to 1024 out of order, since bulk can overtake lane 0. `GET /api/cloud` says which transport carries the link. The registry names them in `cloud_transports`. + ## 0.144.1 ### Patch Changes diff --git a/package-lock.json b/package-lock.json index 032e75cf0..91d46b46d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ftw", - "version": "0.144.1", + "version": "0.145.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ftw", - "version": "0.144.1", + "version": "0.145.0", "license": "SEE LICENSE IN LICENSE", "devDependencies": { "@changesets/cli": "^3.0.3" diff --git a/package.json b/package.json index 15c974606..d157b2b79 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ftw", - "version": "0.144.1", + "version": "0.145.0", "private": true, "type": "module", "description": "FTW — local-first home energy coordination. Version metadata only; the runtime is Go and the mathematical planner is the compiled Energyplan worker.",