Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,17 @@ The **published MQTT payload contract** is versioned separately via
Additive, optional payload fields are backwards-compatible and do **not** bump
the major version; a removed/renamed/retyped field does.

## [0.2.37] — 2026-06-23
### Fixed
- Example dashboard: drone/operator map markers lingered at stale coordinates
after a track was gone. A Map marker only disappears when its entity goes
`unavailable`; the `Airspace Drone Operator` template sensor had no
`availability` clause (its `operator_id or 'operator'` state kept it
"available" forever), so the operator pin persisted indefinitely. Added an
availability gate to the operator sensor (live nearest drone **and** a
broadcast operator position) and tightened the aircraft/drone markers to also
require a non-null latitude, so markers clear when the service purges a track.

## [0.2.36] — 2026-06-22
### Added
- **Remote ID spoof detection (Tier 1).** New `enable_spoof_detection` toggle
Expand Down Expand Up @@ -220,4 +231,4 @@ Initial development. Established the full pipeline and contracts:
optional Prometheus `/metrics`.
- Pydantic v2 config (strict, fail-fast), structlog logging.

[Unreleased]: https://github.com/ifnull/ha-airspace/compare/v0.2.36...HEAD
[Unreleased]: https://github.com/ifnull/ha-airspace/compare/v0.2.37...HEAD
2 changes: 1 addition & 1 deletion addon/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# Display name is "Airspace" (friendly, matches the MQTT device); the slug,
# package, repo, and image names stay ha-airspace as the technical identity.
name: Airspace
version: "0.2.36"
version: "0.2.37"
slug: ha_airspace
description: >-
Multi-source ADS-B + drone Remote ID enrichment to MQTT for Home Assistant.
Expand Down
22 changes: 19 additions & 3 deletions docs/dashboard.example.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -377,10 +377,17 @@ views:
# template:
# - sensor:
# # Aircraft: ✈️ by default, 🚁 for rotorcraft (emitter category A7).
# # NOTE on `availability`: a Map marker only disappears when its entity
# # goes `unavailable`. The source sensors clear (go unavailable) once the
# # service purges a track, so each template sensor MUST gate availability
# # on its source having a live position — otherwise the marker lingers on
# # the map at its last coordinates after the aircraft/drone is gone.
# - name: Airspace Aircraft Map
# unique_id: airspace_aircraft_map
# state: "{{ states('sensor.airspace_nearest_aircraft') }}"
# availability: "{{ states('sensor.airspace_nearest_aircraft') not in ['unknown','unavailable'] }}"
# availability: >-
# {{ states('sensor.airspace_nearest_aircraft') not in ['unknown','unavailable']
# and state_attr('sensor.airspace_nearest_aircraft','latitude') is not none }}
# icon: >-
# {{ 'mdi:helicopter' if state_attr('sensor.airspace_nearest_aircraft','category') == 'A7' else 'mdi:airplane' }}
# attributes:
Expand All @@ -390,15 +397,24 @@ views:
# - name: Airspace Drone Map
# unique_id: airspace_drone_map
# state: "{{ states('sensor.airspace_nearest_drone') }}"
# availability: "{{ states('sensor.airspace_nearest_drone') not in ['unknown','unavailable'] }}"
# availability: >-
# {{ states('sensor.airspace_nearest_drone') not in ['unknown','unavailable']
# and state_attr('sensor.airspace_nearest_drone','latitude') is not none }}
# icon: mdi:controller-classic
# attributes:
# latitude: "{{ state_attr('sensor.airspace_nearest_drone','latitude') }}"
# longitude: "{{ state_attr('sensor.airspace_nearest_drone','longitude') }}"
# # Drone OPERATOR location (the security-relevant marker).
# # Drone OPERATOR location (the security-relevant marker). Available only
# # when the nearest drone is live AND broadcast an operator position —
# # otherwise this pin would persist at stale coordinates (the operator_id
# # `or 'operator'` fallback keeps the sensor from going unavailable on its
# # own, so the availability gate is what clears the marker).
# - name: Airspace Drone Operator
# unique_id: airspace_drone_operator_map
# state: "{{ state_attr('sensor.airspace_nearest_drone','operator_id') or 'operator' }}"
# availability: >-
# {{ states('sensor.airspace_nearest_drone') not in ['unknown','unavailable']
# and state_attr('sensor.airspace_nearest_drone','operator_lat') is not none }}
# icon: mdi:account-alert
# attributes:
# latitude: "{{ state_attr('sensor.airspace_nearest_drone','operator_lat') }}"
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "ha-airspace"
version = "0.2.36"
version = "0.2.37"
description = "Multi-source ADS-B enrichment service: aircraft.json → MQTT → Home Assistant."
readme = "README.md"
requires-python = ">=3.12"
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading