From 7d8554a7aae938ce440fae53b3e0b80da93464f9 Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 4 Mar 2021 19:45:37 +0300 Subject: [PATCH] add force_i2c, add new port namings --- custom_components/mega/__init__.py | 3 ++- custom_components/mega/config_flow.py | 7 +++++-- custom_components/mega/const.py | 1 + custom_components/mega/entities.py | 9 ++++++--- custom_components/mega/hub.py | 13 +++++++++---- 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/custom_components/mega/__init__.py b/custom_components/mega/__init__.py index 4a36cf0..ed25fee 100644 --- a/custom_components/mega/__init__.py +++ b/custom_components/mega/__init__.py @@ -16,7 +16,7 @@ from homeassistant.components import mqtt from homeassistant.config_entries import ConfigEntry from .const import DOMAIN, CONF_INVERT, CONF_RELOAD, PLATFORMS, CONF_PORTS, CONF_CUSTOM, CONF_SKIP, CONF_PORT_TO_SCAN, \ CONF_MQTT_INPUTS, CONF_HTTP, CONF_RESPONSE_TEMPLATE, CONF_ACTION, CONF_GET_VALUE, CONF_ALLOW_HOSTS, \ - CONF_CONV_TEMPLATE, CONF_ALL, CONF_FORCE_D, CONF_DEF_RESPONSE + CONF_CONV_TEMPLATE, CONF_ALL, CONF_FORCE_D, CONF_DEF_RESPONSE, CONF_FORCE_I2C_SCAN from .hub import MegaD from .config_flow import ConfigFlow from .http import MegaView @@ -46,6 +46,7 @@ CUSTOMIZE_PORT = { vol.Optional(CONF_GET_VALUE, default=True): bool, vol.Optional(CONF_CONV_TEMPLATE): cv.template, vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + vol.Optional(CONF_FORCE_I2C_SCAN): bool, } CUSTOMIZE_DS2413 = { vol.Optional(str.lower, description='адрес и индекс устройства'): CUSTOMIZE_PORT diff --git a/custom_components/mega/config_flow.py b/custom_components/mega/config_flow.py index 3186820..176b64a 100644 --- a/custom_components/mega/config_flow.py +++ b/custom_components/mega/config_flow.py @@ -24,7 +24,7 @@ STEP_USER_DATA_SCHEMA = vol.Schema( vol.Required(CONF_PASSWORD, default="sec"): str, vol.Optional(CONF_SCAN_INTERVAL, default=0): int, vol.Optional(CONF_POLL_OUTS, default=False): bool, - vol.Optional(CONF_PORT_TO_SCAN, default=0): int, + # vol.Optional(CONF_PORT_TO_SCAN, default=0): int, vol.Optional(CONF_MQTT_INPUTS, default=False): bool, vol.Optional(CONF_NPORTS, default=37): int, vol.Optional(CONF_UPDATE_ALL, default=True): bool, @@ -82,6 +82,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): await hub.stop() hub.lg.debug(f'config loaded: %s', config) config.update(user_input) + config['new_naming'] = True return self.async_create_entry( title=user_input.get(CONF_ID, user_input[CONF_HOST]), data=config, @@ -113,6 +114,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow): async def async_step_init(self, user_input=None): """Manage the options.""" + new_naming = self.config_entry.data.get('new_naming', False) hub = await get_hub(self.hass, self.config_entry.data) if user_input is not None: reload = user_input.pop(CONF_RELOAD) @@ -129,6 +131,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow): for x in PLATFORMS: cfg.pop(x, None) cfg.update(new) + cfg['new_naming'] = new_naming return self.async_create_entry( title='', data=cfg, @@ -139,7 +142,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow): data_schema=vol.Schema({ vol.Optional(CONF_SCAN_INTERVAL, default=e.get(CONF_SCAN_INTERVAL, 0)): int, vol.Optional(CONF_POLL_OUTS, default=e.get(CONF_POLL_OUTS, False)): bool, - vol.Optional(CONF_PORT_TO_SCAN, default=e.get(CONF_PORT_TO_SCAN, 0)): int, + # vol.Optional(CONF_PORT_TO_SCAN, default=e.get(CONF_PORT_TO_SCAN, 0)): int, vol.Optional(CONF_MQTT_INPUTS, default=e.get(CONF_MQTT_INPUTS, True)): bool, vol.Optional(CONF_NPORTS, default=e.get(CONF_NPORTS, 37)): int, vol.Optional(CONF_RELOAD, default=False): bool, diff --git a/custom_components/mega/const.py b/custom_components/mega/const.py index c209a8e..fa430cf 100644 --- a/custom_components/mega/const.py +++ b/custom_components/mega/const.py @@ -34,6 +34,7 @@ CONF_DEF_RESPONSE = 'def_response' CONF_RESTORE_ON_RESTART = 'restore_on_restart' CONF_CLICK_TIME = 'click_time' CONF_LONG_TIME = 'long_time' +CONF_FORCE_I2C_SCAN = 'force_i2c_scan' PLATFORMS = [ "light", "switch", diff --git a/custom_components/mega/entities.py b/custom_components/mega/entities.py index 015cb2b..81d21b8 100644 --- a/custom_components/mega/entities.py +++ b/custom_components/mega/entities.py @@ -60,7 +60,8 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity): self._lg = None self._unique_id = unique_id or f"mega_{mega.id}_{port}" + \ (f"_{id_suffix}" if id_suffix else "") - self._name = name or f"{mega.id}_{port}" + \ + _pt = port if not mega.new_naming else f'{port:02}' + self._name = name or f"{mega.id}_{_pt}" + \ (f"_{id_suffix}" if id_suffix else "") self._customize: dict = None self.index = index @@ -85,6 +86,7 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity): @property def device_info(self): + _pt = self.port if not self.mega.new_naming else f'{self.port:02}' return { "identifiers": { # Serial numbers are unique identifiers within a specific domain @@ -93,7 +95,7 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity): "config_entries": [ self.config_entry, ], - "name": f'{self._mega_id} port {self.port}', + "name": f'{self._mega_id} port {_pt}', "manufacturer": 'ab-log.ru', # "model": self.light.productname, "sw_version": self.mega.fw, @@ -114,7 +116,8 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity): def name(self): c = self.customize.get(CONF_NAME) if not isinstance(c, str): - c = self._name or f"{self.mega.id}_p{self.port}" + _pt = self.port if not self.mega.new_naming else f'{self.port:02}' + c = self._name or f"{self.mega.id}_p{_pt}" return c @property diff --git a/custom_components/mega/hub.py b/custom_components/mega/hub.py index d53ff25..1e7f764 100644 --- a/custom_components/mega/hub.py +++ b/custom_components/mega/hub.py @@ -20,7 +20,7 @@ from .config_parser import parse_config, DS2413, MCP230, MCP230_OUT, MCP230_IN, from .const import ( TEMP, HUM, PRESS, LUX, PATT_SPLIT, DOMAIN, - CONF_HTTP, EVENT_BINARY_SENSOR, CONF_CUSTOM, CONF_FORCE_D, CONF_DEF_RESPONSE, PATT_FW + CONF_HTTP, EVENT_BINARY_SENSOR, CONF_CUSTOM, CONF_FORCE_D, CONF_DEF_RESPONSE, PATT_FW, CONF_FORCE_I2C_SCAN ) from .entities import set_events_off, BaseMegaEntity, MegaOutPort from .exceptions import CannotConnect, NoPort @@ -85,6 +85,7 @@ class MegaD: ext_in=None, ext_acts=None, i2c_sensors=None, + new_naming=False, **kwargs, ): """Initialize.""" @@ -99,6 +100,7 @@ class MegaD: self.http.hubs[mqtt_id] = self else: self.http = None + self.new_naming = new_naming self.extenders = extenders or [] self.ext_in = ext_in or {} self.ext_act = ext_acts or {} @@ -267,8 +269,8 @@ class MegaD: await self.get_all_ports(check_skip=True) elif len(self.sensors) > 0: await self.get_sensors() - else: - await self.get_port(self.port_to_scan) + # else: + # await self.get_port(self.port_to_scan) await self._get_ds2413() return self.values @@ -550,6 +552,9 @@ class MegaD: ret['ext_acts'] = ext_acts = {} ret['i2c_sensors'] = i2c_sensors = [] async for port, cfg in self.scan_ports(nports): + _cust = self.customize.get(port) + if not isinstance(_customise, dict): + _cust = {} if cfg.pty == "0": ret['binary_sensor'][port].append({}) elif cfg.pty == "1" and (cfg.m in ['0', '1', '3'] or cfg.m is None): @@ -588,7 +593,7 @@ class MegaD: values = values.split(';') for n in range(len(values)): ret['light'][f'{port}e{n}'].append({'dimmer': True, 'dimmer_scale': 16}) - elif cfg.pty == '4' and cfg.gr == '0': + elif cfg.pty == '4' and (cfg.gr == '0' or _cust.get(CONF_FORCE_I2C_SCAN)): # i2c в режиме ANY scan = cfg.src.find('a', text='I2C Scan') self.lg.debug(f'find scan link: %s', scan)