core/homeassistant/components/dlna_dmr/media_player.py

619 lines
21 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
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 collections.abc import Mapping, Sequence
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
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 import UpnpError, UpnpService, UpnpStateVariable
from async_upnp_client.const import NotificationSubType
from async_upnp_client.profiles.dlna import DmrDevice, TransportState
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 (
2019-07-31 19:25:30 +00:00
SUPPORT_NEXT_TRACK,
SUPPORT_PAUSE,
SUPPORT_PLAY,
SUPPORT_PLAY_MEDIA,
SUPPORT_PREVIOUS_TRACK,
SUPPORT_SEEK,
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,
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
STATE_UNKNOWN,
2019-07-31 19:25:30 +00:00
)
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
from .const import (
CONF_CALLBACK_URL_OVERRIDE,
CONF_LISTEN_PORT,
CONF_POLL_AVAILABILITY,
DEFAULT_NAME,
DOMAIN,
LOGGER as _LOGGER,
)
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,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
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
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."""
del hass # Unused
_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
entry.async_on_unload(
entry.add_update_listener(entity.async_config_update_listener)
)
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
_remove_ssdp_callbacks: list[Callable]
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()
self._remove_ssdp_callbacks = []
async def async_added_to_hass(self) -> None:
"""Handle addition."""
# 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
self._remove_ssdp_callbacks.append(
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.
self._remove_ssdp_callbacks.append(
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."""
for callback in self._remove_ssdp_callbacks:
callback()
self._remove_ssdp_callbacks.clear()
await self._device_disconnect()
async def async_ssdp_callback(
self, info: Mapping[str, Any], change: ssdp.SsdpChange
) -> 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
try:
next_bootid_str = info[ssdp.ATTR_SSDP_NEXTBOOTID]
self._bootid = int(next_bootid_str, 10)
except (KeyError, ValueError):
pass
# 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
self.schedule_update_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."""
del hass # Unused
_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
self.schedule_update_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 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)
@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
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:
_LOGGER.debug("Device unavailable")
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
del service # Unused
if not state_variables:
# Indicates a failure to resubscribe, check if device is still available
self.check_available = True
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
self.schedule_update_ha_state()
@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
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)
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 = "Home Assistant"
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
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)
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_wait_for_can_play()
2018-09-09 12:26:06 +00:00
# If already playing, no need to call 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.transport_state == TransportState.PLAYING:
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
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
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
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_title
@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
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 state(self) -> str:
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 of the player."""
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.available:
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 STATE_OFF
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.transport_state is 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 STATE_ON
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.transport_state in (
TransportState.PLAYING,
TransportState.TRANSITIONING,
):
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 STATE_PLAYING
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.transport_state in (
TransportState.PAUSED_PLAYBACK,
TransportState.PAUSED_RECORDING,
):
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 STATE_PAUSED
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.transport_state == TransportState.VENDOR_DEFINED:
return STATE_UNKNOWN
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 STATE_IDLE
@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
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 unique_id(self) -> str:
"""Report the UDN (Unique Device Name) as this entity's unique ID."""
return self.udn
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 usn(self) -> str:
"""Get the USN based on the UDN (Unique Device Name) and device type."""
return f"{self.udn}::{self.device_type}"