mirror of
https://github.com/basnijholt/adaptive-lighting.git
synced 2026-09-27 20:34:20 +02:00
Compare commits
11 commits
main
...
new-servic
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5fdc911d30 | ||
|
|
295c0fa2c1 | ||
|
|
cfe565a8b2 | ||
|
|
01610a32a1 |
||
|
|
5f08706019 |
||
|
|
8dd1b5660e | ||
|
|
3b3f56f2d2 | ||
|
|
258964d97b | ||
|
|
5b6ad02e1d |
||
|
|
251babce9d | ||
|
|
d9cd74bef3 |
5 changed files with 299 additions and 63 deletions
25
README.md
25
README.md
|
|
@ -45,6 +45,7 @@ The `adaptive_lighting.manual_control` event is fired when a light is marked as
|
||||||
- [:memo: Options](#memo-options)
|
- [:memo: Options](#memo-options)
|
||||||
- [:hammer_and_wrench: Services](#hammer_and_wrench-services)
|
- [:hammer_and_wrench: Services](#hammer_and_wrench-services)
|
||||||
- [`adaptive_lighting.apply`](#adaptive_lightingapply)
|
- [`adaptive_lighting.apply`](#adaptive_lightingapply)
|
||||||
|
- [`adaptive_lighting.turn_on`, `adaptive_lighting.turn_off`, `adaptive_lighting.toggle`](#adaptive_lightingturn_on-adaptive_lightingturn_off-adaptive_lightingtoggle)
|
||||||
- [`adaptive_lighting.set_manual_control`](#adaptive_lightingset_manual_control)
|
- [`adaptive_lighting.set_manual_control`](#adaptive_lightingset_manual_control)
|
||||||
- [`adaptive_lighting.change_switch_settings`](#adaptive_lightingchange_switch_settings)
|
- [`adaptive_lighting.change_switch_settings`](#adaptive_lightingchange_switch_settings)
|
||||||
- [:robot: Automation examples](#robot-automation-examples)
|
- [:robot: Automation examples](#robot-automation-examples)
|
||||||
|
|
@ -176,6 +177,30 @@ adaptive_lighting:
|
||||||
| `turn_on_lights` | Whether to turn on lights that are currently off. 🔆 | ❌ | bool |
|
| `turn_on_lights` | Whether to turn on lights that are currently off. 🔆 | ❌ | bool |
|
||||||
|
|
||||||
<!-- END_OUTPUT -->
|
<!-- END_OUTPUT -->
|
||||||
|
|
||||||
|
|
||||||
|
#### `adaptive_lighting.turn_on`, `adaptive_lighting.turn_off`, `adaptive_lighting.toggle`
|
||||||
|
|
||||||
|
`adaptive_lighting.turn_on`, `adaptive_lighting.turn_off`, `adaptive_lighting.toggle` turn Adaptive Lighting on or off.
|
||||||
|
|
||||||
|
TODO: ...
|
||||||
|
|
||||||
|
<!-- START_CODE -->
|
||||||
|
<!-- from homeassistant.components.adaptive_lighting import _docs_helpers -->
|
||||||
|
<!-- print(_docs_helpers.generate_turn_on_markdown_table()) -->
|
||||||
|
<!-- END_CODE -->
|
||||||
|
|
||||||
|
<!-- START_OUTPUT -->
|
||||||
|
<!-- THIS CONTENT IS AUTOMATICALLY GENERATED -->
|
||||||
|
| Service data attribute | Description | Required | Type |
|
||||||
|
|:-------------------------|:--------------------------------------------------------------------------------------------------------------------------------|:-----------|:---------------------|
|
||||||
|
| `entity_id` | The `entity_id` of the switch with the settings to apply. 📝 | ✅ | list of `entity_id`s |
|
||||||
|
| `lights` | A light (or list of lights) to apply the settings to. 💡 | ❌ | list of `entity_id`s |
|
||||||
|
| `switch_type` | Which switch to target in this service call. Options: "main" (default, targets the main switch), "sleep", "brightness", "color" | ✅ | str |
|
||||||
|
|
||||||
|
<!-- END_OUTPUT -->
|
||||||
|
|
||||||
|
|
||||||
#### `adaptive_lighting.set_manual_control`
|
#### `adaptive_lighting.set_manual_control`
|
||||||
|
|
||||||
`adaptive_lighting.set_manual_control` can mark (or unmark) whether a light is "manually controlled", meaning that when a light has `manual_control`, the light is not adapted.
|
`adaptive_lighting.set_manual_control` can mark (or unmark) whether a light is "manually controlled", meaning that when a light has `manual_control`, the light is not adapted.
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ from .const import (
|
||||||
DOCS,
|
DOCS,
|
||||||
DOCS_APPLY,
|
DOCS_APPLY,
|
||||||
DOCS_MANUAL_CONTROL,
|
DOCS_MANUAL_CONTROL,
|
||||||
|
SERVICE_TOGGLE_SCHEMA,
|
||||||
SET_MANUAL_CONTROL_SCHEMA,
|
SET_MANUAL_CONTROL_SCHEMA,
|
||||||
VALIDATION_TUPLES,
|
VALIDATION_TUPLES,
|
||||||
apply_service_schema,
|
apply_service_schema,
|
||||||
|
|
@ -41,6 +42,8 @@ def _type_to_str(type_: Any) -> str:
|
||||||
"""Convert a (voluptuous) type to a string."""
|
"""Convert a (voluptuous) type to a string."""
|
||||||
if type_ == cv.entity_ids:
|
if type_ == cv.entity_ids:
|
||||||
return "list of `entity_id`s"
|
return "list of `entity_id`s"
|
||||||
|
elif type_ == cv.string:
|
||||||
|
return "str"
|
||||||
elif type_ in (bool, int, float, str):
|
elif type_ in (bool, int, float, str):
|
||||||
return f"`{type_.__name__}`"
|
return f"`{type_.__name__}`"
|
||||||
elif type_ == cv.boolean:
|
elif type_ == cv.boolean:
|
||||||
|
|
@ -110,6 +113,10 @@ def generate_apply_markdown_table():
|
||||||
return _generate_service_markdown_table(apply_service_schema(), DOCS_APPLY)
|
return _generate_service_markdown_table(apply_service_schema(), DOCS_APPLY)
|
||||||
|
|
||||||
|
|
||||||
|
def generate_turn_on_markdown_table():
|
||||||
|
return _generate_service_markdown_table(SERVICE_TOGGLE_SCHEMA, DOCS_APPLY)
|
||||||
|
|
||||||
|
|
||||||
def generate_set_manual_control_markdown_table():
|
def generate_set_manual_control_markdown_table():
|
||||||
return _generate_service_markdown_table(
|
return _generate_service_markdown_table(
|
||||||
SET_MANUAL_CONTROL_SCHEMA, DOCS_MANUAL_CONTROL
|
SET_MANUAL_CONTROL_SCHEMA, DOCS_MANUAL_CONTROL
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,12 @@
|
||||||
"""Constants for the Adaptive Lighting integration."""
|
"""Constants for the Adaptive Lighting integration."""
|
||||||
|
|
||||||
from homeassistant.components.light import VALID_TRANSITION
|
from homeassistant.components.light import VALID_TRANSITION
|
||||||
from homeassistant.const import CONF_ENTITY_ID
|
from homeassistant.const import (
|
||||||
|
CONF_ENTITY_ID,
|
||||||
|
SERVICE_TOGGLE,
|
||||||
|
SERVICE_TURN_OFF,
|
||||||
|
SERVICE_TURN_ON,
|
||||||
|
)
|
||||||
from homeassistant.helpers import selector
|
from homeassistant.helpers import selector
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
@ -201,6 +206,19 @@ DOCS[CONF_USE_DEFAULTS] = (
|
||||||
'documented defaults), or "configuration" (reverts to switch config defaults). ⚙️'
|
'documented defaults), or "configuration" (reverts to switch config defaults). ⚙️'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
CONF_WHICH_SWITCH, DEFAULT_WHICH_SWITCH = "switch_type", "main"
|
||||||
|
DOCS[CONF_WHICH_SWITCH] = (
|
||||||
|
"Which switch to target in this service call. Options: "
|
||||||
|
'"main" (default, targets the main switch), "sleep", "brightness", "color"'
|
||||||
|
)
|
||||||
|
DOCS[SERVICE_TURN_ON] = (
|
||||||
|
"Turn on an Adaptive Lighting" " main/sleep/brightness/color switch"
|
||||||
|
)
|
||||||
|
DOCS[SERVICE_TURN_OFF] = (
|
||||||
|
"Turn off an Adaptive Lighting" " main/sleep/brightness/color switch"
|
||||||
|
)
|
||||||
|
DOCS[SERVICE_TOGGLE] = "Toggle an Adaptive Lighting main/sleep/brightness/color switch"
|
||||||
|
|
||||||
TURNING_OFF_DELAY = 5
|
TURNING_OFF_DELAY = 5
|
||||||
|
|
||||||
DOCS_MANUAL_CONTROL = {
|
DOCS_MANUAL_CONTROL = {
|
||||||
|
|
@ -341,6 +359,14 @@ def apply_service_schema(initial_transition: int = 1):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
SERVICE_TOGGLE_SCHEMA = vol.Schema(
|
||||||
|
{
|
||||||
|
vol.Optional(CONF_ENTITY_ID): cv.entity_ids,
|
||||||
|
vol.Optional(CONF_LIGHTS, default=[]): cv.entity_ids,
|
||||||
|
vol.Optional(CONF_WHICH_SWITCH): cv.string,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
SET_MANUAL_CONTROL_SCHEMA = vol.Schema(
|
SET_MANUAL_CONTROL_SCHEMA = vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Optional(CONF_ENTITY_ID): cv.entity_ids,
|
vol.Optional(CONF_ENTITY_ID): cv.entity_ids,
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,7 @@ from homeassistant.const import (
|
||||||
EVENT_CALL_SERVICE,
|
EVENT_CALL_SERVICE,
|
||||||
EVENT_HOMEASSISTANT_STARTED,
|
EVENT_HOMEASSISTANT_STARTED,
|
||||||
EVENT_STATE_CHANGED,
|
EVENT_STATE_CHANGED,
|
||||||
|
SERVICE_TOGGLE,
|
||||||
SERVICE_TURN_OFF,
|
SERVICE_TURN_OFF,
|
||||||
SERVICE_TURN_ON,
|
SERVICE_TURN_ON,
|
||||||
STATE_OFF,
|
STATE_OFF,
|
||||||
|
|
@ -74,6 +75,7 @@ from homeassistant.core import (
|
||||||
HomeAssistant,
|
HomeAssistant,
|
||||||
ServiceCall,
|
ServiceCall,
|
||||||
State,
|
State,
|
||||||
|
async_get_hass,
|
||||||
callback,
|
callback,
|
||||||
)
|
)
|
||||||
from homeassistant.helpers import entity_platform, entity_registry
|
from homeassistant.helpers import entity_platform, entity_registry
|
||||||
|
|
@ -134,6 +136,7 @@ from .const import (
|
||||||
CONF_TRANSITION,
|
CONF_TRANSITION,
|
||||||
CONF_TURN_ON_LIGHTS,
|
CONF_TURN_ON_LIGHTS,
|
||||||
CONF_USE_DEFAULTS,
|
CONF_USE_DEFAULTS,
|
||||||
|
CONF_WHICH_SWITCH,
|
||||||
CONST_COLOR,
|
CONST_COLOR,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
EXTRA_VALIDATION,
|
EXTRA_VALIDATION,
|
||||||
|
|
@ -144,6 +147,7 @@ from .const import (
|
||||||
SERVICE_APPLY,
|
SERVICE_APPLY,
|
||||||
SERVICE_CHANGE_SWITCH_SETTINGS,
|
SERVICE_CHANGE_SWITCH_SETTINGS,
|
||||||
SERVICE_SET_MANUAL_CONTROL,
|
SERVICE_SET_MANUAL_CONTROL,
|
||||||
|
SERVICE_TOGGLE_SCHEMA,
|
||||||
SET_MANUAL_CONTROL_SCHEMA,
|
SET_MANUAL_CONTROL_SCHEMA,
|
||||||
SLEEP_MODE_SWITCH,
|
SLEEP_MODE_SWITCH,
|
||||||
SUN_EVENT_MIDNIGHT,
|
SUN_EVENT_MIDNIGHT,
|
||||||
|
|
@ -429,6 +433,139 @@ async def handle_change_switch_settings(
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@callback
|
||||||
|
async def handle_turn_on(service_call: ServiceCall):
|
||||||
|
"""Toggles the specified switch."""
|
||||||
|
hass = async_get_hass()
|
||||||
|
data = service_call.data
|
||||||
|
_LOGGER.debug(
|
||||||
|
"Called 'adaptive_lighting.turn_on' service with '%s'",
|
||||||
|
data,
|
||||||
|
)
|
||||||
|
switches = _get_switches_from_service_call(hass, service_call)
|
||||||
|
if data[CONF_WHICH_SWITCH] == "sleep":
|
||||||
|
switches = [s.sleep_mode_switch for s in switches]
|
||||||
|
elif data[CONF_WHICH_SWITCH] == "brightness":
|
||||||
|
switches = [s.adapt_brightness_switch for s in switches]
|
||||||
|
elif data[CONF_WHICH_SWITCH] == "color":
|
||||||
|
switches = [s.adapt_color_switch for s in switches]
|
||||||
|
|
||||||
|
_LOGGER.debug("Turning on switches [%s]", switches)
|
||||||
|
for switch in switches:
|
||||||
|
await switch.async_turn_on()
|
||||||
|
|
||||||
|
|
||||||
|
@callback
|
||||||
|
async def handle_turn_off(service_call: ServiceCall):
|
||||||
|
"""Toggles the specified switch."""
|
||||||
|
hass = async_get_hass()
|
||||||
|
data = service_call.data
|
||||||
|
_LOGGER.debug(
|
||||||
|
"Called 'adaptive_lighting.turn_off' service with '%s'",
|
||||||
|
data,
|
||||||
|
)
|
||||||
|
switches = _get_switches_from_service_call(hass, service_call)
|
||||||
|
if data[CONF_WHICH_SWITCH] == "sleep":
|
||||||
|
switches = [s.sleep_mode_switch for s in switches]
|
||||||
|
elif data[CONF_WHICH_SWITCH] == "brightness":
|
||||||
|
switches = [s.adapt_brightness_switch for s in switches]
|
||||||
|
elif data[CONF_WHICH_SWITCH] == "color":
|
||||||
|
switches = [s.adapt_color_switch for s in switches]
|
||||||
|
_LOGGER.debug("Turning off switches [%s]", switches)
|
||||||
|
for switch in switches:
|
||||||
|
await switch.async_turn_off()
|
||||||
|
|
||||||
|
|
||||||
|
@callback
|
||||||
|
async def handle_toggle(service_call: ServiceCall):
|
||||||
|
"""Toggles the specified switch."""
|
||||||
|
hass = async_get_hass()
|
||||||
|
data = service_call.data
|
||||||
|
_LOGGER.debug(
|
||||||
|
"Called 'adaptive_lighting.toggle' service with '%s'",
|
||||||
|
data,
|
||||||
|
)
|
||||||
|
switches = _get_switches_from_service_call(hass, service_call)
|
||||||
|
if data[CONF_WHICH_SWITCH] == "sleep":
|
||||||
|
switches = [s.sleep_mode_switch for s in switches]
|
||||||
|
elif data[CONF_WHICH_SWITCH] == "brightness":
|
||||||
|
switches = [s.adapt_brightness_switch for s in switches]
|
||||||
|
elif data[CONF_WHICH_SWITCH] == "color":
|
||||||
|
switches = [s.adapt_color_switch for s in switches]
|
||||||
|
_LOGGER.debug("Toggling switches [%s]", switches)
|
||||||
|
for switch in switches:
|
||||||
|
if switch.is_on:
|
||||||
|
await switch.async_turn_off()
|
||||||
|
else:
|
||||||
|
await switch.async_turn_on()
|
||||||
|
|
||||||
|
|
||||||
|
@callback
|
||||||
|
async def handle_apply(service_call: ServiceCall):
|
||||||
|
"""Handle the entity service apply."""
|
||||||
|
hass = async_get_hass()
|
||||||
|
data = service_call.data
|
||||||
|
_LOGGER.debug(
|
||||||
|
"Called 'adaptive_lighting.apply' service with '%s'",
|
||||||
|
data,
|
||||||
|
)
|
||||||
|
switches = _get_switches_from_service_call(hass, service_call)
|
||||||
|
lights = data[CONF_LIGHTS]
|
||||||
|
for switch in switches:
|
||||||
|
if not lights:
|
||||||
|
all_lights = switch._lights # pylint: disable=protected-access
|
||||||
|
else:
|
||||||
|
all_lights = _expand_light_groups(switch.hass, lights)
|
||||||
|
switch.turn_on_off_listener.lights.update(all_lights)
|
||||||
|
for light in all_lights:
|
||||||
|
if data[CONF_TURN_ON_LIGHTS] or is_on(hass, light):
|
||||||
|
await switch._adapt_light( # pylint: disable=protected-access
|
||||||
|
light,
|
||||||
|
data[CONF_TRANSITION],
|
||||||
|
data[ATTR_ADAPT_BRIGHTNESS],
|
||||||
|
data[ATTR_ADAPT_COLOR],
|
||||||
|
data[CONF_PREFER_RGB_COLOR],
|
||||||
|
force=True,
|
||||||
|
context=switch.create_context(
|
||||||
|
"service", parent=service_call.context
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@callback
|
||||||
|
async def handle_set_manual_control(service_call: ServiceCall):
|
||||||
|
"""Set or unset lights as 'manually controlled'."""
|
||||||
|
hass = async_get_hass()
|
||||||
|
data = service_call.data
|
||||||
|
_LOGGER.debug(
|
||||||
|
"Called 'adaptive_lighting.set_manual_control' service with '%s'",
|
||||||
|
data,
|
||||||
|
)
|
||||||
|
switches = _get_switches_from_service_call(hass, service_call)
|
||||||
|
lights = data[CONF_LIGHTS]
|
||||||
|
for switch in switches:
|
||||||
|
if not lights:
|
||||||
|
all_lights = switch._lights # pylint: disable=protected-access
|
||||||
|
else:
|
||||||
|
all_lights = _expand_light_groups(switch.hass, lights)
|
||||||
|
if service_call.data[CONF_MANUAL_CONTROL]:
|
||||||
|
for light in all_lights:
|
||||||
|
switch.turn_on_off_listener.mark_as_manual_control(light)
|
||||||
|
_fire_manual_control_event(switch, light, service_call.context)
|
||||||
|
else:
|
||||||
|
switch.turn_on_off_listener.reset(*all_lights)
|
||||||
|
if switch.is_on:
|
||||||
|
# pylint: disable=protected-access
|
||||||
|
await switch._update_attrs_and_maybe_adapt_lights(
|
||||||
|
all_lights,
|
||||||
|
transition=switch._initial_transition,
|
||||||
|
force=True,
|
||||||
|
context=switch.create_context(
|
||||||
|
"service", parent=service_call.context
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _fire_manual_control_event(
|
def _fire_manual_control_event(
|
||||||
switch: AdaptiveSwitch, light: str, context: Context, is_async=True
|
switch: AdaptiveSwitch, light: str, context: Context, is_async=True
|
||||||
|
|
@ -490,67 +627,6 @@ async def async_setup_entry(
|
||||||
update_before_add=True,
|
update_before_add=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
@callback
|
|
||||||
async def handle_apply(service_call: ServiceCall):
|
|
||||||
"""Handle the entity service apply."""
|
|
||||||
data = service_call.data
|
|
||||||
_LOGGER.debug(
|
|
||||||
"Called 'adaptive_lighting.apply' service with '%s'",
|
|
||||||
data,
|
|
||||||
)
|
|
||||||
switches = _get_switches_from_service_call(hass, service_call)
|
|
||||||
lights = data[CONF_LIGHTS]
|
|
||||||
for switch in switches:
|
|
||||||
if not lights:
|
|
||||||
all_lights = switch._lights # pylint: disable=protected-access
|
|
||||||
else:
|
|
||||||
all_lights = _expand_light_groups(switch.hass, lights)
|
|
||||||
switch.turn_on_off_listener.lights.update(all_lights)
|
|
||||||
for light in all_lights:
|
|
||||||
if data[CONF_TURN_ON_LIGHTS] or is_on(hass, light):
|
|
||||||
await switch._adapt_light( # pylint: disable=protected-access
|
|
||||||
light,
|
|
||||||
data[CONF_TRANSITION],
|
|
||||||
data[ATTR_ADAPT_BRIGHTNESS],
|
|
||||||
data[ATTR_ADAPT_COLOR],
|
|
||||||
data[CONF_PREFER_RGB_COLOR],
|
|
||||||
force=True,
|
|
||||||
context=switch.create_context(
|
|
||||||
"service", parent=service_call.context
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
@callback
|
|
||||||
async def handle_set_manual_control(service_call: ServiceCall):
|
|
||||||
"""Set or unset lights as 'manually controlled'."""
|
|
||||||
data = service_call.data
|
|
||||||
_LOGGER.debug(
|
|
||||||
"Called 'adaptive_lighting.set_manual_control' service with '%s'",
|
|
||||||
data,
|
|
||||||
)
|
|
||||||
switches = _get_switches_from_service_call(hass, service_call)
|
|
||||||
lights = data[CONF_LIGHTS]
|
|
||||||
for switch in switches:
|
|
||||||
if not lights:
|
|
||||||
all_lights = switch._lights # pylint: disable=protected-access
|
|
||||||
else:
|
|
||||||
all_lights = _expand_light_groups(switch.hass, lights)
|
|
||||||
if service_call.data[CONF_MANUAL_CONTROL]:
|
|
||||||
for light in all_lights:
|
|
||||||
_fire_manual_control_event(switch, light, service_call.context)
|
|
||||||
else:
|
|
||||||
switch.turn_on_off_listener.reset(*all_lights)
|
|
||||||
if switch.is_on:
|
|
||||||
# pylint: disable=protected-access
|
|
||||||
await switch._update_attrs_and_maybe_adapt_lights(
|
|
||||||
all_lights,
|
|
||||||
transition=switch._initial_transition,
|
|
||||||
force=True,
|
|
||||||
context=switch.create_context(
|
|
||||||
"service", parent=service_call.context
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
# Register `apply` service
|
# Register `apply` service
|
||||||
hass.services.async_register(
|
hass.services.async_register(
|
||||||
domain=DOMAIN,
|
domain=DOMAIN,
|
||||||
|
|
@ -561,6 +637,30 @@ async def async_setup_entry(
|
||||||
), # pylint: disable=protected-access
|
), # pylint: disable=protected-access
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Register `turn_on` service
|
||||||
|
hass.services.async_register(
|
||||||
|
domain=DOMAIN,
|
||||||
|
service=SERVICE_TURN_ON,
|
||||||
|
service_func=handle_turn_on,
|
||||||
|
schema=SERVICE_TOGGLE_SCHEMA,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Register `turn_off` service
|
||||||
|
hass.services.async_register(
|
||||||
|
domain=DOMAIN,
|
||||||
|
service=SERVICE_TURN_OFF,
|
||||||
|
service_func=handle_turn_off,
|
||||||
|
schema=SERVICE_TOGGLE_SCHEMA,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Register `toggle` service
|
||||||
|
hass.services.async_register(
|
||||||
|
domain=DOMAIN,
|
||||||
|
service=SERVICE_TOGGLE,
|
||||||
|
service_func=handle_toggle,
|
||||||
|
schema=SERVICE_TOGGLE_SCHEMA,
|
||||||
|
)
|
||||||
|
|
||||||
# Register `set_manual_control` service
|
# Register `set_manual_control` service
|
||||||
hass.services.async_register(
|
hass.services.async_register(
|
||||||
domain=DOMAIN,
|
domain=DOMAIN,
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ from homeassistant.components.adaptive_lighting.const import (
|
||||||
CONF_TRANSITION,
|
CONF_TRANSITION,
|
||||||
CONF_TURN_ON_LIGHTS,
|
CONF_TURN_ON_LIGHTS,
|
||||||
CONF_USE_DEFAULTS,
|
CONF_USE_DEFAULTS,
|
||||||
|
CONF_WHICH_SWITCH,
|
||||||
CONST_COLOR,
|
CONST_COLOR,
|
||||||
DEFAULT_MAX_BRIGHTNESS,
|
DEFAULT_MAX_BRIGHTNESS,
|
||||||
DEFAULT_NAME,
|
DEFAULT_NAME,
|
||||||
|
|
@ -61,7 +62,6 @@ from homeassistant.components.light import (
|
||||||
COLOR_MODE_BRIGHTNESS,
|
COLOR_MODE_BRIGHTNESS,
|
||||||
)
|
)
|
||||||
from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN
|
from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN
|
||||||
from homeassistant.components.light import SERVICE_TURN_OFF
|
|
||||||
from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN
|
from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN
|
||||||
import homeassistant.config as config_util
|
import homeassistant.config as config_util
|
||||||
from homeassistant.config_entries import ConfigEntryState
|
from homeassistant.config_entries import ConfigEntryState
|
||||||
|
|
@ -73,6 +73,8 @@ from homeassistant.const import (
|
||||||
CONF_NAME,
|
CONF_NAME,
|
||||||
CONF_PLATFORM,
|
CONF_PLATFORM,
|
||||||
EVENT_STATE_CHANGED,
|
EVENT_STATE_CHANGED,
|
||||||
|
SERVICE_TOGGLE,
|
||||||
|
SERVICE_TURN_OFF,
|
||||||
SERVICE_TURN_ON,
|
SERVICE_TURN_ON,
|
||||||
STATE_OFF,
|
STATE_OFF,
|
||||||
STATE_ON,
|
STATE_ON,
|
||||||
|
|
@ -1334,6 +1336,82 @@ async def test_area(hass):
|
||||||
assert light.entity_id not in switch.turn_on_off_listener.last_service_data
|
assert light.entity_id not in switch.turn_on_off_listener.last_service_data
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.dependency(depends=GLOBAL_TEST_DEPENDENCIES)
|
||||||
|
async def test_switch_turn_on_off_toggle(hass):
|
||||||
|
"""Test adaptive_lighting.change_switch_settings service."""
|
||||||
|
switch, (_, _, light) = await setup_lights_and_switch(hass)
|
||||||
|
entity_id = switch.entity_id
|
||||||
|
assert entity_id not in switch._lights
|
||||||
|
|
||||||
|
async def turn_on(which: str, **kwargs):
|
||||||
|
await hass.services.async_call(
|
||||||
|
DOMAIN,
|
||||||
|
SERVICE_TURN_ON,
|
||||||
|
{
|
||||||
|
ATTR_ENTITY_ID: entity_id,
|
||||||
|
CONF_WHICH_SWITCH: which,
|
||||||
|
**kwargs,
|
||||||
|
},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
async def turn_off(which: str, **kwargs):
|
||||||
|
await hass.services.async_call(
|
||||||
|
DOMAIN,
|
||||||
|
SERVICE_TURN_OFF,
|
||||||
|
{
|
||||||
|
ATTR_ENTITY_ID: entity_id,
|
||||||
|
CONF_WHICH_SWITCH: which,
|
||||||
|
**kwargs,
|
||||||
|
},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
async def toggle(which: str, **kwargs):
|
||||||
|
await hass.services.async_call(
|
||||||
|
DOMAIN,
|
||||||
|
SERVICE_TOGGLE,
|
||||||
|
{
|
||||||
|
ATTR_ENTITY_ID: entity_id,
|
||||||
|
CONF_WHICH_SWITCH: which,
|
||||||
|
**kwargs,
|
||||||
|
},
|
||||||
|
blocking=True,
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
# Test sleep
|
||||||
|
await turn_on("sleep")
|
||||||
|
assert switch.sleep_mode_switch.is_on
|
||||||
|
await turn_off("sleep")
|
||||||
|
assert not switch.sleep_mode_switch.is_on
|
||||||
|
await toggle("sleep")
|
||||||
|
assert switch.sleep_mode_switch.is_on
|
||||||
|
# Test brightness
|
||||||
|
await turn_on("brightness")
|
||||||
|
assert switch.adapt_brightness_switch.is_on
|
||||||
|
await turn_off("brightness")
|
||||||
|
assert not switch.adapt_brightness_switch.is_on
|
||||||
|
await toggle("brightness")
|
||||||
|
assert switch.adapt_brightness_switch.is_on
|
||||||
|
# Test color
|
||||||
|
await turn_on("color")
|
||||||
|
assert switch.adapt_color_switch.is_on
|
||||||
|
await turn_off("color")
|
||||||
|
assert not switch.adapt_color_switch.is_on
|
||||||
|
await toggle("color")
|
||||||
|
assert switch.adapt_color_switch.is_on
|
||||||
|
# Test main
|
||||||
|
await turn_on("main")
|
||||||
|
assert switch.is_on
|
||||||
|
await turn_off("main")
|
||||||
|
assert not switch.is_on
|
||||||
|
await toggle("main")
|
||||||
|
assert switch.is_on
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.dependency(depends=GLOBAL_TEST_DEPENDENCIES)
|
@pytest.mark.dependency(depends=GLOBAL_TEST_DEPENDENCIES)
|
||||||
async def test_change_switch_settings_service(hass):
|
async def test_change_switch_settings_service(hass):
|
||||||
"""Test adaptive_lighting.change_switch_settings service."""
|
"""Test adaptive_lighting.change_switch_settings service."""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue