mirror of
https://github.com/andvikt/mega_hacs.git
synced 2025-12-11 00:54:28 +05:00
add force_i2c, add new port namings
This commit is contained in:
@@ -16,7 +16,7 @@ from homeassistant.components import mqtt
|
|||||||
from homeassistant.config_entries import ConfigEntry
|
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, \
|
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_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 .hub import MegaD
|
||||||
from .config_flow import ConfigFlow
|
from .config_flow import ConfigFlow
|
||||||
from .http import MegaView
|
from .http import MegaView
|
||||||
@@ -46,6 +46,7 @@ CUSTOMIZE_PORT = {
|
|||||||
vol.Optional(CONF_GET_VALUE, default=True): bool,
|
vol.Optional(CONF_GET_VALUE, default=True): bool,
|
||||||
vol.Optional(CONF_CONV_TEMPLATE): cv.template,
|
vol.Optional(CONF_CONV_TEMPLATE): cv.template,
|
||||||
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
|
vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
|
||||||
|
vol.Optional(CONF_FORCE_I2C_SCAN): bool,
|
||||||
}
|
}
|
||||||
CUSTOMIZE_DS2413 = {
|
CUSTOMIZE_DS2413 = {
|
||||||
vol.Optional(str.lower, description='адрес и индекс устройства'): CUSTOMIZE_PORT
|
vol.Optional(str.lower, description='адрес и индекс устройства'): CUSTOMIZE_PORT
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ STEP_USER_DATA_SCHEMA = vol.Schema(
|
|||||||
vol.Required(CONF_PASSWORD, default="sec"): str,
|
vol.Required(CONF_PASSWORD, default="sec"): str,
|
||||||
vol.Optional(CONF_SCAN_INTERVAL, default=0): int,
|
vol.Optional(CONF_SCAN_INTERVAL, default=0): int,
|
||||||
vol.Optional(CONF_POLL_OUTS, default=False): bool,
|
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_MQTT_INPUTS, default=False): bool,
|
||||||
vol.Optional(CONF_NPORTS, default=37): int,
|
vol.Optional(CONF_NPORTS, default=37): int,
|
||||||
vol.Optional(CONF_UPDATE_ALL, default=True): bool,
|
vol.Optional(CONF_UPDATE_ALL, default=True): bool,
|
||||||
@@ -82,6 +82,7 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
await hub.stop()
|
await hub.stop()
|
||||||
hub.lg.debug(f'config loaded: %s', config)
|
hub.lg.debug(f'config loaded: %s', config)
|
||||||
config.update(user_input)
|
config.update(user_input)
|
||||||
|
config['new_naming'] = True
|
||||||
return self.async_create_entry(
|
return self.async_create_entry(
|
||||||
title=user_input.get(CONF_ID, user_input[CONF_HOST]),
|
title=user_input.get(CONF_ID, user_input[CONF_HOST]),
|
||||||
data=config,
|
data=config,
|
||||||
@@ -113,6 +114,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
|
|
||||||
async def async_step_init(self, user_input=None):
|
async def async_step_init(self, user_input=None):
|
||||||
"""Manage the options."""
|
"""Manage the options."""
|
||||||
|
new_naming = self.config_entry.data.get('new_naming', False)
|
||||||
hub = await get_hub(self.hass, self.config_entry.data)
|
hub = await get_hub(self.hass, self.config_entry.data)
|
||||||
if user_input is not None:
|
if user_input is not None:
|
||||||
reload = user_input.pop(CONF_RELOAD)
|
reload = user_input.pop(CONF_RELOAD)
|
||||||
@@ -129,6 +131,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
for x in PLATFORMS:
|
for x in PLATFORMS:
|
||||||
cfg.pop(x, None)
|
cfg.pop(x, None)
|
||||||
cfg.update(new)
|
cfg.update(new)
|
||||||
|
cfg['new_naming'] = new_naming
|
||||||
return self.async_create_entry(
|
return self.async_create_entry(
|
||||||
title='',
|
title='',
|
||||||
data=cfg,
|
data=cfg,
|
||||||
@@ -139,7 +142,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
data_schema=vol.Schema({
|
data_schema=vol.Schema({
|
||||||
vol.Optional(CONF_SCAN_INTERVAL, default=e.get(CONF_SCAN_INTERVAL, 0)): int,
|
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_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_MQTT_INPUTS, default=e.get(CONF_MQTT_INPUTS, True)): bool,
|
||||||
vol.Optional(CONF_NPORTS, default=e.get(CONF_NPORTS, 37)): int,
|
vol.Optional(CONF_NPORTS, default=e.get(CONF_NPORTS, 37)): int,
|
||||||
vol.Optional(CONF_RELOAD, default=False): bool,
|
vol.Optional(CONF_RELOAD, default=False): bool,
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ CONF_DEF_RESPONSE = 'def_response'
|
|||||||
CONF_RESTORE_ON_RESTART = 'restore_on_restart'
|
CONF_RESTORE_ON_RESTART = 'restore_on_restart'
|
||||||
CONF_CLICK_TIME = 'click_time'
|
CONF_CLICK_TIME = 'click_time'
|
||||||
CONF_LONG_TIME = 'long_time'
|
CONF_LONG_TIME = 'long_time'
|
||||||
|
CONF_FORCE_I2C_SCAN = 'force_i2c_scan'
|
||||||
PLATFORMS = [
|
PLATFORMS = [
|
||||||
"light",
|
"light",
|
||||||
"switch",
|
"switch",
|
||||||
|
|||||||
@@ -60,7 +60,8 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
|
|||||||
self._lg = None
|
self._lg = None
|
||||||
self._unique_id = unique_id or f"mega_{mega.id}_{port}" + \
|
self._unique_id = unique_id or f"mega_{mega.id}_{port}" + \
|
||||||
(f"_{id_suffix}" if id_suffix else "")
|
(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 "")
|
(f"_{id_suffix}" if id_suffix else "")
|
||||||
self._customize: dict = None
|
self._customize: dict = None
|
||||||
self.index = index
|
self.index = index
|
||||||
@@ -85,6 +86,7 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def device_info(self):
|
def device_info(self):
|
||||||
|
_pt = self.port if not self.mega.new_naming else f'{self.port:02}'
|
||||||
return {
|
return {
|
||||||
"identifiers": {
|
"identifiers": {
|
||||||
# Serial numbers are unique identifiers within a specific domain
|
# Serial numbers are unique identifiers within a specific domain
|
||||||
@@ -93,7 +95,7 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
|
|||||||
"config_entries": [
|
"config_entries": [
|
||||||
self.config_entry,
|
self.config_entry,
|
||||||
],
|
],
|
||||||
"name": f'{self._mega_id} port {self.port}',
|
"name": f'{self._mega_id} port {_pt}',
|
||||||
"manufacturer": 'ab-log.ru',
|
"manufacturer": 'ab-log.ru',
|
||||||
# "model": self.light.productname,
|
# "model": self.light.productname,
|
||||||
"sw_version": self.mega.fw,
|
"sw_version": self.mega.fw,
|
||||||
@@ -114,7 +116,8 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
|
|||||||
def name(self):
|
def name(self):
|
||||||
c = self.customize.get(CONF_NAME)
|
c = self.customize.get(CONF_NAME)
|
||||||
if not isinstance(c, str):
|
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
|
return c
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ from .config_parser import parse_config, DS2413, MCP230, MCP230_OUT, MCP230_IN,
|
|||||||
from .const import (
|
from .const import (
|
||||||
TEMP, HUM, PRESS,
|
TEMP, HUM, PRESS,
|
||||||
LUX, PATT_SPLIT, DOMAIN,
|
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 .entities import set_events_off, BaseMegaEntity, MegaOutPort
|
||||||
from .exceptions import CannotConnect, NoPort
|
from .exceptions import CannotConnect, NoPort
|
||||||
@@ -85,6 +85,7 @@ class MegaD:
|
|||||||
ext_in=None,
|
ext_in=None,
|
||||||
ext_acts=None,
|
ext_acts=None,
|
||||||
i2c_sensors=None,
|
i2c_sensors=None,
|
||||||
|
new_naming=False,
|
||||||
**kwargs,
|
**kwargs,
|
||||||
):
|
):
|
||||||
"""Initialize."""
|
"""Initialize."""
|
||||||
@@ -99,6 +100,7 @@ class MegaD:
|
|||||||
self.http.hubs[mqtt_id] = self
|
self.http.hubs[mqtt_id] = self
|
||||||
else:
|
else:
|
||||||
self.http = None
|
self.http = None
|
||||||
|
self.new_naming = new_naming
|
||||||
self.extenders = extenders or []
|
self.extenders = extenders or []
|
||||||
self.ext_in = ext_in or {}
|
self.ext_in = ext_in or {}
|
||||||
self.ext_act = ext_acts or {}
|
self.ext_act = ext_acts or {}
|
||||||
@@ -267,8 +269,8 @@ class MegaD:
|
|||||||
await self.get_all_ports(check_skip=True)
|
await self.get_all_ports(check_skip=True)
|
||||||
elif len(self.sensors) > 0:
|
elif len(self.sensors) > 0:
|
||||||
await self.get_sensors()
|
await self.get_sensors()
|
||||||
else:
|
# else:
|
||||||
await self.get_port(self.port_to_scan)
|
# await self.get_port(self.port_to_scan)
|
||||||
await self._get_ds2413()
|
await self._get_ds2413()
|
||||||
return self.values
|
return self.values
|
||||||
|
|
||||||
@@ -550,6 +552,9 @@ class MegaD:
|
|||||||
ret['ext_acts'] = ext_acts = {}
|
ret['ext_acts'] = ext_acts = {}
|
||||||
ret['i2c_sensors'] = i2c_sensors = []
|
ret['i2c_sensors'] = i2c_sensors = []
|
||||||
async for port, cfg in self.scan_ports(nports):
|
async for port, cfg in self.scan_ports(nports):
|
||||||
|
_cust = self.customize.get(port)
|
||||||
|
if not isinstance(_customise, dict):
|
||||||
|
_cust = {}
|
||||||
if cfg.pty == "0":
|
if cfg.pty == "0":
|
||||||
ret['binary_sensor'][port].append({})
|
ret['binary_sensor'][port].append({})
|
||||||
elif cfg.pty == "1" and (cfg.m in ['0', '1', '3'] or cfg.m is None):
|
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(';')
|
values = values.split(';')
|
||||||
for n in range(len(values)):
|
for n in range(len(values)):
|
||||||
ret['light'][f'{port}e{n}'].append({'dimmer': True, 'dimmer_scale': 16})
|
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
|
# i2c в режиме ANY
|
||||||
scan = cfg.src.find('a', text='I2C Scan')
|
scan = cfg.src.find('a', text='I2C Scan')
|
||||||
self.lg.debug(f'find scan link: %s', scan)
|
self.lg.debug(f'find scan link: %s', scan)
|
||||||
|
|||||||
Reference in New Issue
Block a user