diff --git a/.coveragerc b/.coveragerc index 4df91b250ed70d..686e3eaaadde62 100644 --- a/.coveragerc +++ b/.coveragerc @@ -654,6 +654,7 @@ omit = homeassistant/components/lg_soundbar/__init__.py homeassistant/components/lg_soundbar/media_player.py homeassistant/components/life360/__init__.py + homeassistant/components/life360/button.py homeassistant/components/life360/coordinator.py homeassistant/components/life360/device_tracker.py homeassistant/components/lightwave/* diff --git a/homeassistant/components/life360/__init__.py b/homeassistant/components/life360/__init__.py index 271f934e1c7d52..c6e0fad14c64ef 100644 --- a/homeassistant/components/life360/__init__.py +++ b/homeassistant/components/life360/__init__.py @@ -39,7 +39,7 @@ ) from .coordinator import Life360DataUpdateCoordinator, MissingLocReason -PLATFORMS = [Platform.DEVICE_TRACKER] +PLATFORMS = [Platform.DEVICE_TRACKER, Platform.BUTTON] CONF_ACCOUNTS = "accounts" diff --git a/homeassistant/components/life360/button.py b/homeassistant/components/life360/button.py new file mode 100644 index 00000000000000..6b460c8531c403 --- /dev/null +++ b/homeassistant/components/life360/button.py @@ -0,0 +1,56 @@ +"""Support for Life360 buttons.""" +from homeassistant.components.button import ButtonEntity +from homeassistant.config_entries import ConfigEntry +from homeassistant.core import HomeAssistant +from homeassistant.helpers.device_registry import DeviceInfo +from homeassistant.helpers.entity_platform import AddEntitiesCallback +from homeassistant.helpers.update_coordinator import CoordinatorEntity + +from . import Life360DataUpdateCoordinator +from .const import DOMAIN + + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: ConfigEntry, + async_add_entities: AddEntitiesCallback, +) -> None: + """Set up Life360 buttons.""" + coordinator: Life360DataUpdateCoordinator = hass.data[DOMAIN].coordinators[ + config_entry.entry_id + ] + for member_id, member in coordinator.data.members.items(): + async_add_entities( + [ + Life360UpdateLocationButton(coordinator, member.circle_id, member_id), + ] + ) + + +class Life360UpdateLocationButton( + CoordinatorEntity[Life360DataUpdateCoordinator], ButtonEntity +): + """Represent an Life360 Update Location button.""" + + _attr_has_entity_name = True + _attr_translation_key = "update_location" + + def __init__( + self, + coordinator: Life360DataUpdateCoordinator, + circle_id: str, + member_id: str, + ) -> None: + """Initialize a new Life360 Update Location button.""" + super().__init__(coordinator) + self._circle_id = circle_id + self._member_id = member_id + self._attr_unique_id = f"{member_id}-update-location" + self._attr_device_info = DeviceInfo( + identifiers={(DOMAIN, member_id)}, + name=coordinator.data.members[member_id].name, + ) + + async def async_press(self) -> None: + """Handle the button press.""" + await self.coordinator.update_location(self._circle_id, self._member_id) diff --git a/homeassistant/components/life360/coordinator.py b/homeassistant/components/life360/coordinator.py index 5ea64d3f81d284..755fa1b812434d 100644 --- a/homeassistant/components/life360/coordinator.py +++ b/homeassistant/components/life360/coordinator.py @@ -65,6 +65,7 @@ class Life360Member: at_loc_since: datetime battery_charging: bool battery_level: int + circle_id: str driving: bool entity_picture: str gps_accuracy: int @@ -118,6 +119,10 @@ async def _retrieve_data(self, func: str, *args: Any) -> list[dict[str, Any]]: LOGGER.debug("%s: %s", exc.__class__.__name__, exc) raise UpdateFailed(exc) from exc + async def update_location(self, circle_id: str, member_id: str) -> None: + """Update location for given Circle and Member.""" + await self._retrieve_data("update_location", circle_id, member_id) + async def _async_update_data(self) -> Life360Data: """Get & process data from Life360.""" @@ -214,6 +219,7 @@ async def _async_update_data(self) -> Life360Data: dt_util.utc_from_timestamp(int(loc["since"])), bool(int(loc["charge"])), int(float(loc["battery"])), + circle_id, bool(int(loc["isDriving"])), member["avatar"], # Life360 reports accuracy in feet, but Device Tracker expects diff --git a/homeassistant/components/life360/strings.json b/homeassistant/components/life360/strings.json index cc31ca64a0870a..343d9e95bb84b0 100644 --- a/homeassistant/components/life360/strings.json +++ b/homeassistant/components/life360/strings.json @@ -27,6 +27,13 @@ "reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]" } }, + "entity": { + "button": { + "update_location": { + "name": "Update Location" + } + } + }, "options": { "step": { "init": {