diff --git a/.changeset/accept-canonical-driver-names.md b/.changeset/accept-canonical-driver-names.md deleted file mode 100644 index 70437f99..00000000 --- a/.changeset/accept-canonical-driver-names.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Accept the canonical driver spellings alongside the current ones, so srcfl/device-drivers can convert its catalog one driver at a time without any site losing telemetry. `host.emit` reads `W` and `SoC_nom_fract` when `w` and `soc` are absent, and `write`, `write_registers` and `now_ms` are registered as aliases of `modbus_write`, `modbus_write_multi` and `millis`. Nothing is removed; the older names keep working until the catalog has moved. diff --git a/.changeset/add-blixt-nameplate-host-calls.md b/.changeset/add-blixt-nameplate-host-calls.md deleted file mode 100644 index f26f2f9a..00000000 --- a/.changeset/add-blixt-nameplate-host-calls.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Add the four Blixt L1 host services FTW was still missing, so a driver converted in `srcfl/device-drivers` runs here unchanged. `host.set_model(name)` and `host.set_rated_w(watts)` record the rest of the nameplate beside make and serial, and the host repeats both on every emit so they reach Nova's `model` and `rated_power_w` without the driver restating them each poll. `host.set_warmup_s(seconds)` holds off the first poll for a device that answers Modbus before its registers are meaningful. `host.decode_string(registers, start, count)` reads ASCII from a register block — two characters per register, high byte first, trailing padding stripped — replacing the byte loop a dozen catalog drivers hand-roll. Nothing is removed and no existing driver behaves differently. diff --git a/.changeset/add-home-link-four-reads.md b/.changeset/add-home-link-four-reads.md deleted file mode 100644 index f62711ed..00000000 --- a/.changeset/add-home-link-four-reads.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Add encrypted Home Link sessions for four bounded, read-only Core views with session-bound one-use grants. diff --git a/.changeset/add-home-link-relay.md b/.changeset/add-home-link-relay.md deleted file mode 100644 index 0e462723..00000000 --- a/.changeset/add-home-link-relay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Add the first Home Link remote transport: a strict versioned wire and a separate invite-only relay that forwards only encrypted session frames. diff --git a/.changeset/bundle-drivers-from-device-drivers.md b/.changeset/bundle-drivers-from-device-drivers.md deleted file mode 100644 index 8125ae86..00000000 --- a/.changeset/bundle-drivers-from-device-drivers.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -The bundled `drivers/` tree is now a generated snapshot of srcfl/device-drivers, pinned by commit, with CI failing if the two drift. It had become a second source of truth and had already diverged: a Sungrow fix landed upstream while the bundled copy kept reading a battery block on inverters that have no battery, which is what took a customer's SG12RT offline. That copy is now correct, and cannot silently fall behind again. diff --git a/.changeset/driver-versions-and-override-visibility.md b/.changeset/driver-versions-and-override-visibility.md deleted file mode 100644 index 91e917ea..00000000 --- a/.changeset/driver-versions-and-override-visibility.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Pick which driver version runs, and see when your own copy has fallen behind. The signed channel keeps every version it has ever published, but rollback only stepped back one, so a specific older version was out of reach from the UI. Each managed driver now has a Versions list showing what is downloaded, what the channel offers, and which one is live. A driver you supply yourself is now also told when the channel has something newer — your copy keeps running until you decide otherwise. diff --git a/.changeset/fix-home-link-route-handle.md b/.changeset/fix-home-link-route-handle.md deleted file mode 100644 index 7b648f19..00000000 --- a/.changeset/fix-home-link-route-handle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Accept the shipped Home Link route-handle format in remote browser invites. diff --git a/.changeset/fix-home-link-session-clock-skew.md b/.changeset/fix-home-link-session-clock-skew.md deleted file mode 100644 index c7490c11..00000000 --- a/.changeset/fix-home-link-session-clock-skew.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Fix Home Link sessions being rejected over a few milliseconds of clock difference between the gateway and the browser. A gateway now issues a session lifetime below the verifier ceiling, so remote passkey access works instead of failing with "Could not reach this home". Reads also reopen a bounded session instead of leaving the page dead until a reload, and a failed session or read now states its cause. diff --git a/.changeset/map-rated-power-key.md b/.changeset/map-rated-power-key.md deleted file mode 100644 index 807afc75..00000000 --- a/.changeset/map-rated-power-key.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Map `rated_W`, `rated_power_W` and `rated_w` onto `rated_power_w`, the name `nova.DerTelemetry` reads. None of the three was mapped, so a device's rated AC power has never reached Nova — including from our own `zap.lua`, which emits `rated_power_W`. diff --git a/.changeset/normalize-telemetry-keys.md b/.changeset/normalize-telemetry-keys.md deleted file mode 100644 index 44fd9d0d..00000000 --- a/.changeset/normalize-telemetry-keys.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Map driver emit keys onto the names the Nova payload reads. Catalog drivers emit `import_wh`, `export_wh`, `charge_wh`, `discharge_wh`, `lifetime_wh` and `hz`, while `DerTelemetry` reads `total_import_wh`, `total_export_wh`, `total_charge_wh`, `total_discharge_wh`, `total_generation_wh` and `freq_hz` — so those values never left the gateway. The canonical `@srcful/data-models` spellings map onto the same names, so the driver catalog can convert without a further host change. diff --git a/.changeset/refresh-x-net-security.md b/.changeset/refresh-x-net-security.md deleted file mode 100644 index abc3b27e..00000000 --- a/.changeset/refresh-x-net-security.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Update Go network dependencies to include current DNS parser security fixes. diff --git a/.changeset/remote-home-link-beta.md b/.changeset/remote-home-link-beta.md deleted file mode 100644 index 45faab05..00000000 --- a/.changeset/remote-home-link-beta.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Add opt-in Home Link remote access with local passkey setup, end-to-end encrypted relay sessions, and four bounded read-only views. diff --git a/.changeset/secure-local-home-link-passkeys.md b/.changeset/secure-local-home-link-passkeys.md deleted file mode 100644 index 22535162..00000000 --- a/.changeset/secure-local-home-link-passkeys.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Add local, revocable Home Link passkey enrollment and verification. diff --git a/.changeset/show-driver-verification-when-picking.md b/.changeset/show-driver-verification-when-picking.md deleted file mode 100644 index daa85682..00000000 --- a/.changeset/show-driver-verification-when-picking.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": minor ---- - -Setup now says how well tested a driver is before you pick one. The signed channel carries drivers that have run on customer sites for months alongside ones nobody has put on hardware, and both used to be described identically. Each option now ends in plain words — verified on hardware, in testing, untested — and selecting one shows its version, whether it came from your own override, the signed channel or this build, and what the driver says about its own testing. diff --git a/.changeset/show-home-link-overview.md b/.changeset/show-home-link-overview.md deleted file mode 100644 index 3c6cb2ce..00000000 --- a/.changeset/show-home-link-overview.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ftw": patch ---- - -Show Home Link as a readable remote energy overview instead of raw JSON, and fix its light and dark theme colours. diff --git a/CHANGELOG.md b/CHANGELOG.md index f2d8fc70..b7ba0de6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,28 @@ # Changelog +## 1.12.0 + +### Minor Changes + +- 86a6c83: Accept the canonical driver spellings alongside the current ones, so srcfl/device-drivers can convert its catalog one driver at a time without any site losing telemetry. `host.emit` reads `W` and `SoC_nom_fract` when `w` and `soc` are absent, and `write`, `write_registers` and `now_ms` are registered as aliases of `modbus_write`, `modbus_write_multi` and `millis`. Nothing is removed; the older names keep working until the catalog has moved. +- 7673003: Add the four Blixt L1 host services FTW was still missing, so a driver converted in `srcfl/device-drivers` runs here unchanged. `host.set_model(name)` and `host.set_rated_w(watts)` record the rest of the nameplate beside make and serial, and the host repeats both on every emit so they reach Nova's `model` and `rated_power_w` without the driver restating them each poll. `host.set_warmup_s(seconds)` holds off the first poll for a device that answers Modbus before its registers are meaningful. `host.decode_string(registers, start, count)` reads ASCII from a register block — two characters per register, high byte first, trailing padding stripped — replacing the byte loop a dozen catalog drivers hand-roll. Nothing is removed and no existing driver behaves differently. +- a5a797e: Add encrypted Home Link sessions for four bounded, read-only Core views with session-bound one-use grants. +- e1d8055: Add the first Home Link remote transport: a strict versioned wire and a separate invite-only relay that forwards only encrypted session frames. +- 25c5604: Pick which driver version runs, and see when your own copy has fallen behind. The signed channel keeps every version it has ever published, but rollback only stepped back one, so a specific older version was out of reach from the UI. Each managed driver now has a Versions list showing what is downloaded, what the channel offers, and which one is live. A driver you supply yourself is now also told when the channel has something newer — your copy keeps running until you decide otherwise. +- a5f9c23: Add opt-in Home Link remote access with local passkey setup, end-to-end encrypted relay sessions, and four bounded read-only views. +- 1418c00: Add local, revocable Home Link passkey enrollment and verification. +- f83c6df: Setup now says how well tested a driver is before you pick one. The signed channel carries drivers that have run on customer sites for months alongside ones nobody has put on hardware, and both used to be described identically. Each option now ends in plain words — verified on hardware, in testing, untested — and selecting one shows its version, whether it came from your own override, the signed channel or this build, and what the driver says about its own testing. + +### Patch Changes + +- c1c9fd6: The bundled `drivers/` tree is now a generated snapshot of srcfl/device-drivers, pinned by commit, with CI failing if the two drift. It had become a second source of truth and had already diverged: a Sungrow fix landed upstream while the bundled copy kept reading a battery block on inverters that have no battery, which is what took a customer's SG12RT offline. That copy is now correct, and cannot silently fall behind again. +- f1bd56f: Accept the shipped Home Link route-handle format in remote browser invites. +- 1efb08e: Fix Home Link sessions being rejected over a few milliseconds of clock difference between the gateway and the browser. A gateway now issues a session lifetime below the verifier ceiling, so remote passkey access works instead of failing with "Could not reach this home". Reads also reopen a bounded session instead of leaving the page dead until a reload, and a failed session or read now states its cause. +- b641b2c: Map `rated_W`, `rated_power_W` and `rated_w` onto `rated_power_w`, the name `nova.DerTelemetry` reads. None of the three was mapped, so a device's rated AC power has never reached Nova — including from our own `zap.lua`, which emits `rated_power_W`. +- d39ace3: Map driver emit keys onto the names the Nova payload reads. Catalog drivers emit `import_wh`, `export_wh`, `charge_wh`, `discharge_wh`, `lifetime_wh` and `hz`, while `DerTelemetry` reads `total_import_wh`, `total_export_wh`, `total_charge_wh`, `total_discharge_wh`, `total_generation_wh` and `freq_hz` — so those values never left the gateway. The canonical `@srcful/data-models` spellings map onto the same names, so the driver catalog can convert without a further host change. +- bbc3f6e: Update Go network dependencies to include current DNS parser security fixes. +- b2993b5: Show Home Link as a readable remote energy overview instead of raw JSON, and fix its light and dark theme colours. + ## 1.11.4 ### Patch Changes diff --git a/package-lock.json b/package-lock.json index 31c40b97..fd3320e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ftw", - "version": "1.11.4", + "version": "1.12.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ftw", - "version": "1.11.4", + "version": "1.12.0", "devDependencies": { "@changesets/cli": "^2.27.10" } diff --git a/package.json b/package.json index 1fd31cb1..208771b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ftw", - "version": "1.11.4", + "version": "1.12.0", "private": true, "type": "module", "description": "FTW — local-first home energy coordination. Version metadata only; the runtime is Go and the mathematical planner is Python/CVXPY.",