From 1029cfcc61608a1af62ad4d5447f764fbe982f76 Mon Sep 17 00:00:00 2001 From: Will <65567450+wjnelson78@users.noreply.github.com> Date: Tue, 11 Mar 2025 07:43:36 -0700 Subject: [PATCH 1/2] fix(openhasp): Use proper entity service schemas and switch to `async_forward_entry_setups` This commit addresses two deprecation warnings in the openHASP integration: 1. **Entity Service Schema** Home Assistant 2025.9 and onward no longer allows registering entity services with an empty `{}` schema. This commit adds minimal entity service schemas for `SERVICE_WAKEUP`, `SERVICE_PAGE_NEXT`, and `SERVICE_PAGE_PREV` by using `cv.make_entity_service_schema({})`. Additionally, the existing `PUSH_IMAGE` service is updated to use `cv.make_entity_service_schema(...)` to ensure compliance with future HA releases. 2. **async_forward_entry_setup Deprecation** Replaces multiple `await hass.config_entries.async_forward_entry_setup(entry, domain)` calls in a loop with a single `await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)`. This ensures the setup lock is handled correctly and removes the related deprecation warning. These changes make the custom component compatible with the upcoming breaking changes in Home Assistant 2025.x and beyond, preventing warnings and ensuring a smooth user experience. --- custom_components/openhasp/__init__.py | 31 ++++++++++---------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/custom_components/openhasp/__init__.py b/custom_components/openhasp/__init__.py index b074078..d6b2c66 100644 --- a/custom_components/openhasp/__init__.py +++ b/custom_components/openhasp/__init__.py @@ -184,26 +184,19 @@ async def async_setup(hass, config): hass.data[DOMAIN] = {CONF_PLATE: {}} - component = hass.data[DOMAIN][CONF_COMPONENT] = EntityComponent( - _LOGGER, DOMAIN, hass - ) + component = hass.data[DOMAIN][CONF_COMPONENT] = EntityComponent(_LOGGER, DOMAIN, hass) + + WAKEUP_SERVICE_SCHEMA = cv.make_entity_service_schema({}) + PAGE_NEXT_SERVICE_SCHEMA = cv.make_entity_service_schema({}) + PAGE_PREV_SERVICE_SCHEMA = cv.make_entity_service_schema({}) + + component.async_register_entity_service(SERVICE_WAKEUP, WAKEUP_SCHEMA, "async_wakeup") + component.async_register_entity_service(SERVICE_PAGE_NEXT, PAGE_NEXT_SCHEMA, "async_change_page_next") + component.async_register_entity_service(SERVICE_PAGE_PREV, PAGE_PREV_SCHEMA, "async_change_page_prev") + component.async_register_entity_service(SERVICE_PAGE_CHANGE, {vol.Required(ATTR_PAGE): int}, "async_change_page") + component.async_register_entity_service(SERVICE_LOAD_PAGE, {vol.Required(ATTR_PATH): cv.isfile}, "async_load_page") + component.async_register_entity_service(SERVICE_CLEAR_PAGE, {vol.Optional(ATTR_PAGE): int}, "async_clearpage") - component.async_register_entity_service(SERVICE_WAKEUP, {}, "async_wakeup") - component.async_register_entity_service( - SERVICE_PAGE_NEXT, {}, "async_change_page_next" - ) - component.async_register_entity_service( - SERVICE_PAGE_PREV, {}, "async_change_page_prev" - ) - component.async_register_entity_service( - SERVICE_PAGE_CHANGE, {vol.Required(ATTR_PAGE): int}, "async_change_page" - ) - component.async_register_entity_service( - SERVICE_LOAD_PAGE, {vol.Required(ATTR_PATH): cv.isfile}, "async_load_page" - ) - component.async_register_entity_service( - SERVICE_CLEAR_PAGE, {vol.Optional(ATTR_PAGE): int}, "async_clearpage" - ) component.async_register_entity_service( SERVICE_COMMAND, { From 674c56166b2d057fd65a0d82252f6afed431f55d Mon Sep 17 00:00:00 2001 From: William Nelson Date: Mon, 15 Dec 2025 13:08:20 -0800 Subject: [PATCH 2/2] Address review feedback: use cv.make_entity_service_schema for all services Per dgomes' feedback, updated ALL entity services to use cv.make_entity_service_schema() for consistency, not just the ones with empty schemas. This fixes: - Variable naming bug (WAKEUP_SERVICE_SCHEMA vs WAKEUP_SCHEMA) - Applies consistent schema wrapping to PAGE_CHANGE, LOAD_PAGE, CLEAR_PAGE, COMMAND, and CONFIG services --- custom_components/openhasp/__init__.py | 56 +++++++++++++++++--------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/custom_components/openhasp/__init__.py b/custom_components/openhasp/__init__.py index d6b2c66..da3537d 100644 --- a/custom_components/openhasp/__init__.py +++ b/custom_components/openhasp/__init__.py @@ -186,37 +186,57 @@ async def async_setup(hass, config): component = hass.data[DOMAIN][CONF_COMPONENT] = EntityComponent(_LOGGER, DOMAIN, hass) - WAKEUP_SERVICE_SCHEMA = cv.make_entity_service_schema({}) - PAGE_NEXT_SERVICE_SCHEMA = cv.make_entity_service_schema({}) - PAGE_PREV_SERVICE_SCHEMA = cv.make_entity_service_schema({}) - - component.async_register_entity_service(SERVICE_WAKEUP, WAKEUP_SCHEMA, "async_wakeup") - component.async_register_entity_service(SERVICE_PAGE_NEXT, PAGE_NEXT_SCHEMA, "async_change_page_next") - component.async_register_entity_service(SERVICE_PAGE_PREV, PAGE_PREV_SCHEMA, "async_change_page_prev") - component.async_register_entity_service(SERVICE_PAGE_CHANGE, {vol.Required(ATTR_PAGE): int}, "async_change_page") - component.async_register_entity_service(SERVICE_LOAD_PAGE, {vol.Required(ATTR_PATH): cv.isfile}, "async_load_page") - component.async_register_entity_service(SERVICE_CLEAR_PAGE, {vol.Optional(ATTR_PAGE): int}, "async_clearpage") - + # Use cv.make_entity_service_schema for all services for consistency + component.async_register_entity_service( + SERVICE_WAKEUP, + cv.make_entity_service_schema({}), + "async_wakeup", + ) + component.async_register_entity_service( + SERVICE_PAGE_NEXT, + cv.make_entity_service_schema({}), + "async_change_page_next", + ) + component.async_register_entity_service( + SERVICE_PAGE_PREV, + cv.make_entity_service_schema({}), + "async_change_page_prev", + ) + component.async_register_entity_service( + SERVICE_PAGE_CHANGE, + cv.make_entity_service_schema({vol.Required(ATTR_PAGE): int}), + "async_change_page", + ) + component.async_register_entity_service( + SERVICE_LOAD_PAGE, + cv.make_entity_service_schema({vol.Required(ATTR_PATH): cv.isfile}), + "async_load_page", + ) + component.async_register_entity_service( + SERVICE_CLEAR_PAGE, + cv.make_entity_service_schema({vol.Optional(ATTR_PAGE): int}), + "async_clearpage", + ) component.async_register_entity_service( SERVICE_COMMAND, - { + cv.make_entity_service_schema({ vol.Required(ATTR_COMMAND_KEYWORD): cv.string, vol.Optional(ATTR_COMMAND_PARAMETERS, default=""): cv.string, - }, + }), "async_command_service", ) - component.async_register_entity_service( SERVICE_CONFIG, - { + cv.make_entity_service_schema({ vol.Required(ATTR_CONFIG_SUBMODULE): cv.string, vol.Required(ATTR_CONFIG_PARAMETERS): cv.string, - }, + }), "async_config_service", ) - component.async_register_entity_service( - SERVICE_PUSH_IMAGE, PUSH_IMAGE_SCHEMA, "async_push_image" + SERVICE_PUSH_IMAGE, + PUSH_IMAGE_SCHEMA, + "async_push_image", ) hass.data[DOMAIN][DATA_IMAGES] = dict()