Merge pull request #71444 from home-assistant/rc

pull/71566/head 2022.5.2
Paulus Schoutsen 2022-05-06 12:58:44 -07:00 committed by GitHub
commit abe1f8e862
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 47 additions and 27 deletions

View File

@ -144,10 +144,11 @@ class CanaryCamera(CoordinatorEntity[CanaryDataUpdateCoordinator], Camera):
if self._live_stream_session is None: if self._live_stream_session is None:
return None return None
stream = CameraMjpeg(self._ffmpeg.binary) live_stream_url = await self.hass.async_add_executor_job(
await stream.open_camera( getattr, self._live_stream_session, "live_stream_url"
self._live_stream_session.live_stream_url, extra_cmd=self._ffmpeg_arguments
) )
stream = CameraMjpeg(self._ffmpeg.binary)
await stream.open_camera(live_stream_url, extra_cmd=self._ffmpeg_arguments)
try: try:
stream_reader = await stream.get_reader() stream_reader = await stream.get_reader()

View File

@ -3,7 +3,7 @@
"name": "Glances", "name": "Glances",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/glances", "documentation": "https://www.home-assistant.io/integrations/glances",
"requirements": ["glances_api==0.3.4"], "requirements": ["glances_api==0.3.5"],
"codeowners": ["@engrbm87"], "codeowners": ["@engrbm87"],
"iot_class": "local_polling", "iot_class": "local_polling",
"loggers": ["glances_api"] "loggers": ["glances_api"]

View File

@ -308,6 +308,22 @@ class OnOffChannel(ZigbeeChannel):
"""Return cached value of on/off attribute.""" """Return cached value of on/off attribute."""
return self.cluster.get("on_off") return self.cluster.get("on_off")
async def turn_on(self) -> bool:
"""Turn the on off cluster on."""
result = await self.on()
if isinstance(result, Exception) or result[1] is not Status.SUCCESS:
return False
self.cluster.update_attribute(self.ON_OFF, t.Bool.true)
return True
async def turn_off(self) -> bool:
"""Turn the on off cluster off."""
result = await self.off()
if isinstance(result, Exception) or result[1] is not Status.SUCCESS:
return False
self.cluster.update_attribute(self.ON_OFF, t.Bool.false)
return True
@callback @callback
def cluster_command(self, tsn, command_id, args): def cluster_command(self, tsn, command_id, args):
"""Handle commands received to this cluster.""" """Handle commands received to this cluster."""

View File

@ -64,15 +64,15 @@ class Switch(ZhaEntity, SwitchEntity):
async def async_turn_on(self, **kwargs) -> None: async def async_turn_on(self, **kwargs) -> None:
"""Turn the entity on.""" """Turn the entity on."""
result = await self._on_off_channel.on() result = await self._on_off_channel.turn_on()
if isinstance(result, Exception) or result[1] is not Status.SUCCESS: if not result:
return return
self.async_write_ha_state() self.async_write_ha_state()
async def async_turn_off(self, **kwargs) -> None: async def async_turn_off(self, **kwargs) -> None:
"""Turn the entity off.""" """Turn the entity off."""
result = await self._on_off_channel.off() result = await self._on_off_channel.turn_off()
if isinstance(result, Exception) or result[1] is not Status.SUCCESS: if not result:
return return
self.async_write_ha_state() self.async_write_ha_state()

View File

@ -7,7 +7,7 @@ from .backports.enum import StrEnum
MAJOR_VERSION: Final = 2022 MAJOR_VERSION: Final = 2022
MINOR_VERSION: Final = 5 MINOR_VERSION: Final = 5
PATCH_VERSION: Final = "1" PATCH_VERSION: Final = "2"
__short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}" __short_version__: Final = f"{MAJOR_VERSION}.{MINOR_VERSION}"
__version__: Final = f"{__short_version__}.{PATCH_VERSION}" __version__: Final = f"{__short_version__}.{PATCH_VERSION}"
REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 9, 0) REQUIRED_PYTHON_VER: Final[tuple[int, int, int]] = (3, 9, 0)

View File

@ -73,11 +73,7 @@ class Selector:
def serialize(self) -> Any: def serialize(self) -> Any:
"""Serialize Selector for voluptuous_serialize.""" """Serialize Selector for voluptuous_serialize."""
return {"selector": {self.selector_type: self.serialize_config()}} return {"selector": {self.selector_type: self.config}}
def serialize_config(self) -> Any:
"""Serialize config."""
return self.config
SINGLE_ENTITY_SELECTOR_CONFIG_SCHEMA = vol.Schema( SINGLE_ENTITY_SELECTOR_CONFIG_SCHEMA = vol.Schema(
@ -617,8 +613,8 @@ class NumberSelector(Selector):
vol.Coerce(float), vol.Range(min=1e-3) vol.Coerce(float), vol.Range(min=1e-3)
), ),
vol.Optional(CONF_UNIT_OF_MEASUREMENT): str, vol.Optional(CONF_UNIT_OF_MEASUREMENT): str,
vol.Optional(CONF_MODE, default=NumberSelectorMode.SLIDER): vol.Coerce( vol.Optional(CONF_MODE, default=NumberSelectorMode.SLIDER): vol.All(
NumberSelectorMode vol.Coerce(NumberSelectorMode), lambda val: val.value
), ),
} }
), ),
@ -629,13 +625,6 @@ class NumberSelector(Selector):
"""Instantiate a selector.""" """Instantiate a selector."""
super().__init__(config) super().__init__(config)
def serialize_config(self) -> Any:
"""Serialize the selector config."""
return {
**self.config,
"mode": self.config["mode"].value,
}
def __call__(self, data: Any) -> float: def __call__(self, data: Any) -> float:
"""Validate the passed selection.""" """Validate the passed selection."""
value: float = vol.Coerce(float)(data) value: float = vol.Coerce(float)(data)

View File

@ -723,7 +723,7 @@ gios==2.1.0
gitterpy==0.1.7 gitterpy==0.1.7
# homeassistant.components.glances # homeassistant.components.glances
glances_api==0.3.4 glances_api==0.3.5
# homeassistant.components.goalzero # homeassistant.components.goalzero
goalzero==0.2.1 goalzero==0.2.1

View File

@ -514,7 +514,7 @@ getmac==0.8.2
gios==2.1.0 gios==2.1.0
# homeassistant.components.glances # homeassistant.components.glances
glances_api==0.3.4 glances_api==0.3.5
# homeassistant.components.goalzero # homeassistant.components.goalzero
goalzero==0.2.1 goalzero==0.2.1

View File

@ -1,6 +1,6 @@
[metadata] [metadata]
name = homeassistant name = homeassistant
version = 2022.5.1 version = 2022.5.2
author = The Home Assistant Authors author = The Home Assistant Authors
author_email = hello@home-assistant.io author_email = hello@home-assistant.io
license = Apache-2.0 license = Apache-2.0

View File

@ -1474,6 +1474,7 @@ async def test_blueprint_automation(hass, calls):
"input": { "input": {
"trigger_event": "blueprint_event", "trigger_event": "blueprint_event",
"service_to_call": "test.automation", "service_to_call": "test.automation",
"a_number": 5,
}, },
} }
} }
@ -1499,6 +1500,7 @@ async def test_blueprint_automation_bad_config(hass, caplog):
"input": { "input": {
"trigger_event": "blueprint_event", "trigger_event": "blueprint_event",
"service_to_call": {"dict": "not allowed"}, "service_to_call": {"dict": "not allowed"},
"a_number": 5,
}, },
} }
} }

View File

@ -199,6 +199,7 @@ async def test_fetch_blueprint_from_github_url(hass, aioclient_mock, url):
assert imported_blueprint.blueprint.inputs == { assert imported_blueprint.blueprint.inputs == {
"service_to_call": None, "service_to_call": None,
"trigger_event": {"selector": {"text": {}}}, "trigger_event": {"selector": {"text": {}}},
"a_number": {"selector": {"number": {"mode": "box", "step": 1.0}}},
} }
assert imported_blueprint.suggested_filename == "balloob/motion_light" assert imported_blueprint.suggested_filename == "balloob/motion_light"
assert imported_blueprint.blueprint.metadata["source_url"] == url assert imported_blueprint.blueprint.metadata["source_url"] == url

View File

@ -33,6 +33,7 @@ async def test_list_blueprints(hass, hass_ws_client):
"input": { "input": {
"service_to_call": None, "service_to_call": None,
"trigger_event": {"selector": {"text": {}}}, "trigger_event": {"selector": {"text": {}}},
"a_number": {"selector": {"number": {"mode": "box", "step": 1.0}}},
}, },
"name": "Call service based on event", "name": "Call service based on event",
}, },
@ -95,6 +96,7 @@ async def test_import_blueprint(hass, aioclient_mock, hass_ws_client):
"input": { "input": {
"service_to_call": None, "service_to_call": None,
"trigger_event": {"selector": {"text": {}}}, "trigger_event": {"selector": {"text": {}}},
"a_number": {"selector": {"number": {"mode": "box", "step": 1.0}}},
}, },
"name": "Call service based on event", "name": "Call service based on event",
"source_url": "https://github.com/balloob/home-assistant-config/blob/main/blueprints/automation/motion_light.yaml", "source_url": "https://github.com/balloob/home-assistant-config/blob/main/blueprints/automation/motion_light.yaml",
@ -129,7 +131,7 @@ async def test_save_blueprint(hass, aioclient_mock, hass_ws_client):
assert msg["success"] assert msg["success"]
assert write_mock.mock_calls assert write_mock.mock_calls
assert write_mock.call_args[0] == ( assert write_mock.call_args[0] == (
"blueprint:\n name: Call service based on event\n domain: automation\n input:\n trigger_event:\n selector:\n text: {}\n service_to_call:\n source_url: https://github.com/balloob/home-assistant-config/blob/main/blueprints/automation/motion_light.yaml\ntrigger:\n platform: event\n event_type: !input 'trigger_event'\naction:\n service: !input 'service_to_call'\n entity_id: light.kitchen\n", "blueprint:\n name: Call service based on event\n domain: automation\n input:\n trigger_event:\n selector:\n text: {}\n service_to_call:\n a_number:\n selector:\n number:\n mode: box\n step: 1.0\n source_url: https://github.com/balloob/home-assistant-config/blob/main/blueprints/automation/motion_light.yaml\ntrigger:\n platform: event\n event_type: !input 'trigger_event'\naction:\n service: !input 'service_to_call'\n entity_id: light.kitchen\n",
) )

View File

@ -1539,6 +1539,7 @@ async def test_trace_blueprint_automation(
"input": { "input": {
"trigger_event": "blueprint_event", "trigger_event": "blueprint_event",
"service_to_call": "test.automation", "service_to_call": "test.automation",
"a_number": 5,
}, },
}, },
} }

View File

@ -1,4 +1,6 @@
"""Test selectors.""" """Test selectors."""
from enum import Enum
import pytest import pytest
import voluptuous as vol import voluptuous as vol
@ -52,6 +54,8 @@ def _test_selector(
config = {selector_type: schema} config = {selector_type: schema}
selector.validate_selector(config) selector.validate_selector(config)
selector_instance = selector.selector(config) selector_instance = selector.selector(config)
# We do not allow enums in the config, as they cannot serialize
assert not any(isinstance(val, Enum) for val in selector_instance.config.values())
# Use selector in schema and validate # Use selector in schema and validate
vol_schema = vol.Schema({"selection": selector_instance}) vol_schema = vol.Schema({"selection": selector_instance})

View File

@ -6,6 +6,10 @@ blueprint:
selector: selector:
text: text:
service_to_call: service_to_call:
a_number:
selector:
number:
mode: "box"
trigger: trigger:
platform: event platform: event
event_type: !input trigger_event event_type: !input trigger_event