Lookup manufacturer name for casts (#33845)

* Lookup manufacturer name, remove use of get_multizone_status

* Bump pychromecast

* Bump pychromecast

* Fix test
pull/33891/head
Erik Montnemery 2020-04-09 10:58:19 +02:00 committed by GitHub
parent 87e7e7fe8a
commit 3845539577
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 14 additions and 24 deletions

View File

@ -3,6 +3,7 @@ from typing import Optional, Tuple
import attr import attr
from pychromecast import dial from pychromecast import dial
from pychromecast.const import CAST_MANUFACTURERS
from .const import DEFAULT_PORT from .const import DEFAULT_PORT
@ -20,7 +21,6 @@ class ChromecastInfo:
uuid = attr.ib( uuid = attr.ib(
type=Optional[str], converter=attr.converters.optional(str), default=None type=Optional[str], converter=attr.converters.optional(str), default=None
) # always convert UUID to string if not None ) # always convert UUID to string if not None
manufacturer = attr.ib(type=str, default="")
model_name = attr.ib(type=str, default="") model_name = attr.ib(type=str, default="")
friendly_name = attr.ib(type=Optional[str], default=None) friendly_name = attr.ib(type=Optional[str], default=None)
is_dynamic_group = attr.ib(type=Optional[bool], default=None) is_dynamic_group = attr.ib(type=Optional[bool], default=None)
@ -52,6 +52,13 @@ class ChromecastInfo:
"""Return the host+port tuple.""" """Return the host+port tuple."""
return self.host, self.port return self.host, self.port
@property
def manufacturer(self) -> str:
"""Return the manufacturer."""
if not self.model_name:
return None
return CAST_MANUFACTURERS.get(self.model_name.lower(), "Google Inc.")
def fill_out_missing_chromecast_info(self) -> "ChromecastInfo": def fill_out_missing_chromecast_info(self) -> "ChromecastInfo":
"""Return a new ChromecastInfo object with missing attributes filled in. """Return a new ChromecastInfo object with missing attributes filled in.
@ -62,22 +69,8 @@ class ChromecastInfo:
# audio group, so checking via HTTP won't give us any new information. # audio group, so checking via HTTP won't give us any new information.
return self return self
# Fill out missing information via HTTP dial.
if self.is_audio_group: if self.is_audio_group:
is_dynamic_group = False is_dynamic_group = False
http_group_status = None
dynamic_groups = []
if self.uuid:
http_group_status = dial.get_multizone_status(
self.host,
services=[self.service],
zconf=ChromeCastZeroconf.get_zeroconf(),
)
if http_group_status is not None:
dynamic_groups = [
str(g.uuid) for g in http_group_status.dynamic_groups
]
is_dynamic_group = self.uuid in dynamic_groups
return ChromecastInfo( return ChromecastInfo(
service=self.service, service=self.service,
@ -85,11 +78,11 @@ class ChromecastInfo:
port=self.port, port=self.port,
uuid=self.uuid, uuid=self.uuid,
friendly_name=self.friendly_name, friendly_name=self.friendly_name,
manufacturer=self.manufacturer,
model_name=self.model_name, model_name=self.model_name,
is_dynamic_group=is_dynamic_group, is_dynamic_group=is_dynamic_group,
) )
# Fill out some missing information (friendly_name, uuid) via HTTP dial.
http_device_status = dial.get_device_status( http_device_status = dial.get_device_status(
self.host, services=[self.service], zconf=ChromeCastZeroconf.get_zeroconf() self.host, services=[self.service], zconf=ChromeCastZeroconf.get_zeroconf()
) )
@ -103,8 +96,7 @@ class ChromecastInfo:
port=self.port, port=self.port,
uuid=(self.uuid or http_device_status.uuid), uuid=(self.uuid or http_device_status.uuid),
friendly_name=(self.friendly_name or http_device_status.friendly_name), friendly_name=(self.friendly_name or http_device_status.friendly_name),
manufacturer=(self.manufacturer or http_device_status.manufacturer), model_name=self.model_name,
model_name=(self.model_name or http_device_status.model_name),
) )
def same_dynamic_group(self, other: "ChromecastInfo") -> bool: def same_dynamic_group(self, other: "ChromecastInfo") -> bool:

View File

@ -3,7 +3,7 @@
"name": "Google Cast", "name": "Google Cast",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/cast", "documentation": "https://www.home-assistant.io/integrations/cast",
"requirements": ["pychromecast==4.2.0"], "requirements": ["pychromecast==4.2.3"],
"after_dependencies": ["cloud"], "after_dependencies": ["cloud"],
"zeroconf": ["_googlecast._tcp.local."], "zeroconf": ["_googlecast._tcp.local."],
"codeowners": ["@emontnemery"] "codeowners": ["@emontnemery"]

View File

@ -1205,7 +1205,7 @@ pycfdns==0.0.1
pychannels==1.0.0 pychannels==1.0.0
# homeassistant.components.cast # homeassistant.components.cast
pychromecast==4.2.0 pychromecast==4.2.3
# homeassistant.components.cmus # homeassistant.components.cmus
pycmus==0.1.1 pycmus==0.1.1

View File

@ -475,7 +475,7 @@ pyblackbird==0.5
pybotvac==0.0.17 pybotvac==0.0.17
# homeassistant.components.cast # homeassistant.components.cast
pychromecast==4.2.0 pychromecast==4.2.3
# homeassistant.components.coolmaster # homeassistant.components.coolmaster
pycoolmasternet==0.0.4 pycoolmasternet==0.0.4

View File

@ -182,9 +182,7 @@ async def test_internal_discovery_callback_fill_out(hass):
discover_cast, _ = await async_setup_cast_internal_discovery(hass) discover_cast, _ = await async_setup_cast_internal_discovery(hass)
info = get_fake_chromecast_info(uuid=None) info = get_fake_chromecast_info(uuid=None)
full_info = attr.evolve( full_info = attr.evolve(info, model_name="", friendly_name="Speaker", uuid=FakeUUID)
info, model_name="google home", friendly_name="Speaker", uuid=FakeUUID
)
with patch( with patch(
"homeassistant.components.cast.helpers.dial.get_device_status", "homeassistant.components.cast.helpers.dial.get_device_status",