Partly migrate Plex to has entity name (#98841)

* Partly migrate Plex to has entity name

* Use friendly name for device name

* Lowercase
This commit is contained in:
Joost Lekkerkerker 2023-12-15 08:56:26 +01:00 committed by GitHub
parent 3f2fc2fce9
commit ef5d9d7377
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 34 additions and 30 deletions

View file

@ -9,12 +9,9 @@ from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.dispatcher import async_dispatcher_send from homeassistant.helpers.dispatcher import async_dispatcher_send
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import ( from . import PlexServer
CONF_SERVER, from .const import CONF_SERVER_IDENTIFIER, DOMAIN, PLEX_UPDATE_PLATFORMS_SIGNAL
CONF_SERVER_IDENTIFIER, from .helpers import get_plex_server
DOMAIN,
PLEX_UPDATE_PLATFORMS_SIGNAL,
)
async def async_setup_entry( async def async_setup_entry(
@ -24,22 +21,24 @@ async def async_setup_entry(
) -> None: ) -> None:
"""Set up Plex button from config entry.""" """Set up Plex button from config entry."""
server_id: str = config_entry.data[CONF_SERVER_IDENTIFIER] server_id: str = config_entry.data[CONF_SERVER_IDENTIFIER]
server_name: str = config_entry.data[CONF_SERVER] plex_server = get_plex_server(hass, server_id)
async_add_entities([PlexScanClientsButton(server_id, server_name)]) async_add_entities([PlexScanClientsButton(server_id, plex_server)])
class PlexScanClientsButton(ButtonEntity): class PlexScanClientsButton(ButtonEntity):
"""Representation of a scan_clients button entity.""" """Representation of a scan_clients button entity."""
_attr_entity_category = EntityCategory.CONFIG _attr_entity_category = EntityCategory.CONFIG
_attr_has_entity_name = True
_attr_translation_key = "scan_clients"
def __init__(self, server_id: str, server_name: str) -> None: def __init__(self, server_id: str, plex_server: PlexServer) -> None:
"""Initialize a scan_clients Plex button entity.""" """Initialize a scan_clients Plex button entity."""
self.server_id = server_id self.server_id = server_id
self._attr_name = f"Scan Clients ({server_name})"
self._attr_unique_id = f"plex-scan_clients-{self.server_id}" self._attr_unique_id = f"plex-scan_clients-{self.server_id}"
self._attr_device_info = DeviceInfo( self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, server_id)}, identifiers={(DOMAIN, server_id)},
name=plex_server.friendly_name,
manufacturer="Plex", manufacturer="Plex",
) )

View file

@ -17,7 +17,6 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import ( from .const import (
CONF_SERVER_IDENTIFIER, CONF_SERVER_IDENTIFIER,
DOMAIN, DOMAIN,
NAME_FORMAT,
PLEX_UPDATE_LIBRARY_SIGNAL, PLEX_UPDATE_LIBRARY_SIGNAL,
PLEX_UPDATE_SENSOR_SIGNAL, PLEX_UPDATE_SENSOR_SIGNAL,
) )
@ -71,13 +70,15 @@ async def async_setup_entry(
class PlexSensor(SensorEntity): class PlexSensor(SensorEntity):
"""Representation of a Plex now playing sensor.""" """Representation of a Plex now playing sensor."""
_attr_has_entity_name = True
_attr_name = None
_attr_icon = "mdi:plex"
_attr_should_poll = False
_attr_native_unit_of_measurement = "watching"
def __init__(self, hass, plex_server): def __init__(self, hass, plex_server):
"""Initialize the sensor.""" """Initialize the sensor."""
self._attr_icon = "mdi:plex"
self._attr_name = NAME_FORMAT.format(plex_server.friendly_name)
self._attr_should_poll = False
self._attr_unique_id = f"sensor-{plex_server.machine_identifier}" self._attr_unique_id = f"sensor-{plex_server.machine_identifier}"
self._attr_native_unit_of_measurement = "Watching"
self._server = plex_server self._server = plex_server
self.async_refresh_sensor = Debouncer( self.async_refresh_sensor = Debouncer(
@ -113,9 +114,6 @@ class PlexSensor(SensorEntity):
@property @property
def device_info(self) -> DeviceInfo | None: def device_info(self) -> DeviceInfo | None:
"""Return a device description for device registry.""" """Return a device description for device registry."""
if self.unique_id is None:
return None
return DeviceInfo( return DeviceInfo(
identifiers={(DOMAIN, self._server.machine_identifier)}, identifiers={(DOMAIN, self._server.machine_identifier)},
manufacturer="Plex", manufacturer="Plex",

View file

@ -57,6 +57,13 @@
} }
} }
}, },
"entity": {
"button": {
"scan_clients": {
"name": "Scan clients"
}
}
},
"services": { "services": {
"refresh_library": { "refresh_library": {
"name": "Refresh library", "name": "Refresh library",

View file

@ -30,7 +30,7 @@ async def test_scan_clients_button_schedule(
BUTTON_DOMAIN, BUTTON_DOMAIN,
SERVICE_PRESS, SERVICE_PRESS,
{ {
ATTR_ENTITY_ID: "button.scan_clients_plex_server_1", ATTR_ENTITY_ID: "button.plex_server_1_scan_clients",
}, },
True, True,
) )

View file

@ -120,7 +120,7 @@ async def test_setup_with_photo_session(
await wait_for_debouncer(hass) await wait_for_debouncer(hass)
sensor = hass.states.get("sensor.plex_plex_server_1") sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == "0" assert sensor.state == "0"
@ -142,7 +142,7 @@ async def test_setup_with_live_tv_session(
await wait_for_debouncer(hass) await wait_for_debouncer(hass)
sensor = hass.states.get("sensor.plex_plex_server_1") sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == "1" assert sensor.state == "1"
@ -164,7 +164,7 @@ async def test_setup_with_transient_session(
await wait_for_debouncer(hass) await wait_for_debouncer(hass)
sensor = hass.states.get("sensor.plex_plex_server_1") sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == "1" assert sensor.state == "1"
@ -186,7 +186,7 @@ async def test_setup_with_unknown_session(
await wait_for_debouncer(hass) await wait_for_debouncer(hass)
sensor = hass.states.get("sensor.plex_plex_server_1") sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == "1" assert sensor.state == "1"

View file

@ -110,7 +110,7 @@ async def test_library_sensor_values(
mock_plex_server = await setup_plex_server() mock_plex_server = await setup_plex_server()
await wait_for_debouncer(hass) await wait_for_debouncer(hass)
activity_sensor = hass.states.get("sensor.plex_plex_server_1") activity_sensor = hass.states.get("sensor.plex_server_1")
assert activity_sensor.state == "1" assert activity_sensor.state == "1"
# Ensure sensor is created as disabled # Ensure sensor is created as disabled

View file

@ -87,7 +87,7 @@ async def test_new_ignored_users_available(
await wait_for_debouncer(hass) await wait_for_debouncer(hass)
sensor = hass.states.get("sensor.plex_plex_server_1") sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == str(len(active_sessions)) assert sensor.state == str(len(active_sessions))
@ -101,7 +101,7 @@ async def test_network_error_during_refresh(
await wait_for_debouncer(hass) await wait_for_debouncer(hass)
sensor = hass.states.get("sensor.plex_plex_server_1") sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == str(len(active_sessions)) assert sensor.state == str(len(active_sessions))
with patch("plexapi.server.PlexServer.clients", side_effect=RequestException): with patch("plexapi.server.PlexServer.clients", side_effect=RequestException):
@ -126,7 +126,7 @@ async def test_gdm_client_failure(
active_sessions = mock_plex_server._plex_server.sessions() active_sessions = mock_plex_server._plex_server.sessions()
await wait_for_debouncer(hass) await wait_for_debouncer(hass)
sensor = hass.states.get("sensor.plex_plex_server_1") sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == str(len(active_sessions)) assert sensor.state == str(len(active_sessions))
with patch("plexapi.server.PlexServer.clients", side_effect=RequestException): with patch("plexapi.server.PlexServer.clients", side_effect=RequestException):
@ -146,7 +146,7 @@ async def test_mark_sessions_idle(
active_sessions = mock_plex_server._plex_server.sessions() active_sessions = mock_plex_server._plex_server.sessions()
sensor = hass.states.get("sensor.plex_plex_server_1") sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == str(len(active_sessions)) assert sensor.state == str(len(active_sessions))
url = mock_plex_server.url_in_use url = mock_plex_server.url_in_use
@ -157,7 +157,7 @@ async def test_mark_sessions_idle(
await hass.async_block_till_done() await hass.async_block_till_done()
await wait_for_debouncer(hass) await wait_for_debouncer(hass)
sensor = hass.states.get("sensor.plex_plex_server_1") sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == "0" assert sensor.state == "0"
@ -175,7 +175,7 @@ async def test_ignore_plex_web_client(
await wait_for_debouncer(hass) await wait_for_debouncer(hass)
active_sessions = mock_plex_server._plex_server.sessions() active_sessions = mock_plex_server._plex_server.sessions()
sensor = hass.states.get("sensor.plex_plex_server_1") sensor = hass.states.get("sensor.plex_server_1")
assert sensor.state == str(len(active_sessions)) assert sensor.state == str(len(active_sessions))
media_players = hass.states.async_entity_ids("media_player") media_players = hass.states.async_entity_ids("media_player")