diff --git a/custom_components/mega/config_parser.py b/custom_components/mega/config_parser.py index b0f90b4..602cddf 100644 --- a/custom_components/mega/config_parser.py +++ b/custom_components/mega/config_parser.py @@ -1,6 +1,19 @@ from dataclasses import dataclass, field from bs4 import BeautifulSoup +inputs = [ + 'eact', + 'inta', + 'misc', +] +selectors = [ + 'pty', + 'm', + 'gr', + 'd', + 'ety', +] + @dataclass(frozen=True, eq=True) class Config: @@ -8,21 +21,16 @@ class Config: m: str = None gr: str = None d: str = None - inta: str = field(compare=False, hash=False, default=None) ety: str = None + inta: str = field(compare=False, hash=False, default=None) misc: str = field(compare=False, hash=False, default=None) + eact: str = field(compare=False, hash=False, default=None) def parse_config(page: str): page = BeautifulSoup(page, features="lxml") ret = {} - for x in [ - 'pty', - 'm', - 'gr', - 'd', - 'ety', - ]: + for x in selectors: v = page.find('select', attrs={'name': x}) if v is None: continue @@ -31,12 +39,10 @@ def parse_config(page: str): if v: v = v['value'] ret[x] = v - v = page.find('input', attrs={'name': 'inta'}) - if v: - ret['inta'] = v['value'] - v = page.find('input', attrs={'name': 'misc'}) - if v: - ret['misc'] = v.get('checked', False) + for x in inputs: + v = page.find('input', attrs={'name': x}) + if v: + ret[x] = v['value'] return Config(**ret) diff --git a/custom_components/mega/http.py b/custom_components/mega/http.py index 6114349..72f2b2a 100644 --- a/custom_components/mega/http.py +++ b/custom_components/mega/http.py @@ -109,7 +109,7 @@ class MegaView(HomeAssistantView): hub.lg.warning(f'can not find extender for int port {port}') return Response(status=200) for e, v in data.items(): - if e.startswith('ext') in data: + if e.startswith('ext'): idx = e[3:] pt = f'{pt_orig}e{idx}' data['pt_orig'] = pt_orig @@ -118,6 +118,8 @@ class MegaView(HomeAssistantView): hub.values[pt] = data for cb in self.callbacks[hub.id][pt]: cb(data) + if pt in hub.ext_act: + await hub.request(cmd=hub.ext_act[pt]) else: hub.values[port] = data for cb in self.callbacks[hub.id][port]: diff --git a/custom_components/mega/hub.py b/custom_components/mega/hub.py index b40fd18..a669649 100644 --- a/custom_components/mega/hub.py +++ b/custom_components/mega/hub.py @@ -82,6 +82,7 @@ class MegaD: restore_on_restart=False, extenders=None, ext_in=None, + ext_act=None, **kwargs, ): """Initialize.""" @@ -98,6 +99,7 @@ class MegaD: self.http = None self.extenders = extenders or [] self.ext_in = ext_in or {} + self.ext_act = ext_act or {} self.poll_outs = poll_outs self.update_all = update_all if update_all is not None else True self.nports = nports @@ -517,6 +519,7 @@ class MegaD: ret['mqtt_id'] = await self.get_mqtt_id() ret['extenders'] = extenders = [] ret['ext_in'] = ext_int = {} + ret['ext_acts'] = ext_acts = {} async for port, cfg in self.scan_ports(nports): if cfg.pty == "0": ret['binary_sensor'][port].append({}) @@ -542,10 +545,13 @@ class MegaD: for n in range(len(values)): ext_page = await self.request(pt=port, ext=n) ext_cfg = parse_config(ext_page) + pt = f'{port}e{n}' if ext_cfg.ety == '1': - ret['light'][f'{port}e{n}'].append({}) + ret['light'][pt].append({}) elif ext_cfg.ety == '0': - ret['binary_sensor'][f'{port}e{n}'].append({}) + if ext_cfg.eact: + ext_acts[pt] = ext_cfg.eact + ret['binary_sensor'][pt].append({}) elif cfg == PCA9685: extenders.append(port) values = await self.request(pt=port, cmd='get')