diff --git a/custom_components/mega/binary_sensor.py b/custom_components/mega/binary_sensor.py index 0490d20..423fb12 100644 --- a/custom_components/mega/binary_sensor.py +++ b/custom_components/mega/binary_sensor.py @@ -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 diff --git a/custom_components/mega/config_flow.py b/custom_components/mega/config_flow.py index f454bd9..97a2e87 100644 --- a/custom_components/mega/config_flow.py +++ b/custom_components/mega/config_flow.py @@ -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, }), ) diff --git a/custom_components/mega/entities.py b/custom_components/mega/entities.py index c24e8c5..134ccf2 100644 --- a/custom_components/mega/entities.py +++ b/custom_components/mega/entities.py @@ -8,7 +8,18 @@ from homeassistant.helpers.update_coordinator import CoordinatorEntity from homeassistant.helpers.restore_state import RestoreEntity from .hub import MegaD 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 + +_task_set_ev_on = None class BaseMegaEntity(CoordinatorEntity, RestoreEntity): @@ -90,8 +101,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 +127,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 +144,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 +153,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 +161,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 +169,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, diff --git a/custom_components/mega/hub.py b/custom_components/mega/hub.py index ee13990..fe9c468 100644 --- a/custom_components/mega/hub.py +++ b/custom_components/mega/hub.py @@ -252,7 +252,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(';')): diff --git a/custom_components/mega/sensor.py b/custom_components/mega/sensor.py index cf3a7d3..5f9ae05 100644 --- a/custom_components/mega/sensor.py +++ b/custom_components/mega/sensor.py @@ -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