mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 23:27:37 +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)
|
||||
username: str = ""
|
||||
account_id: str = ""
|
||||
available: bool = False
|
||||
availability: str = "unavailable"
|
||||
active_sessions: dict[PlatformType, SessionData] = field(default_factory=dict)
|
||||
registered_platforms: set[PlatformType] = field(default_factory=set)
|
||||
trophy_summary: TrophySummary | None = None
|
||||
@ -92,10 +92,7 @@ class PlaystationNetwork:
|
||||
data.username = self.user.online_id
|
||||
data.account_id = self.user.account_id
|
||||
|
||||
data.available = (
|
||||
data.presence.get("basicPresence", {}).get("availability")
|
||||
== "availableToPlay"
|
||||
)
|
||||
data.availability = data.presence["basicPresence"]["availability"]
|
||||
|
||||
session = SessionData()
|
||||
session.platform = PlatformType(
|
||||
@ -127,8 +124,6 @@ class PlaystationNetwork:
|
||||
if (game_title_info := presence[0] if presence else {}) and game_title_info[
|
||||
"onlineStatus"
|
||||
] == "online":
|
||||
data.available = True
|
||||
|
||||
platform = PlatformType(game_title_info["platform"])
|
||||
|
||||
if platform is PlatformType.PS4:
|
||||
|
@ -29,6 +29,14 @@
|
||||
},
|
||||
"last_online": {
|
||||
"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."""
|
||||
session = self.coordinator.data.active_sessions.get(self.key)
|
||||
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.ON
|
||||
return MediaPlayerState.OFF
|
||||
|
@ -51,6 +51,7 @@ class PlaystationNetworkSensor(StrEnum):
|
||||
EARNED_TROPHIES_BRONZE = "earned_trophies_bronze"
|
||||
ONLINE_ID = "online_id"
|
||||
LAST_ONLINE = "last_online"
|
||||
ONLINE_STATUS = "online_status"
|
||||
|
||||
|
||||
SENSOR_DESCRIPTIONS: tuple[PlaystationNetworkSensorEntityDescription, ...] = (
|
||||
@ -121,6 +122,13 @@ SENSOR_DESCRIPTIONS: tuple[PlaystationNetworkSensorEntityDescription, ...] = (
|
||||
available_fn=lambda psn: "lastAvailableDate" in psn.presence["basicPresence"],
|
||||
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": {
|
||||
"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™',
|
||||
}),
|
||||
}),
|
||||
'available': True,
|
||||
'availability': 'availableToPlay',
|
||||
'presence': dict({
|
||||
'basicPresence': dict({
|
||||
'availability': 'availableToPlay',
|
||||
|
@ -244,6 +244,68 @@
|
||||
'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]
|
||||
EntityRegistryEntrySnapshot({
|
||||
'aliases': set({
|
||||
|
Loading…
x
Reference in New Issue
Block a user