* Initial orjson support take 2
Still need to work out problem building wheels
--
Redux of #72754 / #32153 Now possible since the following is solved:
ijl/orjson#220 (comment)
This implements orjson where we use our default encoder. This does not implement orjson where `ExtendedJSONEncoder` is used as these areas tend to be called far less frequently. If its desired, this could be done in a followup, but it seemed like a case of diminishing returns (except maybe for large diagnostics files, or traces, but those are not expected to be downloaded frequently).
Areas where this makes a perceptible difference:
- Anything that subscribes to entities (Initial subscribe_entities payload)
- Initial download of registries on first connection / restore
- History queries
- Saving states to the database
- Large logbook queries
- Anything that subscribes to events (appdaemon)
Cavets:
orjson supports serializing dataclasses natively (and much faster) which
eliminates the need to implement `as_dict` in many places
when the data is already in a dataclass. This works
well as long as all the data in the dataclass can also
be serialized. I audited all places where we have an `as_dict`
for a dataclass and found only backups needs to be adjusted (support for `Path` needed to be added for backups). I was a little bit worried about `SensorExtraStoredData` with `Decimal` but it all seems to work out from since it converts it before it gets to the json encoding cc @dgomes
If it turns out to be a problem we can disable this
with option |= [orjson.OPT_PASSTHROUGH_DATACLASS](https://github.com/ijl/orjson#opt_passthrough_dataclass) and it
will fallback to `as_dict`
Its quite impressive for history queries
<img width="1271" alt="Screen_Shot_2022-05-30_at_23_46_30" src="https://user-images.githubusercontent.com/663432/171145699-661ad9db-d91d-4b2d-9c1a-9d7866c03a73.png">
* use for views as well
* handle UnicodeEncodeError
* tweak
* DRY
* DRY
* not needed
* fix tests
* Update tests/components/http/test_view.py
* Update tests/components/http/test_view.py
* black
* templates
* Update the nest integration to be useable fully from the config flow
* Support discovery in nest config flow
* Remove configuration entries
* Remove unused import
* Remove dead code
* Update homeassistant/components/nest/strings.json
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Remove commented out code
* Use config flow for app auth reauthentication path
* Improves for re-auth for upgrading existing project and creds
* More dead code removal
* Apply suggestions from code review
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Remove outdated code
* Update homeassistant/components/nest/config_flow.py
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Reduce overhead to refire events
- asyncio timers can fire early for a varity of reasons including
poor clock resolution and performance. To solve this problem
we re-arm async_track_point_in_utc_time and try again later
when this happens.
- On some platforms this means the async_track_point_in_utc_time can
end up trying many times to prevent firing the timer early since as
soon as it rearms it fires again and this repeats until we reach
the appointed time. While there is not much we can do to prevent
asyncio from firing the timer callback early, we can reduce the
overhead when this happens by using avoiding creating datetime
objects
* tweak mocking
* -vvv
* fix time freeze being too broad in litterrobot
* adjust
* Refactor template entity to allow reuse
* Fix schema and default name
* Add tests
* Update requirements
* Improve test
* Tweak TemplateSensor initializer
* Drop attributes and availability from TemplateEntity
* Use rest sensor for proof of concept
* Revert changes in SNMP sensor
* Don't set _attr_should_poll in mixin class
* Update requirements
* Remove async_remove_listener
This avoids the ambuigity as to what happens if same callback is added multiple times.
* Keep track of a context for each listener
This allow a update coordinator to adapt what data to request on update from the backing service based on which entities are enabled.
* Clone list before calling callbacks
The callbacks can end up unregistering and modifying the dict while iterating.
* Only yield actual values
* Add a test for update context
* Factor out iteration of _listeners to helper
* Verify context is passed to coordinator
* Switch to Any as type instead of object
* Remove function which use was dropped earliers
The use was removed in 8bee25c938
* Add return code to integration application credentials in config flow
* Update google tests to use new return code
* Update spotify test for no auth configured
* Add translation for oauth2_missing_credentials
* Add new return code to yolink
* Update homeassistant/strings.json
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Franck Nijhof <frenck@frenck.nl>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Initial developer credentials scaffolding
- Support websocket list/add/delete
- Add developer credentials protocol from yaml config
- Handle OAuth credential registration and de-registration
- Tests for websocket and integration based registration
* Fix pydoc text
* Remove translations and update owners
* Update homeassistant/components/developer_credentials/__init__.py
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
* Update homeassistant/components/developer_credentials/__init__.py
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
* Remove _async_get_developer_credential
* Rename to application credentials platform
* Fix race condition and add import support
* Increase code coverage (92%)
* Increase test coverage 93%
* Increase test coverage (94%)
* Increase test coverage (97%)
* Increase test covearge (98%)
* Increase test coverage (99%)
* Increase test coverage (100%)
* Remove http router frozen comment
* Remove auth domain override on import
* Remove debug statement
* Don't import the same client id multiple times
* Add auth dependency for local oauth implementation
* Revert older oauth2 changes from merge
* Update homeassistant/components/application_credentials/__init__.py
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Move config credential import to its own fixture
* Override the mock_application_credentials_integration fixture instead per test
* Update application credentials
* Add dictionary typing
* Use f-strings as per feedback
* Add additional structure needed for an MVP application credential
Add additional structure needed for an MVP, including a target
component Xbox
* Add websocket to list supported integrations for frontend selector
* Application credentials config
* Import xbox credentials
* Remove unnecessary async calls
* Update script/hassfest/application_credentials.py
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Update script/hassfest/application_credentials.py
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Update script/hassfest/application_credentials.py
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Update script/hassfest/application_credentials.py
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Import credentials with a fixed auth domain
Resolve an issue with compatibility of exisiting config entries when importing
client credentials
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* feat: make this variable available in template entities
This makes the variable `this` available in template entities.
It will simplify the use of self-referencing template entities.
Because, without this, we have to repeat the entity id every time.
If we can solve this without explicitly spelling the entity id,
code can be re-used much better.
As a side-effect, this will allow to use `variables`-like patterns,
where attributes can be used as variables to calculate subsequent attributes or state.
Example:
```yaml
template:
sensor:
- name: test
state: "{{ this.attributes.test }}"
# not: "{{ state_attr('sensor.test', 'test' }}"
attributes:
test: "{{ now() }}"
```
* expose entity_id instead of this
* add test
* Refactor to expose this variable
* Tweak repr dunder
Co-authored-by: Erik <erik@montnemery.com>
* Add entity registry helper to migrate entity to new platform
* Add additional assertion
* Add more properties to migration logic
* Change logic after thinking about erik's comments
* Require new_config_entry_id if entry.config_entry_id is not None
* Create private async_update_entity function that all update functions use
* Don't have special handling for entity ID missing in async_update_entity_platform
* fix docstring
* rebase off current
* rearrange
* Overload selector function
* Update/fix all selector references
* better typing?
* remove extra option
* move things around
* Switch to Sequence type to avoid ignoring mypy error
* Get rid of ...'s
* Improve typing to reduce number of ignores
* Remove all typing ignores
* Make config optional for selectors that don't need a config
* add missing unit prefixes
* Rename TypedDicts
* Update homeassistant/helpers/selector.py
Co-authored-by: Erik Montnemery <erik@montnemery.com>
* review feedback
* remove peta from integration integration
* Fix min_max
* Revert change to selector function
* Fix logic
* Add typing for selector classes
* Update selector.py
* Fix indent
Co-authored-by: Erik Montnemery <erik@montnemery.com>
* Add support for new select selector properties
* fix mode option
* Apply suggestions from code review
* Correct validation for empty options, update tests
Co-authored-by: Erik Montnemery <erik@montnemery.com>
* Fix notify discovery setup
* add test
* unsubscribe at reset
* Add guard
* move dispatcher to reload module
* only unsubscribe if platform was setup
* initialize dispatcher once and tests
* test get_service too
* add tests
* fix test
* use get_service for test invalid platform
* Test built-in reload method
* set to None after clearing dispatcher - tests
* Pathing services file
* Update tests/components/notify/test_init.py
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* dispatcher is not set twice if integration loaded
* empty discovery payload
* Removed not needed services.yaml mock
* Update tests/components/notify/test_init.py
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* flake8
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Optionally don't convert output of duration and time selectors
* Allow number selector selection to be None
* Never convert output of duration and time selectors
* Revert "Allow number selector selection to be None"
This reverts commit b6f52c1e83.
* Align selectors with frontend updates
* Drop metadata from MediaSelector selection
* Adjust blueprint tests
* Address review comments
* Add tests for new selectors
* Don't stringify input
* Require min+max for number selector in slider mode
* vol.Schema does not like static methods
* Tweak
* Small performance tweaks to _async_write_ha_state
- Only call self.available once per cycle
- Only call self.device_state_attributes once per update cycle
- Do not check for device_state_attributes if extra_state_attributes is not None
* drop backcompat
* remove prop
* Add options flow support to HelperConfigFlowHandler
* Add config flow for cover, fan, light and media_player groups
* Update according to review comments
* Update translation strings
* Update translation strings
* Copy schema before adding suggested values
* Add config flow for switch.light
* Refactor according to code review
* Setup light switch from config entry
* Improve async_resolve_entity
* Prepare for multiple steps
* Remove name and options flow from switch light
* Check type before adding description to schema keys
* Remove options flow enabler
* Copy name from the switch
* Move helper flows to new file
* Improve test coverage
* Fix name
* Remove dead code from abstract method
* Remove manifest 'helper' option
* Validate registry entry id before forwarding to light platform
* Improve test
* Add translations
* Improve config entry setup
* Log when config entry fails setup
* Update homeassistant/components/switch/__init__.py
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
Co-authored-by: Paulus Schoutsen <balloob@gmail.com>
* Allow area, device, and entity selectors to optionally support multiple selections like target selector
* Update according to code review comments
* Adjust tests
* Update according to review comments
* Tweak error message for multiple entities
Co-authored-by: Erik <erik@montnemery.com>
* Remove entities when config entry is removed from device
* Update tests/helpers/test_entity_registry.py
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Don't remove entities not connected to a config entry
* Update homeassistant/helpers/entity_registry.py
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
Co-authored-by: Franck Nijhof <git@frenck.dev>
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
* Adjust base helper
* Filter type is not None in mailbox
* Filter empty platforms in device_tracker
* Filter out empty platform in notify
* Filter out empty platform in entity_component
Co-authored-by: epenet <epenet@users.noreply.github.com>