Use asyncio Lock for fibaro light#18622
Conversation
pvizeli
left a comment
There was a problem hiding this comment.
Do you sure that you need a lock? Because home assistant calls none async things sequential.
MartinHjelmare
left a comment
There was a problem hiding this comment.
Turn off still has the old handling of the lock.
|
@pvizeli: The issue is that there's a thread for receiving updates from the fibaro hub, which then requests an update on the light. In the turn_on function there are (in case of switched off color lights) two calls out to fibaro hub, setting the color and switching it on. They trigger updates, and I'd have the update function called on a thread while turn_on is still being processed. So there is a race condition, which could have some side effects, unless handled. Maybe its a small thing, and it might not cause a crash, but could introduce a level of unpredictability as both functions are working on the same variables. |
Turned the turn_off into async as well
My local flake8 lies to me. Not cool.
|
Dear Reviewers, Can this be merged or is there something else that needs to be done? Cheers, |
* Use asyncio Lock for fibaro light * line length and empty line at end * async turn_off Turned the turn_off into async as well * bless you, blank lines... My local flake8 lies to me. Not cool.
Description:
Changes Fibaro light turn_on and update functions into async versions, getting rid of a blocking lock by switching to async locks. Big thanks to @amelchio.
Related issue (if applicable): fixes #
Pull request in home-assistant.io with documentation (if applicable): home-assistant/home-assistant.io#<home-assistant.io PR number goes here>
Example entry for
configuration.yaml(if applicable):Checklist:
tox. Your PR cannot be merged unless tests passIf user exposed functionality or configuration variables are added/changed:
If the code communicates with devices, web services, or third-party tools:
REQUIREMENTSvariable (example).requirements_all.txtby runningscript/gen_requirements_all.py..coveragerc.If the code does not interact with devices: