diff --git a/custom_components/mega/config_flow.py b/custom_components/mega/config_flow.py index 2ebdade..3f07474 100644 --- a/custom_components/mega/config_flow.py +++ b/custom_components/mega/config_flow.py @@ -11,7 +11,7 @@ from homeassistant.const import CONF_HOST, CONF_ID, CONF_PASSWORD, CONF_SCAN_INT from homeassistant.core import callback, HomeAssistant from .const import DOMAIN, CONF_PORT_TO_SCAN, CONF_RELOAD, PLATFORMS, CONF_MQTT_INPUTS, \ CONF_NPORTS, CONF_UPDATE_ALL, CONF_POLL_OUTS, CONF_FAKE_RESPONSE, CONF_FORCE_D, \ - CONF_ALLOW_HOSTS, CONF_PROTECTED # pylint:disable=unused-import + CONF_ALLOW_HOSTS, CONF_PROTECTED, CONF_RESTORE_ON_RESTART # pylint:disable=unused-import from .hub import MegaD from . import exceptions @@ -30,6 +30,7 @@ STEP_USER_DATA_SCHEMA = vol.Schema( vol.Optional(CONF_UPDATE_ALL, default=True): bool, vol.Optional(CONF_FAKE_RESPONSE, default=True): bool, vol.Optional(CONF_FORCE_D, default=True): bool, + vol.Optional(CONF_RESTORE_ON_RESTART, default=True): bool, vol.Optional(CONF_PROTECTED, default=True): bool, vol.Optional(CONF_ALLOW_HOSTS, default='::1;127.0.0.1'): str, }, @@ -145,6 +146,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow): vol.Optional(CONF_UPDATE_ALL, default=e.get(CONF_UPDATE_ALL, True)): bool, vol.Optional(CONF_FAKE_RESPONSE, default=e.get(CONF_FAKE_RESPONSE, True)): bool, vol.Optional(CONF_FORCE_D, default=e.get(CONF_FORCE_D, False)): bool, + vol.Optional(CONF_RESTORE_ON_RESTART, default=e.get(CONF_RESTORE_ON_RESTART, False)): bool, vol.Optional(CONF_PROTECTED, default=e.get(CONF_PROTECTED, True)): bool, vol.Optional(CONF_ALLOW_HOSTS, default='::1;127.0.0.1'): str, # vol.Optional(CONF_INVERT, default=''): str, diff --git a/custom_components/mega/const.py b/custom_components/mega/const.py index 2212242..478ae88 100644 --- a/custom_components/mega/const.py +++ b/custom_components/mega/const.py @@ -31,6 +31,7 @@ CONF_CONV_TEMPLATE = 'conv_template' CONF_POLL_OUTS = 'poll_outs' CONF_FORCE_D = 'force_d' CONF_DEF_RESPONSE = 'def_response' +CONF_RESTORE_ON_RESTART = 'restore_on_restart' PLATFORMS = [ "light", "switch", diff --git a/custom_components/mega/http.py b/custom_components/mega/http.py index b46a362..fa18c56 100644 --- a/custom_components/mega/http.py +++ b/custom_components/mega/http.py @@ -64,7 +64,8 @@ class MegaView(HomeAssistantView): _LOGGER.warning(msg) return Response(status=401) - hub: 'h.MegaD' = self.hubs.get(request.remote) + remote = request.headers.get('X-Real-IP', request.remote) + hub: 'h.MegaD' = self.hubs.get(remote) if hub is None and 'mdid' in request.query: hub = self.hubs.get(request.query['mdid']) if hub is None: @@ -80,6 +81,9 @@ class MegaView(HomeAssistantView): ) _LOGGER.debug(f"Request: %s from '%s'", data, request.remote) make_ints(data) + if data.get('st') == '1' and hub.restore_on_restart: + asyncio.create_task(self.later_restore(hub)) + return Response(status=200) port = data.get('pt') data = data.copy() update_all = True @@ -101,13 +105,23 @@ class MegaView(HomeAssistantView): _LOGGER.debug('response %s', ret) Response(body='' if hub.fake_response else ret, content_type='text/plain') - if hub.fake_response: + if hub.fake_response and 'value' not in data and 'pt' in data: if 'd' in ret: await hub.request(pt=port, cmd=ret) else: await hub.request(cmd=ret) return ret + async def later_restore(self, hub): + """ + Восстановление всех выходов с небольшой задержкой. Задержка нужна чтобы ответ прошел успешно + + :param hub: + :return: + """ + await asyncio.sleep(0.2) + await hub.restore_states() + async def later_update(self, hub): await asyncio.sleep(1) _LOGGER.debug('force update') diff --git a/custom_components/mega/hub.py b/custom_components/mega/hub.py index 801b2fa..b63d33a 100644 --- a/custom_components/mega/hub.py +++ b/custom_components/mega/hub.py @@ -21,7 +21,7 @@ from .const import ( LUX, PATT_SPLIT, DOMAIN, CONF_HTTP, EVENT_BINARY_SENSOR, CONF_CUSTOM, CONF_FORCE_D, CONF_DEF_RESPONSE ) -from .entities import set_events_off, BaseMegaEntity +from .entities import set_events_off, BaseMegaEntity, MegaOutPort from .exceptions import CannotConnect, NoPort from .tools import make_ints @@ -78,6 +78,7 @@ class MegaD: force_d: bool=None, allow_hosts: str=None, protected=True, + restore_on_restart=False, **kwargs, ): """Initialize.""" @@ -136,7 +137,7 @@ class MegaD: self.mqtt_id = f"megad/{_id}" else: self.mqtt_id = mqtt_id - + self.restore_on_restart = restore_on_restart if force_d is not None: self.customize[CONF_FORCE_D] = force_d try: @@ -537,4 +538,12 @@ class MegaD: )) return ret + async def restore_states(self): + for x in self.entities: + if isinstance(x, MegaOutPort): + if x.is_on: + await x.async_turn_on(brightness=x.brightness) + else: + await x.async_turn_off() + diff --git a/custom_components/mega/strings.json b/custom_components/mega/strings.json index ddfbf91..7f41bd5 100644 --- a/custom_components/mega/strings.json +++ b/custom_components/mega/strings.json @@ -19,6 +19,7 @@ "force_d": "[%key:common::config_flow::data::force_d%]", "protected": "[%key:common::config_flow::data::protected%]", "allow_hosts": "[%key:common::config_flow::data::allow_hosts%]", + "restore_on_restart": "[%key:common::config_flow::data::restore_on_restart%]", "poll_outs": "[%key:common::config_flow::data::poll_outs%]" } } diff --git a/custom_components/mega/tools.py b/custom_components/mega/tools.py index e93b0f5..9294179 100644 --- a/custom_components/mega/tools.py +++ b/custom_components/mega/tools.py @@ -1,5 +1,6 @@ _params = ['m', 'click', 'cnt', 'pt'] + def make_ints(d: dict): for x in _params: try: diff --git a/custom_components/mega/translations/en.json b/custom_components/mega/translations/en.json index 1d2f31c..2e8fd90 100644 --- a/custom_components/mega/translations/en.json +++ b/custom_components/mega/translations/en.json @@ -27,6 +27,7 @@ "force_d": "Force 'd' response", "protected": "Protected", "allow_hosts": "Allowed hosts", + "restore_on_restart": "Restore outs on restart", "poll_outs": "Poll outs" } } @@ -45,6 +46,7 @@ "force_d": "Force 'd' response", "protected": "Protected", "allow_hosts": "Allowed hosts", + "restore_on_restart": "Restore outs on restart", "poll_outs": "Poll outs" } } diff --git a/custom_components/mega/translations/ru.json b/custom_components/mega/translations/ru.json index f2a2b1d..8206837 100644 --- a/custom_components/mega/translations/ru.json +++ b/custom_components/mega/translations/ru.json @@ -25,7 +25,8 @@ "fake_response": "Имитация http-ответа", "force_d": "Ответ 'd' по умолчанию", "protected": "Блокировать неразрешенные соединения", - "allow_hosts": "Разрешенные ip (через ;)", + "restore_on_restart": "Восстанавливать выходы при перезагрузке", + "allow_hosts": "Разрешенные ip (через ;)", "poll_outs": "Обновлять выходы (регулярно)" } } @@ -40,13 +41,14 @@ "reload": "Обновить объекты", "invert": "Список портов (через ,) с инвертированной логикой", "mqtt_inputs": "Использовать MQTT (Не рекомендуется)", - "fake_response": "Имитация http-ответа", - "force_d": "Ответ 'd' по умолчанию", - "nports": "Кол-во портов", - "update_all": "Обновить все выходы когда срабатывает вход", + "fake_response": "Имитация http-ответа", + "force_d": "Ответ 'd' по умолчанию", + "nports": "Кол-во портов", + "update_all": "Обновить все выходы когда срабатывает вход", "protected": "Блокировать неразрешенные соединения", "allow_hosts": "Разрешенные ip (через ;)", - "poll_outs": "Обновлять выходы (регулярно)" + "restore_on_restart": "Восстанавливать выходы при перезагрузке", + "poll_outs": "Обновлять выходы (регулярно)" } } } diff --git a/custom_components/mega/translations/uk.json b/custom_components/mega/translations/uk.json index d7efedf..48b0594 100644 --- a/custom_components/mega/translations/uk.json +++ b/custom_components/mega/translations/uk.json @@ -26,6 +26,7 @@ "force_d": "Неявно відповідати 'd'", "protected": "Блокувати недозволені з'єднання", "allow_hosts": "Дозволені ip (через ;)", + "restore_on_restart": "Відновлювати виходи при перезавантаженні", "poll_outs": "Оновити виходи" } } @@ -46,6 +47,7 @@ "update_all": "Оновити всі виходи коли спрацьовує вхід", "protected": "Блокувати недозволені з'єднання", "allow_hosts": "Дозволені ip (через ;)", + "restore_on_restart": "Відновлювати виходи при перезавантаженні", "poll_outs": "Оновити виходи" } }