1 """Button platform for UniFi Network integration.
3 Support for restarting UniFi devices.
6 from __future__
import annotations
8 from collections.abc
import Callable, Coroutine
9 from dataclasses
import dataclass
11 from typing
import TYPE_CHECKING, Any
14 from aiounifi.interfaces.api_handlers
import ItemEvent
15 from aiounifi.interfaces.devices
import Devices
16 from aiounifi.interfaces.ports
import Ports
17 from aiounifi.interfaces.wlans
import Wlans
18 from aiounifi.models.api
import ApiItemT
19 from aiounifi.models.device
import (
21 DevicePowerCyclePortRequest,
24 from aiounifi.models.port
import Port
25 from aiounifi.models.wlan
import Wlan, WlanChangePasswordRequest
30 ButtonEntityDescription,
36 from .
import UnifiConfigEntry
40 UnifiEntityDescription,
41 async_device_available_fn,
42 async_device_device_info_fn,
43 async_wlan_available_fn,
44 async_wlan_device_info_fn,
48 from .hub
import UnifiHub
53 """Check if port allows power cycle action."""
56 return bool(hub.api.ports[obj_id].poe_enable)
60 api: aiounifi.Controller, obj_id: str
63 await api.request(DeviceRestartRequest.create(obj_id))
67 api: aiounifi.Controller, obj_id: str
70 mac, _, index = obj_id.partition(
"_")
71 await api.request(DevicePowerCyclePortRequest.create(mac,
int(index)))
75 api: aiounifi.Controller, obj_id: str
77 """Regenerate WLAN password."""
79 WlanChangePasswordRequest.create(obj_id, secrets.token_urlsafe(15))
83 @dataclass(frozen=True, kw_only=True)
85 ButtonEntityDescription, UnifiEntityDescription[HandlerT, ApiItemT]
87 """Class describing UniFi button entity."""
89 control_fn: Callable[[aiounifi.Controller, str], Coroutine[Any, Any,
None]]
92 ENTITY_DESCRIPTIONS: tuple[UnifiButtonEntityDescription, ...] = (
93 UnifiButtonEntityDescription[Devices, Device](
95 entity_category=EntityCategory.CONFIG,
96 device_class=ButtonDeviceClass.RESTART,
97 api_handler_fn=
lambda api: api.devices,
98 available_fn=async_device_available_fn,
99 control_fn=async_restart_device_control_fn,
100 device_info_fn=async_device_device_info_fn,
101 name_fn=
lambda _:
"Restart",
102 object_fn=
lambda api, obj_id: api.devices[obj_id],
103 unique_id_fn=
lambda hub, obj_id: f
"device_restart-{obj_id}",
105 UnifiButtonEntityDescription[Ports, Port](
106 key=
"PoE power cycle",
107 entity_category=EntityCategory.CONFIG,
108 device_class=ButtonDeviceClass.RESTART,
109 api_handler_fn=
lambda api: api.ports,
110 available_fn=async_port_power_cycle_available_fn,
111 control_fn=async_power_cycle_port_control_fn,
112 device_info_fn=async_device_device_info_fn,
113 name_fn=
lambda port: f
"{port.name} Power Cycle",
114 object_fn=
lambda api, obj_id: api.ports[obj_id],
115 supported_fn=
lambda hub, obj_id:
bool(hub.api.ports[obj_id].port_poe),
116 unique_id_fn=
lambda hub, obj_id: f
"power_cycle-{obj_id}",
118 UnifiButtonEntityDescription[Wlans, Wlan](
119 key=
"WLAN regenerate password",
120 translation_key=
"wlan_regenerate_password",
121 device_class=ButtonDeviceClass.UPDATE,
122 entity_category=EntityCategory.CONFIG,
123 entity_registry_enabled_default=
False,
124 api_handler_fn=
lambda api: api.wlans,
125 available_fn=async_wlan_available_fn,
126 control_fn=async_regenerate_password_control_fn,
127 device_info_fn=async_wlan_device_info_fn,
128 name_fn=
lambda wlan:
"Regenerate Password",
129 object_fn=
lambda api, obj_id: api.wlans[obj_id],
130 unique_id_fn=
lambda hub, obj_id: f
"regenerate_password-{obj_id}",
137 config_entry: UnifiConfigEntry,
138 async_add_entities: AddEntitiesCallback,
140 """Set up button platform for UniFi Network integration."""
141 config_entry.runtime_data.entity_loader.register_platform(
142 async_add_entities, UnifiButtonEntity, ENTITY_DESCRIPTIONS, requires_admin=
True
147 """Base representation of a UniFi button."""
149 entity_description: UnifiButtonEntityDescription[HandlerT, ApiItemT]
152 """Press the button."""
157 """Update entity state."""
None async_update_state(self, ItemEvent event, str obj_id)
bool async_device_available_fn(UnifiHub hub, str obj_id)