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 .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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user