mirror of
https://github.com/andvikt/mega_hacs.git
synced 2025-12-12 17:44:28 +05:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f197a09072 | ||
|
|
e8d92cfa36 | ||
|
|
5f94186a14 | ||
|
|
f09610355b | ||
|
|
70e182fec3 | ||
|
|
ef3152a086 | ||
|
|
9b9443864c | ||
|
|
b7669ac407 | ||
|
|
2b308a71a1 | ||
|
|
8f67652c0e | ||
|
|
f83cdaa583 | ||
|
|
8dfa5926ad | ||
|
|
3978ce2203 | ||
|
|
72cf516353 | ||
|
|
3b6459468b | ||
|
|
2e025eb0c2 | ||
|
|
20d5b8ff40 |
@@ -16,7 +16,8 @@ from homeassistant.helpers import config_validation as cv
|
|||||||
from homeassistant.components import mqtt
|
from homeassistant.components import mqtt
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from .const import DOMAIN, CONF_INVERT, CONF_RELOAD, PLATFORMS, CONF_PORTS, CONF_CUSTOM, CONF_SKIP, CONF_PORT_TO_SCAN, \
|
from .const import DOMAIN, CONF_INVERT, CONF_RELOAD, PLATFORMS, CONF_PORTS, CONF_CUSTOM, CONF_SKIP, CONF_PORT_TO_SCAN, \
|
||||||
CONF_MQTT_INPUTS, CONF_HTTP, CONF_RESPONSE_TEMPLATE, CONF_ACTION, CONF_GET_VALUE, CONF_ALLOW_HOSTS
|
CONF_MQTT_INPUTS, CONF_HTTP, CONF_RESPONSE_TEMPLATE, CONF_ACTION, CONF_GET_VALUE, CONF_ALLOW_HOSTS, \
|
||||||
|
CONF_CONV_TEMPLATE
|
||||||
from .hub import MegaD
|
from .hub import MegaD
|
||||||
from .config_flow import ConfigFlow
|
from .config_flow import ConfigFlow
|
||||||
from .http import MegaView
|
from .http import MegaView
|
||||||
@@ -45,6 +46,7 @@ CONFIG_SCHEMA = vol.Schema(
|
|||||||
'сообщение из меги '): cv.template,
|
'сообщение из меги '): cv.template,
|
||||||
vol.Optional(CONF_ACTION): cv.script_action,
|
vol.Optional(CONF_ACTION): cv.script_action,
|
||||||
vol.Optional(CONF_GET_VALUE, default=True): bool,
|
vol.Optional(CONF_GET_VALUE, default=True): bool,
|
||||||
|
vol.Optional(CONF_CONV_TEMPLATE): cv.template
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -160,7 +162,8 @@ async def async_remove_entry(hass, entry) -> None:
|
|||||||
if hub is None:
|
if hub is None:
|
||||||
return
|
return
|
||||||
_LOGGER.debug(f'remove {id}')
|
_LOGGER.debug(f'remove {id}')
|
||||||
_hubs.pop(entry.entry_id)
|
_hubs.pop(id, None)
|
||||||
|
hass.data[DOMAIN].pop(id, None)
|
||||||
task: asyncio.Task = _POLL_TASKS.pop(id, None)
|
task: asyncio.Task = _POLL_TASKS.pop(id, None)
|
||||||
if task is not None:
|
if task is not None:
|
||||||
task.cancel()
|
task.cancel()
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ from homeassistant.const import (
|
|||||||
CONF_ENTITY_ID,
|
CONF_ENTITY_ID,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from .const import EVENT_BINARY_SENSOR, DOMAIN, CONF_CUSTOM, CONF_SKIP
|
from .const import EVENT_BINARY_SENSOR, DOMAIN, CONF_CUSTOM, CONF_SKIP, CONF_INVERT
|
||||||
from .entities import MegaPushEntity
|
from .entities import MegaPushEntity
|
||||||
from .hub import MegaD
|
from .hub import MegaD
|
||||||
|
|
||||||
@@ -71,6 +71,10 @@ class MegaBinarySensor(BinarySensorEntity, MegaPushEntity):
|
|||||||
def state_attributes(self):
|
def state_attributes(self):
|
||||||
return self._attrs
|
return self._attrs
|
||||||
|
|
||||||
|
@property
|
||||||
|
def invert(self):
|
||||||
|
return self.customize.get(CONF_INVERT, False)
|
||||||
|
|
||||||
@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, {}).get("value") \
|
||||||
@@ -79,9 +83,9 @@ class MegaBinarySensor(BinarySensorEntity, MegaPushEntity):
|
|||||||
return self._state == 'ON'
|
return self._state == 'ON'
|
||||||
elif val is not None:
|
elif val is not None:
|
||||||
if val in ['ON', 'OFF']:
|
if val in ['ON', 'OFF']:
|
||||||
return val == 'ON'
|
return val == 'ON' if not self.invert else val == 'OFF'
|
||||||
else:
|
else:
|
||||||
return val != 1
|
return val != 1 if not self.invert else val == 1
|
||||||
|
|
||||||
def _update(self, payload: dict):
|
def _update(self, payload: dict):
|
||||||
self.mega.values[self.port] = payload
|
self.mega.values[self.port] = payload
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ CONF_ACTION = 'action'
|
|||||||
CONF_UPDATE_ALL = 'update_all'
|
CONF_UPDATE_ALL = 'update_all'
|
||||||
CONF_GET_VALUE = 'get_value'
|
CONF_GET_VALUE = 'get_value'
|
||||||
CONF_ALLOW_HOSTS = 'allow_hosts'
|
CONF_ALLOW_HOSTS = 'allow_hosts'
|
||||||
|
CONF_CONV_TEMPLATE = 'conv_template'
|
||||||
PLATFORMS = [
|
PLATFORMS = [
|
||||||
"light",
|
"light",
|
||||||
"switch",
|
"switch",
|
||||||
|
|||||||
@@ -6,19 +6,26 @@ from homeassistant.const import CONF_NAME
|
|||||||
from homeassistant.core import State
|
from homeassistant.core import State
|
||||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||||
from homeassistant.helpers.restore_state import RestoreEntity
|
from homeassistant.helpers.restore_state import RestoreEntity
|
||||||
from .hub import MegaD
|
from . import hub as h
|
||||||
from .const import DOMAIN, CONF_CUSTOM, CONF_INVERT, EVENT_BINARY_SENSOR, LONG, \
|
from .const import DOMAIN, CONF_CUSTOM, CONF_INVERT, EVENT_BINARY_SENSOR, LONG, \
|
||||||
LONG_RELEASE, RELEASE, PRESS, SINGLE_CLICK, DOUBLE_CLICK, EVENT_BINARY
|
LONG_RELEASE, RELEASE, PRESS, SINGLE_CLICK, DOUBLE_CLICK, EVENT_BINARY
|
||||||
|
|
||||||
_events_on = False
|
_events_on = False
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
async def _set_events_on():
|
async def _set_events_on():
|
||||||
global _events_on
|
global _events_on, _task_set_ev_on
|
||||||
await asyncio.sleep(10)
|
await asyncio.sleep(10)
|
||||||
_LOGGER.debug('events on')
|
_LOGGER.debug('events on')
|
||||||
_events_on = True
|
_events_on = True
|
||||||
|
|
||||||
|
|
||||||
|
def set_events_off():
|
||||||
|
global _events_on, _task_set_ev_on
|
||||||
|
_events_on = False
|
||||||
|
_task_set_ev_on = None
|
||||||
|
|
||||||
_task_set_ev_on = None
|
_task_set_ev_on = None
|
||||||
|
|
||||||
|
|
||||||
@@ -30,7 +37,7 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
|
|||||||
"""
|
"""
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
mega: MegaD,
|
mega: 'h.MegaD',
|
||||||
port: int,
|
port: int,
|
||||||
config_entry: ConfigEntry = None,
|
config_entry: ConfigEntry = None,
|
||||||
id_suffix=None,
|
id_suffix=None,
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ from homeassistant.core import HomeAssistant
|
|||||||
from homeassistant.helpers.entity import Entity
|
from homeassistant.helpers.entity import Entity
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
|
||||||
from .const import TEMP, HUM, PATT_SPLIT, DOMAIN, CONF_HTTP, EVENT_BINARY_SENSOR
|
from .const import TEMP, HUM, PATT_SPLIT, DOMAIN, CONF_HTTP, EVENT_BINARY_SENSOR
|
||||||
|
from .entities import set_events_off
|
||||||
from .exceptions import CannotConnect
|
from .exceptions import CannotConnect
|
||||||
from .tools import make_ints
|
from .tools import make_ints
|
||||||
|
|
||||||
@@ -109,6 +110,7 @@ class MegaD:
|
|||||||
async def start(self):
|
async def start(self):
|
||||||
self.loop = asyncio.get_event_loop()
|
self.loop = asyncio.get_event_loop()
|
||||||
if self.mqtt is not None:
|
if self.mqtt is not None:
|
||||||
|
set_events_off()
|
||||||
self.subs = await self.mqtt.async_subscribe(
|
self.subs = await self.mqtt.async_subscribe(
|
||||||
topic=f"{self.mqtt_id}/+",
|
topic=f"{self.mqtt_id}/+",
|
||||||
msg_callback=self._process_msg,
|
msg_callback=self._process_msg,
|
||||||
@@ -207,11 +209,13 @@ class MegaD:
|
|||||||
def parse_response(self, ret):
|
def parse_response(self, ret):
|
||||||
if ret is None:
|
if ret is None:
|
||||||
raise NoPort()
|
raise NoPort()
|
||||||
|
if 'busy' in ret:
|
||||||
|
return None
|
||||||
if ':' in ret:
|
if ':' in ret:
|
||||||
ret = PATT_SPLIT.split(ret)
|
ret = PATT_SPLIT.split(ret)
|
||||||
ret = dict([
|
ret = {'value': dict([
|
||||||
x.split(':') for x in ret if x.count(':') == 1
|
x.split(':') for x in ret if x.count(':') == 1
|
||||||
])
|
])}
|
||||||
elif 'ON' in ret:
|
elif 'ON' in ret:
|
||||||
ret = {'value': 'ON'}
|
ret = {'value': 'ON'}
|
||||||
elif 'OFF' in ret:
|
elif 'OFF' in ret:
|
||||||
@@ -227,13 +231,16 @@ class MegaD:
|
|||||||
"""
|
"""
|
||||||
self.lg.debug(f'get port %s', port)
|
self.lg.debug(f'get port %s', port)
|
||||||
if self.mqtt is None or force_http:
|
if self.mqtt is None or force_http:
|
||||||
ret = await self.request(pt=port, cmd=http_cmd)
|
if http_cmd == 'list':
|
||||||
ret = self.parse_response(ret)
|
await self.request(pt=port, cmd='conv')
|
||||||
self.lg.debug('parsed: %s', ret)
|
|
||||||
if http_cmd == 'list' and isinstance(ret, dict) and 'value' in ret:
|
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
ret = await self.request(pt=port, http_cmd=http_cmd)
|
ret = self.parse_response(await self.request(pt=port, cmd=http_cmd))
|
||||||
ret = self.parse_response(ret)
|
ntry = 0
|
||||||
|
while http_cmd == 'list' and ret is None and ntry < 3:
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
ret = self.parse_response(await self.request(pt=port, cmd=http_cmd))
|
||||||
|
ntry += 1
|
||||||
|
self.lg.debug('parsed: %s', ret)
|
||||||
self.values[port] = ret
|
self.values[port] = ret
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@@ -369,6 +376,9 @@ class MegaD:
|
|||||||
m = m.find(selected=True)['value']
|
m = m.find(selected=True)['value']
|
||||||
self._scanned[port] = (pty, m)
|
self._scanned[port] = (pty, m)
|
||||||
return pty, m
|
return pty, m
|
||||||
|
elif pty == '2':
|
||||||
|
self._scanned[port] = (pty, '0')
|
||||||
|
return pty, '0'
|
||||||
|
|
||||||
async def scan_ports(self, nports=37):
|
async def scan_ports(self, nports=37):
|
||||||
for x in range(0, nports+1):
|
for x in range(0, nports+1):
|
||||||
@@ -384,7 +394,7 @@ class MegaD:
|
|||||||
ret['binary_sensor'][port].append({})
|
ret['binary_sensor'][port].append({})
|
||||||
elif pty == "1" and (m in ['0', '1', '3'] or m is None):
|
elif pty == "1" and (m in ['0', '1', '3'] or m is None):
|
||||||
ret['light'][port].append({'dimmer': m == '1'})
|
ret['light'][port].append({'dimmer': m == '1'})
|
||||||
elif pty == '3':
|
elif pty in ('3', '2'):
|
||||||
try:
|
try:
|
||||||
http_cmd = 'get'
|
http_cmd = 'get'
|
||||||
values = await self.get_port(port, force_http=True)
|
values = await self.get_port(port, force_http=True)
|
||||||
|
|||||||
@@ -14,5 +14,6 @@
|
|||||||
"codeowners": [
|
"codeowners": [
|
||||||
"@andvikt"
|
"@andvikt"
|
||||||
],
|
],
|
||||||
"issue_tracker": "https://github.com/andvikt/mega_hacs/issues"
|
"issue_tracker": "https://github.com/andvikt/mega_hacs/issues",
|
||||||
|
"version": "v0.3.12"
|
||||||
}
|
}
|
||||||
@@ -16,8 +16,9 @@ from homeassistant.const import (
|
|||||||
CONF_TYPE, CONF_UNIT_OF_MEASUREMENT,
|
CONF_TYPE, CONF_UNIT_OF_MEASUREMENT,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
from homeassistant.helpers.template import Template
|
||||||
from .entities import MegaPushEntity
|
from .entities import MegaPushEntity
|
||||||
from .const import CONF_KEY, TEMP, HUM, W1, W1BUS
|
from .const import CONF_KEY, TEMP, HUM, W1, W1BUS, CONF_CONV_TEMPLATE
|
||||||
from .hub import MegaD
|
from .hub import MegaD
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@@ -164,6 +165,10 @@ class Mega1WSensor(MegaPushEntity):
|
|||||||
ret = str(ret)
|
ret = str(ret)
|
||||||
except:
|
except:
|
||||||
ret = None
|
ret = None
|
||||||
|
tmpl: Template = self.customize.get(CONF_CONV_TEMPLATE)
|
||||||
|
if tmpl is not None and self.hass is not None:
|
||||||
|
tmpl.hass = self.hass
|
||||||
|
ret = tmpl.async_render({'value': ret})
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ from homeassistant.const import (
|
|||||||
CONF_DOMAIN,
|
CONF_DOMAIN,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from .entities import MegaD
|
from . import hub as h
|
||||||
from .entities import MegaOutPort
|
from .entities import MegaOutPort
|
||||||
from .const import CONF_DIMMER, CONF_SWITCH, DOMAIN, CONF_CUSTOM, CONF_SKIP
|
from .const import CONF_DIMMER, CONF_SWITCH, DOMAIN, CONF_CUSTOM, CONF_SKIP
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ async def async_setup_platform(hass, config, add_entities, discovery_info=None):
|
|||||||
|
|
||||||
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_devices):
|
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry, async_add_devices):
|
||||||
mid = config_entry.data[CONF_ID]
|
mid = config_entry.data[CONF_ID]
|
||||||
hub: MegaD = hass.data['mega'][mid]
|
hub: 'h.MegaD' = hass.data['mega'][mid]
|
||||||
devices = []
|
devices = []
|
||||||
|
|
||||||
customize = hass.data.get(DOMAIN, {}).get(CONF_CUSTOM, {})
|
customize = hass.data.get(DOMAIN, {}).get(CONF_CUSTOM, {})
|
||||||
|
|||||||
@@ -17,8 +17,11 @@
|
|||||||
"username": "Користувач",
|
"username": "Користувач",
|
||||||
"id": "ID",
|
"id": "ID",
|
||||||
"mqtt_id": "MQTT id",
|
"mqtt_id": "MQTT id",
|
||||||
"scan_interval": "Період оновлення (сек.)",
|
"scan_interval": "Період оновлення (сек.), 0 - не оновлювати",
|
||||||
"port_to_scan": "Порт для сканування при відсутності датчиків"
|
"port_to_scan": "Порт для сканування при відсутності датчиків",
|
||||||
|
"mqtt_inputs": "Використовувати MQTT",
|
||||||
|
"nports": "Кількість портів",
|
||||||
|
"update_all": "Оновити всі виходи коли спрацьовує вхід"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -30,7 +33,10 @@
|
|||||||
"scan_interval": "Період оновлення (сек.)",
|
"scan_interval": "Період оновлення (сек.)",
|
||||||
"port_to_scan": "Порт для сканування при відсутності датчиків",
|
"port_to_scan": "Порт для сканування при відсутності датчиків",
|
||||||
"reload": "Оновити об'єкти",
|
"reload": "Оновити об'єкти",
|
||||||
"invert": "Список портів з інвертованою логікою (через ,)"
|
"invert": "Список портів з інвертованою логікою (через ,)",
|
||||||
|
"mqtt_inputs": "Використовувати MQTT",
|
||||||
|
"nports": "Кількість портів",
|
||||||
|
"update_all": "Оновити всі виходи коли спрацьовує вхід"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
113
readme.md
113
readme.md
@@ -1,4 +1,8 @@
|
|||||||
|
|
||||||
|
|
||||||
# MegaD HomeAssistant integration
|
# MegaD HomeAssistant integration
|
||||||
|
[](https://github.com/custom-components/hacs)
|
||||||
|
[](https://yoomoney.ru/to/410013955329136)
|
||||||
|
|
||||||
Интеграция с [MegaD-2561](https://www.ab-log.ru/smart-house/ethernet/megad-2561)
|
Интеграция с [MegaD-2561](https://www.ab-log.ru/smart-house/ethernet/megad-2561)
|
||||||
|
|
||||||
@@ -53,6 +57,9 @@ mega:
|
|||||||
unit_of_measurement:
|
unit_of_measurement:
|
||||||
hum: "%" # если датчиков несколько, то можно указывать юниты по их ключам
|
hum: "%" # если датчиков несколько, то можно указывать юниты по их ключам
|
||||||
temp: "°C"
|
temp: "°C"
|
||||||
|
# можно так же указать шаблон для конвертации значения, может быть полезно для ацп-входа
|
||||||
|
# текущее значение порта передается в шаблон в переменной "value"
|
||||||
|
conv_template: "{{(value|float)/100}}"
|
||||||
14:
|
14:
|
||||||
name: какой-то датчик
|
name: какой-то датчик
|
||||||
unit_of_measurement: "°C" # если датчик один, то просто строчкой
|
unit_of_measurement: "°C" # если датчик один, то просто строчкой
|
||||||
@@ -72,50 +79,11 @@ srv: "192.168.1.4:8123" # ip:port вашего HA
|
|||||||
script: "mega" # это api интеграции, к которому будет обращаться контроллер
|
script: "mega" # это api интеграции, к которому будет обращаться контроллер
|
||||||
```
|
```
|
||||||
|
|
||||||
Входы будут доступны как binary_sensor, а так же в виде событий `mega.sensor`.
|
#### Ответ на входящие события от контроллера
|
||||||
События можно обрабатывать так:
|
|
||||||
```yaml
|
|
||||||
- alias: some double click
|
|
||||||
trigger:
|
|
||||||
- platform: event
|
|
||||||
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`, что означает
|
Контроллер ожидает ответ от сервера, который может быть сценарием (по умолчанию интеграция отвечает `d`, что означает
|
||||||
запустить то что прописано в поле act в настройках порта).
|
запустить то что прописано в поле act в настройках порта).
|
||||||
|
|
||||||
Поддерживаеются шаблоны HA. Это может быть использовано, например, для запоминания яркости (тк сам контроллер этого не
|
Поддерживаются шаблоны HA. Это может быть использовано, например, для запоминания яркости (тк сам контроллер этого не
|
||||||
умеет). В шаблоне можно использовать параметры, которые передает контроллер (m, click, pt, mdid, mega_id)
|
умеет). В шаблоне можно использовать параметры, которые передает контроллер (m, click, pt, mdid, mega_id)
|
||||||
|
|
||||||
Примеры:
|
Примеры:
|
||||||
@@ -123,7 +91,7 @@ script: "mega" # это api интеграции, к которому будет
|
|||||||
mega:
|
mega:
|
||||||
mega1: # id меги, который вы сами придумываете в конфиге в UI
|
mega1: # id меги, который вы сами придумываете в конфиге в UI
|
||||||
4: # номер порта, с которого ожидаются события
|
4: # номер порта, с которого ожидаются события
|
||||||
response_template: 5:2 # простейший пример без шаблона. Каждый раз когда будет приходить сообщение на этот порт,
|
response_template: "5:2" # простейший пример без шаблона. Каждый раз когда будет приходить сообщение на этот порт,
|
||||||
# будем менять состояние на противоположное
|
# будем менять состояние на противоположное
|
||||||
5:
|
5:
|
||||||
# пример с использованием шаблона, порт 1 будет выключен если он сейчас включен и включен с последней сохраненной
|
# пример с использованием шаблона, порт 1 будет выключен если он сейчас включен и включен с последней сохраненной
|
||||||
@@ -141,30 +109,13 @@ mega:
|
|||||||
{% if m==2 %}1:0{% else %}d{% endif %}
|
{% if m==2 %}1:0{% else %}d{% endif %}
|
||||||
|
|
||||||
```
|
```
|
||||||
## Отладка ответов
|
|
||||||
Для отладки ответов сервера можно самим имитировать запросы контроллера, если у вас есть доступ к консоли
|
|
||||||
HA:
|
|
||||||
```shell
|
|
||||||
curl -v -X GET 'http://localhost:8123/mega?pt=5&m=1'
|
|
||||||
```
|
|
||||||
Если доступа нет, нужно в файл конфигурации добавить ip компьюетра, с которого вы хотите делать запросы, например:
|
|
||||||
```yaml
|
|
||||||
mega:
|
|
||||||
allow_hosts:
|
|
||||||
- 192.168.1.1
|
|
||||||
```
|
|
||||||
И тогда можно с локальной машины делать запросы на ваш сервер HA:
|
|
||||||
```shell
|
|
||||||
curl -v -X GET 'http://192.168.88.1.4:8123/mega?pt=5&m=1'
|
|
||||||
```
|
|
||||||
В ответ будет приходить либо `d`, либо скрипт, который вы настроили
|
|
||||||
|
|
||||||
|
## binary_sensor и события
|
||||||
|
|
||||||
## События
|
Входы будут доступны как binary_sensor, а так же в виде событий `mega.sensor` и `mega.binary`.
|
||||||
`binary_sensor` срабатывает когда цифровой выход принимает значение 'ON'. `binary_sensor` имеет смысл использовать
|
Для корректной работы binary_sensor имеет смысл использовать режим P&R, для остальных режимов - лучше пользоваться
|
||||||
только с режимом входа P&R
|
событиями.
|
||||||
|
|
||||||
При каждом срабатывании `binary_sensor` так же сообщает о событии типа `mega.sensor`.
|
|
||||||
События можно использовать в автоматизациях, например так:
|
События можно использовать в автоматизациях, например так:
|
||||||
```yaml
|
```yaml
|
||||||
# Пример события с полями как есть прямо из меги
|
# Пример события с полями как есть прямо из меги
|
||||||
@@ -174,21 +125,21 @@ curl -v -X GET 'http://192.168.88.1.4:8123/mega?pt=5&m=1'
|
|||||||
event_type: mega.sensor
|
event_type: mega.sensor
|
||||||
event_data:
|
event_data:
|
||||||
pt: 1
|
pt: 1
|
||||||
cnt: 2
|
click: 2
|
||||||
action:
|
action:
|
||||||
- service: light.toggle
|
- service: light.toggle
|
||||||
entity_id: light.some_light
|
entity_id: light.some_light
|
||||||
```
|
```
|
||||||
События могут содержать следующие поля:
|
События могут содержать следующие поля:
|
||||||
- mega_id: id как в конфиге HA
|
- `mega_id`: id как в конфиге HA
|
||||||
- pt: номер порта
|
- `pt`: номер порта
|
||||||
- cnt: счетчик срабатываний
|
- `cnt`: счетчик срабатываний
|
||||||
- mdid: if как в конфиге контроллера
|
- `mdid`: if как в конфиге контроллера
|
||||||
- click: клик (подробнее в документации меги)
|
- `click`: клик (подробнее в документации меги)
|
||||||
- value: текущее значение (только для mqtt)
|
- `value`: текущее значение (только для mqtt)
|
||||||
- port: номер порта
|
- `port`: номер порта
|
||||||
|
|
||||||
Начиная с версии 0.3.7 появилось так же событие типа mega.binary:
|
Начиная с версии 0.3.7 появилось так же событие типа `mega.binary`:
|
||||||
```yaml
|
```yaml
|
||||||
# Пример события с полями как есть прямо из меги
|
# Пример события с полями как есть прямо из меги
|
||||||
- alias: some long click
|
- alias: some long click
|
||||||
@@ -257,3 +208,21 @@ logger:
|
|||||||
logs:
|
logs:
|
||||||
custom_components.mega: debug
|
custom_components.mega: debug
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Отладка ответов http-сервера
|
||||||
|
Для отладки ответов сервера можно самим имитировать запросы контроллера, если у вас есть доступ к консоли
|
||||||
|
HA:
|
||||||
|
```shell
|
||||||
|
curl -v -X GET 'http://localhost:8123/mega?pt=5&m=1'
|
||||||
|
```
|
||||||
|
Если доступа нет, нужно в файл конфигурации добавить ip, с которого вы хотите делать запросы, например:
|
||||||
|
```yaml
|
||||||
|
mega:
|
||||||
|
allow_hosts:
|
||||||
|
- 192.168.1.1
|
||||||
|
```
|
||||||
|
И тогда можно с локальной машины делать запросы на ваш сервер HA:
|
||||||
|
```shell
|
||||||
|
curl -v -X GET 'http://192.168.88.1.4:8123/mega?pt=5&m=1'
|
||||||
|
```
|
||||||
|
В ответ будет приходить либо `d`, либо скрипт, который вы настроили
|
||||||
Reference in New Issue
Block a user