mirror of
https://github.com/andvikt/mega_hacs.git
synced 2025-12-12 01:24:29 +05:00
Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f09610355b | ||
|
|
70e182fec3 | ||
|
|
ef3152a086 | ||
|
|
9b9443864c | ||
|
|
b7669ac407 | ||
|
|
2b308a71a1 | ||
|
|
8f67652c0e | ||
|
|
f83cdaa583 | ||
|
|
8dfa5926ad | ||
|
|
3978ce2203 | ||
|
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -161,6 +163,7 @@ async def async_remove_entry(hass, entry) -> None:
|
|||||||
return
|
return
|
||||||
_LOGGER.debug(f'remove {id}')
|
_LOGGER.debug(f'remove {id}')
|
||||||
_hubs.pop(id, None)
|
_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()
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -13,16 +13,18 @@ from .const import DOMAIN, CONF_CUSTOM, CONF_INVERT, EVENT_BINARY_SENSOR, LONG,
|
|||||||
_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():
|
def set_events_off():
|
||||||
global _events_on
|
global _events_on, _task_set_ev_on
|
||||||
_events_on = False
|
_events_on = False
|
||||||
|
_task_set_ev_on = None
|
||||||
|
|
||||||
_task_set_ev_on = None
|
_task_set_ev_on = None
|
||||||
|
|
||||||
|
|||||||
@@ -209,6 +209,8 @@ 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 = {'value': dict([
|
ret = {'value': dict([
|
||||||
@@ -229,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, 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
|
||||||
|
|
||||||
@@ -371,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):
|
||||||
@@ -386,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.11"
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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": "Оновити всі виходи коли спрацьовує вхід"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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" # если датчик один, то просто строчкой
|
||||||
|
|||||||
Reference in New Issue
Block a user