core/homeassistant/components/dlna_dmr/media_player.py

886 lines
31 KiB
Python
Raw Normal View History

"""Support for DLNA DMR (Device Media Renderer)."""
2021-03-17 22:43:55 +00:00
from __future__ import annotations
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
import asyncio
from collections.abc import Sequence
import contextlib
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
from datetime import datetime, timedelta
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
import functools
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
from typing import Any, Callable, TypeVar, cast
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
from async_upnp_client import UpnpService, UpnpStateVariable
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
from async_upnp_client.const import NotificationSubType
from async_upnp_client.exceptions import UpnpError, UpnpResponseError
from async_upnp_client.profiles.dlna import DmrDevice, PlayMode, TransportState
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
from async_upnp_client.utils import async_get_local_ip
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
import voluptuous as vol
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
from homeassistant import config_entries
from homeassistant.components import ssdp
from homeassistant.components.media_player import PLATFORM_SCHEMA, MediaPlayerEntity
from homeassistant.components.media_player.const import (
ATTR_MEDIA_EXTRA,
REPEAT_MODE_ALL,
REPEAT_MODE_OFF,
REPEAT_MODE_ONE,
2019-07-31 19:25:30 +00:00
SUPPORT_NEXT_TRACK,
SUPPORT_PAUSE,
SUPPORT_PLAY,
SUPPORT_PLAY_MEDIA,
SUPPORT_PREVIOUS_TRACK,
SUPPORT_REPEAT_SET,
2019-07-31 19:25:30 +00:00
SUPPORT_SEEK,
SUPPORT_SELECT_SOUND_MODE,
SUPPORT_SHUFFLE_SET,
2019-07-31 19:25:30 +00:00
SUPPORT_STOP,
SUPPORT_VOLUME_MUTE,
SUPPORT_VOLUME_SET,
)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
from homeassistant.const import (
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
CONF_DEVICE_ID,
2019-07-31 19:25:30 +00:00
CONF_NAME,
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
CONF_TYPE,
2019-07-31 19:25:30 +00:00
CONF_URL,
STATE_IDLE,
STATE_OFF,
STATE_ON,
STATE_PAUSED,
STATE_PLAYING,
)
from homeassistant.core import HomeAssistant
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
from homeassistant.helpers import device_registry, entity_registry
2018-09-09 12:26:06 +00:00
import homeassistant.helpers.config_validation as cv
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
from homeassistant.helpers.entity_platform import AddEntitiesCallback
Improve dlna_dmr code quality (#56886) * Listen for config updates from DlnaDmrEntity.async_added_to_hass Use `Entity.async_on_remove` for dealing with callback cancellation, instead of re-inventing the wheel with `_remove_ssdp_callbacks`. * Use async_write_ha_state within async methods * Import YAML config from async_setup_platform * Import flow prompts user when device is uncontactable during migration When config flow is able to contact a device, or when it has information from SSDP, it will create config entries without error. If the device is uncontactable at this point then it will appear as unavailable in HA until it is turned on again. When import flow cannot migrate an entry because it needs to contact the device and can't, it will notify the user with a config flow form. * Don't del unused parameters, HA pylint doesn't care * Remove unused imports from tests * Abort config flow at earliest opportunity * Return async_abort instead of raising AbortFlow * Consolidate config entry test cleanup into a single function * fixup! Consolidate config entry test cleanup into a single function Revert "Consolidate config entry test cleanup into a single function" This reverts commit 8220da7263e346a37c3e1a219dc374c4a43c7df5. * Check resource acquisition/release in specific tests * fixup! Check resource acquisition/release in specific tests * Remove unused network dependency from manifest * _on_event runs in async context * Call async_write_ha_state directly (not via shedule_update) Co-authored-by: Martin Hjelmare <marhje52@gmail.com> Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-10-07 20:14:00 +00:00
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
from .const import (
CONF_CALLBACK_URL_OVERRIDE,
CONF_LISTEN_PORT,
CONF_POLL_AVAILABILITY,
DOMAIN,
LOGGER as _LOGGER,
MEDIA_METADATA_DIDL,
MEDIA_TYPE_MAP,
MEDIA_UPNP_CLASS_MAP,
REPEAT_PLAY_MODES,
SHUFFLE_PLAY_MODES,
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
)
from .data import EventListenAddr, get_domain_data
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
PARALLEL_UPDATES = 0
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
# Configuration via YAML is deprecated in favour of config flow
2019-07-31 19:25:30 +00:00
CONF_LISTEN_IP = "listen_ip"
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
PLATFORM_SCHEMA = vol.All(
cv.deprecated(CONF_URL),
cv.deprecated(CONF_LISTEN_IP),
cv.deprecated(CONF_LISTEN_PORT),
cv.deprecated(CONF_NAME),
cv.deprecated(CONF_CALLBACK_URL_OVERRIDE),
PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_URL): cv.string,
vol.Optional(CONF_LISTEN_IP): cv.string,
vol.Optional(CONF_LISTEN_PORT): cv.port,
Improve dlna_dmr code quality (#56886) * Listen for config updates from DlnaDmrEntity.async_added_to_hass Use `Entity.async_on_remove` for dealing with callback cancellation, instead of re-inventing the wheel with `_remove_ssdp_callbacks`. * Use async_write_ha_state within async methods * Import YAML config from async_setup_platform * Import flow prompts user when device is uncontactable during migration When config flow is able to contact a device, or when it has information from SSDP, it will create config entries without error. If the device is uncontactable at this point then it will appear as unavailable in HA until it is turned on again. When import flow cannot migrate an entry because it needs to contact the device and can't, it will notify the user with a config flow form. * Don't del unused parameters, HA pylint doesn't care * Remove unused imports from tests * Abort config flow at earliest opportunity * Return async_abort instead of raising AbortFlow * Consolidate config entry test cleanup into a single function * fixup! Consolidate config entry test cleanup into a single function Revert "Consolidate config entry test cleanup into a single function" This reverts commit 8220da7263e346a37c3e1a219dc374c4a43c7df5. * Check resource acquisition/release in specific tests * fixup! Check resource acquisition/release in specific tests * Remove unused network dependency from manifest * _on_event runs in async context * Call async_write_ha_state directly (not via shedule_update) Co-authored-by: Martin Hjelmare <marhje52@gmail.com> Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-10-07 20:14:00 +00:00
vol.Optional(CONF_NAME): cv.string,
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
vol.Optional(CONF_CALLBACK_URL_OVERRIDE): cv.url,
}
),
2019-07-31 19:25:30 +00:00
)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
Func = TypeVar("Func", bound=Callable[..., Any])
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
2019-07-31 19:25:30 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
def catch_request_errors(func: Func) -> Func:
"""Catch UpnpError errors."""
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
@functools.wraps(func)
async def wrapper(self: "DlnaDmrEntity", *args: Any, **kwargs: Any) -> Any:
"""Catch UpnpError errors and check availability before and after request."""
if not self.available:
_LOGGER.warning(
"Device disappeared when trying to call service %s", func.__name__
)
return
try:
return await func(self, *args, **kwargs)
except UpnpError as err:
self.check_available = True
_LOGGER.error("Error during call %s: %r", func.__name__, err)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
return cast(Func, wrapper)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Improve dlna_dmr code quality (#56886) * Listen for config updates from DlnaDmrEntity.async_added_to_hass Use `Entity.async_on_remove` for dealing with callback cancellation, instead of re-inventing the wheel with `_remove_ssdp_callbacks`. * Use async_write_ha_state within async methods * Import YAML config from async_setup_platform * Import flow prompts user when device is uncontactable during migration When config flow is able to contact a device, or when it has information from SSDP, it will create config entries without error. If the device is uncontactable at this point then it will appear as unavailable in HA until it is turned on again. When import flow cannot migrate an entry because it needs to contact the device and can't, it will notify the user with a config flow form. * Don't del unused parameters, HA pylint doesn't care * Remove unused imports from tests * Abort config flow at earliest opportunity * Return async_abort instead of raising AbortFlow * Consolidate config entry test cleanup into a single function * fixup! Consolidate config entry test cleanup into a single function Revert "Consolidate config entry test cleanup into a single function" This reverts commit 8220da7263e346a37c3e1a219dc374c4a43c7df5. * Check resource acquisition/release in specific tests * fixup! Check resource acquisition/release in specific tests * Remove unused network dependency from manifest * _on_event runs in async context * Call async_write_ha_state directly (not via shedule_update) Co-authored-by: Martin Hjelmare <marhje52@gmail.com> Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-10-07 20:14:00 +00:00
async def async_setup_platform(
hass: HomeAssistant,
config: ConfigType,
async_add_entities: AddEntitiesCallback,
discovery_info: DiscoveryInfoType | None = None,
) -> None:
"""Set up DLNA media_player platform."""
hass.async_create_task(
hass.config_entries.flow.async_init(
DOMAIN,
context={"source": config_entries.SOURCE_IMPORT},
data=config,
)
)
_LOGGER.warning(
"Configuring dlna_dmr via yaml is deprecated; the configuration for"
" %s will be migrated to a config entry and can be safely removed when"
"migration is complete",
config.get(CONF_URL),
)
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
async def async_setup_entry(
hass: HomeAssistant,
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
entry: config_entries.ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the DlnaDmrEntity from a config entry."""
_LOGGER.debug("media_player.async_setup_entry %s (%s)", entry.entry_id, entry.title)
# Create our own device-wrapping entity
entity = DlnaDmrEntity(
udn=entry.data[CONF_DEVICE_ID],
device_type=entry.data[CONF_TYPE],
name=entry.title,
event_port=entry.options.get(CONF_LISTEN_PORT) or 0,
event_callback_url=entry.options.get(CONF_CALLBACK_URL_OVERRIDE),
poll_availability=entry.options.get(CONF_POLL_AVAILABILITY, False),
location=entry.data[CONF_URL],
2019-07-31 19:25:30 +00:00
)
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
async_add_entities([entity])
class DlnaDmrEntity(MediaPlayerEntity):
"""Representation of a DLNA DMR device as a HA entity."""
udn: str
device_type: str
_event_addr: EventListenAddr
poll_availability: bool
# Last known URL for the device, used when adding this entity to hass to try
# to connect before SSDP has rediscovered it, or when SSDP discovery fails.
location: str
_device_lock: asyncio.Lock # Held when connecting or disconnecting the device
_device: DmrDevice | None = None
check_available: bool = False
# Track BOOTID in SSDP advertisements for device changes
_bootid: int | None = None
# DMR devices need polling for track position information. async_update will
# determine whether further device polling is required.
_attr_should_poll = True
def __init__(
self,
udn: str,
device_type: str,
name: str,
event_port: int,
event_callback_url: str | None,
poll_availability: bool,
location: str,
) -> None:
"""Initialize DLNA DMR entity."""
self.udn = udn
self.device_type = device_type
self._attr_name = name
self._event_addr = EventListenAddr(None, event_port, event_callback_url)
self.poll_availability = poll_availability
self.location = location
self._device_lock = asyncio.Lock()
async def async_added_to_hass(self) -> None:
"""Handle addition."""
Improve dlna_dmr code quality (#56886) * Listen for config updates from DlnaDmrEntity.async_added_to_hass Use `Entity.async_on_remove` for dealing with callback cancellation, instead of re-inventing the wheel with `_remove_ssdp_callbacks`. * Use async_write_ha_state within async methods * Import YAML config from async_setup_platform * Import flow prompts user when device is uncontactable during migration When config flow is able to contact a device, or when it has information from SSDP, it will create config entries without error. If the device is uncontactable at this point then it will appear as unavailable in HA until it is turned on again. When import flow cannot migrate an entry because it needs to contact the device and can't, it will notify the user with a config flow form. * Don't del unused parameters, HA pylint doesn't care * Remove unused imports from tests * Abort config flow at earliest opportunity * Return async_abort instead of raising AbortFlow * Consolidate config entry test cleanup into a single function * fixup! Consolidate config entry test cleanup into a single function Revert "Consolidate config entry test cleanup into a single function" This reverts commit 8220da7263e346a37c3e1a219dc374c4a43c7df5. * Check resource acquisition/release in specific tests * fixup! Check resource acquisition/release in specific tests * Remove unused network dependency from manifest * _on_event runs in async context * Call async_write_ha_state directly (not via shedule_update) Co-authored-by: Martin Hjelmare <marhje52@gmail.com> Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-10-07 20:14:00 +00:00
# Update this entity when the associated config entry is modified
if self.registry_entry and self.registry_entry.config_entry_id:
config_entry = self.hass.config_entries.async_get_entry(
self.registry_entry.config_entry_id
)
assert config_entry is not None
self.async_on_remove(
config_entry.add_update_listener(self.async_config_update_listener)
)
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
# Try to connect to the last known location, but don't worry if not available
if not self._device:
try:
await self._device_connect(self.location)
except UpnpError as err:
_LOGGER.debug("Couldn't connect immediately: %r", err)
# Get SSDP notifications for only this device
Improve dlna_dmr code quality (#56886) * Listen for config updates from DlnaDmrEntity.async_added_to_hass Use `Entity.async_on_remove` for dealing with callback cancellation, instead of re-inventing the wheel with `_remove_ssdp_callbacks`. * Use async_write_ha_state within async methods * Import YAML config from async_setup_platform * Import flow prompts user when device is uncontactable during migration When config flow is able to contact a device, or when it has information from SSDP, it will create config entries without error. If the device is uncontactable at this point then it will appear as unavailable in HA until it is turned on again. When import flow cannot migrate an entry because it needs to contact the device and can't, it will notify the user with a config flow form. * Don't del unused parameters, HA pylint doesn't care * Remove unused imports from tests * Abort config flow at earliest opportunity * Return async_abort instead of raising AbortFlow * Consolidate config entry test cleanup into a single function * fixup! Consolidate config entry test cleanup into a single function Revert "Consolidate config entry test cleanup into a single function" This reverts commit 8220da7263e346a37c3e1a219dc374c4a43c7df5. * Check resource acquisition/release in specific tests * fixup! Check resource acquisition/release in specific tests * Remove unused network dependency from manifest * _on_event runs in async context * Call async_write_ha_state directly (not via shedule_update) Co-authored-by: Martin Hjelmare <marhje52@gmail.com> Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-10-07 20:14:00 +00:00
self.async_on_remove(
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
await ssdp.async_register_callback(
self.hass, self.async_ssdp_callback, {"USN": self.usn}
)
2019-07-31 19:25:30 +00:00
)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
# async_upnp_client.SsdpListener only reports byebye once for each *UDN*
# (device name) which often is not the USN (service within the device)
# that we're interested in. So also listen for byebye advertisements for
# the UDN, which is reported in the _udn field of the combined_headers.
Improve dlna_dmr code quality (#56886) * Listen for config updates from DlnaDmrEntity.async_added_to_hass Use `Entity.async_on_remove` for dealing with callback cancellation, instead of re-inventing the wheel with `_remove_ssdp_callbacks`. * Use async_write_ha_state within async methods * Import YAML config from async_setup_platform * Import flow prompts user when device is uncontactable during migration When config flow is able to contact a device, or when it has information from SSDP, it will create config entries without error. If the device is uncontactable at this point then it will appear as unavailable in HA until it is turned on again. When import flow cannot migrate an entry because it needs to contact the device and can't, it will notify the user with a config flow form. * Don't del unused parameters, HA pylint doesn't care * Remove unused imports from tests * Abort config flow at earliest opportunity * Return async_abort instead of raising AbortFlow * Consolidate config entry test cleanup into a single function * fixup! Consolidate config entry test cleanup into a single function Revert "Consolidate config entry test cleanup into a single function" This reverts commit 8220da7263e346a37c3e1a219dc374c4a43c7df5. * Check resource acquisition/release in specific tests * fixup! Check resource acquisition/release in specific tests * Remove unused network dependency from manifest * _on_event runs in async context * Call async_write_ha_state directly (not via shedule_update) Co-authored-by: Martin Hjelmare <marhje52@gmail.com> Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-10-07 20:14:00 +00:00
self.async_on_remove(
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
await ssdp.async_register_callback(
self.hass,
self.async_ssdp_callback,
{"_udn": self.udn, "NTS": NotificationSubType.SSDP_BYEBYE},
)
)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
async def async_will_remove_from_hass(self) -> None:
"""Handle removal."""
await self._device_disconnect()
async def async_ssdp_callback(
self, info: ssdp.SsdpServiceInfo, change: ssdp.SsdpChange
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
) -> None:
"""Handle notification from SSDP of device state change."""
_LOGGER.debug(
"SSDP %s notification of device %s at %s",
change,
info[ssdp.ATTR_SSDP_USN],
info.get(ssdp.ATTR_SSDP_LOCATION),
)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
try:
bootid_str = info[ssdp.ATTR_SSDP_BOOTID]
bootid: int | None = int(bootid_str, 10)
except (KeyError, ValueError):
bootid = None
if change == ssdp.SsdpChange.UPDATE:
# This is an announcement that bootid is about to change
if self._bootid is not None and self._bootid == bootid:
# Store the new value (because our old value matches) so that we
# can ignore subsequent ssdp:alive messages
with contextlib.suppress(KeyError, ValueError):
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
next_bootid_str = info[ssdp.ATTR_SSDP_NEXTBOOTID]
self._bootid = int(next_bootid_str, 10)
# Nothing left to do until ssdp:alive comes through
return
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if self._bootid is not None and self._bootid != bootid and self._device:
# Device has rebooted, drop existing connection and maybe reconnect
await self._device_disconnect()
self._bootid = bootid
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if change == ssdp.SsdpChange.BYEBYE and self._device:
# Device is going away, disconnect
await self._device_disconnect()
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if change == ssdp.SsdpChange.ALIVE and not self._device:
location = info[ssdp.ATTR_SSDP_LOCATION]
try:
await self._device_connect(location)
except UpnpError as err:
_LOGGER.warning(
"Failed connecting to recently alive device at %s: %r",
location,
err,
)
# Device could have been de/re-connected, state probably changed
Improve dlna_dmr code quality (#56886) * Listen for config updates from DlnaDmrEntity.async_added_to_hass Use `Entity.async_on_remove` for dealing with callback cancellation, instead of re-inventing the wheel with `_remove_ssdp_callbacks`. * Use async_write_ha_state within async methods * Import YAML config from async_setup_platform * Import flow prompts user when device is uncontactable during migration When config flow is able to contact a device, or when it has information from SSDP, it will create config entries without error. If the device is uncontactable at this point then it will appear as unavailable in HA until it is turned on again. When import flow cannot migrate an entry because it needs to contact the device and can't, it will notify the user with a config flow form. * Don't del unused parameters, HA pylint doesn't care * Remove unused imports from tests * Abort config flow at earliest opportunity * Return async_abort instead of raising AbortFlow * Consolidate config entry test cleanup into a single function * fixup! Consolidate config entry test cleanup into a single function Revert "Consolidate config entry test cleanup into a single function" This reverts commit 8220da7263e346a37c3e1a219dc374c4a43c7df5. * Check resource acquisition/release in specific tests * fixup! Check resource acquisition/release in specific tests * Remove unused network dependency from manifest * _on_event runs in async context * Call async_write_ha_state directly (not via shedule_update) Co-authored-by: Martin Hjelmare <marhje52@gmail.com> Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-10-07 20:14:00 +00:00
self.async_write_ha_state()
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
async def async_config_update_listener(
self, hass: HomeAssistant, entry: config_entries.ConfigEntry
) -> None:
"""Handle options update by modifying self in-place."""
_LOGGER.debug(
"Updating: %s with data=%s and options=%s",
self.name,
entry.data,
entry.options,
)
self.location = entry.data[CONF_URL]
self.poll_availability = entry.options.get(CONF_POLL_AVAILABILITY, False)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
new_port = entry.options.get(CONF_LISTEN_PORT) or 0
new_callback_url = entry.options.get(CONF_CALLBACK_URL_OVERRIDE)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if (
new_port == self._event_addr.port
and new_callback_url == self._event_addr.callback_url
):
return
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
# Changes to eventing requires a device reconnect for it to update correctly
await self._device_disconnect()
# Update _event_addr after disconnecting, to stop the right event listener
self._event_addr = self._event_addr._replace(
port=new_port, callback_url=new_callback_url
)
try:
await self._device_connect(self.location)
except UpnpError as err:
_LOGGER.warning("Couldn't (re)connect after config change: %r", err)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
# Device was de/re-connected, state might have changed
Improve dlna_dmr code quality (#56886) * Listen for config updates from DlnaDmrEntity.async_added_to_hass Use `Entity.async_on_remove` for dealing with callback cancellation, instead of re-inventing the wheel with `_remove_ssdp_callbacks`. * Use async_write_ha_state within async methods * Import YAML config from async_setup_platform * Import flow prompts user when device is uncontactable during migration When config flow is able to contact a device, or when it has information from SSDP, it will create config entries without error. If the device is uncontactable at this point then it will appear as unavailable in HA until it is turned on again. When import flow cannot migrate an entry because it needs to contact the device and can't, it will notify the user with a config flow form. * Don't del unused parameters, HA pylint doesn't care * Remove unused imports from tests * Abort config flow at earliest opportunity * Return async_abort instead of raising AbortFlow * Consolidate config entry test cleanup into a single function * fixup! Consolidate config entry test cleanup into a single function Revert "Consolidate config entry test cleanup into a single function" This reverts commit 8220da7263e346a37c3e1a219dc374c4a43c7df5. * Check resource acquisition/release in specific tests * fixup! Check resource acquisition/release in specific tests * Remove unused network dependency from manifest * _on_event runs in async context * Call async_write_ha_state directly (not via shedule_update) Co-authored-by: Martin Hjelmare <marhje52@gmail.com> Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2021-10-07 20:14:00 +00:00
self.async_write_ha_state()
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
async def _device_connect(self, location: str) -> None:
"""Connect to the device now that it's available."""
_LOGGER.debug("Connecting to device at %s", location)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
async with self._device_lock:
if self._device:
_LOGGER.debug("Trying to connect when device already connected")
return
domain_data = get_domain_data(self.hass)
# Connect to the base UPNP device
upnp_device = await domain_data.upnp_factory.async_create_device(location)
# Create/get event handler that is reachable by the device, using
# the connection's local IP to listen only on the relevant interface
_, event_ip = await async_get_local_ip(location, self.hass.loop)
self._event_addr = self._event_addr._replace(host=event_ip)
event_handler = await domain_data.async_get_event_notifier(
self._event_addr, self.hass
)
# Create profile wrapper
self._device = DmrDevice(upnp_device, event_handler)
self.location = location
# Subscribe to event notifications
try:
self._device.on_event = self._on_event
await self._device.async_subscribe_services(auto_resubscribe=True)
except UpnpResponseError as err:
# Device rejected subscription request. This is OK, variables
# will be polled instead.
_LOGGER.debug("Device rejected subscription: %r", err)
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
except UpnpError as err:
# Don't leave the device half-constructed
self._device.on_event = None
self._device = None
await domain_data.async_release_event_notifier(self._event_addr)
_LOGGER.debug("Error while subscribing during device connect: %r", err)
raise
if (
not self.registry_entry
or not self.registry_entry.config_entry_id
or self.registry_entry.device_id
):
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
return
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
# Create linked HA DeviceEntry now the information is known.
dev_reg = device_registry.async_get(self.hass)
device_entry = dev_reg.async_get_or_create(
config_entry_id=self.registry_entry.config_entry_id,
# Connections are based on the root device's UDN, and the DMR
# embedded device's UDN. They may be the same, if the DMR is the
# root device.
connections={
(
device_registry.CONNECTION_UPNP,
self._device.profile_device.root_device.udn,
),
(device_registry.CONNECTION_UPNP, self._device.udn),
},
identifiers={(DOMAIN, self.unique_id)},
default_manufacturer=self._device.manufacturer,
default_model=self._device.model_name,
default_name=self._device.name,
)
# Update entity registry to link to the device
ent_reg = entity_registry.async_get(self.hass)
ent_reg.async_get_or_create(
self.registry_entry.domain,
self.registry_entry.platform,
self.unique_id,
device_id=device_entry.id,
2019-07-31 19:25:30 +00:00
)
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
async def _device_disconnect(self) -> None:
"""Destroy connections to the device now that it's not available.
Also call when removing this entity from hass to clean up connections.
"""
async with self._device_lock:
if not self._device:
_LOGGER.debug("Disconnecting from device that's not connected")
return
_LOGGER.debug("Disconnecting from %s", self._device.name)
self._device.on_event = None
old_device = self._device
self._device = None
await old_device.async_unsubscribe_services()
domain_data = get_domain_data(self.hass)
await domain_data.async_release_event_notifier(self._event_addr)
async def async_update(self) -> None:
"""Retrieve the latest data."""
if not self._device:
if not self.poll_availability:
return
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
try:
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
await self._device_connect(self.location)
except UpnpError:
return
assert self._device is not None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
try:
do_ping = self.poll_availability or self.check_available
await self._device.async_update(do_ping=do_ping)
except UpnpError as err:
_LOGGER.debug("Device unavailable: %r", err)
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
await self._device_disconnect()
return
finally:
self.check_available = False
def _on_event(
self, service: UpnpService, state_variables: Sequence[UpnpStateVariable]
) -> None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""State variable(s) changed, let home-assistant know."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if not state_variables:
# Indicates a failure to resubscribe, check if device is still available
self.check_available = True
force_refresh = False
if service.service_id == "urn:upnp-org:serviceId:AVTransport":
for state_variable in state_variables:
# Force a state refresh when player begins or pauses playback
# to update the position info.
if (
state_variable.name == "TransportState"
and state_variable.value
in (TransportState.PLAYING, TransportState.PAUSED_PLAYBACK)
):
force_refresh = True
self.async_schedule_update_ha_state(force_refresh)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
@property
def available(self) -> bool:
"""Device is available when we have a connection to it."""
return self._device is not None and self._device.profile_device.available
@property
def unique_id(self) -> str:
"""Report the UDN (Unique Device Name) as this entity's unique ID."""
return self.udn
@property
def usn(self) -> str:
"""Get the USN based on the UDN (Unique Device Name) and device type."""
return f"{self.udn}::{self.device_type}"
@property
def state(self) -> str | None:
"""State of the player."""
if not self._device or not self.available:
return STATE_OFF
if self._device.transport_state is None:
return STATE_ON
if self._device.transport_state in (
TransportState.PLAYING,
TransportState.TRANSITIONING,
):
return STATE_PLAYING
if self._device.transport_state in (
TransportState.PAUSED_PLAYBACK,
TransportState.PAUSED_RECORDING,
):
return STATE_PAUSED
if self._device.transport_state == TransportState.VENDOR_DEFINED:
# Unable to map this state to anything reasonable, so it's "Unknown"
return None
return STATE_IDLE
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
@property
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
def supported_features(self) -> int:
"""Flag media player features that are supported at this moment.
Supported features may change as the device enters different states.
"""
if not self._device:
return 0
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
supported_features = 0
if self._device.has_volume_level:
supported_features |= SUPPORT_VOLUME_SET
if self._device.has_volume_mute:
supported_features |= SUPPORT_VOLUME_MUTE
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if self._device.can_play:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
supported_features |= SUPPORT_PLAY
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if self._device.can_pause:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
supported_features |= SUPPORT_PAUSE
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if self._device.can_stop:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
supported_features |= SUPPORT_STOP
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if self._device.can_previous:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
supported_features |= SUPPORT_PREVIOUS_TRACK
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if self._device.can_next:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
supported_features |= SUPPORT_NEXT_TRACK
if self._device.has_play_media:
supported_features |= SUPPORT_PLAY_MEDIA
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if self._device.can_seek_rel_time:
supported_features |= SUPPORT_SEEK
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
play_modes = self._device.valid_play_modes
if play_modes & {PlayMode.RANDOM, PlayMode.SHUFFLE}:
supported_features |= SUPPORT_SHUFFLE_SET
if play_modes & {PlayMode.REPEAT_ONE, PlayMode.REPEAT_ALL}:
supported_features |= SUPPORT_REPEAT_SET
if self._device.has_presets:
supported_features |= SUPPORT_SELECT_SOUND_MODE
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
return supported_features
@property
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
def volume_level(self) -> float | None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Volume level of the media player (0..1)."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if not self._device or not self._device.has_volume_level:
return None
return self._device.volume_level
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
@catch_request_errors
async def async_set_volume_level(self, volume: float) -> None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Set volume level, range 0..1."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
assert self._device is not None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
await self._device.async_set_volume_level(volume)
@property
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
def is_volume_muted(self) -> bool | None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Boolean if volume is currently muted."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if not self._device:
return None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
return self._device.is_volume_muted
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
@catch_request_errors
async def async_mute_volume(self, mute: bool) -> None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Mute the volume."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
assert self._device is not None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
desired_mute = bool(mute)
await self._device.async_mute_volume(desired_mute)
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
@catch_request_errors
async def async_media_pause(self) -> None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Send pause command."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
assert self._device is not None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
await self._device.async_pause()
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
@catch_request_errors
async def async_media_play(self) -> None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Send play command."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
assert self._device is not None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
await self._device.async_play()
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
@catch_request_errors
async def async_media_stop(self) -> None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Send stop command."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
assert self._device is not None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
await self._device.async_stop()
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
@catch_request_errors
async def async_media_seek(self, position: int | float) -> None:
"""Send seek command."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
assert self._device is not None
time = timedelta(seconds=position)
await self._device.async_seek_rel_time(time)
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
@catch_request_errors
async def async_play_media(
self, media_type: str, media_id: str, **kwargs: Any
) -> None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Play a piece of media."""
_LOGGER.debug("Playing media: %s, %s, %s", media_type, media_id, kwargs)
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
assert self._device is not None
extra: dict[str, Any] = kwargs.get(ATTR_MEDIA_EXTRA) or {}
metadata: dict[str, Any] = extra.get("metadata") or {}
title = extra.get("title") or metadata.get("title") or "Home Assistant"
2021-10-30 14:33:42 +00:00
if thumb := extra.get("thumb"):
metadata["album_art_uri"] = thumb
# Translate metadata keys from HA names to DIDL-Lite names
for hass_key, didl_key in MEDIA_METADATA_DIDL.items():
if hass_key in metadata:
metadata[didl_key] = metadata.pop(hass_key)
# Create metadata specific to the given media type; different fields are
# available depending on what the upnp_class is.
upnp_class = MEDIA_UPNP_CLASS_MAP.get(media_type)
didl_metadata = await self._device.construct_play_media_metadata(
media_url=media_id,
media_title=title,
override_upnp_class=upnp_class,
meta_data=metadata,
)
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
2018-09-09 12:26:06 +00:00
# Stop current playing media
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
if self._device.can_stop:
await self.async_media_stop()
# Queue media
await self._device.async_set_transport_uri(media_id, title, didl_metadata)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
# If already playing, or don't want to autoplay, no need to call Play
autoplay = extra.get("autoplay", True)
if self._device.transport_state == TransportState.PLAYING or not autoplay:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
return
2018-09-09 12:26:06 +00:00
# Play it
await self._device.async_wait_for_can_play()
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
await self.async_media_play()
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
@catch_request_errors
async def async_media_previous_track(self) -> None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Send previous track command."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
assert self._device is not None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
await self._device.async_previous()
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
@catch_request_errors
async def async_media_next_track(self) -> None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Send next track command."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
assert self._device is not None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
await self._device.async_next()
@property
def shuffle(self) -> bool | None:
"""Boolean if shuffle is enabled."""
if not self._device:
return None
2021-10-30 14:33:42 +00:00
if not (play_mode := self._device.play_mode):
return None
if play_mode == PlayMode.VENDOR_DEFINED:
return None
return play_mode in (PlayMode.SHUFFLE, PlayMode.RANDOM)
@catch_request_errors
async def async_set_shuffle(self, shuffle: bool) -> None:
"""Enable/disable shuffle mode."""
assert self._device is not None
repeat = self.repeat or REPEAT_MODE_OFF
potential_play_modes = SHUFFLE_PLAY_MODES[(shuffle, repeat)]
valid_play_modes = self._device.valid_play_modes
for mode in potential_play_modes:
if mode in valid_play_modes:
await self._device.async_set_play_mode(mode)
return
_LOGGER.debug(
"Couldn't find a suitable mode for shuffle=%s, repeat=%s", shuffle, repeat
)
@property
def repeat(self) -> str | None:
"""Return current repeat mode."""
if not self._device:
return None
2021-10-30 14:33:42 +00:00
if not (play_mode := self._device.play_mode):
return None
if play_mode == PlayMode.VENDOR_DEFINED:
return None
if play_mode == PlayMode.REPEAT_ONE:
return REPEAT_MODE_ONE
if play_mode in (PlayMode.REPEAT_ALL, PlayMode.RANDOM):
return REPEAT_MODE_ALL
return REPEAT_MODE_OFF
@catch_request_errors
async def async_set_repeat(self, repeat: str) -> None:
"""Set repeat mode."""
assert self._device is not None
shuffle = self.shuffle or False
potential_play_modes = REPEAT_PLAY_MODES[(shuffle, repeat)]
valid_play_modes = self._device.valid_play_modes
for mode in potential_play_modes:
if mode in valid_play_modes:
await self._device.async_set_play_mode(mode)
return
_LOGGER.debug(
"Couldn't find a suitable mode for shuffle=%s, repeat=%s", shuffle, repeat
)
@property
def sound_mode(self) -> str | None:
"""Name of the current sound mode, not supported by DLNA."""
return None
@property
def sound_mode_list(self) -> list[str] | None:
"""List of available sound modes."""
if not self._device:
return None
return self._device.preset_names
@catch_request_errors
async def async_select_sound_mode(self, sound_mode: str) -> None:
"""Select sound mode."""
assert self._device is not None
await self._device.async_select_preset(sound_mode)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
@property
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
def media_title(self) -> str | None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Title of current playing media."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if not self._device:
return None
# Use the best available title
return self._device.media_program_title or self._device.media_title
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
@property
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
def media_image_url(self) -> str | None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Image url of current playing media."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if not self._device:
return None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
return self._device.media_image_url
@property
def media_content_id(self) -> str | None:
"""Content ID of current playing media."""
if not self._device:
return None
return self._device.current_track_uri
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
@property
def media_content_type(self) -> str | None:
"""Content type of current playing media."""
if not self._device or not self._device.media_class:
return None
return MEDIA_TYPE_MAP.get(self._device.media_class)
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
@property
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
def media_duration(self) -> int | None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Duration of current playing media in seconds."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if not self._device:
return None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
return self._device.media_duration
@property
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
def media_position(self) -> int | None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""Position of current playing media in seconds."""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if not self._device:
return None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
return self._device.media_position
@property
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
def media_position_updated_at(self) -> datetime | None:
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
"""When was the position of the current playing media valid.
Returns value from homeassistant.util.dt.utcnow().
"""
Config-flow for DLNA-DMR integration (#55267) * Modernize dlna_dmr component: configflow, test, types * Support config-flow with ssdp discovery * Add unit tests * Enforce strict typing * Gracefully handle network devices (dis)appearing * Fix Aiohttp mock response headers type to match actual response class * Fixes from code review * Fixes from code review * Import device config in flow if unavailable at hass start * Support SSDP advertisements * Ignore bad BOOTID, fix ssdp:byebye handling * Only listen for events on interface connected to device * Release all listeners when entities are removed * Warn about deprecated dlna_dmr configuration * Use sublogger for dlna_dmr.config_flow for easier filtering * Tests for dlna_dmr.data module * Rewrite DMR tests for HA style * Fix DMR strings: "Digital Media *Renderer*" * Update DMR entity state and device info when changed * Replace deprecated async_upnp_client State with TransportState * supported_features are dynamic, based on current device state * Cleanup fully when subscription fails * Log warnings when device connection fails unexpectedly * Set PARALLEL_UPDATES to unlimited * Fix spelling * Fixes from code review * Simplify has & can checks to just can, which includes has * Treat transitioning state as playing (not idle) to reduce UI jerking * Test if device is usable * Handle ssdp:update messages properly * Fix _remove_ssdp_callbacks being shared by all DlnaDmrEntity instances * Fix tests for transitioning state * Mock DmrDevice.is_profile_device (added to support embedded devices) * Use ST & NT SSDP headers to find DMR devices, not deviceType The deviceType is extracted from the device's description XML, and will not be what we want when dealing with embedded devices. * Use UDN from SSDP headers, not device description, as unique_id The SSDP headers have the UDN of the embedded device that we're interested in, whereas the device description (`ATTR_UPNP_UDN`) field will always be for the root device. * Fix DMR string English localization * Test config flow with UDN from SSDP headers * Bump async-upnp-client==0.22.1, fix flake8 error * fix test for remapping * DMR HA Device connections based on root and embedded UDN * DmrDevice's UpnpDevice is now named profile_device * Use device type from SSDP headers, not device description * Mark dlna_dmr constants as Final * Use embedded device UDN and type for unique ID when connected via URL * More informative connection error messages * Also match SSDP messages on NT headers The NT header is to ssdp:alive messages what ST is to M-SEARCH responses. * Bump async-upnp-client==0.22.2 * fix merge * Bump async-upnp-client==0.22.3 Co-authored-by: Steven Looman <steven.looman@gmail.com> Co-authored-by: J. Nick Koston <nick@koston.org>
2021-09-27 20:47:01 +00:00
if not self._device:
return None
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
return self._device.media_position_updated_at
@property
def media_artist(self) -> str | None:
"""Artist of current playing media, music track only."""
if not self._device:
return None
return self._device.media_artist
Add media_player.dlna_dmr component (#14749) * Add media_player.dlna_dmr component * PEP 492 * Move DIDL-template up * Remove max_volume-override option * Remove picky_device support * Use DEFAULT_NAME * Make supported_features static * Remove unneeded argument * Proper module-docstring * Add http dependency * Remove additional_configuration options, no longer used * Change default name to 'DLNA Digital Media Renderer' * Use python-didl-lite for DIDL-Lite-xml construction/parsing * Handle NOT_IMPLEMENTED for UPnP state variables RelativeTimePosition and CurrentMediaDuration * Use UPnP-UDN for unique_id * Proper handling of upnp events * Keeping flake8 happy * Update requirements_all.txt * Make UDN optional * Ensure NotifyView is started, before using it * Only subscribe to services we're interested in * Don't update state_variables if value has not been changed + minor refactoring * Improve play_media, follow flow of DLNA more closely * Hopefully fix ClientOSError problems * Flake8 fixes * Keep pylint happy * Catch errors and report gracefully * Update async_upnp_client to 0.11.0 * Don't be so noisy * Define/use constants for HTTP status codes * Add discovery entry for dlna_dmr * More robustness with regard to state variable not being set (yet) * Keep privates hidden * Handle NOT_IMPLEMENTED for CurrentTrackMetaData state variable * Fixes in async_upnp_client + renew UPnP subscriptions regularly * Not too eager * Refactor duplicate code to _current_transport_actions and improve parsing of actions * Support RC:1 to RC:3 and AVT:1 to AVT:3 * Moved DLNA-specifics to async_upnp_client.dlna.DmrDevice * Use our own HTTP server to listen for events. * More clear and explicit log message for easier troubleshooting * Follow changes by hass, fixes traceback * Fix not being able to do next * Changes after review by @MartinHjelmare * Linting * Use homeassistant.util.get_local_ip * Moved upnp event handling to async_upnp_client * Keeping pylint happy * Changes after review by @MartinHjelmare
2018-08-05 12:41:18 +00:00
@property
def media_album_name(self) -> str | None:
"""Album name of current playing media, music track only."""
if not self._device:
return None
return self._device.media_album_name
@property
def media_album_artist(self) -> str | None:
"""Album artist of current playing media, music track only."""
if not self._device:
return None
return self._device.media_album_artist
@property
def media_track(self) -> int | None:
"""Track number of current playing media, music track only."""
if not self._device:
return None
return self._device.media_track_number
@property
def media_series_title(self) -> str | None:
"""Title of series of current playing media, TV show only."""
if not self._device:
return None
return self._device.media_series_title
@property
def media_season(self) -> str | None:
"""Season number, starting at 1, of current playing media, TV show only."""
if not self._device:
return None
# Some DMRs, like Kodi, leave this as 0 and encode the season & episode
# in the episode_number metadata, as {season:d}{episode:02d}
if (
not self._device.media_season_number
or self._device.media_season_number == "0"
) and self._device.media_episode_number:
with contextlib.suppress(ValueError):
episode = int(self._device.media_episode_number, 10)
if episode > 100:
return str(episode // 100)
return self._device.media_season_number
@property
def media_episode(self) -> str | None:
"""Episode number of current playing media, TV show only."""
if not self._device:
return None
# Complement to media_season math above
if (
not self._device.media_season_number
or self._device.media_season_number == "0"
) and self._device.media_episode_number:
with contextlib.suppress(ValueError):
episode = int(self._device.media_episode_number, 10)
if episode > 100:
return str(episode % 100)
return self._device.media_episode_number
@property
def media_channel(self) -> str | None:
"""Channel name currently playing."""
if not self._device:
return None
return self._device.media_channel_name
@property
def media_playlist(self) -> str | None:
"""Title of Playlist currently playing."""
if not self._device:
return None
return self._device.media_playlist_title