mirror of
https://github.com/andvikt/mega_hacs.git
synced 2025-12-12 01:24:29 +05:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72cf516353 | ||
|
|
3b6459468b | ||
|
|
c36c1369aa |
@@ -160,7 +160,7 @@ async def async_remove_entry(hass, entry) -> None:
|
||||
if hub is None:
|
||||
return
|
||||
_LOGGER.debug(f'remove {id}')
|
||||
_hubs.pop(entry.entry_id)
|
||||
_hubs.pop(id, None)
|
||||
task: asyncio.Task = _POLL_TASKS.pop(id, None)
|
||||
if task is not None:
|
||||
task.cancel()
|
||||
|
||||
@@ -78,7 +78,10 @@ class MegaBinarySensor(BinarySensorEntity, MegaPushEntity):
|
||||
if val is None and self._state is not None:
|
||||
return self._state == 'ON'
|
||||
elif val is not None:
|
||||
return val == 'ON' or val != 1
|
||||
if val in ['ON', 'OFF']:
|
||||
return val == 'ON'
|
||||
else:
|
||||
return val != 1
|
||||
|
||||
def _update(self, payload: dict):
|
||||
self.mega.values[self.port] = payload
|
||||
|
||||
@@ -25,7 +25,7 @@ STEP_USER_DATA_SCHEMA = vol.Schema(
|
||||
vol.Optional(CONF_PORT_TO_SCAN, default=0): int,
|
||||
vol.Optional(CONF_MQTT_INPUTS, default=True): bool,
|
||||
vol.Optional(CONF_NPORTS, default=37): int,
|
||||
# vol.Optional(CONF_UPDATE_ALL, default=True): bool,
|
||||
vol.Optional(CONF_UPDATE_ALL, default=True): bool,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -135,7 +135,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow):
|
||||
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,
|
||||
# vol.Optional(CONF_UPDATE_ALL, default=e.get(CONF_UPDATE_ALL, True)): bool,
|
||||
vol.Optional(CONF_UPDATE_ALL, default=e.get(CONF_UPDATE_ALL, True)): bool,
|
||||
# vol.Optional(CONF_INVERT, default=''): str,
|
||||
}),
|
||||
)
|
||||
|
||||
@@ -6,9 +6,25 @@ from homeassistant.const import CONF_NAME
|
||||
from homeassistant.core import State
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
from homeassistant.helpers.restore_state import RestoreEntity
|
||||
from .hub import MegaD
|
||||
from . import hub as h
|
||||
from .const import DOMAIN, CONF_CUSTOM, CONF_INVERT, EVENT_BINARY_SENSOR, LONG, \
|
||||
LONG_RELEASE, RELEASE, PRESS, SINGLE_CLICK, DOUBLE_CLICK
|
||||
LONG_RELEASE, RELEASE, PRESS, SINGLE_CLICK, DOUBLE_CLICK, EVENT_BINARY
|
||||
|
||||
_events_on = False
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
async def _set_events_on():
|
||||
global _events_on
|
||||
await asyncio.sleep(10)
|
||||
_LOGGER.debug('events on')
|
||||
_events_on = True
|
||||
|
||||
|
||||
def set_events_off():
|
||||
global _events_on
|
||||
_events_on = False
|
||||
|
||||
_task_set_ev_on = None
|
||||
|
||||
|
||||
class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
|
||||
@@ -19,7 +35,7 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
|
||||
"""
|
||||
def __init__(
|
||||
self,
|
||||
mega: MegaD,
|
||||
mega: 'h.MegaD',
|
||||
port: int,
|
||||
config_entry: ConfigEntry = None,
|
||||
id_suffix=None,
|
||||
@@ -90,8 +106,11 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
|
||||
return self._unique_id
|
||||
|
||||
async def async_added_to_hass(self) -> None:
|
||||
global _task_set_ev_on
|
||||
await super().async_added_to_hass()
|
||||
self._state = await self.async_get_last_state()
|
||||
if self.mega.mqtt_inputs and _task_set_ev_on is None:
|
||||
_task_set_ev_on = asyncio.create_task(_set_events_on())
|
||||
|
||||
async def get_state(self):
|
||||
if self.mega.mqtt is None:
|
||||
@@ -113,12 +132,16 @@ class MegaPushEntity(BaseMegaEntity):
|
||||
self._update(value)
|
||||
self.async_write_ha_state()
|
||||
self.lg.debug(f'state after update %s', self.state)
|
||||
if self.mega.mqtt_inputs and not _events_on:
|
||||
_LOGGER.debug('skip event because events are off')
|
||||
return
|
||||
if not self.entity_id.startswith('binary_sensor'):
|
||||
_LOGGER.debug('skip event because not a bnary sens')
|
||||
return
|
||||
ll: bool = self.mega.last_long.get(self.port, False)
|
||||
if safe_int(value.get('click', 0)) == 1:
|
||||
self.hass.bus.async_fire(
|
||||
event_type=EVENT_BINARY_SENSOR,
|
||||
event_type=EVENT_BINARY,
|
||||
event_data={
|
||||
'entity_id': self.entity_id,
|
||||
'type': SINGLE_CLICK
|
||||
@@ -126,7 +149,7 @@ class MegaPushEntity(BaseMegaEntity):
|
||||
)
|
||||
elif safe_int(value.get('click', 0)) == 2:
|
||||
self.hass.bus.async_fire(
|
||||
event_type=EVENT_BINARY_SENSOR,
|
||||
event_type=EVENT_BINARY,
|
||||
event_data={
|
||||
'entity_id': self.entity_id,
|
||||
'type': DOUBLE_CLICK
|
||||
@@ -135,7 +158,7 @@ class MegaPushEntity(BaseMegaEntity):
|
||||
elif safe_int(value.get('m', 0)) == 2:
|
||||
self.mega.last_long[self.port] = True
|
||||
self.hass.bus.async_fire(
|
||||
event_type=EVENT_BINARY_SENSOR,
|
||||
event_type=EVENT_BINARY,
|
||||
event_data={
|
||||
'entity_id': self.entity_id,
|
||||
'type': LONG
|
||||
@@ -143,7 +166,7 @@ class MegaPushEntity(BaseMegaEntity):
|
||||
)
|
||||
elif safe_int(value.get('m', 0)) == 1:
|
||||
self.hass.bus.async_fire(
|
||||
event_type=EVENT_BINARY_SENSOR,
|
||||
event_type=EVENT_BINARY,
|
||||
event_data={
|
||||
'entity_id': self.entity_id,
|
||||
'type': LONG_RELEASE if ll else RELEASE,
|
||||
@@ -151,7 +174,7 @@ class MegaPushEntity(BaseMegaEntity):
|
||||
)
|
||||
elif safe_int(value.get('m', None)) == 0:
|
||||
self.hass.bus.async_fire(
|
||||
event_type=EVENT_BINARY_SENSOR,
|
||||
event_type=EVENT_BINARY,
|
||||
event_data={
|
||||
'entity_id': self.entity_id,
|
||||
'type': PRESS,
|
||||
|
||||
@@ -15,6 +15,7 @@ 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 .entities import set_events_off
|
||||
from .exceptions import CannotConnect
|
||||
from .tools import make_ints
|
||||
|
||||
@@ -109,6 +110,7 @@ class MegaD:
|
||||
async def start(self):
|
||||
self.loop = asyncio.get_event_loop()
|
||||
if self.mqtt is not None:
|
||||
set_events_off()
|
||||
self.subs = await self.mqtt.async_subscribe(
|
||||
topic=f"{self.mqtt_id}/+",
|
||||
msg_callback=self._process_msg,
|
||||
@@ -209,9 +211,9 @@ class MegaD:
|
||||
raise NoPort()
|
||||
if ':' in ret:
|
||||
ret = PATT_SPLIT.split(ret)
|
||||
ret = dict([
|
||||
ret = {'value': dict([
|
||||
x.split(':') for x in ret if x.count(':') == 1
|
||||
])
|
||||
])}
|
||||
elif 'ON' in ret:
|
||||
ret = {'value': 'ON'}
|
||||
elif 'OFF' in ret:
|
||||
@@ -232,7 +234,7 @@ class MegaD:
|
||||
self.lg.debug('parsed: %s', ret)
|
||||
if http_cmd == 'list' and isinstance(ret, dict) and 'value' in ret:
|
||||
await asyncio.sleep(1)
|
||||
ret = await self.request(pt=port, http_cmd=http_cmd)
|
||||
ret = await self.request(pt=port, cmd=http_cmd)
|
||||
ret = self.parse_response(ret)
|
||||
self.values[port] = ret
|
||||
return ret
|
||||
@@ -252,7 +254,7 @@ class MegaD:
|
||||
except asyncio.TimeoutError:
|
||||
self.lg.error(f'timeout when getting port {port}')
|
||||
|
||||
async def get_all_ports(self):
|
||||
async def get_all_ports(self, only_out=False):
|
||||
if not self.mqtt_inputs:
|
||||
ret = await self.request(cmd='all')
|
||||
for port, x in enumerate(ret.split(';')):
|
||||
|
||||
@@ -149,7 +149,9 @@ class Mega1WSensor(MegaPushEntity):
|
||||
try:
|
||||
ret = self.mega.values.get(self.port, {})
|
||||
if isinstance(ret, dict):
|
||||
ret = ret.get(self.key)
|
||||
ret = ret.get('value', {})
|
||||
if isinstance(ret, dict):
|
||||
ret = ret.get(self.key)
|
||||
except:
|
||||
self.lg.error(self.mega.values.get(self.port, {}).get('value', {}))
|
||||
return
|
||||
|
||||
@@ -15,7 +15,7 @@ from homeassistant.const import (
|
||||
CONF_DOMAIN,
|
||||
)
|
||||
from homeassistant.core import HomeAssistant
|
||||
from .entities import MegaD
|
||||
from . import hub as h
|
||||
from .entities import MegaOutPort
|
||||
from .const import CONF_DIMMER, CONF_SWITCH, DOMAIN, CONF_CUSTOM, CONF_SKIP
|
||||
|
||||
@@ -45,7 +45,7 @@ async def async_setup_platform(hass, config, add_entities, discovery_info=None):
|
||||
|
||||
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_devices):
|
||||
mid = config_entry.data[CONF_ID]
|
||||
hub: MegaD = hass.data['mega'][mid]
|
||||
hub: 'h.MegaD' = hass.data['mega'][mid]
|
||||
devices = []
|
||||
|
||||
customize = hass.data.get(DOMAIN, {}).get(CONF_CUSTOM, {})
|
||||
|
||||
Reference in New Issue
Block a user