diff --git a/custom_components/mega/entities.py b/custom_components/mega/entities.py index 5182b5b..270fc4b 100644 --- a/custom_components/mega/entities.py +++ b/custom_components/mega/entities.py @@ -155,10 +155,12 @@ class MegaOutPort(MegaPushEntity): @property def is_on(self) -> bool: - val = self.mega.values.get(self.port, {}).get("value") + val = self.mega.values.get(self.port, {}) + if val is None and self._state is not None: return self._state == 'ON' elif val is not None: + val = val.get("value") if not self.invert: return val == 'ON' or str(val) == '1' or (safe_int(val) is not None and safe_int(val) > 0) else: @@ -186,10 +188,11 @@ class MegaOutPort(MegaPushEntity): self.mega.values[self.port] = {'value': cmd} await self.get_state() + def safe_int(v): if v in ['ON', 'OFF']: return None try: return int(v) - except ValueError: + except (ValueError, TypeError): return None \ No newline at end of file diff --git a/custom_components/mega/hub.py b/custom_components/mega/hub.py index 0628253..0c6debb 100644 --- a/custom_components/mega/hub.py +++ b/custom_components/mega/hub.py @@ -291,16 +291,18 @@ class MegaD: value = None try: value = json.loads(msg.payload) - value = make_ints(value) + if isinstance(value, dict): + make_ints(value) self.values[port] = value for cb in self._callbacks[port]: cb(value) - value = value.copy() - value['mega_id'] = self.id - self.hass.bus.async_fire( - EVENT_BINARY_SENSOR, - value, - ) + if isinstance(value, dict): + value = value.copy() + value['mega_id'] = self.id + self.hass.bus.async_fire( + EVENT_BINARY_SENSOR, + value, + ) except Exception as exc: self.lg.warning(f'could not parse json ({msg.payload}): {exc}') return diff --git a/custom_components/mega/tools.py b/custom_components/mega/tools.py index 482e717..d1d8876 100644 --- a/custom_components/mega/tools.py +++ b/custom_components/mega/tools.py @@ -2,7 +2,7 @@ def make_ints(d: dict): for x in d: try: d[x] = float(d[x]) - except ValueError: + except (ValueError, TypeError): pass if 'm' not in d: d['m'] = 0 diff --git a/readme.md b/readme.md index 68279c5..52c802c 100644 --- a/readme.md +++ b/readme.md @@ -81,12 +81,36 @@ script: "mega" # это api интеграции, к которому будет event_type: mega.sensor event_data: pt: 1 + click: 2 action: - service: light.toggle entity_id: light.some_light ``` Для binary_sensor имеет смысл использовать режим P&R, для остальных режимов - лучше пользоваться событиями. +Примеры использования binary_sensor: +```yaml +- alias: обработка долгих/коротких нажатий + trigger: + - platform: state + entity_id: binary_sensor.some_sensor + to: on + for: 1 # задержка на секунду + + action: + - choose: + # если кнопка все еще нажата - значит это долгое нажатие + - conditions: "{{ is_state('binary_sensor.some_sensor', 'on')}}" + sequence: + - service: light.turn_on + entity_id: light.some_light + # если кнопка уже не нажата - значит это короткое нажатие + - conditions: "{{ is_state('binary_sensor.some_sensor', 'off')}}" + sequence: + - service: light.turn_off + entity_id: light.some_light +``` + ## Ответ на входящие события от контроллера Контроллер ожидает ответ от сервера, который может быть сценарием (по умолчанию интеграция отвечает `d`, что означает запустить то что прописано в поле act в настройках порта).