Make TrackerEntity in_zones win over lat/long (#172313)

This commit is contained in:
Erik Montnemery
2026-05-27 11:27:34 +02:00
committed by GitHub
parent 00a0fae7bc
commit 7feaf71b9e
3 changed files with 31 additions and 13 deletions
@@ -221,8 +221,8 @@ class TrackerEntity(
"""Return the entity_id of zones the device is currently in.
The list may be in any order; the base class sorts it by zone radius
and discards zones which do not exist. Ignored if latitude and
longitude are both set.
and discards zones which do not exist. Takes precedence over latitude
and longitude when set (including when set to an empty list).
"""
return self._attr_in_zones
@@ -252,11 +252,7 @@ class TrackerEntity(
@callback
def _async_write_ha_state(self) -> None:
"""Calculate active zones."""
if self.available and self.latitude is not None and self.longitude is not None:
self.__active_zone, self.__in_zones = zone.async_in_zones(
self.hass, self.latitude, self.longitude, self.location_accuracy
)
elif (zones := self.in_zones) is not None:
if (zones := self.in_zones) is not None:
zone_states = sorted(
(
zone_state
@@ -270,6 +266,12 @@ class TrackerEntity(
None,
)
self.__in_zones = [z.entity_id for z in zone_states]
elif (
self.available and self.latitude is not None and self.longitude is not None
):
self.__active_zone, self.__in_zones = zone.async_in_zones(
self.hass, self.latitude, self.longitude, self.location_accuracy
)
else:
self.__active_zone = None
self.__in_zones = None
+19 -3
View File
@@ -683,15 +683,31 @@ async def test_load_unload_entry_tracker(
None,
1.0,
2.0,
STATE_HOME,
{
ATTR_SOURCE_TYPE: SourceType.GPS,
ATTR_GPS_ACCURACY: 0,
ATTR_IN_ZONES: ["zone.home"],
ATTR_LATITUDE: 1.0,
ATTR_LONGITUDE: 2.0,
},
id="in_zones_wins_over_lat_long",
),
pytest.param(
None,
[],
None,
50.0,
60.0,
STATE_NOT_HOME,
{
ATTR_SOURCE_TYPE: SourceType.GPS,
ATTR_GPS_ACCURACY: 0,
ATTR_IN_ZONES: [],
ATTR_LATITUDE: 1.0,
ATTR_LONGITUDE: 2.0,
ATTR_LATITUDE: 50.0,
ATTR_LONGITUDE: 60.0,
},
id="in_zones_ignored_when_lat_long_set",
id="empty_in_zones_wins_over_lat_long",
),
pytest.param(
None,
@@ -172,16 +172,16 @@ async def setup_zone(hass: HomeAssistant) -> None:
{"in_zones": []},
"not_home",
),
# in_zones + gps: gps wins, in_zones recomputed from coordinates
# in_zones + gps: in_zones wins, gps coordinates still reported as attributes
(
{"gps": [10, 20], "in_zones": ["zone.school"]},
{
"latitude": 10,
"longitude": 20,
"gps_accuracy": 30,
"in_zones": ["zone.home"],
"in_zones": ["zone.school"],
},
"home",
"School",
),
],
)