mirror of
https://github.com/andvikt/mega_hacs.git
synced 2025-12-12 01:24:29 +05:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5da2973351 | ||
|
|
5eadd295f1 | ||
|
|
5bf432a27f | ||
|
|
d934e87ae5 | ||
|
|
0b54db9c44 | ||
|
|
2d15b60929 |
26
.github/ISSUE_TEMPLATE/bug-report.md
vendored
Normal file
26
.github/ISSUE_TEMPLATE/bug-report.md
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Описание**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**Версии систем**
|
||||||
|
Enviroment: raspberry/linux/windows/macos/docker
|
||||||
|
HA version:
|
||||||
|
mega_hacs version:
|
||||||
|
megad firmware version:
|
||||||
|
|
||||||
|
**Ожидаемое поведение**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**LOG**
|
||||||
|
Прочитайте в документации как включить подробный лог интеграции и приложите его здесь
|
||||||
@@ -16,7 +16,7 @@ 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_MQTT_INPUTS, CONF_HTTP, CONF_RESPONSE_TEMPLATE, CONF_ACTION, CONF_GET_VALUE, CONF_ALLOW_HOSTS
|
||||||
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
|
||||||
@@ -26,6 +26,7 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
CONFIG_SCHEMA = vol.Schema(
|
CONFIG_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
DOMAIN: {
|
DOMAIN: {
|
||||||
|
vol.Optional(CONF_ALLOW_HOSTS): [str],
|
||||||
vol.Required(str, description='id меги из веб-интерфейса'): {
|
vol.Required(str, description='id меги из веб-интерфейса'): {
|
||||||
vol.Optional(int, description='номер порта'): {
|
vol.Optional(int, description='номер порта'): {
|
||||||
vol.Optional(CONF_SKIP, description='исключить порт из сканирования', default=False): bool,
|
vol.Optional(CONF_SKIP, description='исключить порт из сканирования', default=False): bool,
|
||||||
@@ -62,6 +63,7 @@ async def async_setup(hass: HomeAssistant, config: dict):
|
|||||||
"""YAML-конфигурация содержит только кастомизации портов"""
|
"""YAML-конфигурация содержит только кастомизации портов"""
|
||||||
hass.data[DOMAIN] = {CONF_CUSTOM: config.get(DOMAIN, {})}
|
hass.data[DOMAIN] = {CONF_CUSTOM: config.get(DOMAIN, {})}
|
||||||
hass.data[DOMAIN][CONF_HTTP] = view = MegaView(cfg=config.get(DOMAIN, {}))
|
hass.data[DOMAIN][CONF_HTTP] = view = MegaView(cfg=config.get(DOMAIN, {}))
|
||||||
|
view.allowed_hosts |= set(config.get(DOMAIN, {}).get(CONF_ALLOW_HOSTS, []))
|
||||||
hass.http.register_view(view)
|
hass.http.register_view(view)
|
||||||
hass.services.async_register(
|
hass.services.async_register(
|
||||||
DOMAIN, 'save', partial(_save_service, hass), schema=vol.Schema({
|
DOMAIN, 'save', partial(_save_service, hass), schema=vol.Schema({
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ STEP_USER_DATA_SCHEMA = vol.Schema(
|
|||||||
|
|
||||||
async def get_hub(hass: HomeAssistant, data):
|
async def get_hub(hass: HomeAssistant, data):
|
||||||
_mqtt = hass.data.get(mqtt.DOMAIN)
|
_mqtt = hass.data.get(mqtt.DOMAIN)
|
||||||
if not isinstance(_mqtt, mqtt.MQTT):
|
# if not isinstance(_mqtt, mqtt.MQTT):
|
||||||
raise exceptions.MqttNotConfigured("mqtt must be configured first")
|
# raise exceptions.MqttNotConfigured("mqtt must be configured first")
|
||||||
hub = MegaD(hass, **data, lg=_LOGGER, mqtt=_mqtt, loop=asyncio.get_event_loop())
|
hub = MegaD(hass, **data, lg=_LOGGER, mqtt=_mqtt, loop=asyncio.get_event_loop())
|
||||||
hub.mqtt_id = await hub.get_mqtt_id()
|
hub.mqtt_id = await hub.get_mqtt_id()
|
||||||
if not await hub.authenticate():
|
if not await hub.authenticate():
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ CONF_RESPONSE_TEMPLATE = 'response_template'
|
|||||||
CONF_ACTION = 'action'
|
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'
|
||||||
PLATFORMS = [
|
PLATFORMS = [
|
||||||
"light",
|
"light",
|
||||||
"switch",
|
"switch",
|
||||||
|
|||||||
@@ -209,13 +209,13 @@ class MegaD:
|
|||||||
ret = {'value': ret}
|
ret = {'value': ret}
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
async def get_port(self, port):
|
async def get_port(self, port, force_http=False):
|
||||||
"""
|
"""
|
||||||
Запрос состояния порта. Состояние всегда возвращается в виде объекта, всегда сохраняется в центральное
|
Запрос состояния порта. Состояние всегда возвращается в виде объекта, всегда сохраняется в центральное
|
||||||
хранилище values
|
хранилище values
|
||||||
"""
|
"""
|
||||||
self.lg.debug(f'get port %s', port)
|
self.lg.debug(f'get port %s', port)
|
||||||
if self.mqtt is None:
|
if self.mqtt is None or force_http:
|
||||||
ret = await self.request(pt=port, cmd='get')
|
ret = await self.request(pt=port, cmd='get')
|
||||||
ret = self.parse_response(ret)
|
ret = self.parse_response(ret)
|
||||||
self.values[port] = ret
|
self.values[port] = ret
|
||||||
@@ -346,7 +346,7 @@ class MegaD:
|
|||||||
return pty, m
|
return pty, m
|
||||||
|
|
||||||
async def scan_ports(self, nports=37):
|
async def scan_ports(self, nports=37):
|
||||||
for x in range(nports+1):
|
for x in range(1, nports+1):
|
||||||
ret = await self.scan_port(x)
|
ret = await self.scan_port(x)
|
||||||
if ret:
|
if ret:
|
||||||
yield [x, *ret]
|
yield [x, *ret]
|
||||||
@@ -361,7 +361,7 @@ class MegaD:
|
|||||||
ret['light'][port].append({'dimmer': m == '1'})
|
ret['light'][port].append({'dimmer': m == '1'})
|
||||||
elif pty == '3':
|
elif pty == '3':
|
||||||
try:
|
try:
|
||||||
values = await self.get_port(port)
|
values = await self.get_port(port, force_http=True)
|
||||||
except asyncio.TimeoutError:
|
except asyncio.TimeoutError:
|
||||||
self.lg.warning(f'timout on port {port}')
|
self.lg.warning(f'timout on port {port}')
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -154,5 +154,7 @@ class Mega1WSensor(MegaPushEntity):
|
|||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
n = super().name
|
n = super().name
|
||||||
c = self.customize.get(CONF_NAME, {}).get(self.key)
|
c = self.customize.get(CONF_NAME, {})
|
||||||
|
if isinstance(c, dict):
|
||||||
|
c = c.get(self.key)
|
||||||
return c or n
|
return c or n
|
||||||
98
readme.md
98
readme.md
@@ -14,8 +14,52 @@
|
|||||||
большого кол-ва команд (например в сценах). Каждая следующая команда отправляется только после получения ответа о
|
большого кол-ва команд (например в сценах). Каждая следующая команда отправляется только после получения ответа о
|
||||||
выполнении предыдущей.
|
выполнении предыдущей.
|
||||||
|
|
||||||
|
## Установка
|
||||||
|
Рекомендованный способ с поддержкой обновлений - [HACS](https://hacs.xyz/docs/installation/installation):
|
||||||
|
|
||||||
|
HACS - Integrations - Explore, в поиске ищем MegaD.
|
||||||
|
|
||||||
|
Альтернативный способ установки:
|
||||||
|
```shell
|
||||||
|
# из папки с конфигом
|
||||||
|
wget -q -O - https://raw.githubusercontent.com/andvikt/mega_hacs/master/install.sh | bash -
|
||||||
|
```
|
||||||
|
Не забываем перезагрузить HA
|
||||||
|
|
||||||
|
## Настройка
|
||||||
|
`Настройки` -> `Интеграции` -> `Добавить интеграцию` в поиске ищем mega
|
||||||
|
|
||||||
|
Все имеющиеся у вас порты будут настроены автоматически. Вы можете менять названия, иконки и entity_id так же из интерфейса.
|
||||||
|
|
||||||
|
#### Кастомизация устройств с помощью yaml:
|
||||||
|
```yaml
|
||||||
|
# configuration.yaml
|
||||||
|
|
||||||
|
mega:
|
||||||
|
hello: # ID меги, как в UI
|
||||||
|
7: # номер порта
|
||||||
|
domain: switch # тип устройства (switch или light, по умолчанию для цифровых выходов используется light)
|
||||||
|
invert: true # инвертировать или нет (по умолчанию false)
|
||||||
|
name: Насос # имя устройства
|
||||||
|
8:
|
||||||
|
# исключить из сканирования
|
||||||
|
skip: true
|
||||||
|
33:
|
||||||
|
# для датчиков можно кастомизировать только имя и unit_of_measurement
|
||||||
|
# для температуры и влажность unit определяется автоматически, для остальных юнита нет
|
||||||
|
name:
|
||||||
|
hum: "влажность"
|
||||||
|
temp: "температура"
|
||||||
|
unit_of_measurement:
|
||||||
|
hum: "%" # если датчиков несколько, то можно указывать юниты по их ключам
|
||||||
|
temp: "°C"
|
||||||
|
14:
|
||||||
|
name: какой-то датчик
|
||||||
|
unit_of_measurement: "°C" # если датчик один, то просто строчкой
|
||||||
|
```
|
||||||
|
|
||||||
## Зависимости
|
## Зависимости
|
||||||
**Важно!!** Для максимальной совместимости необходимо настроить интеграцию [mqtt](https://www.home-assistant.io/integrations/mqtt/)
|
Для совместимости c mqtt необходимо настроить интеграцию [mqtt](https://www.home-assistant.io/integrations/mqtt/)
|
||||||
в HomeAssistant, а так же обновить ваш контроллер до последней версии, тк были важные обновления в части mqtt
|
в HomeAssistant, а так же обновить ваш контроллер до последней версии, тк были важные обновления в части mqtt
|
||||||
|
|
||||||
## HTTP in
|
## HTTP in
|
||||||
@@ -73,50 +117,24 @@ mega:
|
|||||||
{% if m==2 %}1:0{% else %}d{% endif %}
|
{% if m==2 %}1:0{% else %}d{% endif %}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
## Отладка ответов
|
||||||
## Установка
|
Для отладки ответов сервера можно самим имитировать запросы контроллера, если у вас есть доступ к консоли
|
||||||
Рекомендованный способ с поддержкой обновлений - [HACS](https://hacs.xyz/docs/installation/installation):
|
HA:
|
||||||
|
|
||||||
HACS - Integrations - Explore, в поиске ищем MegaD.
|
|
||||||
|
|
||||||
Альтернативный способ установки:
|
|
||||||
```shell
|
```shell
|
||||||
# из папки с конфигом
|
curl -v -X GET 'http://localhost:8123/mega?pt=5&m=1'
|
||||||
wget -q -O - https://raw.githubusercontent.com/andvikt/mega_hacs/master/install.sh | bash -
|
|
||||||
```
|
```
|
||||||
Не забываем перезагрузить HA
|
Если доступа нет, нужно в файл конфигурации добавить ip компьюетра, с которого вы хотите делать запросы, например:
|
||||||
|
|
||||||
## Настройка
|
|
||||||
`Настройки` -> `Интеграции` -> `Добавить интеграцию` в поиске ищем mega
|
|
||||||
|
|
||||||
Все имеющиеся у вас порты будут настроены автоматически. Вы можете менять названия, иконки и entity_id так же из интерфейса.
|
|
||||||
|
|
||||||
#### Кастомизация устройств с помощью yaml:
|
|
||||||
```yaml
|
```yaml
|
||||||
# configuration.yaml
|
|
||||||
|
|
||||||
mega:
|
mega:
|
||||||
hello: # ID меги, как в UI
|
allow_hosts:
|
||||||
7: # номер порта
|
- 192.168.1.1
|
||||||
domain: switch # тип устройства (switch или light, по умолчанию для цифровых выходов используется light)
|
|
||||||
invert: true # инвертировать или нет (по умолчанию false)
|
|
||||||
name: Насос # имя устройства
|
|
||||||
8:
|
|
||||||
# исключить из сканирования
|
|
||||||
skip: true
|
|
||||||
33:
|
|
||||||
# для датчиков можно кастомизировать только имя и unit_of_measurement
|
|
||||||
# для температуры и влажность unit определяется автоматически, для остальных юнита нет
|
|
||||||
name:
|
|
||||||
hum: "влажность"
|
|
||||||
temp: "температура"
|
|
||||||
unit_of_measurement:
|
|
||||||
hum: "%" # если датчиков несколько, то можно указывать юниты по их ключам
|
|
||||||
temp: "°C"
|
|
||||||
14:
|
|
||||||
name: какой-то датчик
|
|
||||||
unit_of_measurement: "°C" # если датчик один, то просто строчкой
|
|
||||||
```
|
```
|
||||||
|
И тогда можно с локальной машины делать запросы на ваш сервер HA:
|
||||||
|
```shell
|
||||||
|
curl -v -X GET 'http://192.168.88.1.4:8123/mega?pt=5&m=1'
|
||||||
|
```
|
||||||
|
В ответ будет приходить либо `d`, либо скрипт, который вы настроили
|
||||||
|
|
||||||
|
|
||||||
## События
|
## События
|
||||||
`binary_sensor` срабатывает когда цифровой выход принимает значение 'ON'. `binary_sensor` имеет смысл использовать
|
`binary_sensor` срабатывает когда цифровой выход принимает значение 'ON'. `binary_sensor` имеет смысл использовать
|
||||||
|
|||||||
Reference in New Issue
Block a user