mirror of
https://github.com/andvikt/mega_hacs.git
synced 2025-12-12 01:24:29 +05:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9544f562ba | ||
|
|
c2422cac9c | ||
|
|
0adba7fc0f | ||
|
|
39642700ca | ||
|
|
07589e8e3a | ||
|
|
5a6903c67e | ||
|
|
6758fd8d8e |
@@ -28,8 +28,9 @@ CONFIG_SCHEMA = vol.Schema(
|
|||||||
{
|
{
|
||||||
DOMAIN: {
|
DOMAIN: {
|
||||||
vol.Optional(CONF_ALLOW_HOSTS): [str],
|
vol.Optional(CONF_ALLOW_HOSTS): [str],
|
||||||
vol.Optional(CONF_FORCE_D, description='Принудительно слать d после срабатывания входа', default=False): bool,
|
# vol.Optional(CONF_FORCE_D, description='Принудительно слать d после срабатывания входа', default=False): bool,
|
||||||
vol.Required(str, description='id меги из веб-интерфейса'): {
|
vol.Required(str, description='id меги из веб-интерфейса'): {
|
||||||
|
vol.Optional(CONF_FORCE_D, description='Принудительно слать d после срабатывания входа', default=False): bool,
|
||||||
vol.Optional(int, description='номер порта'): {
|
vol.Optional(int, description='номер порта'): {
|
||||||
vol.Optional(CONF_SKIP, description='исключить порт из сканирования', default=False): bool,
|
vol.Optional(CONF_SKIP, description='исключить порт из сканирования', default=False): bool,
|
||||||
vol.Optional(CONF_INVERT, default=False): bool,
|
vol.Optional(CONF_INVERT, default=False): bool,
|
||||||
|
|||||||
@@ -15,3 +15,7 @@ class DuplicateId(exceptions.HomeAssistantError):
|
|||||||
|
|
||||||
class InvalidAuth(exceptions.HomeAssistantError):
|
class InvalidAuth(exceptions.HomeAssistantError):
|
||||||
"""Error to indicate there is invalid auth."""
|
"""Error to indicate there is invalid auth."""
|
||||||
|
|
||||||
|
|
||||||
|
class NoPort(Exception):
|
||||||
|
pass
|
||||||
@@ -8,16 +8,15 @@ from aiohttp.web_request import Request
|
|||||||
from aiohttp.web_response import Response
|
from aiohttp.web_response import Response
|
||||||
|
|
||||||
from homeassistant.helpers.template import Template
|
from homeassistant.helpers.template import Template
|
||||||
from .const import EVENT_BINARY_SENSOR, DOMAIN, CONF_RESPONSE_TEMPLATE
|
|
||||||
from homeassistant.components.http import HomeAssistantView
|
from homeassistant.components.http import HomeAssistantView
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
from .const import EVENT_BINARY_SENSOR, DOMAIN, CONF_RESPONSE_TEMPLATE
|
||||||
from .tools import make_ints
|
from .tools import make_ints
|
||||||
from . import hub as h
|
from . import hub as h
|
||||||
_LOGGER = logging.getLogger(__name__).getChild('http')
|
_LOGGER = logging.getLogger(__name__).getChild('http')
|
||||||
|
|
||||||
|
|
||||||
class MegaView(HomeAssistantView):
|
class MegaView(HomeAssistantView):
|
||||||
"""Handle Yandex Smart Home unauthorized requests."""
|
|
||||||
|
|
||||||
url = '/mega'
|
url = '/mega'
|
||||||
name = 'mega'
|
name = 'mega'
|
||||||
@@ -31,8 +30,8 @@ class MegaView(HomeAssistantView):
|
|||||||
mid: {
|
mid: {
|
||||||
pt: cfg[mid][pt][CONF_RESPONSE_TEMPLATE]
|
pt: cfg[mid][pt][CONF_RESPONSE_TEMPLATE]
|
||||||
for pt in cfg[mid]
|
for pt in cfg[mid]
|
||||||
if CONF_RESPONSE_TEMPLATE in cfg[mid][pt]
|
if isinstance(pt, int) and CONF_RESPONSE_TEMPLATE in cfg[mid][pt]
|
||||||
} for mid in cfg
|
} for mid in cfg if isinstance(cfg[mid], dict)
|
||||||
}
|
}
|
||||||
_LOGGER.debug('templates: %s', self.templates)
|
_LOGGER.debug('templates: %s', self.templates)
|
||||||
|
|
||||||
@@ -62,6 +61,10 @@ class MegaView(HomeAssistantView):
|
|||||||
make_ints(data)
|
make_ints(data)
|
||||||
port = data.get('pt')
|
port = data.get('pt')
|
||||||
data = data.copy()
|
data = data.copy()
|
||||||
|
update_all = True
|
||||||
|
if 'v' in data:
|
||||||
|
update_all = False
|
||||||
|
data['value'] = data.pop('v')
|
||||||
data['mega_id'] = hub.id
|
data['mega_id'] = hub.id
|
||||||
ret = 'd'
|
ret = 'd'
|
||||||
if port is not None:
|
if port is not None:
|
||||||
@@ -69,7 +72,7 @@ class MegaView(HomeAssistantView):
|
|||||||
for cb in self.callbacks[hub.id][port]:
|
for cb in self.callbacks[hub.id][port]:
|
||||||
cb(data)
|
cb(data)
|
||||||
template: Template = self.templates.get(hub.id, {}).get(port)
|
template: Template = self.templates.get(hub.id, {}).get(port)
|
||||||
if hub.update_all:
|
if hub.update_all and update_all:
|
||||||
asyncio.create_task(self.later_update(hub))
|
asyncio.create_task(self.later_update(hub))
|
||||||
if template is not None:
|
if template is not None:
|
||||||
template.hass = hass
|
template.hass = hass
|
||||||
|
|||||||
@@ -10,15 +10,19 @@ import json
|
|||||||
|
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
from homeassistant.components import mqtt
|
from homeassistant.components import mqtt
|
||||||
from homeassistant.const import (DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_PRESSURE,
|
from homeassistant.const import (
|
||||||
DEVICE_CLASS_ILLUMINANCE, TEMP_CELSIUS, PERCENTAGE, LIGHT_LUX)
|
DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_HUMIDITY, DEVICE_CLASS_PRESSURE,
|
||||||
|
DEVICE_CLASS_ILLUMINANCE, TEMP_CELSIUS, PERCENTAGE, LIGHT_LUX
|
||||||
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
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, PRESS, LUX, PATT_SPLIT, DOMAIN, CONF_HTTP, EVENT_BINARY_SENSOR, CONF_CUSTOM, CONF_SKIP, \
|
from .const import (
|
||||||
CONF_FORCE_D
|
TEMP, HUM, PRESS,
|
||||||
|
LUX, PATT_SPLIT, DOMAIN,
|
||||||
|
CONF_HTTP, EVENT_BINARY_SENSOR, CONF_CUSTOM, CONF_FORCE_D
|
||||||
|
)
|
||||||
from .entities import set_events_off, BaseMegaEntity
|
from .entities import set_events_off, BaseMegaEntity
|
||||||
from .exceptions import CannotConnect
|
from .exceptions import CannotConnect, NoPort
|
||||||
from .tools import make_ints
|
from .tools import make_ints
|
||||||
|
|
||||||
TEMP_PATT = re.compile(r'temp:([01234567890\.]+)')
|
TEMP_PATT = re.compile(r'temp:([01234567890\.]+)')
|
||||||
@@ -49,8 +53,6 @@ I2C_DEVICE_TYPES = {
|
|||||||
"7": LUX, # MAX44009
|
"7": LUX, # MAX44009
|
||||||
"70": LUX, # OPT3001
|
"70": LUX, # OPT3001
|
||||||
}
|
}
|
||||||
class NoPort(Exception):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class MegaD:
|
class MegaD:
|
||||||
@@ -191,8 +193,7 @@ class MegaD:
|
|||||||
|
|
||||||
async def poll(self):
|
async def poll(self):
|
||||||
"""
|
"""
|
||||||
Send get port 0 every poll_interval. When answer is received, mega.<id> becomes online else mega.<id> becomes
|
Polling ports
|
||||||
offline
|
|
||||||
"""
|
"""
|
||||||
self.lg.debug('poll')
|
self.lg.debug('poll')
|
||||||
if self.mqtt is None:
|
if self.mqtt is None:
|
||||||
|
|||||||
@@ -15,5 +15,5 @@
|
|||||||
"@andvikt"
|
"@andvikt"
|
||||||
],
|
],
|
||||||
"issue_tracker": "https://github.com/andvikt/mega_hacs/issues",
|
"issue_tracker": "https://github.com/andvikt/mega_hacs/issues",
|
||||||
"version": "v0.3.17"
|
"version": "v0.3.19"
|
||||||
}
|
}
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
[](https://github.com/custom-components/hacs)
|
[](https://github.com/custom-components/hacs)
|
||||||
[](https://yoomoney.ru/to/410013955329136)
|
[](https://yoomoney.ru/to/410013955329136)
|
||||||
|
|
||||||
Интеграция с [MegaD-2561](https://www.ab-log.ru/smart-house/ethernet/megad-2561)
|
Интеграция с [MegaD-2561, MegaD-328](https://www.ab-log.ru/smart-house/ethernet/megad-2561)
|
||||||
|
|
||||||
## Основные особенности:
|
## Основные особенности:
|
||||||
- Настройка в веб-интерфейсе + yaml
|
- Настройка в веб-интерфейсе + yaml
|
||||||
@@ -110,7 +110,6 @@ mega:
|
|||||||
# эти параметры можно использовать в условиях или непосредственно в шаблоне в виде {{pt}}
|
# эти параметры можно использовать в условиях или непосредственно в шаблоне в виде {{pt}}
|
||||||
response_template: >-
|
response_template: >-
|
||||||
{% if m==2 %}1:0{% else %}d{% endif %}
|
{% if m==2 %}1:0{% else %}d{% endif %}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Начиная с версии v0.3.17 ответ можно слать так же и в режиме MQTT. Аналогично, темплейт должен возвращать готовую команду
|
Начиная с версии v0.3.17 ответ можно слать так же и в режиме MQTT. Аналогично, темплейт должен возвращать готовую команду
|
||||||
@@ -125,6 +124,12 @@ mega:
|
|||||||
**Внимание!** Нельзя использовать чекбокс напротив поля act если планируется использовать ответ сервера - у вас и
|
**Внимание!** Нельзя использовать чекбокс напротив поля act если планируется использовать ответ сервера - у вас и
|
||||||
сработает act и команда от сервера, а вслучае ответа d сработает act два раза.
|
сработает act и команда от сервера, а вслучае ответа d сработает act два раза.
|
||||||
|
|
||||||
|
Так же следует понимать, что это не "ответ" в нормальном понимании - это вызов следом за полученным mqtt-сообщением
|
||||||
|
http команды такого вида `http://megaurl/?pt=port&cmd=rendered_template`, где `port` - это номер порта сработавшего входа,
|
||||||
|
а `cmd` - текст команды, который получен из темплейта. Те это имитация ответа. У этого подхода есть минус - задержка в
|
||||||
|
исполнении будет значительно выше чем при ответе в режиме http, но тем не менее эта задержка скорее всего не будет
|
||||||
|
сильно заметна.
|
||||||
|
|
||||||
## binary_sensor и события
|
## binary_sensor и события
|
||||||
|
|
||||||
Входы будут доступны как binary_sensor, а так же в виде событий `mega.sensor` и `mega.binary`.
|
Входы будут доступны как binary_sensor, а так же в виде событий `mega.sensor` и `mega.binary`.
|
||||||
|
|||||||
Reference in New Issue
Block a user