mirror of
https://github.com/andvikt/mega_hacs.git
synced 2025-12-13 01:54:27 +05:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a7d7738a5c |
@@ -155,10 +155,12 @@ class MegaOutPort(MegaPushEntity):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def is_on(self) -> bool:
|
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:
|
if val is None and self._state is not None:
|
||||||
return self._state == 'ON'
|
return self._state == 'ON'
|
||||||
elif val is not None:
|
elif val is not None:
|
||||||
|
val = val.get("value")
|
||||||
if not self.invert:
|
if not self.invert:
|
||||||
return val == 'ON' or str(val) == '1' or (safe_int(val) is not None and safe_int(val) > 0)
|
return val == 'ON' or str(val) == '1' or (safe_int(val) is not None and safe_int(val) > 0)
|
||||||
else:
|
else:
|
||||||
@@ -186,10 +188,11 @@ class MegaOutPort(MegaPushEntity):
|
|||||||
self.mega.values[self.port] = {'value': cmd}
|
self.mega.values[self.port] = {'value': cmd}
|
||||||
await self.get_state()
|
await self.get_state()
|
||||||
|
|
||||||
|
|
||||||
def safe_int(v):
|
def safe_int(v):
|
||||||
if v in ['ON', 'OFF']:
|
if v in ['ON', 'OFF']:
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
return int(v)
|
return int(v)
|
||||||
except ValueError:
|
except (ValueError, TypeError):
|
||||||
return None
|
return None
|
||||||
@@ -291,16 +291,18 @@ class MegaD:
|
|||||||
value = None
|
value = None
|
||||||
try:
|
try:
|
||||||
value = json.loads(msg.payload)
|
value = json.loads(msg.payload)
|
||||||
value = make_ints(value)
|
if isinstance(value, dict):
|
||||||
|
make_ints(value)
|
||||||
self.values[port] = value
|
self.values[port] = value
|
||||||
for cb in self._callbacks[port]:
|
for cb in self._callbacks[port]:
|
||||||
cb(value)
|
cb(value)
|
||||||
value = value.copy()
|
if isinstance(value, dict):
|
||||||
value['mega_id'] = self.id
|
value = value.copy()
|
||||||
self.hass.bus.async_fire(
|
value['mega_id'] = self.id
|
||||||
EVENT_BINARY_SENSOR,
|
self.hass.bus.async_fire(
|
||||||
value,
|
EVENT_BINARY_SENSOR,
|
||||||
)
|
value,
|
||||||
|
)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
self.lg.warning(f'could not parse json ({msg.payload}): {exc}')
|
self.lg.warning(f'could not parse json ({msg.payload}): {exc}')
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ def make_ints(d: dict):
|
|||||||
for x in d:
|
for x in d:
|
||||||
try:
|
try:
|
||||||
d[x] = float(d[x])
|
d[x] = float(d[x])
|
||||||
except ValueError:
|
except (ValueError, TypeError):
|
||||||
pass
|
pass
|
||||||
if 'm' not in d:
|
if 'm' not in d:
|
||||||
d['m'] = 0
|
d['m'] = 0
|
||||||
|
|||||||
24
readme.md
24
readme.md
@@ -81,12 +81,36 @@ script: "mega" # это api интеграции, к которому будет
|
|||||||
event_type: mega.sensor
|
event_type: mega.sensor
|
||||||
event_data:
|
event_data:
|
||||||
pt: 1
|
pt: 1
|
||||||
|
click: 2
|
||||||
action:
|
action:
|
||||||
- service: light.toggle
|
- service: light.toggle
|
||||||
entity_id: light.some_light
|
entity_id: light.some_light
|
||||||
```
|
```
|
||||||
Для binary_sensor имеет смысл использовать режим P&R, для остальных режимов - лучше пользоваться событиями.
|
Для 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`, что означает
|
Контроллер ожидает ответ от сервера, который может быть сценарием (по умолчанию интеграция отвечает `d`, что означает
|
||||||
запустить то что прописано в поле act в настройках порта).
|
запустить то что прописано в поле act в настройках порта).
|
||||||
|
|||||||
Reference in New Issue
Block a user