Big-Tree / HomeAssistant-OptiSpark

AI based heat pump optimisation. Cheaper and greener heating
https://optispark.ai/demo
MIT License
4 stars 3 forks source link

Accessing entities within other integrations could be improved #20

Open Big-Tree opened 9 months ago

Big-Tree commented 9 months ago

Checklist

Is your feature request related to a problem? Please describe.

The method by which entities are are accessed and controlled is not officially supported. They may be better alternative methods:

https://github.com/Big-Tree/HomeAssistant-OptiSpark/blob/73a252bb8c191626d3517e9a6ec00e33b3b463f0/custom_components/optispark/__init__.py#L62-L75

Describe the solution you'd like

-

Describe alternatives you've considered

-

Additional context

-

chappers00 commented 9 months ago

Logger: aiohttp.server Source: /usr/local/lib/python3.11/site-packages/aiohttp/web_protocol.py:403 First occurred: 4:14:41 PM (2 occurrences) Last logged: 4:15:06 PM

Error handling request Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/aiohttp/web_protocol.py", line 433, in _handle_request resp = await request_handler(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/aiohttp/web_app.py", line 504, in _handle resp = await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/aiohttp/web_middlewares.py", line 117, in impl return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 85, in security_filter_middleware return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 100, in forwarded_middleware return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 28, in request_context_middleware return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 80, in ban_middleware return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 236, in auth_middleware return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 31, in headers_middleware response = await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 148, in handle result = await handler(request, request.match_info) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 63, in with_admin return await func(self, request, *args, *kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 177, in post return await super().post(request, flow_id) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 72, in wrapper result = await method(view, request, data, args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 110, in post result = await self._flow_mgr.async_configure(flow_id, data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 293, in async_configure result = await self._async_handle_step( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 389, in _async_handle_step result: FlowResult = await getattr(flow, method)(user_input) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/config/custom_components/optispark/config_flow.py", line 71, in async_step_init postcode = await self._test_credentials( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/config/custom_components/optispark/config_flow.py", line 144, in _test_credentials power_entity = get_entity(self.hass, heat_pump_power_entity_id) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/config/custom_components/optispark/init.py", line 70, in get_entity entity_coordinator: DataUpdateCoordinator = hass.data[domain][entity_reg.config_entry_id]


KeyError: 'e35ea7b6bea2b0c6d7ed57830f3effc6'
Big-Tree commented 9 months ago

It's trying to get the entity which measures the power of the heat pump. It looks like the domain is 'e35ea7b6bea2b0c6d7ed57830f3effc6' and that doesn't exist. However, 'e35ea7b6bea2b0c6d7ed57830f3effc6' doesn't look like a typical domain name so I think the method by which I get the domain name is flawed.

Big-Tree commented 9 months ago

I've changed the way domain is fetched and added some more logging.

https://github.com/Big-Tree/HomeAssistant-OptiSpark/blob/b3980d3578bb47b92d625b14d5ba6d83209d47ac/custom_components/optispark/__init__.py#L63-L85

chappers00 commented 8 months ago

Logs with latest version: 2024-01-08 17:38:16.255 ERROR (MainThread) [custom_components.optispark] Traceback (most recent call last): File "/config/custom_components/optispark/init.py", line 90, in get_entity entity_coordinator: DataUpdateCoordinator = hass.data[domain][entity_reg.config_entry_id]


KeyError: 'e35ea7b6bea2b0c6d7ed57830f3effc6'
2024-01-08 17:38:16.255 ERROR (MainThread) [custom_components.optispark] 'e35ea7b6bea2b0c6d7ed57830f3effc6'
2024-01-08 17:38:16.255 ERROR (MainThread) [custom_components.optispark] 'e35ea7b6bea2b0c6d7ed57830f3effc6'
Big-Tree commented 8 months ago

I've updated how entities from other integrations are fetched again. 3rd time lucky? It's similar to how HA automation get entities.

This has been tested with Daikin's heat pump integration

https://github.com/Big-Tree/HomeAssistant-OptiSpark/blob/9a83f2cb47ac1cfd972229668dfb27e7785009c4/custom_components/optispark/__init__.py#L64-L86

chappers00 commented 8 months ago

2024-01-10 16:11:27.086 ERROR (MainThread) [aiohttp.server] Error handling request Traceback (most recent call last): File "/usr/local/lib/python3.11/site-packages/aiohttp/web_protocol.py", line 452, in _handle_request resp = await request_handler(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/aiohttp/web_app.py", line 543, in _handle resp = await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/aiohttp/web_middlewares.py", line 114, in impl return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 85, in security_filter_middleware return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 100, in forwarded_middleware return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 28, in request_context_middleware return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 80, in ban_middleware return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 233, in auth_middleware return await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 31, in headers_middleware response = await handler(request) ^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/view.py", line 149, in handle result = await handler(request, request.match_info) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 63, in with_admin return await func(self, request, *args, *kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 177, in post return await super().post(request, flow_id) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 72, in wrapper result = await method(view, request, data, args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 110, in post result = await self._flow_mgr.async_configure(flow_id, data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 320, in async_configure result = await self._async_handle_step( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 416, in _async_handle_step result: FlowResult = await getattr(flow, method)(user_input) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/config/custom_components/optispark/config_flow.py", line 159, in async_step_accept dynamo_data = await get_history( ^^^^^^^^^^^^^^^^^^ File "/config/custom_components/optispark/history.py", line 240, in get_history state_changes = await get_state_changes(hass, entity_id, history_days) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/config/custom_components/optispark/history.py", line 212, in get_state_changes state_changes = await get_instance(hass).async_add_executor_job( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/concurrent/futures/thread.py", line 58, in run result = self.fn(*self.args, **self.kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/recorder/history/init.py", line 174, in state_changes_during_period return _target( ^^^^^^^^ File "/usr/src/homeassistant/homeassistant/components/recorder/history/modern.py", line 373, in state_changes_during_period raise ValueError("entity_id must be provided") ValueError: entity_id must be provided