From b6407f77dae2c28ba16e8bc976268d2bee2c84bf Mon Sep 17 00:00:00 2001 From: Barry Williams Date: Sat, 30 May 2020 13:40:35 +0100 Subject: [PATCH] Add service to openhome to invoke a pin (#31119) Setup platform async Use entity services Store UUID in default data rather than entity --- .coveragerc | 2 ++ homeassistant/components/openhome/const.py | 5 +++ .../components/openhome/manifest.json | 2 +- .../components/openhome/media_player.py | 35 +++++++++++++------ .../components/openhome/services.yaml | 11 ++++++ requirements_all.txt | 2 +- 6 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 homeassistant/components/openhome/const.py create mode 100644 homeassistant/components/openhome/services.yaml diff --git a/.coveragerc b/.coveragerc index 7e0269784a4..5003e179b80 100644 --- a/.coveragerc +++ b/.coveragerc @@ -564,7 +564,9 @@ omit = homeassistant/components/openevse/sensor.py homeassistant/components/openexchangerates/sensor.py homeassistant/components/opengarage/cover.py + homeassistant/components/openhome/__init__.py homeassistant/components/openhome/media_player.py + homeassistant/components/openhome/const.py homeassistant/components/opensensemap/air_quality.py homeassistant/components/opensky/sensor.py homeassistant/components/opentherm_gw/__init__.py diff --git a/homeassistant/components/openhome/const.py b/homeassistant/components/openhome/const.py new file mode 100644 index 00000000000..09fcd2ef0e2 --- /dev/null +++ b/homeassistant/components/openhome/const.py @@ -0,0 +1,5 @@ +"""Constants for the Openhome component.""" +DOMAIN = "openhome" +SERVICE_INVOKE_PIN = "invoke_pin" +ATTR_PIN_INDEX = "pin" +DATA_OPENHOME = "openhome" diff --git a/homeassistant/components/openhome/manifest.json b/homeassistant/components/openhome/manifest.json index 8105c01dfc5..3a94215a7b1 100644 --- a/homeassistant/components/openhome/manifest.json +++ b/homeassistant/components/openhome/manifest.json @@ -2,6 +2,6 @@ "domain": "openhome", "name": "Linn / OpenHome", "documentation": "https://www.home-assistant.io/integrations/openhome", - "requirements": ["openhomedevice==0.6.3"], + "requirements": ["openhomedevice==0.7.2"], "codeowners": [] } diff --git a/homeassistant/components/openhome/media_player.py b/homeassistant/components/openhome/media_player.py index 4225228e271..b4258a88347 100644 --- a/homeassistant/components/openhome/media_player.py +++ b/homeassistant/components/openhome/media_player.py @@ -2,6 +2,7 @@ import logging from openhomedevice.Device import Device +import voluptuous as vol from homeassistant.components.media_player import MediaPlayerEntity from homeassistant.components.media_player.const import ( @@ -20,35 +21,45 @@ from homeassistant.components.media_player.const import ( SUPPORT_VOLUME_STEP, ) from homeassistant.const import STATE_IDLE, STATE_OFF, STATE_PAUSED, STATE_PLAYING +from homeassistant.helpers import config_validation as cv, entity_platform + +from .const import ATTR_PIN_INDEX, DATA_OPENHOME, SERVICE_INVOKE_PIN SUPPORT_OPENHOME = SUPPORT_SELECT_SOURCE | SUPPORT_TURN_OFF | SUPPORT_TURN_ON _LOGGER = logging.getLogger(__name__) -DEVICES = [] - -def setup_platform(hass, config, add_entities, discovery_info=None): +async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Openhome platform.""" if not discovery_info: - return True + return + + openhome_data = hass.data.setdefault(DATA_OPENHOME, set()) name = discovery_info.get("name") description = discovery_info.get("ssdp_description") + _LOGGER.info("Openhome device found: %s", name) - device = Device(description) + device = await hass.async_add_executor_job(Device, description) # if device has already been discovered - if device.Uuid() in [x.unique_id for x in DEVICES]: + if device.Uuid() in openhome_data: return True - device = OpenhomeDevice(hass, device) + entity = OpenhomeDevice(hass, device) - add_entities([device], True) - DEVICES.append(device) + async_add_entities([entity]) + openhome_data.add(device.Uuid()) - return True + platform = entity_platform.current_platform.get() + + platform.async_register_entity_service( + SERVICE_INVOKE_PIN, + {vol.Required(ATTR_PIN_INDEX): cv.positive_int}, + "invoke_pin", + ) class OpenhomeDevice(MediaPlayerEntity): @@ -162,6 +173,10 @@ class OpenhomeDevice(MediaPlayerEntity): """Select input source.""" self._device.SetSource(self._source_index[source]) + def invoke_pin(self, pin): + """Invoke pin.""" + self._device.InvokePin(pin) + @property def name(self): """Return the name of the device.""" diff --git a/homeassistant/components/openhome/services.yaml b/homeassistant/components/openhome/services.yaml new file mode 100644 index 00000000000..e8ae5fb55da --- /dev/null +++ b/homeassistant/components/openhome/services.yaml @@ -0,0 +1,11 @@ +# Describes the format for available openhome services + +invoke_pin: + description: Invoke a pin on the specified device. + fields: + entity_id: + description: The name of the openhome device to invoke the pin on + example: media_player.main_room + pin: + description: Which pin to invoke + example: 4 diff --git a/requirements_all.txt b/requirements_all.txt index bbccd9de4aa..d0811ef659c 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1012,7 +1012,7 @@ openerz-api==0.1.0 openevsewifi==0.4 # homeassistant.components.openhome -openhomedevice==0.6.3 +openhomedevice==0.7.2 # homeassistant.components.opensensemap opensensemap-api==0.1.5