• v1.30.0 944860dcae

    v1.30.0
    All checks were successful
    CI / Rust clippy (push) Successful in 1m41s
    CI / Rust fmt (push) Successful in 1m5s
    CI / Rust test (push) Successful in 5m56s
    CI / UI (SvelteKit) (push) Successful in 1m10s
    CI / Security Audit (push) Successful in 1m14s
    docs / build (push) Successful in 23m53s
    Release / Docker Multi-Arch (push) Successful in 23m32s
    Release / Binary aarch64-unknown-linux-gnu (push) Successful in 12m29s
    Release / Binary x86_64-unknown-linux-gnu (push) Successful in 10m35s
    Release / Linux .deb + .rpm (amd64) (push) Successful in 2m4s
    Release / Linux .deb + .rpm (arm64) (push) Successful in 1m49s
    Release / Linux AppImage (aarch64) (push) Successful in 19s
    Release / Linux AppImage (x86_64) (push) Successful in 20s
    Release / Cosign sign artifacts (push) Successful in 19s
    Release / Forgejo Release (push) Successful in 31s
    Stable

    dvb-projekt released this 2026-09-11 15:06:13 +00:00 | 262 commits to main since this release

    Added

    • Battery as its own energy origin. The energy card and the period
      overview now split the pool's kilowatt-hours three ways — solar, battery
      and grid — instead of two. Battery means solar that was stored during
      the day and consumed later; until now every one of those evening
      kilowatt-hours was booked as grid power, because the old check only
      compared production against load — with the sun down, production is zero
      and everything looks like grid. Battery kWh are priced like solar kWh
      (at nothing), so the cost figures drop accordingly.
      The attribution is marginal: the miners are the last consumer
      switched on, so their energy is charged against grid import first, then
      the battery, then direct PV — what would stop flowing if you unplugged
      them. The house average would credit the pool with stored solar that it
      did not actually free up.
    • scripts/anker-bridge.py reports the full power flows it already had in
      hand: battery_discharge_w, battery_charge_w, grid_w, feed_in_w
      and battery_soc_pct. New /raw.json diagnostic endpoint shows the
      power-related raw fields per Anker site — useful when Anker renames
      something, and it needs no second cloud login (the Anker cloud allows
      only one token per account, so a debug script would lock the bridge
      out).
    • Home Assistant provider: optional battery_discharge_entity_id,
      battery_charge_entity_id, grid_entity_id, feed_in_entity_id and
      battery_soc_entity_id — editable in the setup wizard and under
      Admin → Profile → Photovoltaics (collapsed "Battery sensors" group), or
      straight in config.toml. A failing optional entity degrades to
      "no battery split" instead of killing the snapshot; clearing a field in
      the admin form switches that sensor off again.
    • /api/energy gained last_24h_battery_kwh, last_7d_battery_kwh,
      lifetime_battery_kwh, and the solar object now carries
      battery_discharge_w, battery_charge_w, battery_soc_pct and mix
      (the live supply mix, i.e. exactly how the current minute is booked).
      /api/overview/period gained energy_battery_kwh per bucket and
      total_battery_kwh.

    Changed

    • Energy attribution is proportional instead of all-or-nothing wherever
      the provider reports battery discharge
      : a minute whose marginal load
      spans two sources counts as exactly that, where a 5-minute bucket
      previously tipped onto whichever side held the majority of its minutes.
      Without battery data (no storage, entities not configured, stale
      snapshot) the old yes/no decision still applies — but even those minutes
      are now summed individually instead of by bucket majority, so a bucket
      with 3 of 5 solar minutes reads 60 % solar rather than 100 %. Historic
      days outside the 7-day telemetry retention keep the split they were
      recorded with; the tariff decision (does PV surplus cover the pool?)
      stays a yes/no question and is unchanged.

    • Admin → Profile: the dvb-WarpTune card marks an empty sidecar URL and
      disables Save while the coupling is on — the server refuses that
      combination anyway, so the error no longer has to come back from the
      round trip.

    • scripts/setup-warptune.sh reads
      ~/Library/Application Support/dvb-WarpPool/warptune-push-token and
      writes it into the launchd plist as WARPTUNE_PUSH_TOKEN (plist stays
      0600), so the sidecar pushes its snapshot without a manual edit.

    Fixed

    • /api/overview/period priced all kilowatt-hours at the grid tariff,
      including self-generated ones — the week/month/year view charged for
      solar the energy card had already booked as free. Costs there now follow
      the grid share, matching /api/energy. Pools without PV are unaffected
      (grid share = total).
    • DB migration energy_battery_split_v1: solar_excess_minute gains
      share_solar/share_battery (NULL = fall back to the old boolean),
      daily_aggregates gains energy_battery_kwh. New lifetime carry key
      energy_lifetime_kwh_carry_battery.

    dvb-WarpPool v1.30.0 — Downloads

    Docker

    git.warppool.org/dvb-projekt/dvb-warppool:v1.30.0 (multi-arch amd64+arm64, ohne v-Präfix)

    Native packages

    • Linux .deb: amd64 + arm64 → apt install ./dvb-warppool_*.deb
    • Linux .rpm: amd64 + arm64 → dnf install ./dvb-warppool-*.rpm
    • Linux AppImage: x86_64 + aarch64 portable
    • Linux tarballs: x86_64 + aarch64 for manual installs
    • macOS .dmg: added shortly after publish (built separately) — or build from source
    • Windows .msi: paused since the forge migration (no Windows runner yet)

    Signatures

    • SHA256SUMS + cosign bundle (SHA256SUMS.bundle, project key)
    • SBOM (SPDX) for all dependencies

    Verify (project public key cosign.pub in the repo root):

    cosign verify-blob \
      --key cosign.pub \
      --bundle SHA256SUMS.bundle \
      SHA256SUMS
    sha256sum --check SHA256SUMS
    

    First-time setup: run dvb-warppool-setup for the first-run wizard.

    Downloads