1 """Snapcast Integration."""
3 from __future__
import annotations
7 import snapcast.control
8 from snapcast.control.client
import Snapclient
15 from .media_player
import SnapcastClientDevice, SnapcastGroupDevice
17 _LOGGER = logging.getLogger(__name__)
21 """Snapcast server and data stored in the Home Assistant data object."""
28 server: snapcast.control.Snapserver,
32 """Initialize the HomeAssistantSnapcast object.
38 server : snapcast.control.Snapserver
50 self.hass: HomeAssistant = hass
51 self.server: snapcast.control.Snapserver = server
54 self.clients: list[SnapcastClientDevice] = []
55 self.groups: list[SnapcastGroupDevice] = []
56 self.hass_async_add_entities: AddEntitiesCallback
58 self.server.set_on_update_callback(self.
on_updateon_update)
59 self.server.set_on_connect_callback(self.
on_connecton_connect)
60 self.server.set_on_disconnect_callback(self.
on_disconnecton_disconnect)
61 self.server.set_new_client_callback(self.
on_add_clienton_add_client)
64 """Disconnect from server."""
65 self.server.set_on_update_callback(
None)
66 self.server.set_on_connect_callback(
None)
67 self.server.set_on_disconnect_callback(
None)
68 self.server.set_new_client_callback(
None)
72 """Update all entities.
74 Retrieve all groups/clients from server and add/update/delete entities.
76 if not self.hass_async_add_entities:
78 new_groups: list[MediaPlayerEntity] = []
79 groups: list[MediaPlayerEntity] = []
80 hass_groups = {g.identifier: g
for g
in self.groups}
81 for group
in self.server.groups:
82 if group.identifier
in hass_groups:
83 groups.append(hass_groups[group.identifier])
84 hass_groups[group.identifier].async_schedule_update_ha_state()
87 new_clients: list[MediaPlayerEntity] = []
88 clients: list[MediaPlayerEntity] = []
89 hass_clients = {c.identifier: c
for c
in self.clients}
90 for client
in self.server.clients:
91 if client.identifier
in hass_clients:
92 clients.append(hass_clients[client.identifier])
93 hass_clients[client.identifier].async_schedule_update_ha_state()
98 del_entities: list[MediaPlayerEntity] = [
99 x
for x
in self.groups
if x
not in groups
101 del_entities.extend([x
for x
in self.clients
if x
not in clients])
103 _LOGGER.debug(
"New clients: %s",
str([c.name
for c
in new_clients]))
104 _LOGGER.debug(
"New groups: %s",
str([g.name
for g
in new_groups]))
105 _LOGGER.debug(
"Delete: %s",
str(del_entities))
107 ent_reg = er.async_get(self.hass)
108 for entity
in del_entities:
109 ent_reg.async_remove(entity.entity_id)
110 self.hass_async_add_entities(new_clients + new_groups)
113 """Activate all entities and update."""
114 for client
in self.clients:
115 client.set_availability(
True)
116 for group
in self.groups:
117 group.set_availability(
True)
118 _LOGGER.debug(
"Server connected: %s", self.hpid)
122 """Deactivate all entities."""
123 for client
in self.clients:
124 client.set_availability(
False)
125 for group
in self.groups:
126 group.set_availability(
False)
128 "Server disconnected: %s. Trying to reconnect. %s", self.hpid,
str(ex
or "")
132 """Add a Snapcast client.
137 Snapcast client to be added to HA.
140 if not self.hass_async_add_entities:
143 self.hass_async_add_entities(clients)
None __init__(self, HomeAssistant hass, snapcast.control.Snapserver server, str hpid, str entry_id)
None on_disconnect(self, Exception|None ex)
None on_add_client(self, Snapclient client)