fix binary sensors

This commit is contained in:
Andrey
2021-01-28 10:29:16 +03:00
parent 6d3391bc45
commit c36c1369aa
5 changed files with 34 additions and 11 deletions

View File

@@ -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

View File

@@ -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,
}),
)

View File

@@ -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,

View File

@@ -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(';')):

View File

@@ -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