This commit is contained in:
Andrey
2021-01-26 08:34:27 +03:00
parent c0b1247b9e
commit a7d7738a5c
4 changed files with 39 additions and 10 deletions

View File

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

View File

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

View File

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

View File

@@ -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 в настройках порта).