Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for sending Wake-On-LAN magic packets."""
2 
3 from functools import partial
4 import logging
5 
6 import voluptuous as vol
7 import wakeonlan
8 
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.const import CONF_BROADCAST_ADDRESS, CONF_BROADCAST_PORT, CONF_MAC
11 from homeassistant.core import HomeAssistant, ServiceCall
13 from homeassistant.helpers.typing import ConfigType
14 
15 from .const import DOMAIN, PLATFORMS
16 
17 _LOGGER = logging.getLogger(__name__)
18 
19 SERVICE_SEND_MAGIC_PACKET = "send_magic_packet"
20 
21 WAKE_ON_LAN_SEND_MAGIC_PACKET_SCHEMA = vol.Schema(
22  {
23  vol.Required(CONF_MAC): cv.string,
24  vol.Optional(CONF_BROADCAST_ADDRESS): cv.string,
25  vol.Optional(CONF_BROADCAST_PORT): cv.port,
26  }
27 )
28 
29 CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN)
30 
31 
32 async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
33  """Set up the wake on LAN component."""
34 
35  async def send_magic_packet(call: ServiceCall) -> None:
36  """Send magic packet to wake up a device."""
37  mac_address = call.data.get(CONF_MAC)
38  broadcast_address = call.data.get(CONF_BROADCAST_ADDRESS)
39  broadcast_port = call.data.get(CONF_BROADCAST_PORT)
40 
41  service_kwargs = {}
42  if broadcast_address is not None:
43  service_kwargs["ip_address"] = broadcast_address
44  if broadcast_port is not None:
45  service_kwargs["port"] = broadcast_port
46 
47  _LOGGER.debug(
48  "Send magic packet to mac %s (broadcast: %s, port: %s)",
49  mac_address,
50  broadcast_address,
51  broadcast_port,
52  )
53 
54  await hass.async_add_executor_job(
55  partial(wakeonlan.send_magic_packet, mac_address, **service_kwargs)
56  )
57 
58  hass.services.async_register(
59  DOMAIN,
60  SERVICE_SEND_MAGIC_PACKET,
61  send_magic_packet,
62  schema=WAKE_ON_LAN_SEND_MAGIC_PACKET_SCHEMA,
63  )
64 
65  return True
66 
67 
68 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
69  """Set up a Wake on LAN component entry."""
70 
71  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
72  entry.async_on_unload(entry.add_update_listener(update_listener))
73  return True
74 
75 
76 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
77  """Unload a config entry."""
78  return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
79 
80 
81 async def update_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
82  """Handle options update."""
83  await hass.config_entries.async_reload(entry.entry_id)
bool async_setup(HomeAssistant hass, ConfigType config)
Definition: __init__.py:32
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:68
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:76
None update_listener(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:81