* Make aiolifx modules easily available
* Use aiolifx features_map for deciding bulb features
Also move the feature detection out of Light so it is available even
during the initial detection.
* Move each LIFX light type to a separate class
* Simplify AwaitAioLIFX
This has become possible with recent aiolifx that calls the callback even
when a message is lost.
Now the wrapper can be used also before a Light is added though the register
callback then has to become a coroutine.
* Refactor send_color
* Add support for multizone
This lets lifx_set_state work on individual zones.
Also update to aiolifx_effects 0.1.1 that restores the state for individual
zones.
The default aiolifx timers are tuned for a network with few lost packets.
This means that lights can become "unavailable" from just a two second
dropout. An unavailable light is completely useless for HA until it is
rediscovered so this is an undesirable state to be in.
These tweaks make aiolifx try harder to get its messages through to the
bulbs, at the cost of some latency in detecting lights that actually are
unavailable.
bellows 0.3.0 changes the API to have both, renaming the attribute which used
to be for input clusters in the process.
This is in preparation for remotes.
The upstream Avion and Decora code has changed to punt retry logic out to
consumers, so update to match. As a bonus, Avion also gains support for
pulling switch configuration off the web rather than requiring manual
configuration.
* LIFX: Move light effects to external library
This moves the LIFX light effects to the external library aiolifx_effects.
To get the light state synchronized between that library and HA, the LIFX
platform no longer maintains the light state itself. Instead, it uses the
cached state that aiolifx maintains.
The reorganization also includes the addition of a cleanup handler.
* Fix style
* Configurable fade-out behavior
Adds a per-group "fade" option with values of "out" (default) or "none".
By default, the lights are faded out when turned off, but this can cause usability issues when manually switching wall switches, since the bulbs turn back on at minimum brightness.
* Changed fade value from enum to boolean
* No need to fall back to default since voluptuous takes care of that.
* Fix lights issue #8098
* Don't check self._color to decide whether to calll get_color()
self._color is None on init, so get_color() will never be called.
* Use standard entity_ids for zwave entities
* Include temporary opt-in for new entity ids
* Update link to blog post
* Update tests
* Add old entity_id as state attribute
* Expose ZWave value details
* Update tests
* Also show new_entity_id
* Just can't win with this one
* blink: the existing 50/50 flashing between base color and effect color
* breathe: a lifx_effect_breathe replacement
* ping: mostly base color with a short flash at the end of the cycle
* strobe: dark base color and short cycles by default
* solid: temporary color change, base color never visible
Adding a service call for each mode is a bit extravagant so instead
lifx_effect_breathe has been folded in as an option and that service
call is deprecated.
* Add color_util.color_hsv_to_RGB
* Use helper functions for LIFX conversions
The LIFX API uses 16 bits for saturation/brightness while HA uses 8 bits.
Using helper functions makes the conversion a bit nicer and less prone
to off-by-one issues.
The colorsys library uses 0.0-1.0 but we can avoid that by using the HA
color_util converters instead.
* osram lightify removed duplicated set in case of brightness changes
* lightify component: anticipate brightness evaluation to handle unconsidered scenario described in the PR request comments (light turned on with color/temperature)
* Correction for travis ci error:
undefined name 'transition'
* Added effects to Yeelight bulbs
* Fix Typo and Use randint instead of randrange
* Added Effects
* updated requirements_all.txt
* fix empty line
* minor fixes
* fix passing effects as parameter
* starting light template component
* linting/flaking
* starting unit tests from copypasta
* working on unit testing
* forgot to commit the test
* wrapped up unit testing
* adding remote back
* updates post running tox
* Revert "adding remote back"
This reverts commit 852c87ff96.
* adding submodule back from origin
* updating submodule
* removing a line to commit
* re-adding line
* trying to update line endings
* trying to fix line endings
* trying a different approach
* making requested changes, need to fix tests
* flaking
* union rather than intersect; makes a big difference
* more tests passing, not sure why this one's failing
* got it working
* most of the requested changes
* hopefully done now
* sets; the more you know
The product type is already established in order to decide the Kelvin range
so just reuse that information to disable color features for white-only lights.
Also change the breathe/pulse effects to be more useful for white-only
bulbs. For consistency, color bulbs set to a desaturated (i.e. white-ish)
color get the same default treatment as white-only bulbs.
* Refactor color profiles to a class
* Refactor into preprocess_turn_on_alternatives
* LIFX: use light.preprocess_turn_on_alternatives
This avoids the color_name duplication and gains support for profile.
* Add kelvin parameter to light.turn_on
* Add brightness_pct parameter to light.turn_on
* LIFX: accept brightness_pct in effects
* Add test of kelvin/brightness_pct conversions
* Move service helpers to LifxManager
* Add lifx_set_color
This is a synonym for light.turn_on except it does not actually turn on the
light unless asked to.
Thus, turn_on can be implemented just by asking.
* Rename set_color to set_state
* Support power=False with lifx_set_state
* ps - do not install all dependencies
* Comment out blinkt because it depends on GPIO
* Add pip upgrade check back
* Disable import error blinkt
* Update comment
* Fix comment
The hue is now a float but the hsbk conversion still believed it to be
an integer that could not be larger than 359. The float can in fact be,
for example, 359.9 and this would cause an out-of-bounds error in the
set_color call.
For completeness, the initial hue is also changed to a float.
Recent aiolifx allow sending messages to unregistered devices (as a
no-op). This is handy because bulbs can disappear anytime we yield and
constantly testing for availability is both error-prone and annoying.
So keep the aiolifx device around until a new one registers on the same
mac_addr.
* Added osramlighrify groups.
Allows you to make use of the build in osram lightify groups. Group states get
handeled similar as in the case of phillips hue. A lightify group shows up as
light in the homeassistant webinterface. If one light of the
group is on, the complete group is considered to be on.
To use this feature, first define some groups within your lighrify bridge, then
set add `allow_lightify_groups=true` to you osramlightify config.
It might look like:
````yaml
- platform: osramlightify
host: IP-ADDRES
allow_lightify_groups: true
```
* Fixed Pylint errors.
* Included requests.
* Included more requests.
* Fixed setup bridge and removed _light attribute.
* Update osramlightify.py
Forcing a refresh will log a warning if the periodic async_update happens
to be running already.
So let's do the refresh locally and remove the force_refresh.
State restoration takes up to a second because bulbs can be slow to react.
During this time an effect could keep running, overwriting the state that we
were trying to restore.
Now the effect forgets the light immediately and it thus avoids further
changes while the restored state settles.
This clears the internal cache in case polling picked up the state as set by
an effect.
For example, aborting an effect by selecting a new brightness could keep a
color set by the effect.
This allows for more of a disco mode where lights change so fast that you
actually notice it.
Also change the valid period to the maximum 20 msgs/sec that LIFX bulbs
can handle.
First, move the default away from turn_on so we do not have to test for
the current service.
Next, change the default color away from random. The new default is that
saturated colors will flash white and desatured colors will flash to their
fully satured color. Always with full brightness.
After many experiments, this was the method that best produced results that
are both visually pleasing and always noticeable as a flash.
* light.sensehat: adding plugin to control the 8x8 LED matrix on a Sense Hat
* add new .coveragerc entry
* light.sensehat: formatting and removing unused import
* light.sensehat: add to requirements list
* light.sensehat: update docstrings to the linter's specs
* light.sensehat: add a bit more docstring
* Remove global limit on white light temperature
Here are the supported temperatures of some popular bulbs:
Philips Hue: 2000K-6500K (the current 500-154 mired range)
LIFX Color 1000: 2500K-9000K
IKEA TRÅDFRI: 2200K, 2700K, 4000K
Obviously, Home Assistant cannot enforce a global limit and work properly
with all of these bulbs. So just remove the limit and leave it up to each
platform to work it out.
This commit updates the existing users and adds a clamp to Hue (where the
limit appears to have originated). It does not attempt to update other
platforms that might need extra handling of the larger range that is now
possible.
* Add min_mireds/max_mireds state attributes to lights
* Support min_mireds/max_mireds with LIFX lights
This makes more sense because the input and output brightness is the same.
We currently convert through RGB which does contain a brightness so we supply
an arbitrary value as input and discard the output.
* Default to white when setting LIFX temperature
Changing the temperature of a saturated color is possible but not very
interesting. So assume that a change of the temperature implies setting
the color to white, unless a different color is actually specified.
This makes the frontend temperature picker much more useful because it can
now be used to get away from a colored light.
* Default to a neutral white temperature when setting LIFX colors
This means that setting a particular color will always give the same output,
no matter what the temperature was previously at.
* Find brightness after colors
Now the color_temp logic will not see a changed color when setting
temperature+brightness and thus we will actually get a white light in
this situation.
The XY conversion can then not use brightness as input. This is not
an issue because XY only affects hue and saturation, not brightness. So
we can just use an arbitrary value as brightness input.
* Add a simple comment to a complex conditional
* Add support for Zigbee Home Automation
* Fewer magic numbers
* Make optional device config work
* Remove non-zha device_tracker stuff
* Always return boolean from is_on
* Only pass through JSON serializable discovery_info
* Update to bellows 0.2.4
* Fewer magic numbers in binary sensor
* Populate const structures from a function
* Update bellows to 0.2.6
* Fewer magic numbers in light
* Take all possible clusters when overriding
* Update bellows to 0.2.7
* Added initial support for tradfri group control
* Tried to keep original variable structure
* pylint and pep8 fixes
* Fixed lint error about docstring
* Removed unneeded stuff, renamed _light. Needs to be released pytradfri version.
* Better naming of variables inside add_devices call.
* avion light: Bump python-avion dependency version
The dependencies in python-avion weren't sufficiently strict. This is now
fixed, but means we need to depend on a new version.
* decora light: Bump python-decora dependency
There's a new version of python-decora with a reliability fix, so depend on
that.
* Refactor into find_hsbk
This will be useful for new methods that also have to find passed in colors.
* Add AwaitAioLIFX
This encapsulates the callback and Event that aiolifx needs and thus avoids an
explosion of those when new calls are added.
The refresh_state is now generally useful, so move it into its own method.
* Initial effects support for LIFX
These effects are useful as notifications. They mimic the breathe and pulse
effects from the LIFX HTTP API:
https://api.developer.lifx.com/docs/breathe-effecthttps://api.developer.lifx.com/docs/pulse-effect
However, this implementation runs locally with the LIFX LAN protocol.
* Saturate LIFX no color value
Now the color is "full saturation, no brightness". This avoids a lot of
temporary white when fading from the "no color" value and into a real color.
* Organize LIFX effects in classes
This is to move the setup/restore away from the actual effect, making it quite
simple to add additional effects.
* Stop running LIFX effects on conflicting service calls
Turning the light on/off or starting a new effect will now stop the running
effect.
* Present default LIFX effects as light.turn_on effects
This makes the effects (with default parameters) easily accessible from
the UI.
* Add LIFX colorloop effect
This cycles the HSV colors, so that is added as an internal way to set a
color.
* Move lifx to its own package and split effects into a separate file
* Always show LIFX light name in logs
The name is actually the easiest way to identify a bulb so just using it
as a fallback was a bit odd.
* Compact effect getter
* Always use full brightness for random flash color
This is a stopgap. When a bit more infrastructure is in place, the intention
is to turn the current hue some degrees. This will guarantee a flash color
that is both unlike the current color and unlike white.
* Clear effects concurrently
We have to wait for the bulbs, so let us wait for all of them at once.
* Add lifx_effect_stop
The colorloop effect is most impressive if run on many lights. Testing
this has revealed the need for an easy way to stop effects on all lights
and return to the initial state of each bulb. This new call does just that.
Calling turn_on/turn_off could also stop the effect but that would not
restore the initial state.
* Always calculate the initial effect color
To fade nicely from power off, the breathe effect needs to keep an
unchanging hue. So give up on using a static start color and just find the
correct hue from the target color.
The colorloop effect can start from anything but we use a random color
just to keep things a little interesting during power on.
* Fix lint
* Update .coveragerc
* Fixes issue with id mismatch when multiple devices are connected to the lutron bridge
* Updates labels
* removes no longer needed config values.
* removes no longer needed imports
* Add support for tradfri color temp
* Only return rgb_color if supported features indicate support.
* Return color_temp if supported features indicate support and dict
with allowed color temperatures exist for manufacturer.
* Add manufacturer specific supported features, with default.
* Color temperature is set from a dict of allowed pairs per
manufacturer, where kelvin is mapped to hex_color. When a user sets a
color temperature, the closest matching temperature is selected and
set.
* Clean up
* Cache the name of LIFX lights
After #7031 the LIFX device will change during an unregister/register
transition. This has the user-visible effect of the new device missing
a friendly name until the next poll.
We now cache the name internally and it will then transfer to the new
device when it registers.
* Allow LIFX logging even without an available device
This will allow us to set the device to None when it unregisters.
* Calculate LIFX availability from the existence of a device
This has become possible because the device is no longer needed
to provide the name of the light when it is unavailable.
We just have to forget the device when it unregisters.
* Make Tradfri discoverable
* Fix lint errors
* Fix bugs and clean up calls to light_control
* Add more color util tests
* Add coap client to dockerfile
* After rebase and all fixes
* Added color_rgb_to_hex to util.color
* Added test_color_rgb_to_hex
* Changed reference to color_rgb_to_hex
* Bumped to pytradfri 0.5, having support for retry
* Bumped to pytradfri 0.5, having support for retry
* Bumped to pytradfri 0.5, having support for retry
* Bumped to pytradfri 0.5, having support for retry
* Rolled back to 0.4
* Rolled back to 0.4
* Added initial support for IKEA Tradfri Gateway
* Pinned requirement
* Fixed lint-errors
* Added file to .coveragerc
* Trying to fix commit
* Fixed requirements_all again
* Minor reorder of code
* Minor reorder of code
* Made the changes suggested by @balloob
* Made the changes suggested by @balloob and removed debug
* Update tradfri.py
* Plug file leak on LIFX unregister
The aiolifx 0.4.4 release closes its socket when the unregister callback is
called. This plugs a file descriptor leak but also means that we must be
careful to not use the device after it goes unavailable.
Also, when a light reappears, it has a new device that must be used.
* Do not test self.available in service calls
The core will learn to handle that.
* Fire EVENT_HOMEASSISTANT_START automations off right away while starting
* Actually have core state be set to 'starting' during boot
* Fix correct start implementation
* Test and deprecate event automation platform on start
* Fix doc strings
* Remove shutting down exception
* More strict when to mark an instance as finished
* Add automation platform to listen for start/shutdown
* When we stop we should wait till it's all done
* Fix testing
* Fix async bugs in tests
* Only set UVLOOP when hass starts from CLI
* This hangs normal asyncio event loop
* Clean up Z-Wave node entity test
* Add legacy LIFX platform for Windows support
The async platform introduced in 9ef084d903 has
turned out to use Python functionality that is not available in Windows.
This commit restores the previous implementation, now named lifx_legacy.
* Add a comment about the platform being a legacy implementation
* Warn when using unsupported lifx platform on Windows
* Update .coveragerc
* Add support for group commands (allon/alloff).
Add 'group_aliasses' config attribute that only respond to group commands.
Add nogroup_aliases that only respond to 'on' 'off' commands.
Allow settings device id group behaviour.
* Fix linting.
* Fix lint.
* yeelight: adjust supported features on update()
Earlier we checked for the type only during the initialization,
but this won't work when the bulb is disconnected during the init,
causing failures to adjust rgb&color temperature even if those should be supported.
fixes#6692
* Use reassign instead of OR for updating the supported features
* Add link to docs and remove comments which are obvious
* Update docstrings
* Repleace conf details with link to docs
* Add link to docs
* Update docstrings
* Update import
* Update ordering
* Update ordering
* Update docstring
* Update ordering
* Update ordering
Addressing #6382 . Feedback from github & forums is the bridge_led feature never worked and defining the bridge LED as another group+bulb type is the right way to do this in the limitlessled component.
* Adds support for the Lutron Caseta family of devices
* Added external requirement
* Removes unuse import
* Adds requirement to requirements_all.txt
* Removes unuse import
* fixes requirement_all.txt. by regenerating
* Cleans up syantax
* Cleans up syantax
* Cleans up syantax
* Cleans up syantax
* Shortens long line
* adds lutron_caseta component to .coveragerc
* Merges into light, removes component
* Fixes long lines
* Fixes requirement.txt
* Removes 'ERROR' log statements. Adds missing dependency
* savig work to pick up on other machine
* Enables Lutron Caseta component with Light and Switch platforms
* Add missing file to .coveragerc
* Changes based on PR review
* fixes requirements file
* Fixes install of paramiko dependency.
* Moves callback registration to
* comment changes
* Platform have no return value
* Change style for guard
* fix logic
* fix lint
* Fix LIFX unregister races
If the initial state request never got a response, we tried to unregister
a device that was not yet registered.
Also, aiolifx 0.4.2 has an "unregister" race fix.
* Update requirements
* added support for lights with toggle type
* fixed style errors
* introduced tests for the toggle type
it's not passing yet because of an assertionerror at line 407
* updated to reflect tristate of "state"
* Format code according to pep8
Added line break for import that was too long.
* fixed lint, replaced if statement with 'var = bool(test)'
* changed implementation of state check according to bug on 6bceb04ca1 (r106758784)
* Move LIFX to aiolifx for driving the bulbs
* Fix whitespace
* Fix more whitespace
* Fix lint
* Define _available in init
* Add @callback decorators
* Use hass.async_add_job
* Rename class
* Refactor zwave discovery to entity schema
* Address PR concerns
* Split DISCOVERY_SCHEMAS into separate file
* Only check cover reverse workaround once
* Fix colortemp conversion for osramlightify
Copied from the LIFX fix in 75df4be733.
* Fix style
* Updates from review
@armills:
While we're doing cleanup here, can you just change self._brightness,
self._rgb, self._name, self._temperature, and self._state assignments in
__init__ to None? These will get overwritten when self.update() is called, so
it's safer/cleaner to initialize them to None since it shouldn't matter if
everything is working.
This increases the global limit to 6535 seconds (1h48m55s) because that is
supported by all light platforms.
Some platforms support even longer transition times so the limit should
actually be platform specific.