Commit Graph

2367 Commits (470d121f5ceb9fa232a88aaba0829e88dfd14770)

Author SHA1 Message Date
J. Nick Koston 78bb6dbe75
Reduce latency in storage by making the tasks eager ()
* Reduce latancy to load storage by making the task eager

This changes the semantics a bit under the hood because it
can raise sooner which means we do not store the task
as _load_task if it raises right away. That means
concurrent calls that result in failure are likely to try
again now which will be a tiny performance hit for this
case.

* fix

* will now finish in time
2024-02-27 23:27:37 -05:00
Jan-Philipp Benecke 4e4345f04e
Drop `@bind_hass` use from hassio component ()
* Drop `@bind_hass` use from hassio component

* Add comment why we import locally

---------

Co-authored-by: J. Nick Koston <nick@koston.org>
2024-02-28 00:25:46 +01:00
Jan-Philipp Benecke c8b7f098e5
Avoid call to `hass.helpers.store` in FloorRegistry ()
* Avoid call to `hass.helpers.store` in FloorRegistry

* Change type annotation
2024-02-27 23:03:28 +01:00
J. Nick Koston a6f4f6eae8
Use eager task creation to add entities to entity platform () 2024-02-27 09:54:51 -10:00
Jan-Philipp Benecke 070b411820
Avoid call to `hass.helpers.store` in LabelRegistry ()
* Avoid call to `hass.helpers.store` in LabelRegistry

* Change type annotation
2024-02-27 09:37:45 -05:00
J. Nick Koston 08e0008d31
Use an eager task to setup entity platforms ()
* Use an eager task to setup entity platforms

Ideally we would have awaited this function instead, but we want
to shield it from cancellation so we wrap it in asyncio.shield
which schedules it as a task. Since we have integrations that
never suspend in async_setup_entry, we can avoid scheduling on
the evnet loop with an eager task for this case

* its an executor future

* its an executor future

* fix

* doc string lied
2024-02-27 08:45:45 -05:00
J. Nick Koston ce0fb1e716
Fully fix race in removing entities ()
Full fix race in removing entities

Followup to  now that we can start the task
eagerly it completely closes the race window
2024-02-26 23:55:15 -05:00
J. Nick Koston d5e1934942
Use an eager task in the update coordinator scheduled refresh ()
* Use an eager task in the update coordinator scheduled refresh

We have a lot of places that will not suspend because the refresh function
decides it does not need to update. Currently these have to be scheduled
on the event loop even though they are a noop.

Since _handle_refresh_interval is subclassed in some integrations, I created
a dunder wrapper function to avoid integraions subclassing it

* fix time fires outside of patch
2024-02-26 23:31:08 -05:00
J. Nick Koston f56e4d6a09
Use eager task creation for entity platform polling ()
* Use eager task creation for entity platform polling

We have lots of places where `async_update` does not suspend and
is only a coro because its required to be a coro to run in the
event loop

* try again
2024-02-26 23:16:39 -05:00
J. Nick Koston fb4e8a4f3b
Start the debouncer task eagerly () 2024-02-26 16:29:46 -10:00
J. Nick Koston ae2ce99cbd
Create tasks eagerly in the discovery flow helper ()
The likely outcome from most discoveries is an near immediate abort
so we run them eagerly to avoid having to schedule on the event loop
for the common case
2024-02-26 20:52:04 -05:00
J. Nick Koston b75277cc24
Use an eager task to update multiple entities ()
If there are multiple entities on the same platform its likely
that only one of them will suspend in the update so schedule
them eagerly
2024-02-26 20:49:09 -05:00
J. Nick Koston dd80157dc7
Load translations at setup time if they were not loaded at bootstrap () 2024-02-24 11:31:25 -10:00
J. Nick Koston 5b8591ec7e
Avoid reschedule churn in Storage.async_delay_save ()
* Avoid circular import in Storage.async_delay_save

We call Storage.async_delay_save for every entity being added or removed
from the registry. The late import took more time than everything else
in the function.

* Avoid reschedule churn in Storage.async_delay_save

When we are adding or removing entities we will call async_delay_save
quite often which has to add and remove a TimerHandle on the event loop
which can add up when there are a lot of registry items changing.

If the timer handle still has 80% of the time remaining on it
we will avoid resceduling and let it fire at the time the
original async_delay_save call was made. This ensures we
do not force the event loop to rebuild its heapq because
too many timer handlers were cancelled at once

* div0

* add coverage for 0 since we had none

* fix bad conflict

* tweaks

* tweaks

* tweaks

* tweaks

* tweaks

* tweaks

* more test fixes

* mqtt tests rely on event loop overhead
2024-02-24 08:46:00 +01:00
J. Nick Koston ff0e0b3e77
Convert debouncer async_shutdown to be a normal function ()
* Convert debouncer async_shutdown to be a normal function

nothing was being awaited here and the shutdown call was only used
in integrations marked internal and other internals. Its possible
that a custom component might have been using the method but it
seemed uncommon enough that it did not warrent marking as a breaking
change. The update coordinator is no longer awaiting anything in
async_shutdown either now but it seemed likely that this use
would get subclassed.

* fix
2024-02-24 08:37:33 +01:00
J. Nick Koston d9addc45f9
Avoid scheduling a task to add each entity when not using update_before_add ()
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
2024-02-23 10:49:26 -10:00
J. Nick Koston 125de17a09
Avoid linear search to remove from the entity registry index ()
Avoid linear search to remove from entity registry index

Because the entity registry index needs to preserve insertion order
for backwards compat, a list was used for the index. Because some
config entries/devices/areas have a large amount of entities, removing
the entities, the O(n) time complexity of removing from a list can
slow down reloads. As python has no orderedset in stdlib, use
a dict since it preserves insertion order has O(1) add/remove
time complexity for the average case
2024-02-23 13:57:59 -05:00
J. Nick Koston b5a2df1951
Refactor keyed event trackers to reduce future refactoring risk ()
* Refactor keyed event trackers to avoid refactoring risk

Follow to https://github.com/home-assistant/core/pull/110978#discussion_r1496771106

I had to do some type ignores because of the EventType vs Event
which is hopefully not going to be needed after the next mypy

* delete constants only used one in other const

* no field

* fixes

* less refactoring later

* less refactoring later

* keep const
2024-02-23 13:55:02 -05:00
J. Nick Koston 5e16602595
Refactor storage collections to reduce tasks during startup ()
* Make adding entities in storage collection a normal function

Nothing is awaited when adding

* cleanup

* cleanup

* cleanup

* cleanup

* reduce

* reduce

* reduce

* reduce

* tweak
2024-02-23 13:50:25 -05:00
J. Nick Koston 3877a56d23
Avoid creating tasks for automation and script validation ()
These functions created tasks to run small validators, and the cost of
creating all the tasks was more expensive than running the validators
themselves. Since the code is unlikely to suspend its more efficient to
await them in series.
2024-02-23 13:41:36 -05:00
Joost Lekkerkerker 730d805876
Enable SIM114 ruff rule () 2024-02-23 13:21:59 +01:00
J. Nick Koston 5bf8086a2b
Cache formatting of mac addresses () 2024-02-22 07:09:56 -10:00
J. Nick Koston 1de83140ab
Avoid circular import in Storage.async_delay_save () 2024-02-21 12:45:59 -06:00
J. Nick Koston 7bf0fb9e48
Avoid late import of area registry in device registry if its not used () 2024-02-21 12:45:00 -06:00
J. Nick Koston 776a9b8691
Make device registry cleanup a callback function ()
* Add async_schedule_call to the Debouncer

async_schedule_call allows the Debouncer to schedule a call
from a callback without having to create tasks to run
async_call

* Update homeassistant/helpers/debounce.py

* Make device registry cleanup all callback function

* fix typing, code supported callback functions, but typing did not

* fixes

* fixes

* fix

* we had no coverage for other job types

* we had no coverage for other job types
2024-02-21 09:34:49 +01:00
J. Nick Koston 5b73adba20
Revert "Reduce dict lookups in entity registry indices" ()
Revert "Reduce dict lookups in entity registry indices ()"

This reverts commit 440212ddce.
2024-02-21 07:11:58 +01:00
J. Nick Koston 490c03d248
Add async_schedule_call to the Debouncer () 2024-02-21 00:09:45 -06:00
J. Nick Koston 1a02330bd9
Avoid creating tasks to remove entities () 2024-02-20 21:32:36 -06:00
J. Nick Koston 9ce1ec414e
Reduce overhead to load multiple languages in translations ()
* Reduce overhead to load multiple languages in translations

Instead of loading in a task, we now group everything
to be loaded into a single executor job

* fixes

* fixes

* fixes

* fixes

* fixes

* update tests

* add missing coverage (was existing)
2024-02-20 21:52:28 -05:00
J. Nick Koston 9c145b5faa
Fix race in removing entities from the registry () 2024-02-20 20:48:31 -06:00
J. Nick Koston dc4008c518
Avoid creating tasks to shutdown entity platforms ()
* Avoid creating tasks to shutdown entity platforms

Nothing needed to be awaited here

* fix mocking

* missed one test
2024-02-20 21:10:25 -05:00
Michael Hansen ec4bd9a421
Add new intents for cover, valve, vacuum, and media player ()
* Add valve to HassTurnOn/Off

* Add set position for valves

* Add set position to covers

* Add HassTurnOn/Off for vacuums

* Add media player intents

* Split out vacuum intents

* Address comments

* Extra test
2024-02-19 22:28:42 -05:00
Franck Nijhof e0a9dcd996
Add label registry () 2024-02-19 11:59:08 +01:00
J. Nick Koston c74958dd36
Reduce one iteration of pending flows in the discovery flow helper () 2024-02-19 09:57:39 +01:00
Marc Mueller 72ccc40c43
Add better HassJob typing for IntegrationPlatform process_job () 2024-02-18 16:46:48 -06:00
Franck Nijhof 67ac60d042
Add hex color validator () 2024-02-18 16:03:21 +01:00
Franck Nijhof 70d1bbb20d
Improve floor registry event typing () 2024-02-18 14:57:15 +01:00
J. Nick Koston 16653ff5d0
Group loading of translations for integrations to reduce executor jobs at startup () 2024-02-17 21:08:55 -06:00
J. Nick Koston 9bc130c131
Ensure translations for other integrations can be loaded if one integration fails ()
* load failure

* merge
2024-02-17 21:01:36 -05:00
J. Nick Koston 0d4c82b54d
Convert Integration platforms processors where nothing is awaited to callbacks ()
Convert Integration platforms processors where nothing is awaited callbacks
2024-02-17 20:49:47 -05:00
J. Nick Koston 165d79b553
Add typing of EVENT_COMPONENT_LOADED to integration_platform helper () 2024-02-17 20:48:46 -05:00
J. Nick Koston 33ff6b5b6e
Avoid creating tasks for checking integrations platforms ()
* Avoid creating tasks for checking integrations platforms

This is a followup to  to avoid creating a task to check
if the integration platform exists. We created tasks because
we needed to await async_get_integrations but since its always
called from EVENT_COMPONENT_LOADED firing, we can use the
async_get_loaded_integration version which does not need
to be awaited. This eliminates one task for every loaded
component

* there is no more race risk

* reduce

* coro or callback

* reduce

* tweak

* race safe

* fix type

* fixes

* use built-in helper to make it smaller

* use built-in helper to make it smaller

* use built-in helper to make it smaller

* add coverage to ensure exceptions are logged

* improve readability a bit

* platforms
2024-02-18 01:07:18 +01:00
Franck Nijhof 4570eed6f6
Add floor registry ()
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
2024-02-17 21:21:15 +01:00
J. Nick Koston 664285b9d4
Small performance improvement in tracking template results ()
- Avoid inner function creation each refresh
- remove extra unneeded checks from ratelimit
2024-02-17 18:08:24 +01:00
J. Nick Koston 42cf081582
Avoid creating tasks to load integration platforms that do not exist () 2024-02-17 07:02:51 -06:00
J. Nick Koston 2cb0249f0a
Add filter to translation event listeners to avoid creating tasks () 2024-02-16 12:13:23 -06:00
J. Nick Koston 53062a81cc
Simplify loading of icons () 2024-02-16 16:51:14 +01:00
G Johansson cb776593cf
Make context in data entry flow possible to modify for subclasses ()
* Make context in data entry flow possible to modify for subclasses

* mypy

* Make get_context

* base view

* Review comments

* Remove context from options flow
2024-02-16 15:51:51 +01:00
J. Nick Koston dd1cf2c593
Remove unneeded list copy in icon helper () 2024-02-15 16:33:24 -06:00
deosrc e38cb01d81
Add missing log message for error resolving OAuth token () 2024-02-11 13:07:54 +00:00