diff --git a/homeassistant/components/duckdns/manifest.json b/homeassistant/components/duckdns/manifest.json index 37b09318a4bda9..167b75a5a0d0aa 100644 --- a/homeassistant/components/duckdns/manifest.json +++ b/homeassistant/components/duckdns/manifest.json @@ -4,5 +4,6 @@ "codeowners": ["@tr4nt0r"], "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/duckdns", + "integration_type": "service", "iot_class": "cloud_polling" } diff --git a/homeassistant/components/playstation_network/manifest.json b/homeassistant/components/playstation_network/manifest.json index 4f59bf33518121..419f572c9a75d0 100644 --- a/homeassistant/components/playstation_network/manifest.json +++ b/homeassistant/components/playstation_network/manifest.json @@ -75,6 +75,15 @@ }, { "macaddress": "84E657*" + }, + { + "hostname": "ps5-*" + }, + { + "hostname": "ps4-*" + }, + { + "hostname": "ps3" } ], "documentation": "https://www.home-assistant.io/integrations/playstation_network", diff --git a/homeassistant/components/pooldose/quality_scale.yaml b/homeassistant/components/pooldose/quality_scale.yaml index 7c8ce99715fb02..6004d7fdb14966 100644 --- a/homeassistant/components/pooldose/quality_scale.yaml +++ b/homeassistant/components/pooldose/quality_scale.yaml @@ -53,7 +53,7 @@ rules: docs-use-cases: todo dynamic-devices: status: exempt - comment: This integration does not support dynamic devices, as it is designed for a single PoolDose device. + comment: This integration does not support dynamic device discovery, as each config entry represents a single PoolDose device with all available entities. entity-category: done entity-device-class: done entity-disabled-by-default: done @@ -63,10 +63,10 @@ rules: reconfiguration-flow: done repair-issues: status: exempt - comment: This integration does not provide repair issues, as it is designed for a single PoolDose device with a fixed configuration. + comment: This integration does not have any identified cases where repair issues would be needed. stale-devices: status: exempt - comment: This integration does not support stale devices, as it is designed for a single PoolDose device with a fixed configuration. + comment: This integration manages a single device per config entry, so stale device removal is not applicable. # Platinum async-dependency: done diff --git a/homeassistant/components/portainer/icons.json b/homeassistant/components/portainer/icons.json index 5fdcd2c50a655b..027e4eb68a10b6 100644 --- a/homeassistant/components/portainer/icons.json +++ b/homeassistant/components/portainer/icons.json @@ -7,6 +7,9 @@ "architecture": { "default": "mdi:cpu-64-bit" }, + "container_state": { + "default": "mdi:state-machine" + }, "containers_count": { "default": "mdi:database" }, diff --git a/homeassistant/components/portainer/sensor.py b/homeassistant/components/portainer/sensor.py index 7cdc4ebd51b389..cc42eecf435414 100644 --- a/homeassistant/components/portainer/sensor.py +++ b/homeassistant/components/portainer/sensor.py @@ -49,6 +49,13 @@ class PortainerEndpointSensorEntityDescription(SensorEntityDescription): translation_key="image", value_fn=lambda data: data.container.image, ), + PortainerContainerSensorEntityDescription( + key="container_state", + translation_key="container_state", + value_fn=lambda data: data.container.state, + device_class=SensorDeviceClass.ENUM, + options=["running", "exited", "paused", "restarting", "created", "dead"], + ), PortainerContainerSensorEntityDescription( key="memory_limit", translation_key="memory_limit", diff --git a/homeassistant/components/portainer/strings.json b/homeassistant/components/portainer/strings.json index 0630ff182a3380..1e9b9a86bcc522 100644 --- a/homeassistant/components/portainer/strings.json +++ b/homeassistant/components/portainer/strings.json @@ -68,6 +68,17 @@ "architecture": { "name": "Architecture" }, + "container_state": { + "name": "State", + "state": { + "created": "Created", + "dead": "Dead", + "exited": "Exited", + "paused": "Paused", + "restarting": "Restarting", + "running": "Running" + } + }, "containers_count": { "name": "Container count" }, diff --git a/homeassistant/generated/dhcp.py b/homeassistant/generated/dhcp.py index bce067a9fd6d19..0f975fbab17725 100644 --- a/homeassistant/generated/dhcp.py +++ b/homeassistant/generated/dhcp.py @@ -572,6 +572,18 @@ "domain": "playstation_network", "macaddress": "84E657*", }, + { + "domain": "playstation_network", + "hostname": "ps5-*", + }, + { + "domain": "playstation_network", + "hostname": "ps4-*", + }, + { + "domain": "playstation_network", + "hostname": "ps3", + }, { "domain": "pooldose", "hostname": "kommspot", diff --git a/homeassistant/generated/integrations.json b/homeassistant/generated/integrations.json index e1ae6e6f2a654b..c8a6f7d439c2dd 100644 --- a/homeassistant/generated/integrations.json +++ b/homeassistant/generated/integrations.json @@ -1472,7 +1472,7 @@ }, "duckdns": { "name": "Duck DNS", - "integration_type": "hub", + "integration_type": "service", "config_flow": true, "iot_class": "cloud_polling" }, diff --git a/tests/components/portainer/snapshots/test_sensor.ambr b/tests/components/portainer/snapshots/test_sensor.ambr index 36b64a7806b1f4..ac57edf5522ddb 100644 --- a/tests/components/portainer/snapshots/test_sensor.ambr +++ b/tests/components/portainer/snapshots/test_sensor.ambr @@ -275,6 +275,72 @@ 'state': '9.7412109375', }) # --- +# name: test_all_entities[sensor.focused_einstein_state-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'running', + 'exited', + 'paused', + 'restarting', + 'created', + 'dead', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.focused_einstein_state', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'State', + 'platform': 'portainer', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'container_state', + 'unique_id': 'portainer_test_entry_123_focused_einstein_container_state', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.focused_einstein_state-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'enum', + 'friendly_name': 'focused_einstein State', + 'options': list([ + 'running', + 'exited', + 'paused', + 'restarting', + 'created', + 'dead', + ]), + }), + 'context': , + 'entity_id': 'sensor.focused_einstein_state', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'running', + }) +# --- # name: test_all_entities[sensor.funny_chatelet_cpu_usage_total-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -551,6 +617,72 @@ 'state': '9.7412109375', }) # --- +# name: test_all_entities[sensor.funny_chatelet_state-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'running', + 'exited', + 'paused', + 'restarting', + 'created', + 'dead', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.funny_chatelet_state', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'State', + 'platform': 'portainer', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'container_state', + 'unique_id': 'portainer_test_entry_123_funny_chatelet_container_state', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.funny_chatelet_state-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'enum', + 'friendly_name': 'funny_chatelet State', + 'options': list([ + 'running', + 'exited', + 'paused', + 'restarting', + 'created', + 'dead', + ]), + }), + 'context': , + 'entity_id': 'sensor.funny_chatelet_state', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'running', + }) +# --- # name: test_all_entities[sensor.my_environment_api_version-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -1480,6 +1612,72 @@ 'state': '9.7412109375', }) # --- +# name: test_all_entities[sensor.practical_morse_state-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'running', + 'exited', + 'paused', + 'restarting', + 'created', + 'dead', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.practical_morse_state', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'State', + 'platform': 'portainer', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'container_state', + 'unique_id': 'portainer_test_entry_123_practical_morse_container_state', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.practical_morse_state-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'enum', + 'friendly_name': 'practical_morse State', + 'options': list([ + 'running', + 'exited', + 'paused', + 'restarting', + 'created', + 'dead', + ]), + }), + 'context': , + 'entity_id': 'sensor.practical_morse_state', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'running', + }) +# --- # name: test_all_entities[sensor.serene_banach_cpu_usage_total-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -1756,6 +1954,72 @@ 'state': '9.7412109375', }) # --- +# name: test_all_entities[sensor.serene_banach_state-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'running', + 'exited', + 'paused', + 'restarting', + 'created', + 'dead', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.serene_banach_state', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'State', + 'platform': 'portainer', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'container_state', + 'unique_id': 'portainer_test_entry_123_serene_banach_container_state', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.serene_banach_state-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'enum', + 'friendly_name': 'serene_banach State', + 'options': list([ + 'running', + 'exited', + 'paused', + 'restarting', + 'created', + 'dead', + ]), + }), + 'context': , + 'entity_id': 'sensor.serene_banach_state', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'running', + }) +# --- # name: test_all_entities[sensor.stoic_turing_cpu_usage_total-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ @@ -2032,3 +2296,69 @@ 'state': '9.7412109375', }) # --- +# name: test_all_entities[sensor.stoic_turing_state-entry] + EntityRegistryEntrySnapshot({ + 'aliases': set({ + }), + 'area_id': None, + 'capabilities': dict({ + 'options': list([ + 'running', + 'exited', + 'paused', + 'restarting', + 'created', + 'dead', + ]), + }), + 'config_entry_id': , + 'config_subentry_id': , + 'device_class': None, + 'device_id': , + 'disabled_by': None, + 'domain': 'sensor', + 'entity_category': None, + 'entity_id': 'sensor.stoic_turing_state', + 'has_entity_name': True, + 'hidden_by': None, + 'icon': None, + 'id': , + 'labels': set({ + }), + 'name': None, + 'options': dict({ + }), + 'original_device_class': , + 'original_icon': None, + 'original_name': 'State', + 'platform': 'portainer', + 'previous_unique_id': None, + 'suggested_object_id': None, + 'supported_features': 0, + 'translation_key': 'container_state', + 'unique_id': 'portainer_test_entry_123_stoic_turing_container_state', + 'unit_of_measurement': None, + }) +# --- +# name: test_all_entities[sensor.stoic_turing_state-state] + StateSnapshot({ + 'attributes': ReadOnlyDict({ + 'device_class': 'enum', + 'friendly_name': 'stoic_turing State', + 'options': list([ + 'running', + 'exited', + 'paused', + 'restarting', + 'created', + 'dead', + ]), + }), + 'context': , + 'entity_id': 'sensor.stoic_turing_state', + 'last_changed': , + 'last_reported': , + 'last_updated': , + 'state': 'running', + }) +# ---