diff --git a/custom_components/mega/__init__.py b/custom_components/mega/__init__.py index 3499acb..a332a62 100644 --- a/custom_components/mega/__init__.py +++ b/custom_components/mega/__init__.py @@ -51,15 +51,31 @@ async def async_setup(hass: HomeAssistant, config: dict): """Set up the mega component.""" conf = config.get(DOMAIN) hass.data[DOMAIN] = {} + hass.services.async_register( + DOMAIN, 'save', _save_service, schema=vol.Schema({ + vol.Optional('mega_id'): str + }) + ) + hass.services.async_register( + DOMAIN, 'get_port', _get_port, schema=vol.Schema({ + vol.Optional('mega_id'): str, + vol.Optional('port'): int, + }) + ) + hass.services.async_register( + DOMAIN, 'run_cmd', _run_cmd, schema=vol.Schema({ + vol.Required('port'): int, + vol.Required('cmd'): str, + vol.Optional('mega_id'): str, + }) + ) if conf is None: return True if CONF_HOST in conf: conf = {DEF_ID: conf} for id, data in conf.items(): await _add_mega(hass, id, data) - hass.services.async_register( - DOMAIN, 'save', _save_service, - ) + for id, hub in hass.data[DOMAIN].__items__(): _POLL_TASKS[id] = asyncio.create_task(hub.poll()) return True @@ -79,7 +95,6 @@ async def _add_mega(hass: HomeAssistant, id, data: dict): async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry): - print(entry.entry_id) id = entry.data.get('id', entry.entry_id) data = dict(entry.data) data.update(entry.options or {}) @@ -119,7 +134,35 @@ async def async_remove_entry(hass, entry) -> None: @bind_hass -async def _save_service(hass: HomeAssistant, mega_id='def'): - hub: MegaD = hass.data[DOMAIN][mega_id] - await hub.save() +async def _save_service(hass: HomeAssistant, mega_id=None): + if mega_id: + hub: MegaD = hass.data[DOMAIN][mega_id] + await hub.save() + else: + for hub in hass.data[DOMAIN].values(): + await hub.save() + +@bind_hass +async def _get_port(hass: HomeAssistant, port=None, mega_id=None): + if mega_id: + hub: MegaD = hass.data[DOMAIN][mega_id] + if port is None: + await hub.get_all_ports() + else: + await hub.get_port(port) + else: + for hub in hass.data[DOMAIN].values(): + if port is None: + await hub.get_all_ports() + else: + await hub.get_port(port) + +@bind_hass +async def _run_cmd(hass: HomeAssistant, port: int, cmd: str, mega_id=None): + if mega_id: + hub: MegaD = hass.data[DOMAIN][mega_id] + await hub.send_command(port=port, cmd=cmd) + else: + for hub in hass.data[DOMAIN].values(): + await hub.send_command(port=port, cmd=cmd) diff --git a/custom_components/mega/entities.py b/custom_components/mega/entities.py index 55ed21f..99a7c6c 100644 --- a/custom_components/mega/entities.py +++ b/custom_components/mega/entities.py @@ -25,11 +25,12 @@ class BaseMegaEntity(RestoreEntity): ): self._state: State = None self.port = port - self._name = name self._mega_id = mega_id self._lg = None self._unique_id = unique_id or f"mega_{mega_id}_{port}" + \ (f"_{id_suffix}" if id_suffix else "") + self._name = name or f"{mega_id}_{port}" + \ + (f"_{id_suffix}" if id_suffix else "") @property def lg(self) -> logging.Logger: diff --git a/custom_components/mega/hub.py b/custom_components/mega/hub.py index 9f46555..ef9c100 100644 --- a/custom_components/mega/hub.py +++ b/custom_components/mega/hub.py @@ -178,7 +178,7 @@ class MegaD: async def get_all_ports(self): for x in range(37): - await self.get_port(x) + asyncio.create_task(self.get_port(x)) async def reboot(self, save=True): await self.save() diff --git a/custom_components/mega/services.yaml b/custom_components/mega/services.yaml index 3adeab5..55a207c 100644 --- a/custom_components/mega/services.yaml +++ b/custom_components/mega/services.yaml @@ -1,13 +1,33 @@ save: - # Description of the service description: Сохраняет текущее состояние портов (?cmd=s) - # Different fields that your service accepts fields: - # Key of the field + mega_id: - # Description of the field - description: ID меги - # Example value that can be passed for this field - example: "def" \ No newline at end of file + description: ID меги, можно оставить пустым, тогда будут сохранены все зарегистрированные меги + example: "mega" + +get_port: + description: Запросить текущий статус порта (или всех) + fields: + mega_id: + description: ID меги, можно оставить пустым, тогда будут сохранены все зарегистрированные меги + example: "mega" + port: + description: Номер порта (если не заполнять, будут запрошены все порты сразу) + example: 1 + +run_cmd: + description: Выполнить любую произвольную команду + fields: + + mega_id: + description: ID меги, можно оставить пустым, тогда будут сохранены все зарегистрированные меги + example: "mega" + port: + description: Номер порта (это не порт, которым мы управляем, а порт с которого шлем команду) + example: 1 + cmd: + description: Любая поддерживаемая мегой команда + example: "1:0" diff --git a/readme.md b/readme.md index b2ad004..dfe1faa 100644 --- a/readme.md +++ b/readme.md @@ -81,12 +81,39 @@ switch: ``` ## Сервисы -Интеграция предоставляет сервис сохранения состояния портов: `mega.save` ```yaml -action: - service: mega.save - data: - mega_id: def +save: + description: Сохраняет текущее состояние портов (?cmd=s) + fields: + + mega_id: + description: ID меги, можно оставить пустым, тогда будут сохранены все зарегистрированные меги + example: "mega" + +get_port: + description: Запросить текущий статус порта (или всех) + fields: + mega_id: + description: ID меги, можно оставить пустым, тогда будут сохранены все зарегистрированные меги + example: "mega" + port: + description: Номер порта (если не заполнять, будут запрошены все порты сразу) + example: 1 + +run_cmd: + description: Выполнить любую произвольную команду + fields: + + mega_id: + description: ID меги, можно оставить пустым, тогда будут сохранены все зарегистрированные меги + example: "mega" + port: + description: Номер порта (это не порт, которым мы управляем, а порт с которого шлем команду) + example: 1 + cmd: + description: Любая поддерживаемая мегой команда + example: "1:0" + ``` ## Состояния