"""Discover Songpal devices."""
|
|
import logging
|
|
from . import SSDPDiscoverable
|
|
from . import ATTR_PROPERTIES
|
|
|
|
|
|
class Discoverable(SSDPDiscoverable):
|
|
"""Support for Songpal devices.
|
|
Supported devices: http://vssupport.sony.net/en_ww/device.html."""
|
|
|
|
def get_entries(self):
|
|
"""Get all the Songpal devices."""
|
|
devs = self.find_by_st(
|
|
"urn:schemas-sony-com:service:ScalarWebAPI:1")
|
|
|
|
# At least some Bravia televisions use this API for communication.
|
|
# Based on some examples they always seem to lack modelNumber,
|
|
# so we use it here to keep them undiscovered for now.
|
|
non_bravias = []
|
|
for dev in devs:
|
|
if 'device' in dev.description:
|
|
device = dev.description['device']
|
|
if 'modelNumber' in device:
|
|
non_bravias.append(dev)
|
|
|
|
return non_bravias
|
|
|
|
def info_from_entry(self, entry):
|
|
"""Get information for a device.."""
|
|
info = super().info_from_entry(entry)
|
|
|
|
cached_descs = entry.DESCRIPTION_CACHE[entry.location]
|
|
|
|
device_info_element = "X_ScalarWebAPI_DeviceInfo"
|
|
baseurl_element = "X_ScalarWebAPI_BaseURL"
|
|
device_element = "device"
|
|
if device_element in cached_descs and \
|
|
device_info_element in cached_descs[device_element]:
|
|
scalarweb = cached_descs[device_element][device_info_element]
|
|
|
|
properties = {"scalarwebapi": scalarweb}
|
|
if baseurl_element in scalarweb:
|
|
properties["endpoint"] = scalarweb[baseurl_element]
|
|
else:
|
|
logging.warning("Unable to find %s", baseurl_element)
|
|
info[ATTR_PROPERTIES] = properties
|
|
else:
|
|
logging.warning("Unable to find ScalarWeb element from desc.")
|
|
|
|
return info
|