From 97911d0241549b9edc0ffddca16b86b4e16a80c7 Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 5 Feb 2021 20:21:14 +0300 Subject: [PATCH] fix get_port --- custom_components/mega/__init__.py | 9 ++++++--- custom_components/mega/hub.py | 19 +++++++++++++++++-- custom_components/mega/services.yaml | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/custom_components/mega/__init__.py b/custom_components/mega/__init__.py index 39ae410..304fff2 100644 --- a/custom_components/mega/__init__.py +++ b/custom_components/mega/__init__.py @@ -75,7 +75,7 @@ async def async_setup(hass: HomeAssistant, config: dict): hass.services.async_register( DOMAIN, 'get_port', partial(_get_port, hass), schema=vol.Schema({ vol.Optional('mega_id'): str, - vol.Optional('port'): int, + vol.Optional('port'): vol.Any(int, [int]), }) ) hass.services.async_register( @@ -208,9 +208,12 @@ async def _get_port(hass: HomeAssistant, call: ServiceCall): if mega_id: hub: MegaD = hass.data[DOMAIN][mega_id] if port is None: - await hub.get_all_ports() - else: + await hub.get_all_ports(check_skip=True) + elif isinstance(port, int): await hub.get_port(port) + elif isinstance(port, list): + for x in port: + await hub.get_port(x) else: for hub in hass.data[DOMAIN].values(): if not isinstance(hub, MegaD): diff --git a/custom_components/mega/hub.py b/custom_components/mega/hub.py index 573e7f6..821a981 100644 --- a/custom_components/mega/hub.py +++ b/custom_components/mega/hub.py @@ -14,7 +14,7 @@ from homeassistant.const import DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_HUMIDITY from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import Entity from homeassistant.helpers.update_coordinator import DataUpdateCoordinator -from .const import TEMP, HUM, PATT_SPLIT, DOMAIN, CONF_HTTP, EVENT_BINARY_SENSOR +from .const import TEMP, HUM, PATT_SPLIT, DOMAIN, CONF_HTTP, EVENT_BINARY_SENSOR, CONF_CUSTOM, CONF_SKIP from .entities import set_events_off from .exceptions import CannotConnect from .tools import make_ints @@ -91,6 +91,7 @@ class MegaD: self.last_update = datetime.now() self._callbacks: typing.DefaultDict[int, typing.List[typing.Callable[[dict], typing.Coroutine]]] = defaultdict(list) self._loop = loop + self._customize = None self.values = {} self.last_port = None self.updater = DataUpdateCoordinator( @@ -138,6 +139,14 @@ class MegaD: await self.get_port(x.port, force_http=True, http_cmd=x.http_cmd) ports.append(x.port) + @property + def customize(self): + if self._customize is None: + c = self.hass.data.get(DOMAIN, {}).get(CONF_CUSTOM) or {} + c = c.get(self.id) or {} + self._customize = c + return self._customize + @property def is_online(self): return (datetime.now() - self.last_update).total_seconds() < (self.poll_interval + 10) @@ -259,14 +268,20 @@ class MegaD: except asyncio.TimeoutError: self.lg.error(f'timeout when getting port {port}') - async def get_all_ports(self, only_out=False): + async def get_all_ports(self, only_out=False, check_skip=False): if not self.mqtt_inputs: ret = await self.request(cmd='all') for port, x in enumerate(ret.split(';')): + if check_skip: + if self.customize.get(port, {}).get(CONF_SKIP, False): + continue ret = self.parse_response(x) self.values[port] = ret else: for x in range(self.nports + 1): + if check_skip: + if self.customize.get(x, {}).get(CONF_SKIP, False): + continue await self.get_port(x) async def reboot(self, save=True): diff --git a/custom_components/mega/services.yaml b/custom_components/mega/services.yaml index 55a207c..2ef7412 100644 --- a/custom_components/mega/services.yaml +++ b/custom_components/mega/services.yaml @@ -15,7 +15,7 @@ get_port: description: ID меги, можно оставить пустым, тогда будут сохранены все зарегистрированные меги example: "mega" port: - description: Номер порта (если не заполнять, будут запрошены все порты сразу) + description: Номер порта или список портов (если не заполнять, будут запрошены все порты сразу) example: 1 run_cmd: