mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 19:27:45 +00:00
directv: extended discovery via REST api, bug fix (#8800)
* fix not providing device for discovered directvs This fixes a bug introduced at 6884965c80 Discovered directv boxes would not be instantiated with a DEVICE parameter. Signed-off-by: Nicholas Sielicki <sielicki@yandex.com> * directv: add discovery of RVU clients If discovery is used with directv, also try to further discover and configure RVU client set-top boxes by requesting information from a REST service running on the main directv box/RVU-server. This commit also disables discovery if any directv configuration is supplied by the user. Signed-off-by: Nicholas Sielicki <sielicki@yandex.com> * components/media_player/directv.py: use hass.data Use hass.data instead of a global to remember state. Signed-off-by: Nicholas Sielicki <sielicki@yandex.com> * unconditionally import requests in directv.py Requests is a core requirement, so we're okay to import at the top of the file rather than conditionally / in a function. Signed-off-by: Nicholas Sielicki <sielicki@yandex.com>
This commit is contained in:
parent
7de73e9ef7
commit
ebc7ade591
@ -5,6 +5,7 @@ For more details about this platform, please refer to the documentation at
|
|||||||
https://home-assistant.io/components/media_player.directv/
|
https://home-assistant.io/components/media_player.directv/
|
||||||
"""
|
"""
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
import requests
|
||||||
|
|
||||||
from homeassistant.components.media_player import (
|
from homeassistant.components.media_player import (
|
||||||
MEDIA_TYPE_TVSHOW, MEDIA_TYPE_VIDEO, SUPPORT_PAUSE, SUPPORT_PLAY_MEDIA,
|
MEDIA_TYPE_TVSHOW, MEDIA_TYPE_VIDEO, SUPPORT_PAUSE, SUPPORT_PLAY_MEDIA,
|
||||||
@ -25,7 +26,7 @@ SUPPORT_DTV = SUPPORT_PAUSE | SUPPORT_TURN_ON | SUPPORT_TURN_OFF | \
|
|||||||
SUPPORT_PLAY_MEDIA | SUPPORT_STOP | SUPPORT_NEXT_TRACK | \
|
SUPPORT_PLAY_MEDIA | SUPPORT_STOP | SUPPORT_NEXT_TRACK | \
|
||||||
SUPPORT_PREVIOUS_TRACK | SUPPORT_PLAY
|
SUPPORT_PREVIOUS_TRACK | SUPPORT_PLAY
|
||||||
|
|
||||||
KNOWN_HOSTS = []
|
DATA_DIRECTV = "data_directv"
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
vol.Required(CONF_HOST): cv.string,
|
vol.Required(CONF_HOST): cv.string,
|
||||||
@ -37,32 +38,45 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
|||||||
|
|
||||||
def setup_platform(hass, config, add_devices, discovery_info=None):
|
def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
"""Set up the DirecTV platform."""
|
"""Set up the DirecTV platform."""
|
||||||
|
known_devices = hass.data.get(DATA_DIRECTV)
|
||||||
|
if not known_devices:
|
||||||
|
known_devices = []
|
||||||
hosts = []
|
hosts = []
|
||||||
|
|
||||||
if discovery_info:
|
if CONF_HOST in config:
|
||||||
host = discovery_info.get('host')
|
|
||||||
|
|
||||||
if host in KNOWN_HOSTS:
|
|
||||||
return
|
|
||||||
|
|
||||||
hosts.append([
|
|
||||||
'DirecTV_' + discovery_info.get('serial', ''),
|
|
||||||
host, DEFAULT_PORT
|
|
||||||
])
|
|
||||||
|
|
||||||
elif CONF_HOST in config:
|
|
||||||
hosts.append([
|
hosts.append([
|
||||||
config.get(CONF_NAME), config.get(CONF_HOST),
|
config.get(CONF_NAME), config.get(CONF_HOST),
|
||||||
config.get(CONF_PORT), config.get(CONF_DEVICE)
|
config.get(CONF_PORT), config.get(CONF_DEVICE)
|
||||||
])
|
])
|
||||||
|
|
||||||
|
elif discovery_info:
|
||||||
|
host = discovery_info.get('host')
|
||||||
|
name = 'DirecTV_' + discovery_info.get('serial', '')
|
||||||
|
|
||||||
|
# attempt to discover additional RVU units
|
||||||
|
try:
|
||||||
|
resp = requests.get(
|
||||||
|
'http://%s:%d/info/getLocations' % (host, DEFAULT_PORT)).json()
|
||||||
|
if "locations" in resp:
|
||||||
|
for loc in resp["locations"]:
|
||||||
|
if("locationName" in loc and "clientAddr" in loc
|
||||||
|
and loc["clientAddr"] not in known_devices):
|
||||||
|
hosts.append([str.title(loc["locationName"]), host,
|
||||||
|
DEFAULT_PORT, loc["clientAddr"]])
|
||||||
|
|
||||||
|
except requests.exceptions.RequestException:
|
||||||
|
# bail out and just go forward with uPnP data
|
||||||
|
if DEFAULT_DEVICE not in known_devices:
|
||||||
|
hosts.append([name, host, DEFAULT_PORT, DEFAULT_DEVICE])
|
||||||
|
|
||||||
dtvs = []
|
dtvs = []
|
||||||
|
|
||||||
for host in hosts:
|
for host in hosts:
|
||||||
dtvs.append(DirecTvDevice(*host))
|
dtvs.append(DirecTvDevice(*host))
|
||||||
KNOWN_HOSTS.append(host)
|
known_devices.append(host[-1])
|
||||||
|
|
||||||
add_devices(dtvs)
|
add_devices(dtvs)
|
||||||
|
hass.data[DATA_DIRECTV] = known_devices
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user