mirror of
https://github.com/andvikt/mega_hacs.git
synced 2025-12-12 01:24:29 +05:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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.config_entries import ConfigEntry
|
||||
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 .config_flow import ConfigFlow
|
||||
from .http import MegaView
|
||||
@@ -45,6 +46,7 @@ CONFIG_SCHEMA = vol.Schema(
|
||||
'сообщение из меги '): cv.template,
|
||||
vol.Optional(CONF_ACTION): cv.script_action,
|
||||
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:
|
||||
return
|
||||
_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)
|
||||
if task is not None:
|
||||
task.cancel()
|
||||
|
||||
@@ -24,6 +24,7 @@ CONF_ACTION = 'action'
|
||||
CONF_UPDATE_ALL = 'update_all'
|
||||
CONF_GET_VALUE = 'get_value'
|
||||
CONF_ALLOW_HOSTS = 'allow_hosts'
|
||||
CONF_CONV_TEMPLATE = 'conv_template'
|
||||
PLATFORMS = [
|
||||
"light",
|
||||
"switch",
|
||||
|
||||
@@ -6,19 +6,26 @@ from homeassistant.const import CONF_NAME
|
||||
from homeassistant.core import State
|
||||
from homeassistant.helpers.update_coordinator import CoordinatorEntity
|
||||
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, \
|
||||
LONG_RELEASE, RELEASE, PRESS, SINGLE_CLICK, DOUBLE_CLICK, EVENT_BINARY
|
||||
|
||||
_events_on = False
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def _set_events_on():
|
||||
global _events_on
|
||||
global _events_on, _task_set_ev_on
|
||||
await asyncio.sleep(10)
|
||||
_LOGGER.debug('events on')
|
||||
_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
|
||||
|
||||
|
||||
@@ -30,7 +37,7 @@ class BaseMegaEntity(CoordinatorEntity, RestoreEntity):
|
||||
"""
|
||||
def __init__(
|
||||
self,
|
||||
mega: MegaD,
|
||||
mega: 'h.MegaD',
|
||||
port: int,
|
||||
config_entry: ConfigEntry = None,
|
||||
id_suffix=None,
|
||||
|
||||
@@ -15,6 +15,7 @@ from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers.entity import Entity
|
||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
|
||||
from .const import TEMP, HUM, PATT_SPLIT, DOMAIN, CONF_HTTP, EVENT_BINARY_SENSOR
|
||||
from .entities import set_events_off
|
||||
from .exceptions import CannotConnect
|
||||
from .tools import make_ints
|
||||
|
||||
@@ -109,6 +110,7 @@ class MegaD:
|
||||
async def start(self):
|
||||
self.loop = asyncio.get_event_loop()
|
||||
if self.mqtt is not None:
|
||||
set_events_off()
|
||||
self.subs = await self.mqtt.async_subscribe(
|
||||
topic=f"{self.mqtt_id}/+",
|
||||
msg_callback=self._process_msg,
|
||||
@@ -207,11 +209,13 @@ class MegaD:
|
||||
def parse_response(self, ret):
|
||||
if ret is None:
|
||||
raise NoPort()
|
||||
if 'busy' in ret:
|
||||
return None
|
||||
if ':' in ret:
|
||||
ret = PATT_SPLIT.split(ret)
|
||||
ret = dict([
|
||||
ret = {'value': dict([
|
||||
x.split(':') for x in ret if x.count(':') == 1
|
||||
])
|
||||
])}
|
||||
elif 'ON' in ret:
|
||||
ret = {'value': 'ON'}
|
||||
elif 'OFF' in ret:
|
||||
@@ -227,13 +231,16 @@ class MegaD:
|
||||
"""
|
||||
self.lg.debug(f'get port %s', port)
|
||||
if self.mqtt is None or force_http:
|
||||
ret = await self.request(pt=port, cmd=http_cmd)
|
||||
ret = self.parse_response(ret)
|
||||
self.lg.debug('parsed: %s', ret)
|
||||
if http_cmd == 'list' and isinstance(ret, dict) and 'value' in ret:
|
||||
if http_cmd == 'list':
|
||||
await self.request(pt=port, cmd='conv')
|
||||
await asyncio.sleep(1)
|
||||
ret = await self.request(pt=port, http_cmd=http_cmd)
|
||||
ret = self.parse_response(ret)
|
||||
ret = self.parse_response(await self.request(pt=port, cmd=http_cmd))
|
||||
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
|
||||
return ret
|
||||
|
||||
@@ -369,6 +376,9 @@ class MegaD:
|
||||
m = m.find(selected=True)['value']
|
||||
self._scanned[port] = (pty, m)
|
||||
return pty, m
|
||||
elif pty == '2':
|
||||
self._scanned[port] = (pty, '0')
|
||||
return pty, '0'
|
||||
|
||||
async def scan_ports(self, nports=37):
|
||||
for x in range(0, nports+1):
|
||||
@@ -384,7 +394,7 @@ class MegaD:
|
||||
ret['binary_sensor'][port].append({})
|
||||
elif pty == "1" and (m in ['0', '1', '3'] or m is None):
|
||||
ret['light'][port].append({'dimmer': m == '1'})
|
||||
elif pty == '3':
|
||||
elif pty in ('3', '2'):
|
||||
try:
|
||||
http_cmd = 'get'
|
||||
values = await self.get_port(port, force_http=True)
|
||||
|
||||
@@ -14,5 +14,6 @@
|
||||
"codeowners": [
|
||||
"@andvikt"
|
||||
],
|
||||
"issue_tracker": "https://github.com/andvikt/mega_hacs/issues"
|
||||
"issue_tracker": "https://github.com/andvikt/mega_hacs/issues",
|
||||
"version": "v0.3.11"
|
||||
}
|
||||
@@ -16,8 +16,9 @@ from homeassistant.const import (
|
||||
CONF_TYPE, CONF_UNIT_OF_MEASUREMENT,
|
||||
)
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers.template import Template
|
||||
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
|
||||
import re
|
||||
|
||||
@@ -164,6 +165,10 @@ class Mega1WSensor(MegaPushEntity):
|
||||
ret = str(ret)
|
||||
except:
|
||||
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
|
||||
|
||||
@property
|
||||
|
||||
@@ -15,7 +15,7 @@ from homeassistant.const import (
|
||||
CONF_DOMAIN,
|
||||
)
|
||||
from homeassistant.core import HomeAssistant
|
||||
from .entities import MegaD
|
||||
from . import hub as h
|
||||
from .entities import MegaOutPort
|
||||
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):
|
||||
mid = config_entry.data[CONF_ID]
|
||||
hub: MegaD = hass.data['mega'][mid]
|
||||
hub: 'h.MegaD' = hass.data['mega'][mid]
|
||||
devices = []
|
||||
|
||||
customize = hass.data.get(DOMAIN, {}).get(CONF_CUSTOM, {})
|
||||
|
||||
@@ -17,8 +17,11 @@
|
||||
"username": "Користувач",
|
||||
"id": "ID",
|
||||
"mqtt_id": "MQTT id",
|
||||
"scan_interval": "Період оновлення (сек.)",
|
||||
"port_to_scan": "Порт для сканування при відсутності датчиків"
|
||||
"scan_interval": "Період оновлення (сек.), 0 - не оновлювати",
|
||||
"port_to_scan": "Порт для сканування при відсутності датчиків",
|
||||
"mqtt_inputs": "Використовувати MQTT",
|
||||
"nports": "Кількість портів",
|
||||
"update_all": "Оновити всі виходи коли спрацьовує вхід"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -30,7 +33,10 @@
|
||||
"scan_interval": "Період оновлення (сек.)",
|
||||
"port_to_scan": "Порт для сканування при відсутності датчиків",
|
||||
"reload": "Оновити об'єкти",
|
||||
"invert": "Список портів з інвертованою логікою (через ,)"
|
||||
"invert": "Список портів з інвертованою логікою (через ,)",
|
||||
"mqtt_inputs": "Використовувати MQTT",
|
||||
"nports": "Кількість портів",
|
||||
"update_all": "Оновити всі виходи коли спрацьовує вхід"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
|
||||
|
||||
# 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)
|
||||
|
||||
@@ -53,6 +57,9 @@ mega:
|
||||
unit_of_measurement:
|
||||
hum: "%" # если датчиков несколько, то можно указывать юниты по их ключам
|
||||
temp: "°C"
|
||||
# можно так же указать шаблон для конвертации значения, может быть полезно для ацп-входа
|
||||
# текущее значение порта передается в шаблон в переменной "value"
|
||||
conv_template: "{{(value|float)/100}}"
|
||||
14:
|
||||
name: какой-то датчик
|
||||
unit_of_measurement: "°C" # если датчик один, то просто строчкой
|
||||
|
||||
Reference in New Issue
Block a user