Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Starlink reboot button #85729

Merged
merged 5 commits into from Jan 16, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion homeassistant/components/starlink/__init__.py
Expand Up @@ -8,7 +8,7 @@
from .const import DOMAIN
from .coordinator import StarlinkUpdateCoordinator

PLATFORMS: list[Platform] = [Platform.BINARY_SENSOR, Platform.SENSOR]
PLATFORMS: list[Platform] = [Platform.BINARY_SENSOR, Platform.BUTTON, Platform.SENSOR]


async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
Expand Down
76 changes: 76 additions & 0 deletions homeassistant/components/starlink/button.py
@@ -0,0 +1,76 @@
"""Contains buttons exposed by the Starlink ingegration."""
boswelja marked this conversation as resolved.
Show resolved Hide resolved

from __future__ import annotations

from collections.abc import Awaitable, Callable
from dataclasses import dataclass

from homeassistant.components.button import (
ButtonDeviceClass,
ButtonEntity,
ButtonEntityDescription,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from .const import DOMAIN
from .coordinator import StarlinkUpdateCoordinator
from .entity import StarlinkEntity


async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up all binary sensors for this entry."""
coordinator = hass.data[DOMAIN][entry.entry_id]

async_add_entities(
StarlinkButtonEntity(coordinator, description) for description in BUTTONS
)


@dataclass
class StarlinkButtonEntityDescriptionMixin:
"""Mixin for required keys."""

press_fn: Callable[[StarlinkUpdateCoordinator], Awaitable[None]]


@dataclass
class StarlinkButtonEntityDescription(
ButtonEntityDescription, StarlinkButtonEntityDescriptionMixin
):
"""Describes a Starlink button entity."""


class StarlinkButtonEntity(StarlinkEntity, ButtonEntity):
"""A ButtonEntity for Starlink devices. Handles creating unique IDs."""

entity_description: StarlinkButtonEntityDescription

def __init__(
self,
coordinator: StarlinkUpdateCoordinator,
description: StarlinkButtonEntityDescription,
) -> None:
"""Initialize the button."""
super().__init__(coordinator)
self.entity_description = description
self._attr_unique_id = f"{self.coordinator.data.status['id']}_{description.key}"
boswelja marked this conversation as resolved.
Show resolved Hide resolved

async def async_press(self) -> None:
"""Press the button."""
return await self.entity_description.press_fn(self.coordinator)


BUTTONS = [
StarlinkButtonEntityDescription(
key="reboot",
name="Reboot",
device_class=ButtonDeviceClass.RESTART,
entity_category=EntityCategory.DIAGNOSTIC,
press_fn=lambda coordinator: coordinator.reboot_starlink(),
)
]
9 changes: 9 additions & 0 deletions homeassistant/components/starlink/coordinator.py
Expand Up @@ -12,6 +12,7 @@
GrpcError,
ObstructionDict,
StatusDict,
reboot,
status_data,
)

Expand Down Expand Up @@ -53,3 +54,11 @@ async def _async_update_data(self) -> StarlinkData:
return StarlinkData(*status)
except GrpcError as exc:
raise UpdateFailed from exc

async def reboot_starlink(self):
"""Reboot the Starlink system tied to this coordinator."""
async with async_timeout.timeout(4):
try:
await self.hass.async_add_executor_job(reboot, self.channel_context)
except GrpcError as exc:
raise UpdateFailed from exc
boswelja marked this conversation as resolved.
Show resolved Hide resolved