diff --git a/custom_components/mega/__init__.py b/custom_components/mega/__init__.py index 1e862c5..0c0bfc7 100644 --- a/custom_components/mega/__init__.py +++ b/custom_components/mega/__init__.py @@ -17,7 +17,7 @@ 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_CONV_TEMPLATE, CONF_ALL + CONF_CONV_TEMPLATE, CONF_ALL, CONF_FORCE_D from .hub import MegaD from .config_flow import ConfigFlow from .http import MegaView @@ -28,6 +28,7 @@ CONFIG_SCHEMA = vol.Schema( { DOMAIN: { vol.Optional(CONF_ALLOW_HOSTS): [str], + vol.Optional(CONF_FORCE_D, description='Принудительно слать d после срабатывания входа', default=False): bool, vol.Required(str, description='id меги из веб-интерфейса'): { vol.Optional(int, description='номер порта'): { vol.Optional(CONF_SKIP, description='исключить порт из сканирования', default=False): bool, @@ -44,7 +45,7 @@ CONFIG_SCHEMA = vol.Schema( CONF_RESPONSE_TEMPLATE, description='шаблон ответа когда на этот порт приходит' 'сообщение из меги '): 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_CONV_TEMPLATE): cv.template } diff --git a/custom_components/mega/binary_sensor.py b/custom_components/mega/binary_sensor.py index 6c55824..0390d33 100644 --- a/custom_components/mega/binary_sensor.py +++ b/custom_components/mega/binary_sensor.py @@ -16,7 +16,8 @@ from homeassistant.const import ( CONF_ENTITY_ID, ) from homeassistant.core import HomeAssistant -from .const import EVENT_BINARY_SENSOR, DOMAIN, CONF_CUSTOM, CONF_SKIP, CONF_INVERT +from homeassistant.helpers.template import Template +from .const import EVENT_BINARY_SENSOR, DOMAIN, CONF_CUSTOM, CONF_SKIP, CONF_INVERT, CONF_RESPONSE_TEMPLATE from .entities import MegaPushEntity from .hub import MegaD @@ -89,4 +90,18 @@ class MegaBinarySensor(BinarySensorEntity, MegaPushEntity): def _update(self, payload: dict): self.mega.values[self.port] = payload + if not self.mega.mqtt_inputs: + return + + template: Template = self.customize.get(CONF_RESPONSE_TEMPLATE, None) + if template is not None: + template.hass = self.hass + ret = template.async_render(payload) + self.hass.async_create_task( + self.mega.request(pt=self.port, cmd=ret) + ) + elif self.mega.force_d: + self.hass.async_create_task( + self.mega.request(pt=self.port, cmd='d') + ) diff --git a/custom_components/mega/const.py b/custom_components/mega/const.py index fb5009e..7379290 100644 --- a/custom_components/mega/const.py +++ b/custom_components/mega/const.py @@ -27,6 +27,7 @@ CONF_GET_VALUE = 'get_value' CONF_ALLOW_HOSTS = 'allow_hosts' CONF_CONV_TEMPLATE = 'conv_template' CONF_POLL_OUTS = 'poll_outs' +CONF_FORCE_D = 'force_d' PLATFORMS = [ "light", "switch", diff --git a/custom_components/mega/hub.py b/custom_components/mega/hub.py index e88adaf..c5e857d 100644 --- a/custom_components/mega/hub.py +++ b/custom_components/mega/hub.py @@ -15,7 +15,8 @@ from homeassistant.const import (DEVICE_CLASS_TEMPERATURE, DEVICE_CLASS_HUMIDITY from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import Entity 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 TEMP, HUM, PRESS, LUX, PATT_SPLIT, DOMAIN, CONF_HTTP, EVENT_BINARY_SENSOR, CONF_CUSTOM, CONF_SKIP, \ + CONF_FORCE_D from .entities import set_events_off, BaseMegaEntity from .exceptions import CannotConnect from .tools import make_ints @@ -163,6 +164,10 @@ class MegaD: self._customize = c return self._customize + @property + def force_d(self): + return self.customize.get(CONF_FORCE_D, False) + @property def is_online(self): return (datetime.now() - self.last_update).total_seconds() < (self.poll_interval + 10) diff --git a/custom_components/mega/manifest.json b/custom_components/mega/manifest.json index 8f329fe..47ea087 100644 --- a/custom_components/mega/manifest.json +++ b/custom_components/mega/manifest.json @@ -15,5 +15,5 @@ "@andvikt" ], "issue_tracker": "https://github.com/andvikt/mega_hacs/issues", - "version": "v0.3.13" + "version": "v0.3.16" } \ No newline at end of file diff --git a/readme.md b/readme.md index 96a75cc..7434dc7 100644 --- a/readme.md +++ b/readme.md @@ -113,6 +113,18 @@ mega: ``` +Начиная с версии v0.3.16 ответ можно слать так же и в режиме MQTT. Аналогично, темплейт должен возвращать готовую команду +такую же как требует команда cmd, так же можно использовать d, но d не отправляется по умолчанию, это сделано чтобы не +сломать текущую логику у пользователей предыдущих версий. Чтобы включить для всех входов в режиме mqtt отправку команды +d необходимо в конфиге прописать следующее: +```yaml +mega: + mega1: + force_d: true +``` +**Внимание!** Нельзя использовать чекбокс напротив поля act если планируется использовать ответ сервера - у вас и +сработает act и команда от сервера, а вслучае ответа d сработает act два раза. + ## binary_sensor и события Входы будут доступны как binary_sensor, а так же в виде событий `mega.sensor` и `mega.binary`.