From 651c44f4aff5d614b284543883354306b565b811 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Thu, 26 Jun 2025 22:12:24 +0000 Subject: [PATCH 01/10] Add Binary Sensor Platform to PlayStation_Network --- .../playstation_network/__init__.py | 6 +- .../playstation_network/binary_sensor.py | 108 ++++++++++++++++++ .../components/playstation_network/icons.json | 8 ++ .../playstation_network/strings.json | 16 +++ .../snapshots/test_binary_sensor.ambr | 97 ++++++++++++++++ .../playstation_network/test_binary_sensor.py | 42 +++++++ 6 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 homeassistant/components/playstation_network/binary_sensor.py create mode 100644 tests/components/playstation_network/snapshots/test_binary_sensor.ambr create mode 100644 tests/components/playstation_network/test_binary_sensor.py diff --git a/homeassistant/components/playstation_network/__init__.py b/homeassistant/components/playstation_network/__init__.py index 72ce0b9cfc2ee..feb598a646a2c 100644 --- a/homeassistant/components/playstation_network/__init__.py +++ b/homeassistant/components/playstation_network/__init__.py @@ -9,7 +9,11 @@ from .coordinator import PlaystationNetworkConfigEntry, PlaystationNetworkCoordinator from .helpers import PlaystationNetwork -PLATFORMS: list[Platform] = [Platform.MEDIA_PLAYER, Platform.SENSOR] +PLATFORMS: list[Platform] = [ + Platform.BINARY_SENSOR, + Platform.MEDIA_PLAYER, + Platform.SENSOR, +] async def async_setup_entry( diff --git a/homeassistant/components/playstation_network/binary_sensor.py b/homeassistant/components/playstation_network/binary_sensor.py new file mode 100644 index 0000000000000..665bab1c59956 --- /dev/null +++ b/homeassistant/components/playstation_network/binary_sensor.py @@ -0,0 +1,108 @@ +"""Binary Sensor platform for PlayStation Network integration.""" + +from __future__ import annotations + +from collections.abc import Callable +from dataclasses import dataclass +from enum import StrEnum +from typing import TYPE_CHECKING + +from homeassistant.components.binary_sensor import ( + BinarySensorEntity, + BinarySensorEntityDescription, +) +from homeassistant.core import HomeAssistant +from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo +from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback +from homeassistant.helpers.typing import StateType +from homeassistant.helpers.update_coordinator import CoordinatorEntity + +from .const import DOMAIN +from .coordinator import ( + PlaystationNetworkConfigEntry, + PlaystationNetworkCoordinator, + PlaystationNetworkData, +) + +PARALLEL_UPDATES = 0 + + +@dataclass(kw_only=True, frozen=True) +class PlaystationNetworkBinarySensorEntityDescription(BinarySensorEntityDescription): + """PlayStation Network sensor description.""" + + value_fn: Callable[[PlaystationNetworkData], StateType] + + +class PlaystationNetworkBinarySensor(StrEnum): + """PlayStation Network sensors.""" + + ONLINE_STATUS = "online_status" + PS_PLUS_STATUS = "ps_plus_status" + + +BINARY_SENSOR_DESCRIPTIONS: tuple[ + PlaystationNetworkBinarySensorEntityDescription, ... +] = ( + PlaystationNetworkBinarySensorEntityDescription( + key=PlaystationNetworkBinarySensor.ONLINE_STATUS, + translation_key=PlaystationNetworkBinarySensor.ONLINE_STATUS, + name="Online", + value_fn=(lambda psn: psn.available), + ), + PlaystationNetworkBinarySensorEntityDescription( + key=PlaystationNetworkBinarySensor.PS_PLUS_STATUS, + translation_key=PlaystationNetworkBinarySensor.PS_PLUS_STATUS, + name="PlayStation Plus", + value_fn=(lambda psn: psn.profile["isPlus"]), + ), +) + + +async def async_setup_entry( + hass: HomeAssistant, + config_entry: PlaystationNetworkConfigEntry, + async_add_entities: AddConfigEntryEntitiesCallback, +) -> None: + """Set up the binary sensor platform.""" + coordinator = config_entry.runtime_data + async_add_entities( + PlaystationNetworkBinarySensorEntity(coordinator, description) + for description in BINARY_SENSOR_DESCRIPTIONS + ) + + +class PlaystationNetworkBinarySensorEntity( + CoordinatorEntity[PlaystationNetworkCoordinator], BinarySensorEntity +): + """Representation of a PlayStation Network sensor entity.""" + + entity_description: PlaystationNetworkBinarySensorEntityDescription + coordinator: PlaystationNetworkCoordinator + + _attr_has_entity_name = True + + def __init__( + self, + coordinator: PlaystationNetworkCoordinator, + description: PlaystationNetworkBinarySensorEntityDescription, + ) -> None: + """Initialize a binary sensor entity.""" + super().__init__(coordinator) + self.entity_description = description + if TYPE_CHECKING: + assert coordinator.config_entry.unique_id + self._attr_unique_id = f"{coordinator.config_entry.unique_id}_{description.key}" + self._attr_translation_key = description.translation_key + self._attr_device_info = DeviceInfo( + identifiers={(DOMAIN, coordinator.config_entry.unique_id)}, + name=coordinator.data.username, + entry_type=DeviceEntryType.SERVICE, + manufacturer="Sony Interactive Entertainment", + ) + + @property + def is_on(self) -> bool: + """Return the state of the binary sensor.""" + + return bool(self.entity_description.value_fn(self.coordinator.data)) diff --git a/homeassistant/components/playstation_network/icons.json b/homeassistant/components/playstation_network/icons.json index 612427c9a1daf..666c2f0252f58 100644 --- a/homeassistant/components/playstation_network/icons.json +++ b/homeassistant/components/playstation_network/icons.json @@ -5,6 +5,14 @@ "default": "mdi:sony-playstation" } }, + "binary_sensor": { + "online_status": { + "default": "mdi:sony-playstation" + }, + "ps_plus_status": { + "default": "mdi:shape-plus-outline" + } + }, "sensor": { "trophy_level": { "default": "mdi:trophy-award" diff --git a/homeassistant/components/playstation_network/strings.json b/homeassistant/components/playstation_network/strings.json index f68d69417fbf1..f97dc2f17a832 100644 --- a/homeassistant/components/playstation_network/strings.json +++ b/homeassistant/components/playstation_network/strings.json @@ -53,6 +53,22 @@ } }, "entity": { + "binary_sensor": { + "online_status": { + "name": "Status", + "state": { + "on": "Online", + "off": "Offline" + } + }, + "ps_plus_status": { + "name": "PlayStation Plus", + "state": { + "on": "[%key:common::state::active%]", + "off": "Inactive" + } + } + }, "sensor": { "trophy_level": { "name": "Trophy level" diff --git a/tests/components/playstation_network/snapshots/test_binary_sensor.ambr b/tests/components/playstation_network/snapshots/test_binary_sensor.ambr new file mode 100644 index 0000000000000..eb3392edfdfff --- /dev/null +++ b/tests/components/playstation_network/snapshots/test_binary_sensor.ambr @@ -0,0 +1,97 @@ +# serializer version: 1 +# name: test_sensors[binary_sensor.testuser_playstation_plus-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': None, + 'entity_id': 'binary_sensor.testuser_playstation_plus', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'PlayStation Plus', + 'platform': 'playstation_network', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': 'my-psn-id_ps_plus_status', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[binary_sensor.testuser_playstation_plus-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'testuser PlayStation Plus', + }), + 'context': , + 'entity_id': 'binary_sensor.testuser_playstation_plus', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'on', + }) +# --- +# name: test_sensors[binary_sensor.testuser_status-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': None, + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'binary_sensor', + 'entity_category': None, + 'entity_id': 'binary_sensor.testuser_status', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': None, + 'original_icon': None, + 'original_name': 'Status', + 'platform': 'playstation_network', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': , + 'unique_id': 'my-psn-id_online_status', + 'unit_of_measurement': None, + }) +# --- +# name: test_sensors[binary_sensor.testuser_status-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'friendly_name': 'testuser Status', + }), + 'context': , + 'entity_id': 'binary_sensor.testuser_status', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'on', + }) +# --- diff --git a/tests/components/playstation_network/test_binary_sensor.py b/tests/components/playstation_network/test_binary_sensor.py new file mode 100644 index 0000000000000..de7ef630b76b6 --- /dev/null +++ b/tests/components/playstation_network/test_binary_sensor.py @@ -0,0 +1,42 @@ +"""Test the Playstation Network binary sensor platform.""" + +from collections.abc import Generator +from unittest.mock import patch + +import pytest +from syrupy.assertion import SnapshotAssertion + +from homeassistant.config_entries import ConfigEntryState +from homeassistant.const import Platform +from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er + +from tests.common import MockConfigEntry, snapshot_platform + + +@pytest.fixture(autouse=True) +def binary_sensor_only() -> Generator[None]: + """Enable only the binary sensor platform.""" + with patch( + "homeassistant.components.playstation_network.PLATFORMS", + [Platform.BINARY_SENSOR], + ): + yield + + +@pytest.mark.usefixtures("mock_psnawpapi") +async def test_sensors( + hass: HomeAssistant, + config_entry: MockConfigEntry, + snapshot: SnapshotAssertion, + entity_registry: er.EntityRegistry, +) -> None: + """Test setup of the PlayStation Network binary sensor platform.""" + + config_entry.add_to_hass(hass) + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + assert config_entry.state is ConfigEntryState.LOADED + + await snapshot_platform(hass, entity_registry, snapshot, config_entry.entry_id) From 6a3c893c3670f7d263e39d9e2f84cd4c31b31ad5 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Thu, 26 Jun 2025 22:32:02 +0000 Subject: [PATCH 02/10] Improve doc text --- .../components/playstation_network/binary_sensor.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/playstation_network/binary_sensor.py b/homeassistant/components/playstation_network/binary_sensor.py index 665bab1c59956..4b02e0d72b9ec 100644 --- a/homeassistant/components/playstation_network/binary_sensor.py +++ b/homeassistant/components/playstation_network/binary_sensor.py @@ -29,13 +29,13 @@ @dataclass(kw_only=True, frozen=True) class PlaystationNetworkBinarySensorEntityDescription(BinarySensorEntityDescription): - """PlayStation Network sensor description.""" + """PlayStation Network binary sensor description.""" value_fn: Callable[[PlaystationNetworkData], StateType] class PlaystationNetworkBinarySensor(StrEnum): - """PlayStation Network sensors.""" + """PlayStation Network binary sensors.""" ONLINE_STATUS = "online_status" PS_PLUS_STATUS = "ps_plus_status" @@ -75,7 +75,7 @@ async def async_setup_entry( class PlaystationNetworkBinarySensorEntity( CoordinatorEntity[PlaystationNetworkCoordinator], BinarySensorEntity ): - """Representation of a PlayStation Network sensor entity.""" + """Representation of a PlayStation Network binary sensor entity.""" entity_description: PlaystationNetworkBinarySensorEntityDescription coordinator: PlaystationNetworkCoordinator From 2c5a6e806ac9c981b285123a5a1a496aa316e739 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Fri, 27 Jun 2025 13:14:29 +0000 Subject: [PATCH 03/10] Refactor entity base class --- .../playstation_network/binary_sensor.py | 28 ++++------------ .../components/playstation_network/entity.py | 25 +++++++++++++++ .../components/playstation_network/icons.json | 5 ++- .../playstation_network/strings.json | 12 ++----- .../snapshots/test_binary_sensor.ambr | 32 +++++++++---------- 5 files changed, 54 insertions(+), 48 deletions(-) create mode 100644 homeassistant/components/playstation_network/entity.py diff --git a/homeassistant/components/playstation_network/binary_sensor.py b/homeassistant/components/playstation_network/binary_sensor.py index 4b02e0d72b9ec..5779a676ccf48 100644 --- a/homeassistant/components/playstation_network/binary_sensor.py +++ b/homeassistant/components/playstation_network/binary_sensor.py @@ -12,17 +12,14 @@ BinarySensorEntityDescription, ) from homeassistant.core import HomeAssistant -from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback -from homeassistant.helpers.typing import StateType -from homeassistant.helpers.update_coordinator import CoordinatorEntity -from .const import DOMAIN from .coordinator import ( PlaystationNetworkConfigEntry, PlaystationNetworkCoordinator, PlaystationNetworkData, ) +from .entity import PlaystationNetworkServiceEntity PARALLEL_UPDATES = 0 @@ -31,7 +28,7 @@ class PlaystationNetworkBinarySensorEntityDescription(BinarySensorEntityDescription): """PlayStation Network binary sensor description.""" - value_fn: Callable[[PlaystationNetworkData], StateType] + is_on_fn: Callable[[PlaystationNetworkData], bool] class PlaystationNetworkBinarySensor(StrEnum): @@ -47,14 +44,12 @@ class PlaystationNetworkBinarySensor(StrEnum): PlaystationNetworkBinarySensorEntityDescription( key=PlaystationNetworkBinarySensor.ONLINE_STATUS, translation_key=PlaystationNetworkBinarySensor.ONLINE_STATUS, - name="Online", - value_fn=(lambda psn: psn.available), + is_on_fn=lambda psn: psn.available, ), PlaystationNetworkBinarySensorEntityDescription( key=PlaystationNetworkBinarySensor.PS_PLUS_STATUS, translation_key=PlaystationNetworkBinarySensor.PS_PLUS_STATUS, - name="PlayStation Plus", - value_fn=(lambda psn: psn.profile["isPlus"]), + is_on_fn=lambda psn: psn.profile["isPlus"], ), ) @@ -73,14 +68,12 @@ async def async_setup_entry( class PlaystationNetworkBinarySensorEntity( - CoordinatorEntity[PlaystationNetworkCoordinator], BinarySensorEntity + PlaystationNetworkServiceEntity, + BinarySensorEntity, ): """Representation of a PlayStation Network binary sensor entity.""" entity_description: PlaystationNetworkBinarySensorEntityDescription - coordinator: PlaystationNetworkCoordinator - - _attr_has_entity_name = True def __init__( self, @@ -93,16 +86,9 @@ def __init__( if TYPE_CHECKING: assert coordinator.config_entry.unique_id self._attr_unique_id = f"{coordinator.config_entry.unique_id}_{description.key}" - self._attr_translation_key = description.translation_key - self._attr_device_info = DeviceInfo( - identifiers={(DOMAIN, coordinator.config_entry.unique_id)}, - name=coordinator.data.username, - entry_type=DeviceEntryType.SERVICE, - manufacturer="Sony Interactive Entertainment", - ) @property def is_on(self) -> bool: """Return the state of the binary sensor.""" - return bool(self.entity_description.value_fn(self.coordinator.data)) + return self.entity_description.is_on_fn(self.coordinator.data) diff --git a/homeassistant/components/playstation_network/entity.py b/homeassistant/components/playstation_network/entity.py new file mode 100644 index 0000000000000..efdc260e4b73e --- /dev/null +++ b/homeassistant/components/playstation_network/entity.py @@ -0,0 +1,25 @@ +"""Base entity for PlayStation Network Integration.""" + +from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo +from homeassistant.helpers.update_coordinator import CoordinatorEntity + +from .const import DOMAIN +from .coordinator import PlaystationNetworkCoordinator + + +class PlaystationNetworkServiceEntity(CoordinatorEntity[PlaystationNetworkCoordinator]): + """Common entity class for PlayStationNetwork Service entities.""" + + _attr_has_entity_name = True + + def __init__(self, coordinator) -> None: + """Initialize PlayStation Network Service Entity.""" + super().__init__(coordinator) + self.coordinator = coordinator + + self._attr_device_info = DeviceInfo( + identifiers={(DOMAIN, coordinator.config_entry.unique_id)}, + name=coordinator.data.username, + entry_type=DeviceEntryType.SERVICE, + manufacturer="Sony Interactive Entertainment", + ) diff --git a/homeassistant/components/playstation_network/icons.json b/homeassistant/components/playstation_network/icons.json index 666c2f0252f58..5c2e10148c27c 100644 --- a/homeassistant/components/playstation_network/icons.json +++ b/homeassistant/components/playstation_network/icons.json @@ -7,7 +7,10 @@ }, "binary_sensor": { "online_status": { - "default": "mdi:sony-playstation" + "default": "mdi:account-badge", + "state": { + "off": "mdi:account-off-outline" + } }, "ps_plus_status": { "default": "mdi:shape-plus-outline" diff --git a/homeassistant/components/playstation_network/strings.json b/homeassistant/components/playstation_network/strings.json index f97dc2f17a832..b6cd5b1bac2ec 100644 --- a/homeassistant/components/playstation_network/strings.json +++ b/homeassistant/components/playstation_network/strings.json @@ -55,18 +55,10 @@ "entity": { "binary_sensor": { "online_status": { - "name": "Status", - "state": { - "on": "Online", - "off": "Offline" - } + "name": "Online" }, "ps_plus_status": { - "name": "PlayStation Plus", - "state": { - "on": "[%key:common::state::active%]", - "off": "Inactive" - } + "name": "Subscribed to PlayStation Plus" } }, "sensor": { diff --git a/tests/components/playstation_network/snapshots/test_binary_sensor.ambr b/tests/components/playstation_network/snapshots/test_binary_sensor.ambr index eb3392edfdfff..bf77add67cd99 100644 --- a/tests/components/playstation_network/snapshots/test_binary_sensor.ambr +++ b/tests/components/playstation_network/snapshots/test_binary_sensor.ambr @@ -1,5 +1,5 @@ # serializer version: 1 -# name: test_sensors[binary_sensor.testuser_playstation_plus-entry] +# name: test_sensors[binary_sensor.testuser_online-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ }), @@ -12,7 +12,7 @@ 'disabled_by': None, 'domain': 'binary_sensor', 'entity_category': None, - 'entity_id': 'binary_sensor.testuser_playstation_plus', + 'entity_id': 'binary_sensor.testuser_online', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -24,30 +24,30 @@ }), 'original_device_class': None, 'original_icon': None, - 'original_name': 'PlayStation Plus', + 'original_name': 'Online', 'platform': 'playstation_network', 'previous_unique_id': None, 'suggested_object_id': None, 'supported_features': 0, - 'translation_key': , - 'unique_id': 'my-psn-id_ps_plus_status', + 'translation_key': , + 'unique_id': 'my-psn-id_online_status', 'unit_of_measurement': None, }) # --- -# name: test_sensors[binary_sensor.testuser_playstation_plus-state] +# name: test_sensors[binary_sensor.testuser_online-state] StateSnapshot({ 'attributes': ReadOnlyDict({ - 'friendly_name': 'testuser PlayStation Plus', + 'friendly_name': 'testuser Online', }), 'context': , - 'entity_id': 'binary_sensor.testuser_playstation_plus', + 'entity_id': 'binary_sensor.testuser_online', 'last_changed': , 'last_reported': , 'last_updated': , 'state': 'on', }) # --- -# name: test_sensors[binary_sensor.testuser_status-entry] +# name: test_sensors[binary_sensor.testuser_subscribed_to_playstation_plus-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ }), @@ -60,7 +60,7 @@ 'disabled_by': None, 'domain': 'binary_sensor', 'entity_category': None, - 'entity_id': 'binary_sensor.testuser_status', + 'entity_id': 'binary_sensor.testuser_subscribed_to_playstation_plus', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -72,23 +72,23 @@ }), 'original_device_class': None, 'original_icon': None, - 'original_name': 'Status', + 'original_name': 'Subscribed to PlayStation Plus', 'platform': 'playstation_network', 'previous_unique_id': None, 'suggested_object_id': None, 'supported_features': 0, - 'translation_key': , - 'unique_id': 'my-psn-id_online_status', + 'translation_key': , + 'unique_id': 'my-psn-id_ps_plus_status', 'unit_of_measurement': None, }) # --- -# name: test_sensors[binary_sensor.testuser_status-state] +# name: test_sensors[binary_sensor.testuser_subscribed_to_playstation_plus-state] StateSnapshot({ 'attributes': ReadOnlyDict({ - 'friendly_name': 'testuser Status', + 'friendly_name': 'testuser Subscribed to PlayStation Plus', }), 'context': , - 'entity_id': 'binary_sensor.testuser_status', + 'entity_id': 'binary_sensor.testuser_subscribed_to_playstation_plus', 'last_changed': , 'last_reported': , 'last_updated': , From 51a744eb2840d0aaf1df30b58c013a13f7ee8961 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Fri, 27 Jun 2025 19:07:34 +0000 Subject: [PATCH 04/10] Shift more to entity base class --- .../components/playstation_network/binary_sensor.py | 7 +------ .../components/playstation_network/entity.py | 12 ++++++++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/playstation_network/binary_sensor.py b/homeassistant/components/playstation_network/binary_sensor.py index 5779a676ccf48..bdcb758348864 100644 --- a/homeassistant/components/playstation_network/binary_sensor.py +++ b/homeassistant/components/playstation_network/binary_sensor.py @@ -5,7 +5,6 @@ from collections.abc import Callable from dataclasses import dataclass from enum import StrEnum -from typing import TYPE_CHECKING from homeassistant.components.binary_sensor import ( BinarySensorEntity, @@ -81,11 +80,7 @@ def __init__( description: PlaystationNetworkBinarySensorEntityDescription, ) -> None: """Initialize a binary sensor entity.""" - super().__init__(coordinator) - self.entity_description = description - if TYPE_CHECKING: - assert coordinator.config_entry.unique_id - self._attr_unique_id = f"{coordinator.config_entry.unique_id}_{description.key}" + super().__init__(coordinator, description) @property def is_on(self) -> bool: diff --git a/homeassistant/components/playstation_network/entity.py b/homeassistant/components/playstation_network/entity.py index efdc260e4b73e..b8428e3744961 100644 --- a/homeassistant/components/playstation_network/entity.py +++ b/homeassistant/components/playstation_network/entity.py @@ -1,6 +1,9 @@ """Base entity for PlayStation Network Integration.""" +from typing import TYPE_CHECKING + from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo +from homeassistant.helpers.entity import EntityDescription from homeassistant.helpers.update_coordinator import CoordinatorEntity from .const import DOMAIN @@ -12,11 +15,16 @@ class PlaystationNetworkServiceEntity(CoordinatorEntity[PlaystationNetworkCoordi _attr_has_entity_name = True - def __init__(self, coordinator) -> None: + def __init__(self, coordinator, entity_description: EntityDescription) -> None: """Initialize PlayStation Network Service Entity.""" super().__init__(coordinator) self.coordinator = coordinator - + if TYPE_CHECKING: + assert coordinator.config_entry.unique_id + self.entity_description = entity_description + self._attr_unique_id = ( + f"{coordinator.config_entry.unique_id}_{entity_description.key}" + ) self._attr_device_info = DeviceInfo( identifiers={(DOMAIN, coordinator.config_entry.unique_id)}, name=coordinator.data.username, From 17aa83421484f0d6973cb4e66dd93abc21c38529 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Wed, 2 Jul 2025 18:09:55 +0000 Subject: [PATCH 05/10] Rebase changes --- .../playstation_network/binary_sensor.py | 20 +---------- .../components/playstation_network/entity.py | 2 +- .../components/playstation_network/sensor.py | 35 +++---------------- .../playstation_network/strings.json | 3 -- .../snapshots/test_sensor.ambr | 10 +++--- 5 files changed, 11 insertions(+), 59 deletions(-) diff --git a/homeassistant/components/playstation_network/binary_sensor.py b/homeassistant/components/playstation_network/binary_sensor.py index bdcb758348864..fcecd1d1ee18a 100644 --- a/homeassistant/components/playstation_network/binary_sensor.py +++ b/homeassistant/components/playstation_network/binary_sensor.py @@ -13,11 +13,7 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback -from .coordinator import ( - PlaystationNetworkConfigEntry, - PlaystationNetworkCoordinator, - PlaystationNetworkData, -) +from .coordinator import PlaystationNetworkConfigEntry, PlaystationNetworkData from .entity import PlaystationNetworkServiceEntity PARALLEL_UPDATES = 0 @@ -33,18 +29,12 @@ class PlaystationNetworkBinarySensorEntityDescription(BinarySensorEntityDescript class PlaystationNetworkBinarySensor(StrEnum): """PlayStation Network binary sensors.""" - ONLINE_STATUS = "online_status" PS_PLUS_STATUS = "ps_plus_status" BINARY_SENSOR_DESCRIPTIONS: tuple[ PlaystationNetworkBinarySensorEntityDescription, ... ] = ( - PlaystationNetworkBinarySensorEntityDescription( - key=PlaystationNetworkBinarySensor.ONLINE_STATUS, - translation_key=PlaystationNetworkBinarySensor.ONLINE_STATUS, - is_on_fn=lambda psn: psn.available, - ), PlaystationNetworkBinarySensorEntityDescription( key=PlaystationNetworkBinarySensor.PS_PLUS_STATUS, translation_key=PlaystationNetworkBinarySensor.PS_PLUS_STATUS, @@ -74,14 +64,6 @@ class PlaystationNetworkBinarySensorEntity( entity_description: PlaystationNetworkBinarySensorEntityDescription - def __init__( - self, - coordinator: PlaystationNetworkCoordinator, - description: PlaystationNetworkBinarySensorEntityDescription, - ) -> None: - """Initialize a binary sensor entity.""" - super().__init__(coordinator, description) - @property def is_on(self) -> bool: """Return the state of the binary sensor.""" diff --git a/homeassistant/components/playstation_network/entity.py b/homeassistant/components/playstation_network/entity.py index b8428e3744961..086a172a12a75 100644 --- a/homeassistant/components/playstation_network/entity.py +++ b/homeassistant/components/playstation_network/entity.py @@ -13,12 +13,12 @@ class PlaystationNetworkServiceEntity(CoordinatorEntity[PlaystationNetworkCoordinator]): """Common entity class for PlayStationNetwork Service entities.""" + coordinator: PlaystationNetworkCoordinator _attr_has_entity_name = True def __init__(self, coordinator, entity_description: EntityDescription) -> None: """Initialize PlayStation Network Service Entity.""" super().__init__(coordinator) - self.coordinator = coordinator if TYPE_CHECKING: assert coordinator.config_entry.unique_id self.entity_description = entity_description diff --git a/homeassistant/components/playstation_network/sensor.py b/homeassistant/components/playstation_network/sensor.py index 305f252f31dc9..f4a634d5fb546 100644 --- a/homeassistant/components/playstation_network/sensor.py +++ b/homeassistant/components/playstation_network/sensor.py @@ -6,7 +6,6 @@ from dataclasses import dataclass from datetime import datetime from enum import StrEnum -from typing import TYPE_CHECKING from homeassistant.components.sensor import ( SensorDeviceClass, @@ -15,18 +14,12 @@ ) from homeassistant.const import PERCENTAGE from homeassistant.core import HomeAssistant -from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.typing import StateType -from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.util import dt as dt_util -from .const import DOMAIN -from .coordinator import ( - PlaystationNetworkConfigEntry, - PlaystationNetworkCoordinator, - PlaystationNetworkData, -) +from .coordinator import PlaystationNetworkConfigEntry, PlaystationNetworkData +from .entity import PlaystationNetworkServiceEntity PARALLEL_UPDATES = 0 @@ -146,32 +139,12 @@ async def async_setup_entry( class PlaystationNetworkSensorEntity( - CoordinatorEntity[PlaystationNetworkCoordinator], SensorEntity + PlaystationNetworkServiceEntity, + SensorEntity, ): """Representation of a PlayStation Network sensor entity.""" entity_description: PlaystationNetworkSensorEntityDescription - coordinator: PlaystationNetworkCoordinator - - _attr_has_entity_name = True - - def __init__( - self, - coordinator: PlaystationNetworkCoordinator, - description: PlaystationNetworkSensorEntityDescription, - ) -> None: - """Initialize a sensor entity.""" - super().__init__(coordinator) - self.entity_description = description - if TYPE_CHECKING: - assert coordinator.config_entry.unique_id - self._attr_unique_id = f"{coordinator.config_entry.unique_id}_{description.key}" - self._attr_device_info = DeviceInfo( - identifiers={(DOMAIN, coordinator.config_entry.unique_id)}, - name=coordinator.data.username, - entry_type=DeviceEntryType.SERVICE, - manufacturer="Sony Interactive Entertainment", - ) @property def native_value(self) -> StateType | datetime: diff --git a/homeassistant/components/playstation_network/strings.json b/homeassistant/components/playstation_network/strings.json index b6cd5b1bac2ec..360687f97c8ae 100644 --- a/homeassistant/components/playstation_network/strings.json +++ b/homeassistant/components/playstation_network/strings.json @@ -54,9 +54,6 @@ }, "entity": { "binary_sensor": { - "online_status": { - "name": "Online" - }, "ps_plus_status": { "name": "Subscribed to PlayStation Plus" } diff --git a/tests/components/playstation_network/snapshots/test_sensor.ambr b/tests/components/playstation_network/snapshots/test_sensor.ambr index a00e3c4ff0a58..a5d225e275749 100644 --- a/tests/components/playstation_network/snapshots/test_sensor.ambr +++ b/tests/components/playstation_network/snapshots/test_sensor.ambr @@ -159,7 +159,7 @@ 'disabled_by': None, 'domain': 'sensor', 'entity_category': None, - 'entity_id': 'sensor.testuser_next_level', + 'entity_id': 'sensor.testuser_next_trophy_level', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -171,7 +171,7 @@ }), 'original_device_class': None, 'original_icon': None, - 'original_name': 'Next level', + 'original_name': 'Next trophy level', 'platform': 'playstation_network', 'previous_unique_id': None, 'suggested_object_id': None, @@ -181,14 +181,14 @@ 'unit_of_measurement': '%', }) # --- -# name: test_sensors[sensor.testuser_next_level-state] +# name: test_sensors[sensor.testuser_next_trophy_level-state] StateSnapshot({ 'attributes': ReadOnlyDict({ - 'friendly_name': 'testuser Next level', + 'friendly_name': 'testuser Next trophy level', 'unit_of_measurement': '%', }), 'context': , - 'entity_id': 'sensor.testuser_next_level', + 'entity_id': 'sensor.testuser_next_trophy_level', 'last_changed': , 'last_reported': , 'last_updated': , From b7aacb62d0215023bec2f7b324460481b7e8afd1 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Wed, 2 Jul 2025 18:11:19 +0000 Subject: [PATCH 06/10] Rebase changes --- .../playstation_network/snapshots/test_sensor.ambr | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/components/playstation_network/snapshots/test_sensor.ambr b/tests/components/playstation_network/snapshots/test_sensor.ambr index a5d225e275749..254e2fc4873d1 100644 --- a/tests/components/playstation_network/snapshots/test_sensor.ambr +++ b/tests/components/playstation_network/snapshots/test_sensor.ambr @@ -159,7 +159,7 @@ 'disabled_by': None, 'domain': 'sensor', 'entity_category': None, - 'entity_id': 'sensor.testuser_next_trophy_level', + 'entity_id': 'sensor.testuser_next_level', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -171,7 +171,7 @@ }), 'original_device_class': None, 'original_icon': None, - 'original_name': 'Next trophy level', + 'original_name': 'Next level', 'platform': 'playstation_network', 'previous_unique_id': None, 'suggested_object_id': None, @@ -181,14 +181,14 @@ 'unit_of_measurement': '%', }) # --- -# name: test_sensors[sensor.testuser_next_trophy_level-state] +# name: test_sensors[sensor.testuser_next_level-state] StateSnapshot({ 'attributes': ReadOnlyDict({ - 'friendly_name': 'testuser Next trophy level', + 'friendly_name': 'testuser Next level', 'unit_of_measurement': '%', }), 'context': , - 'entity_id': 'sensor.testuser_next_trophy_level', + 'entity_id': 'sensor.testuser_next_level', 'last_changed': , 'last_reported': , 'last_updated': , @@ -220,7 +220,7 @@ }), 'original_device_class': None, 'original_icon': None, - 'original_name': 'Online ID', + 'original_name': 'Online-ID', 'platform': 'playstation_network', 'previous_unique_id': None, 'suggested_object_id': None, @@ -234,7 +234,7 @@ StateSnapshot({ 'attributes': ReadOnlyDict({ 'entity_picture': 'http://static-resource.np.community.playstation.net/avatar_xl/WWS_A/UP90001312L24_DD96EB6A4FF5FE883C09_XL.png', - 'friendly_name': 'testuser Online ID', + 'friendly_name': 'testuser Online-ID', }), 'context': , 'entity_id': 'sensor.testuser_online_id', From 958bd73c3bcbb2f11b15cbeb81558934d85d33c7 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Fri, 27 Jun 2025 22:09:19 +0000 Subject: [PATCH 07/10] revert entity base class change --- homeassistant/components/playstation_network/entity.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/playstation_network/entity.py b/homeassistant/components/playstation_network/entity.py index 086a172a12a75..54f5fd5db704b 100644 --- a/homeassistant/components/playstation_network/entity.py +++ b/homeassistant/components/playstation_network/entity.py @@ -13,10 +13,13 @@ class PlaystationNetworkServiceEntity(CoordinatorEntity[PlaystationNetworkCoordinator]): """Common entity class for PlayStationNetwork Service entities.""" - coordinator: PlaystationNetworkCoordinator _attr_has_entity_name = True - def __init__(self, coordinator, entity_description: EntityDescription) -> None: + def __init__( + self, + coordinator: PlaystationNetworkCoordinator, + entity_description: EntityDescription, + ) -> None: """Initialize PlayStation Network Service Entity.""" super().__init__(coordinator) if TYPE_CHECKING: From af712bf0dc0c8edd411dbe97580fbad78bae8243 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Wed, 2 Jul 2025 17:55:34 +0000 Subject: [PATCH 08/10] Remove unused snapshot --- .../snapshots/test_binary_sensor.ambr | 48 ------------------- 1 file changed, 48 deletions(-) diff --git a/tests/components/playstation_network/snapshots/test_binary_sensor.ambr b/tests/components/playstation_network/snapshots/test_binary_sensor.ambr index bf77add67cd99..f380f91e9b9f3 100644 --- a/tests/components/playstation_network/snapshots/test_binary_sensor.ambr +++ b/tests/components/playstation_network/snapshots/test_binary_sensor.ambr @@ -1,52 +1,4 @@ # serializer version: 1 -# name: test_sensors[binary_sensor.testuser_online-entry] - EntityRegistryEntrySnapshot({ - 'aliases': set({ - }), - 'area_id': None, - 'capabilities': None, - 'config_entry_id': , - 'config_subentry_id': , - 'device_class': None, - 'device_id': , - 'disabled_by': None, - 'domain': 'binary_sensor', - 'entity_category': None, - 'entity_id': 'binary_sensor.testuser_online', - 'has_entity_name': True, - 'hidden_by': None, - 'icon': None, - 'id': , - 'labels': set({ - }), - 'name': None, - 'options': dict({ - }), - 'original_device_class': None, - 'original_icon': None, - 'original_name': 'Online', - 'platform': 'playstation_network', - 'previous_unique_id': None, - 'suggested_object_id': None, - 'supported_features': 0, - 'translation_key': , - 'unique_id': 'my-psn-id_online_status', - 'unit_of_measurement': None, - }) -# --- -# name: test_sensors[binary_sensor.testuser_online-state] - StateSnapshot({ - 'attributes': ReadOnlyDict({ - 'friendly_name': 'testuser Online', - }), - 'context': , - 'entity_id': 'binary_sensor.testuser_online', - 'last_changed': , - 'last_reported': , - 'last_updated': , - 'state': 'on', - }) -# --- # name: test_sensors[binary_sensor.testuser_subscribed_to_playstation_plus-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ From 4a7829bb6e6d28123cac8354b410e6929313a725 Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Sat, 5 Jul 2025 01:06:33 +0000 Subject: [PATCH 09/10] Update snapshots --- .../components/playstation_network/snapshots/test_sensor.ambr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/components/playstation_network/snapshots/test_sensor.ambr b/tests/components/playstation_network/snapshots/test_sensor.ambr index 254e2fc4873d1..a00e3c4ff0a58 100644 --- a/tests/components/playstation_network/snapshots/test_sensor.ambr +++ b/tests/components/playstation_network/snapshots/test_sensor.ambr @@ -220,7 +220,7 @@ }), 'original_device_class': None, 'original_icon': None, - 'original_name': 'Online-ID', + 'original_name': 'Online ID', 'platform': 'playstation_network', 'previous_unique_id': None, 'suggested_object_id': None, @@ -234,7 +234,7 @@ StateSnapshot({ 'attributes': ReadOnlyDict({ 'entity_picture': 'http://static-resource.np.community.playstation.net/avatar_xl/WWS_A/UP90001312L24_DD96EB6A4FF5FE883C09_XL.png', - 'friendly_name': 'testuser Online-ID', + 'friendly_name': 'testuser Online ID', }), 'context': , 'entity_id': 'sensor.testuser_online_id', From 288028c8bca53d270d7416058073cf2e0f8a099e Mon Sep 17 00:00:00 2001 From: Jack Powell Date: Sat, 5 Jul 2025 15:02:25 +0000 Subject: [PATCH 10/10] Remove stale icon definition for binary sensor --- homeassistant/components/playstation_network/icons.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/homeassistant/components/playstation_network/icons.json b/homeassistant/components/playstation_network/icons.json index 5c2e10148c27c..2742ab1c989e6 100644 --- a/homeassistant/components/playstation_network/icons.json +++ b/homeassistant/components/playstation_network/icons.json @@ -6,12 +6,6 @@ } }, "binary_sensor": { - "online_status": { - "default": "mdi:account-badge", - "state": { - "off": "mdi:account-off-outline" - } - }, "ps_plus_status": { "default": "mdi:shape-plus-outline" }