Skip to content

Arrival and departure alerts, hide and join trips, APK and maintenance in the widget and Home Assistant, docs - #521

Merged
joszz merged 4 commits into
mainfrom
claude/gallant-rubin-ihbf2v
Oct 19, 2026
Merged

joszz merged 4 commits into
mainfrom
claude/gallant-rubin-ihbf2v

Conversation

@joszz

@joszz joszz commented Oct 19, 2026

Copy link
Copy Markdown
Owner

Pull Request

Summary

Three features from the project review, and the documentation batch (P4).

  • feat(notifications): arriving at and leaving home or work. A commute place gets Notify on arrival and departure (CommutePlace.Notify, off until switched on). place-departure goes out on the first position outside the place's radius after the engine started there, so warming the car up sends nothing; place-arrival on the position of the poll the car parked in, and not for a drive that never left the place it started in. Two new types each device can switch off, in English and Dutch. State lives in the Worker's PlaceAlerts, fed by TelemetryHandler.
  • feat(trip-log): hide a trip, and join two trips a short stop split. Trip.IsHidden keeps a trip out of the map, the statistics, the dashboard and the trip log's totals and export; it stays listed under Show hidden trips. POST .../trips/{id}/merge-next joins a trip with the next saved one in one transaction (fixes, end, odometer, end address, speed figures, notes); a purpose someone chose is kept, an automatic one is worked out again from the new ends.
  • feat(home-assistant): APK, recalls, next maintenance and last trip. VehicleFactsService works these out once; the Homepage widget serves them beside the telemetry, and HomeAssistantPublisher (Api) announces them over MQTT discovery on the car's existing device, with one retained state message per car on garagestack/<VIN>/state. A sensor with nothing to show gets an empty config, which removes it. The Home Assistant broker login may now read garagestack/#.
  • docs:
    • The OpenAPI document is served in every deployment at /api/openapi/v1.json to signed-in callers and read-only tokens.
    • pnpm screenshots retakes the gallery and the manifest's install screenshots from a demo stack. All were retaken (the old ones predate the current sidebar and the RDW card), and Climate schedules was added.
    • README sections for climate schedules and maintenance.
    • The all-in-one image's move to a new PostgreSQL major version.

For the release notes (Upgrade Notes): migrations AddCommutePlaceNotify and AddTripIsHidden (columns with defaults). A Home Assistant broker reached through a Mosquitto bridge needs topic garagestack/# in 0 added for GarageStack's own sensors (HOME_ASSISTANT.md).

Type of Change

  • Bug fix
  • New feature
  • Refactor / cleanup
  • Documentation
  • Dependency update
  • Other

Related Issues

Follows #519 and #520.

Checklist

  • Tests added or updated (place alerts over MQTT, hide and merge in the repository and through the demo stack, vehicle facts, widget fields, discovery payloads, the API reference, trip log store and item)
  • Linting passes (pnpm lint / dotnet build), plus dotnet format --verify-no-changes, has-pending-model-changes, shellcheck, 1458 backend and 1141 frontend tests
  • No secrets or personal data committed
  • Responsive on mobile (checked in the retaken phone screenshots)
  • i18n keys added for any new UI strings (en and nl, notifications and widget too)
  • If unraid/garagestack.xml changed: not changed

Also checked locally: the generated Mosquitto ACL against a real broker (the Home Assistant login reads garagestack/# and homeassistant/#, cannot overwrite the state, and an empty retained config removes a sensor). Not run here: the Docker images, the Playwright smoke tests, the all-in-one PostgreSQL upgrade steps, and the sensors in a real Home Assistant.


Generated by Claude Code

A home or work place with Notify switched on (off until asked for) sends
place-arrival when the car parks there, judged by the position of the poll it
parked in, and place-departure on the first position outside its radius after
the engine started there: warming the car up, or a drive that never leaves,
sends nothing. Both are types each device can switch off, in English and
Dutch. The AddCommutePlaceNotify migration adds the column.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6DtW2eHhipteRopmy3cif
A hidden trip (Trip.IsHidden, AddTripIsHidden migration) leaves the map, the
statistics, the dashboard and the trip log's totals and export, and stays
listed under Show hidden trips to show again; nothing is deleted. Join with
next trip (two taps) makes a trip and the saved trip after it one, from the
first one's start to the second one's end, with the second removed in the same
transaction. A purpose someone chose is kept; otherwise it is labelled again
from the new ends, so home to a fuel station to work becomes a commute.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6DtW2eHhipteRopmy3cif
…p, in the widget and Home Assistant

VehicleFactsService works out what only GarageStack knows about a car: the APK
and its days left, open recalls and insurance from the RDW, the maintenance item
due first, and the newest trip. The Homepage widget serves it beside the
telemetry, and HomeAssistantPublisher (Api) announces it over MQTT discovery on
the car's own device, with one retained state message per car on
garagestack/<VIN>/state; a sensor with nothing to show is removed. The Home
Assistant broker login may read garagestack/#, nothing more. Checked against a
real Mosquitto with the generated ACL.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6DtW2eHhipteRopmy3cif
…es and maintenance, and the PostgreSQL upgrade

- The OpenAPI document is served in every deployment at /api/openapi/v1.json,
  to whoever is signed in or holds a read-only token, and the README points
  token users at it instead of at the local demo.
- pnpm screenshots retakes the gallery and the manifest's install screenshots
  from a running demo stack; the gallery is retaken with it (the new sidebar,
  the RDW card, the trip log's hide and join) and gains Climate schedules.
- The README gets sections for climate schedules and maintenance, as the trip
  log and the RDW have.
- docker/all-in-one/README.md says how to move the bundled database to a new
  PostgreSQL major version by dump and restore, which the README links.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L6DtW2eHhipteRopmy3cif
@joszz
joszz enabled auto-merge October 19, 2026 20:16
@joszz
joszz merged commit 6fbf3cf into main Oct 19, 2026
21 checks passed
@joszz
joszz deleted the claude/gallant-rubin-ihbf2v branch October 19, 2026 20:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants