mirror of
https://github.com/home-assistant/core.git
synced 2025-07-28 15:47:12 +00:00
Add sensor for online status to PlayStation Network (#147842)
This commit is contained in:
parent
1051f85ac0
commit
bab9ec9976
@ -38,7 +38,7 @@ class PlaystationNetworkData:
|
|||||||
presence: dict[str, Any] = field(default_factory=dict)
|
presence: dict[str, Any] = field(default_factory=dict)
|
||||||
username: str = ""
|
username: str = ""
|
||||||
account_id: str = ""
|
account_id: str = ""
|
||||||
available: bool = False
|
availability: str = "unavailable"
|
||||||
active_sessions: dict[PlatformType, SessionData] = field(default_factory=dict)
|
active_sessions: dict[PlatformType, SessionData] = field(default_factory=dict)
|
||||||
registered_platforms: set[PlatformType] = field(default_factory=set)
|
registered_platforms: set[PlatformType] = field(default_factory=set)
|
||||||
trophy_summary: TrophySummary | None = None
|
trophy_summary: TrophySummary | None = None
|
||||||
@ -92,10 +92,7 @@ class PlaystationNetwork:
|
|||||||
data.username = self.user.online_id
|
data.username = self.user.online_id
|
||||||
data.account_id = self.user.account_id
|
data.account_id = self.user.account_id
|
||||||
|
|
||||||
data.available = (
|
data.availability = data.presence["basicPresence"]["availability"]
|
||||||
data.presence.get("basicPresence", {}).get("availability")
|
|
||||||
== "availableToPlay"
|
|
||||||
)
|
|
||||||
|
|
||||||
session = SessionData()
|
session = SessionData()
|
||||||
session.platform = PlatformType(
|
session.platform = PlatformType(
|
||||||
@ -127,8 +124,6 @@ class PlaystationNetwork:
|
|||||||
if (game_title_info := presence[0] if presence else {}) and game_title_info[
|
if (game_title_info := presence[0] if presence else {}) and game_title_info[
|
||||||
"onlineStatus"
|
"onlineStatus"
|
||||||
] == "online":
|
] == "online":
|
||||||
data.available = True
|
|
||||||
|
|
||||||
platform = PlatformType(game_title_info["platform"])
|
platform = PlatformType(game_title_info["platform"])
|
||||||
|
|
||||||
if platform is PlatformType.PS4:
|
if platform is PlatformType.PS4:
|
||||||
|
@ -29,6 +29,14 @@
|
|||||||
},
|
},
|
||||||
"last_online": {
|
"last_online": {
|
||||||
"default": "mdi:account-clock"
|
"default": "mdi:account-clock"
|
||||||
|
},
|
||||||
|
"online_status": {
|
||||||
|
"default": "mdi:account-badge",
|
||||||
|
"state": {
|
||||||
|
"busy": "mdi:account-cancel",
|
||||||
|
"availabletocommunicate": "mdi:cellphone",
|
||||||
|
"offline": "mdi:account-off-outline"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -107,7 +107,7 @@ class PsnMediaPlayerEntity(
|
|||||||
"""Media Player state getter."""
|
"""Media Player state getter."""
|
||||||
session = self.coordinator.data.active_sessions.get(self.key)
|
session = self.coordinator.data.active_sessions.get(self.key)
|
||||||
if session and session.status == "online":
|
if session and session.status == "online":
|
||||||
if self.coordinator.data.available and session.title_id is not None:
|
if session.title_id is not None:
|
||||||
return MediaPlayerState.PLAYING
|
return MediaPlayerState.PLAYING
|
||||||
return MediaPlayerState.ON
|
return MediaPlayerState.ON
|
||||||
return MediaPlayerState.OFF
|
return MediaPlayerState.OFF
|
||||||
|
@ -51,6 +51,7 @@ class PlaystationNetworkSensor(StrEnum):
|
|||||||
EARNED_TROPHIES_BRONZE = "earned_trophies_bronze"
|
EARNED_TROPHIES_BRONZE = "earned_trophies_bronze"
|
||||||
ONLINE_ID = "online_id"
|
ONLINE_ID = "online_id"
|
||||||
LAST_ONLINE = "last_online"
|
LAST_ONLINE = "last_online"
|
||||||
|
ONLINE_STATUS = "online_status"
|
||||||
|
|
||||||
|
|
||||||
SENSOR_DESCRIPTIONS: tuple[PlaystationNetworkSensorEntityDescription, ...] = (
|
SENSOR_DESCRIPTIONS: tuple[PlaystationNetworkSensorEntityDescription, ...] = (
|
||||||
@ -121,6 +122,13 @@ SENSOR_DESCRIPTIONS: tuple[PlaystationNetworkSensorEntityDescription, ...] = (
|
|||||||
available_fn=lambda psn: "lastAvailableDate" in psn.presence["basicPresence"],
|
available_fn=lambda psn: "lastAvailableDate" in psn.presence["basicPresence"],
|
||||||
device_class=SensorDeviceClass.TIMESTAMP,
|
device_class=SensorDeviceClass.TIMESTAMP,
|
||||||
),
|
),
|
||||||
|
PlaystationNetworkSensorEntityDescription(
|
||||||
|
key=PlaystationNetworkSensor.ONLINE_STATUS,
|
||||||
|
translation_key=PlaystationNetworkSensor.ONLINE_STATUS,
|
||||||
|
value_fn=lambda psn: psn.availability.lower().replace("unavailable", "offline"),
|
||||||
|
device_class=SensorDeviceClass.ENUM,
|
||||||
|
options=["offline", "availabletoplay", "availabletocommunicate", "busy"],
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -81,6 +81,15 @@
|
|||||||
},
|
},
|
||||||
"last_online": {
|
"last_online": {
|
||||||
"name": "Last online"
|
"name": "Last online"
|
||||||
|
},
|
||||||
|
"online_status": {
|
||||||
|
"name": "Online status",
|
||||||
|
"state": {
|
||||||
|
"offline": "Offline",
|
||||||
|
"availabletoplay": "Online",
|
||||||
|
"availabletocommunicate": "Online on PS App",
|
||||||
|
"busy": "Away"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
'title_name': 'STAR WARS Jedi: Survivor™',
|
'title_name': 'STAR WARS Jedi: Survivor™',
|
||||||
}),
|
}),
|
||||||
}),
|
}),
|
||||||
'available': True,
|
'availability': 'availableToPlay',
|
||||||
'presence': dict({
|
'presence': dict({
|
||||||
'basicPresence': dict({
|
'basicPresence': dict({
|
||||||
'availability': 'availableToPlay',
|
'availability': 'availableToPlay',
|
||||||
|
@ -244,6 +244,68 @@
|
|||||||
'state': 'testuser',
|
'state': 'testuser',
|
||||||
})
|
})
|
||||||
# ---
|
# ---
|
||||||
|
# name: test_sensors[sensor.testuser_online_status-entry]
|
||||||
|
EntityRegistryEntrySnapshot({
|
||||||
|
'aliases': set({
|
||||||
|
}),
|
||||||
|
'area_id': None,
|
||||||
|
'capabilities': dict({
|
||||||
|
'options': list([
|
||||||
|
'offline',
|
||||||
|
'availabletoplay',
|
||||||
|
'availabletocommunicate',
|
||||||
|
'busy',
|
||||||
|
]),
|
||||||
|
}),
|
||||||
|
'config_entry_id': <ANY>,
|
||||||
|
'config_subentry_id': <ANY>,
|
||||||
|
'device_class': None,
|
||||||
|
'device_id': <ANY>,
|
||||||
|
'disabled_by': None,
|
||||||
|
'domain': 'sensor',
|
||||||
|
'entity_category': None,
|
||||||
|
'entity_id': 'sensor.testuser_online_status',
|
||||||
|
'has_entity_name': True,
|
||||||
|
'hidden_by': None,
|
||||||
|
'icon': None,
|
||||||
|
'id': <ANY>,
|
||||||
|
'labels': set({
|
||||||
|
}),
|
||||||
|
'name': None,
|
||||||
|
'options': dict({
|
||||||
|
}),
|
||||||
|
'original_device_class': <SensorDeviceClass.ENUM: 'enum'>,
|
||||||
|
'original_icon': None,
|
||||||
|
'original_name': 'Online status',
|
||||||
|
'platform': 'playstation_network',
|
||||||
|
'previous_unique_id': None,
|
||||||
|
'suggested_object_id': None,
|
||||||
|
'supported_features': 0,
|
||||||
|
'translation_key': <PlaystationNetworkSensor.ONLINE_STATUS: 'online_status'>,
|
||||||
|
'unique_id': 'my-psn-id_online_status',
|
||||||
|
'unit_of_measurement': None,
|
||||||
|
})
|
||||||
|
# ---
|
||||||
|
# name: test_sensors[sensor.testuser_online_status-state]
|
||||||
|
StateSnapshot({
|
||||||
|
'attributes': ReadOnlyDict({
|
||||||
|
'device_class': 'enum',
|
||||||
|
'friendly_name': 'testuser Online status',
|
||||||
|
'options': list([
|
||||||
|
'offline',
|
||||||
|
'availabletoplay',
|
||||||
|
'availabletocommunicate',
|
||||||
|
'busy',
|
||||||
|
]),
|
||||||
|
}),
|
||||||
|
'context': <ANY>,
|
||||||
|
'entity_id': 'sensor.testuser_online_status',
|
||||||
|
'last_changed': <ANY>,
|
||||||
|
'last_reported': <ANY>,
|
||||||
|
'last_updated': <ANY>,
|
||||||
|
'state': 'availabletoplay',
|
||||||
|
})
|
||||||
|
# ---
|
||||||
# name: test_sensors[sensor.testuser_platinum_trophies-entry]
|
# name: test_sensors[sensor.testuser_platinum_trophies-entry]
|
||||||
EntityRegistryEntrySnapshot({
|
EntityRegistryEntrySnapshot({
|
||||||
'aliases': set({
|
'aliases': set({
|
||||||
|
Loading…
x
Reference in New Issue
Block a user