mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 23:27:37 +00:00
2022.9.7 (#79095)
This commit is contained in:
commit
77a933d6f0
@ -2,7 +2,7 @@
|
|||||||
"domain": "august",
|
"domain": "august",
|
||||||
"name": "August",
|
"name": "August",
|
||||||
"documentation": "https://www.home-assistant.io/integrations/august",
|
"documentation": "https://www.home-assistant.io/integrations/august",
|
||||||
"requirements": ["yalexs==1.2.1"],
|
"requirements": ["yalexs==1.2.2"],
|
||||||
"codeowners": ["@bdraco"],
|
"codeowners": ["@bdraco"],
|
||||||
"dhcp": [
|
"dhcp": [
|
||||||
{
|
{
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"name": "Bosch SHC",
|
"name": "Bosch SHC",
|
||||||
"config_flow": true,
|
"config_flow": true,
|
||||||
"documentation": "https://www.home-assistant.io/integrations/bosch_shc",
|
"documentation": "https://www.home-assistant.io/integrations/bosch_shc",
|
||||||
"requirements": ["boschshcpy==0.2.30"],
|
"requirements": ["boschshcpy==0.2.35"],
|
||||||
"zeroconf": [{ "type": "_http._tcp.local.", "name": "bosch shc*" }],
|
"zeroconf": [{ "type": "_http._tcp.local.", "name": "bosch shc*" }],
|
||||||
"iot_class": "local_push",
|
"iot_class": "local_push",
|
||||||
"codeowners": ["@tschamm"],
|
"codeowners": ["@tschamm"],
|
||||||
|
@ -12,6 +12,11 @@
|
|||||||
"service_uuid": "00008451-0000-1000-8000-00805f9b34fb",
|
"service_uuid": "00008451-0000-1000-8000-00805f9b34fb",
|
||||||
"connectable": false
|
"connectable": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"manufacturer_id": 63391,
|
||||||
|
"service_uuid": "00008351-0000-1000-8000-00805f9b34fb",
|
||||||
|
"connectable": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"manufacturer_id": 26589,
|
"manufacturer_id": 26589,
|
||||||
"service_uuid": "00008351-0000-1000-8000-00805f9b34fb",
|
"service_uuid": "00008351-0000-1000-8000-00805f9b34fb",
|
||||||
@ -32,6 +37,11 @@
|
|||||||
"service_uuid": "00008551-0000-1000-8000-00805f9b34fb",
|
"service_uuid": "00008551-0000-1000-8000-00805f9b34fb",
|
||||||
"connectable": false
|
"connectable": false
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"manufacturer_id": 43682,
|
||||||
|
"service_uuid": "00008151-0000-1000-8000-00805f9b34fb",
|
||||||
|
"connectable": false
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"manufacturer_id": 59970,
|
"manufacturer_id": 59970,
|
||||||
"service_uuid": "00008151-0000-1000-8000-00805f9b34fb",
|
"service_uuid": "00008151-0000-1000-8000-00805f9b34fb",
|
||||||
@ -58,7 +68,7 @@
|
|||||||
"connectable": false
|
"connectable": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"requirements": ["govee-ble==0.17.3"],
|
"requirements": ["govee-ble==0.19.0"],
|
||||||
"dependencies": ["bluetooth"],
|
"dependencies": ["bluetooth"],
|
||||||
"codeowners": ["@bdraco"],
|
"codeowners": ["@bdraco"],
|
||||||
"iot_class": "local_push"
|
"iot_class": "local_push"
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
"""Component for the Portuguese weather service - IPMA."""
|
"""Component for the Portuguese weather service - IPMA."""
|
||||||
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import async_timeout
|
import async_timeout
|
||||||
@ -22,36 +23,31 @@ PLATFORMS = [Platform.WEATHER]
|
|||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
async def async_get_api(hass):
|
|
||||||
"""Get the pyipma api object."""
|
|
||||||
websession = async_get_clientsession(hass)
|
|
||||||
return IPMA_API(websession)
|
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
|
async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
|
||||||
"""Set up IPMA station as config entry."""
|
"""Set up IPMA station as config entry."""
|
||||||
|
|
||||||
latitude = config_entry.data[CONF_LATITUDE]
|
latitude = config_entry.data[CONF_LATITUDE]
|
||||||
longitude = config_entry.data[CONF_LONGITUDE]
|
longitude = config_entry.data[CONF_LONGITUDE]
|
||||||
|
|
||||||
api = await async_get_api(hass)
|
api = IPMA_API(async_get_clientsession(hass))
|
||||||
|
|
||||||
try:
|
try:
|
||||||
async with async_timeout.timeout(30):
|
async with async_timeout.timeout(30):
|
||||||
location = await Location.get(api, float(latitude), float(longitude))
|
location = await Location.get(api, float(latitude), float(longitude))
|
||||||
|
except (IPMAException, asyncio.TimeoutError) as err:
|
||||||
_LOGGER.debug(
|
|
||||||
"Initializing for coordinates %s, %s -> station %s (%d, %d)",
|
|
||||||
latitude,
|
|
||||||
longitude,
|
|
||||||
location.station,
|
|
||||||
location.id_station,
|
|
||||||
location.global_id_local,
|
|
||||||
)
|
|
||||||
except IPMAException as err:
|
|
||||||
raise ConfigEntryNotReady(
|
raise ConfigEntryNotReady(
|
||||||
f"Could not get location for ({latitude},{longitude})"
|
f"Could not get location for ({latitude},{longitude})"
|
||||||
) from err
|
) from err
|
||||||
|
|
||||||
|
_LOGGER.debug(
|
||||||
|
"Initializing for coordinates %s, %s -> station %s (%d, %d)",
|
||||||
|
latitude,
|
||||||
|
longitude,
|
||||||
|
location.station,
|
||||||
|
location.id_station,
|
||||||
|
location.global_id_local,
|
||||||
|
)
|
||||||
|
|
||||||
hass.data.setdefault(DOMAIN, {})
|
hass.data.setdefault(DOMAIN, {})
|
||||||
hass.data[DOMAIN][config_entry.entry_id] = {DATA_API: api, DATA_LOCATION: location}
|
hass.data[DOMAIN][config_entry.entry_id] = {DATA_API: api, DATA_LOCATION: location}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"name": "Instituto Portugu\u00eas do Mar e Atmosfera (IPMA)",
|
"name": "Instituto Portugu\u00eas do Mar e Atmosfera (IPMA)",
|
||||||
"config_flow": true,
|
"config_flow": true,
|
||||||
"documentation": "https://www.home-assistant.io/integrations/ipma",
|
"documentation": "https://www.home-assistant.io/integrations/ipma",
|
||||||
"requirements": ["pyipma==3.0.4"],
|
"requirements": ["pyipma==3.0.5"],
|
||||||
"codeowners": ["@dgomes", "@abmantis"],
|
"codeowners": ["@dgomes", "@abmantis"],
|
||||||
"iot_class": "cloud_polling",
|
"iot_class": "cloud_polling",
|
||||||
"loggers": ["geopy", "pyipma"]
|
"loggers": ["geopy", "pyipma"]
|
||||||
|
@ -13,6 +13,7 @@ from demetriek import (
|
|||||||
Model,
|
Model,
|
||||||
Notification,
|
Notification,
|
||||||
NotificationIconType,
|
NotificationIconType,
|
||||||
|
NotificationPriority,
|
||||||
NotificationSound,
|
NotificationSound,
|
||||||
Simple,
|
Simple,
|
||||||
Sound,
|
Sound,
|
||||||
@ -227,6 +228,7 @@ class LaMetricFlowHandler(AbstractOAuth2FlowHandler, domain=DOMAIN):
|
|||||||
|
|
||||||
await lametric.notify(
|
await lametric.notify(
|
||||||
notification=Notification(
|
notification=Notification(
|
||||||
|
priority=NotificationPriority.CRITICAL,
|
||||||
icon_type=NotificationIconType.INFO,
|
icon_type=NotificationIconType.INFO,
|
||||||
model=Model(
|
model=Model(
|
||||||
cycles=2,
|
cycles=2,
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"name": "Motion Blinds",
|
"name": "Motion Blinds",
|
||||||
"config_flow": true,
|
"config_flow": true,
|
||||||
"documentation": "https://www.home-assistant.io/integrations/motion_blinds",
|
"documentation": "https://www.home-assistant.io/integrations/motion_blinds",
|
||||||
"requirements": ["motionblinds==0.6.12"],
|
"requirements": ["motionblinds==0.6.13"],
|
||||||
"dependencies": ["network"],
|
"dependencies": ["network"],
|
||||||
"dhcp": [
|
"dhcp": [
|
||||||
{ "registered_devices": true },
|
{ "registered_devices": true },
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
"""Support for tracking MQTT enabled devices identified through discovery."""
|
"""Support for tracking MQTT enabled devices identified through discovery."""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import asyncio
|
|
||||||
import functools
|
import functools
|
||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
@ -28,12 +27,7 @@ from .. import subscription
|
|||||||
from ..config import MQTT_RO_SCHEMA
|
from ..config import MQTT_RO_SCHEMA
|
||||||
from ..const import CONF_QOS, CONF_STATE_TOPIC
|
from ..const import CONF_QOS, CONF_STATE_TOPIC
|
||||||
from ..debug_info import log_messages
|
from ..debug_info import log_messages
|
||||||
from ..mixins import (
|
from ..mixins import MQTT_ENTITY_COMMON_SCHEMA, MqttEntity, async_setup_entry_helper
|
||||||
MQTT_ENTITY_COMMON_SCHEMA,
|
|
||||||
MqttEntity,
|
|
||||||
async_get_platform_config_from_yaml,
|
|
||||||
async_setup_entry_helper,
|
|
||||||
)
|
|
||||||
from ..models import MqttValueTemplate
|
from ..models import MqttValueTemplate
|
||||||
|
|
||||||
CONF_PAYLOAD_HOME = "payload_home"
|
CONF_PAYLOAD_HOME = "payload_home"
|
||||||
@ -58,16 +52,6 @@ async def async_setup_entry_from_discovery(
|
|||||||
async_add_entities: AddEntitiesCallback,
|
async_add_entities: AddEntitiesCallback,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Set up MQTT device tracker configuration.yaml and dynamically through MQTT discovery."""
|
"""Set up MQTT device tracker configuration.yaml and dynamically through MQTT discovery."""
|
||||||
# load and initialize platform config from configuration.yaml
|
|
||||||
await asyncio.gather(
|
|
||||||
*(
|
|
||||||
_async_setup_entity(hass, async_add_entities, config, config_entry)
|
|
||||||
for config in await async_get_platform_config_from_yaml(
|
|
||||||
hass, device_tracker.DOMAIN
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
# setup for discovery
|
|
||||||
setup = functools.partial(
|
setup = functools.partial(
|
||||||
_async_setup_entity, hass, async_add_entities, config_entry=config_entry
|
_async_setup_entity, hass, async_add_entities, config_entry=config_entry
|
||||||
)
|
)
|
||||||
|
@ -86,7 +86,7 @@ FORECAST_MODES = [
|
|||||||
FORECAST_MODE_ONECALL_HOURLY,
|
FORECAST_MODE_ONECALL_HOURLY,
|
||||||
FORECAST_MODE_ONECALL_DAILY,
|
FORECAST_MODE_ONECALL_DAILY,
|
||||||
]
|
]
|
||||||
DEFAULT_FORECAST_MODE = FORECAST_MODE_ONECALL_DAILY
|
DEFAULT_FORECAST_MODE = FORECAST_MODE_HOURLY
|
||||||
|
|
||||||
LANGUAGES = [
|
LANGUAGES = [
|
||||||
"af",
|
"af",
|
||||||
|
@ -10,21 +10,12 @@ import voluptuous as vol
|
|||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.components import usb
|
from homeassistant.components import usb
|
||||||
from homeassistant.const import CONF_NAME, CONF_PORT
|
from homeassistant.const import CONF_NAME, CONF_PORT
|
||||||
from homeassistant.core import HomeAssistant, callback
|
|
||||||
from homeassistant.data_entry_flow import FlowResult
|
from homeassistant.data_entry_flow import FlowResult
|
||||||
from homeassistant.util import slugify
|
from homeassistant.util import slugify
|
||||||
|
|
||||||
from .const import DOMAIN
|
from .const import DOMAIN
|
||||||
|
|
||||||
|
|
||||||
@callback
|
|
||||||
def velbus_entries(hass: HomeAssistant) -> set[str]:
|
|
||||||
"""Return connections for Velbus domain."""
|
|
||||||
return {
|
|
||||||
entry.data[CONF_PORT] for entry in hass.config_entries.async_entries(DOMAIN)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class VelbusConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
class VelbusConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
||||||
"""Handle a config flow."""
|
"""Handle a config flow."""
|
||||||
|
|
||||||
@ -51,10 +42,6 @@ class VelbusConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _prt_in_configuration_exists(self, prt: str) -> bool:
|
|
||||||
"""Return True if port exists in configuration."""
|
|
||||||
return prt in velbus_entries(self.hass)
|
|
||||||
|
|
||||||
async def async_step_user(
|
async def async_step_user(
|
||||||
self, user_input: dict[str, Any] | None = None
|
self, user_input: dict[str, Any] | None = None
|
||||||
) -> FlowResult:
|
) -> FlowResult:
|
||||||
@ -63,11 +50,9 @@ class VelbusConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
if user_input is not None:
|
if user_input is not None:
|
||||||
name = slugify(user_input[CONF_NAME])
|
name = slugify(user_input[CONF_NAME])
|
||||||
prt = user_input[CONF_PORT]
|
prt = user_input[CONF_PORT]
|
||||||
if not self._prt_in_configuration_exists(prt):
|
self._async_abort_entries_match({CONF_PORT: prt})
|
||||||
if await self._test_connection(prt):
|
if await self._test_connection(prt):
|
||||||
return self._create_device(name, prt)
|
return self._create_device(name, prt)
|
||||||
else:
|
|
||||||
self._errors[CONF_PORT] = "already_configured"
|
|
||||||
else:
|
else:
|
||||||
user_input = {}
|
user_input = {}
|
||||||
user_input[CONF_NAME] = ""
|
user_input[CONF_NAME] = ""
|
||||||
@ -93,8 +78,7 @@ class VelbusConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
usb.get_serial_by_id, discovery_info.device
|
usb.get_serial_by_id, discovery_info.device
|
||||||
)
|
)
|
||||||
# check if this device is not already configured
|
# check if this device is not already configured
|
||||||
if self._prt_in_configuration_exists(dev_path):
|
self._async_abort_entries_match({CONF_PORT: dev_path})
|
||||||
return self.async_abort(reason="already_configured")
|
|
||||||
# check if we can make a valid velbus connection
|
# check if we can make a valid velbus connection
|
||||||
if not await self._test_connection(dev_path):
|
if not await self._test_connection(dev_path):
|
||||||
return self.async_abort(reason="cannot_connect")
|
return self.async_abort(reason="cannot_connect")
|
||||||
|
@ -7,7 +7,7 @@ from .backports.enum import StrEnum
|
|||||||
|
|
||||||
MAJOR_VERSION: Final = 2022
|
MAJOR_VERSION: Final = 2022
|
||||||
MINOR_VERSION: Final = 9
|
MINOR_VERSION: Final = 9
|
||||||
PATCH_VERSION: Final = "6"
|
PATCH_VERSION: Final = "7"
|
||||||
__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)
|
||||||
|
@ -56,6 +56,12 @@ BLUETOOTH: list[dict[str, bool | str | int | list[int]]] = [
|
|||||||
"service_uuid": "00008451-0000-1000-8000-00805f9b34fb",
|
"service_uuid": "00008451-0000-1000-8000-00805f9b34fb",
|
||||||
"connectable": False
|
"connectable": False
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"domain": "govee_ble",
|
||||||
|
"manufacturer_id": 63391,
|
||||||
|
"service_uuid": "00008351-0000-1000-8000-00805f9b34fb",
|
||||||
|
"connectable": False
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"domain": "govee_ble",
|
"domain": "govee_ble",
|
||||||
"manufacturer_id": 26589,
|
"manufacturer_id": 26589,
|
||||||
@ -80,6 +86,12 @@ BLUETOOTH: list[dict[str, bool | str | int | list[int]]] = [
|
|||||||
"service_uuid": "00008551-0000-1000-8000-00805f9b34fb",
|
"service_uuid": "00008551-0000-1000-8000-00805f9b34fb",
|
||||||
"connectable": False
|
"connectable": False
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"domain": "govee_ble",
|
||||||
|
"manufacturer_id": 43682,
|
||||||
|
"service_uuid": "00008151-0000-1000-8000-00805f9b34fb",
|
||||||
|
"connectable": False
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"domain": "govee_ble",
|
"domain": "govee_ble",
|
||||||
"manufacturer_id": 59970,
|
"manufacturer_id": 59970,
|
||||||
|
@ -132,3 +132,6 @@ iso4217!=1.10.20220401
|
|||||||
|
|
||||||
# Pandas 1.4.4 has issues with wheels om armhf + Py3.10
|
# Pandas 1.4.4 has issues with wheels om armhf + Py3.10
|
||||||
pandas==1.4.3
|
pandas==1.4.3
|
||||||
|
|
||||||
|
# pyopenssl 22.1.0 requires pycryptography > 38 and we have 37
|
||||||
|
pyopenssl==22.0.0
|
||||||
|
@ -357,11 +357,10 @@ async def async_process_deps_reqs(
|
|||||||
if failed_deps := await _async_process_dependencies(hass, config, integration):
|
if failed_deps := await _async_process_dependencies(hass, config, integration):
|
||||||
raise DependencyError(failed_deps)
|
raise DependencyError(failed_deps)
|
||||||
|
|
||||||
if not hass.config.skip_pip and integration.requirements:
|
async with hass.timeout.async_freeze(integration.domain):
|
||||||
async with hass.timeout.async_freeze(integration.domain):
|
await requirements.async_get_integration_with_requirements(
|
||||||
await requirements.async_get_integration_with_requirements(
|
hass, integration.domain
|
||||||
hass, integration.domain
|
)
|
||||||
)
|
|
||||||
|
|
||||||
processed.add(integration.domain)
|
processed.add(integration.domain)
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|||||||
|
|
||||||
[project]
|
[project]
|
||||||
name = "homeassistant"
|
name = "homeassistant"
|
||||||
version = "2022.9.6"
|
version = "2022.9.7"
|
||||||
license = {text = "Apache-2.0"}
|
license = {text = "Apache-2.0"}
|
||||||
description = "Open-source home automation platform running on Python 3."
|
description = "Open-source home automation platform running on Python 3."
|
||||||
readme = "README.rst"
|
readme = "README.rst"
|
||||||
|
@ -442,7 +442,7 @@ bluetooth-auto-recovery==0.3.3
|
|||||||
bond-async==0.1.22
|
bond-async==0.1.22
|
||||||
|
|
||||||
# homeassistant.components.bosch_shc
|
# homeassistant.components.bosch_shc
|
||||||
boschshcpy==0.2.30
|
boschshcpy==0.2.35
|
||||||
|
|
||||||
# homeassistant.components.amazon_polly
|
# homeassistant.components.amazon_polly
|
||||||
# homeassistant.components.route53
|
# homeassistant.components.route53
|
||||||
@ -778,7 +778,7 @@ googlemaps==2.5.1
|
|||||||
goslide-api==0.5.1
|
goslide-api==0.5.1
|
||||||
|
|
||||||
# homeassistant.components.govee_ble
|
# homeassistant.components.govee_ble
|
||||||
govee-ble==0.17.3
|
govee-ble==0.19.0
|
||||||
|
|
||||||
# homeassistant.components.remote_rpi_gpio
|
# homeassistant.components.remote_rpi_gpio
|
||||||
gpiozero==1.6.2
|
gpiozero==1.6.2
|
||||||
@ -1079,7 +1079,7 @@ moat-ble==0.1.1
|
|||||||
moehlenhoff-alpha2==1.2.1
|
moehlenhoff-alpha2==1.2.1
|
||||||
|
|
||||||
# homeassistant.components.motion_blinds
|
# homeassistant.components.motion_blinds
|
||||||
motionblinds==0.6.12
|
motionblinds==0.6.13
|
||||||
|
|
||||||
# homeassistant.components.motioneye
|
# homeassistant.components.motioneye
|
||||||
motioneye-client==0.3.12
|
motioneye-client==0.3.12
|
||||||
@ -1614,7 +1614,7 @@ pyinsteon==1.2.0
|
|||||||
pyintesishome==1.8.0
|
pyintesishome==1.8.0
|
||||||
|
|
||||||
# homeassistant.components.ipma
|
# homeassistant.components.ipma
|
||||||
pyipma==3.0.4
|
pyipma==3.0.5
|
||||||
|
|
||||||
# homeassistant.components.ipp
|
# homeassistant.components.ipp
|
||||||
pyipp==0.11.0
|
pyipp==0.11.0
|
||||||
@ -2551,7 +2551,7 @@ yalesmartalarmclient==0.3.9
|
|||||||
yalexs-ble==1.9.2
|
yalexs-ble==1.9.2
|
||||||
|
|
||||||
# homeassistant.components.august
|
# homeassistant.components.august
|
||||||
yalexs==1.2.1
|
yalexs==1.2.2
|
||||||
|
|
||||||
# homeassistant.components.yeelight
|
# homeassistant.components.yeelight
|
||||||
yeelight==0.7.10
|
yeelight==0.7.10
|
||||||
|
@ -353,7 +353,7 @@ bluetooth-auto-recovery==0.3.3
|
|||||||
bond-async==0.1.22
|
bond-async==0.1.22
|
||||||
|
|
||||||
# homeassistant.components.bosch_shc
|
# homeassistant.components.bosch_shc
|
||||||
boschshcpy==0.2.30
|
boschshcpy==0.2.35
|
||||||
|
|
||||||
# homeassistant.components.broadlink
|
# homeassistant.components.broadlink
|
||||||
broadlink==0.18.2
|
broadlink==0.18.2
|
||||||
@ -579,7 +579,7 @@ google-nest-sdm==2.0.0
|
|||||||
googlemaps==2.5.1
|
googlemaps==2.5.1
|
||||||
|
|
||||||
# homeassistant.components.govee_ble
|
# homeassistant.components.govee_ble
|
||||||
govee-ble==0.17.3
|
govee-ble==0.19.0
|
||||||
|
|
||||||
# homeassistant.components.gree
|
# homeassistant.components.gree
|
||||||
greeclimate==1.3.0
|
greeclimate==1.3.0
|
||||||
@ -778,7 +778,7 @@ moat-ble==0.1.1
|
|||||||
moehlenhoff-alpha2==1.2.1
|
moehlenhoff-alpha2==1.2.1
|
||||||
|
|
||||||
# homeassistant.components.motion_blinds
|
# homeassistant.components.motion_blinds
|
||||||
motionblinds==0.6.12
|
motionblinds==0.6.13
|
||||||
|
|
||||||
# homeassistant.components.motioneye
|
# homeassistant.components.motioneye
|
||||||
motioneye-client==0.3.12
|
motioneye-client==0.3.12
|
||||||
@ -1127,7 +1127,7 @@ pyicloud==1.0.0
|
|||||||
pyinsteon==1.2.0
|
pyinsteon==1.2.0
|
||||||
|
|
||||||
# homeassistant.components.ipma
|
# homeassistant.components.ipma
|
||||||
pyipma==3.0.4
|
pyipma==3.0.5
|
||||||
|
|
||||||
# homeassistant.components.ipp
|
# homeassistant.components.ipp
|
||||||
pyipp==0.11.0
|
pyipp==0.11.0
|
||||||
@ -1755,7 +1755,7 @@ yalesmartalarmclient==0.3.9
|
|||||||
yalexs-ble==1.9.2
|
yalexs-ble==1.9.2
|
||||||
|
|
||||||
# homeassistant.components.august
|
# homeassistant.components.august
|
||||||
yalexs==1.2.1
|
yalexs==1.2.2
|
||||||
|
|
||||||
# homeassistant.components.yeelight
|
# homeassistant.components.yeelight
|
||||||
yeelight==0.7.10
|
yeelight==0.7.10
|
||||||
|
@ -142,6 +142,9 @@ iso4217!=1.10.20220401
|
|||||||
|
|
||||||
# Pandas 1.4.4 has issues with wheels om armhf + Py3.10
|
# Pandas 1.4.4 has issues with wheels om armhf + Py3.10
|
||||||
pandas==1.4.3
|
pandas==1.4.3
|
||||||
|
|
||||||
|
# pyopenssl 22.1.0 requires pycryptography > 38 and we have 37
|
||||||
|
pyopenssl==22.0.0
|
||||||
"""
|
"""
|
||||||
|
|
||||||
IGNORE_PRE_COMMIT_HOOK_ID = (
|
IGNORE_PRE_COMMIT_HOOK_ID = (
|
||||||
|
@ -7,9 +7,8 @@ from velbusaio.exceptions import VelbusConnectionFailed
|
|||||||
|
|
||||||
from homeassistant import data_entry_flow
|
from homeassistant import data_entry_flow
|
||||||
from homeassistant.components import usb
|
from homeassistant.components import usb
|
||||||
from homeassistant.components.velbus import config_flow
|
|
||||||
from homeassistant.components.velbus.const import DOMAIN
|
from homeassistant.components.velbus.const import DOMAIN
|
||||||
from homeassistant.config_entries import SOURCE_USB
|
from homeassistant.config_entries import SOURCE_USB, SOURCE_USER
|
||||||
from homeassistant.const import CONF_NAME, CONF_PORT, CONF_SOURCE
|
from homeassistant.const import CONF_NAME, CONF_PORT, CONF_SOURCE
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
@ -53,63 +52,76 @@ def mock_controller_connection_failed():
|
|||||||
yield
|
yield
|
||||||
|
|
||||||
|
|
||||||
def init_config_flow(hass: HomeAssistant):
|
|
||||||
"""Init a configuration flow."""
|
|
||||||
flow = config_flow.VelbusConfigFlow()
|
|
||||||
flow.hass = hass
|
|
||||||
return flow
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("controller")
|
@pytest.mark.usefixtures("controller")
|
||||||
async def test_user(hass: HomeAssistant):
|
async def test_user(hass: HomeAssistant):
|
||||||
"""Test user config."""
|
"""Test user config."""
|
||||||
flow = init_config_flow(hass)
|
# simple user form
|
||||||
|
result = await hass.config_entries.flow.async_init(
|
||||||
result = await flow.async_step_user()
|
DOMAIN, context={"source": SOURCE_USER}
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.FORM
|
|
||||||
assert result["step_id"] == "user"
|
|
||||||
|
|
||||||
result = await flow.async_step_user(
|
|
||||||
{CONF_NAME: "Velbus Test Serial", CONF_PORT: PORT_SERIAL}
|
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
|
assert result
|
||||||
assert result["title"] == "velbus_test_serial"
|
assert result.get("flow_id")
|
||||||
assert result["data"][CONF_PORT] == PORT_SERIAL
|
assert result.get("type") == data_entry_flow.FlowResultType.FORM
|
||||||
|
assert result.get("step_id") == "user"
|
||||||
|
|
||||||
result = await flow.async_step_user(
|
# try with a serial port
|
||||||
{CONF_NAME: "Velbus Test TCP", CONF_PORT: PORT_TCP}
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
DOMAIN,
|
||||||
|
context={"source": SOURCE_USER},
|
||||||
|
data={CONF_NAME: "Velbus Test Serial", CONF_PORT: PORT_SERIAL},
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
|
assert result
|
||||||
assert result["title"] == "velbus_test_tcp"
|
assert result.get("type") == data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||||
assert result["data"][CONF_PORT] == PORT_TCP
|
assert result.get("title") == "velbus_test_serial"
|
||||||
|
data = result.get("data")
|
||||||
|
assert data[CONF_PORT] == PORT_SERIAL
|
||||||
|
|
||||||
|
# try with a ip:port combination
|
||||||
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
DOMAIN,
|
||||||
|
context={"source": SOURCE_USER},
|
||||||
|
data={CONF_NAME: "Velbus Test TCP", CONF_PORT: PORT_TCP},
|
||||||
|
)
|
||||||
|
assert result
|
||||||
|
assert result.get("type") == data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||||
|
assert result.get("title") == "velbus_test_tcp"
|
||||||
|
data = result.get("data")
|
||||||
|
assert data[CONF_PORT] == PORT_TCP
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("controller_connection_failed")
|
@pytest.mark.usefixtures("controller_connection_failed")
|
||||||
async def test_user_fail(hass: HomeAssistant):
|
async def test_user_fail(hass: HomeAssistant):
|
||||||
"""Test user config."""
|
"""Test user config."""
|
||||||
flow = init_config_flow(hass)
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
DOMAIN,
|
||||||
result = await flow.async_step_user(
|
context={"source": SOURCE_USER},
|
||||||
{CONF_NAME: "Velbus Test Serial", CONF_PORT: PORT_SERIAL}
|
data={CONF_NAME: "Velbus Test Serial", CONF_PORT: PORT_SERIAL},
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.FORM
|
assert result
|
||||||
assert result["errors"] == {CONF_PORT: "cannot_connect"}
|
assert result.get("type") == data_entry_flow.FlowResultType.FORM
|
||||||
|
assert result.get("errors") == {CONF_PORT: "cannot_connect"}
|
||||||
|
|
||||||
result = await flow.async_step_user(
|
result = await hass.config_entries.flow.async_init(
|
||||||
{CONF_NAME: "Velbus Test TCP", CONF_PORT: PORT_TCP}
|
DOMAIN,
|
||||||
|
context={"source": SOURCE_USER},
|
||||||
|
data={CONF_NAME: "Velbus Test TCP", CONF_PORT: PORT_TCP},
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.FORM
|
assert result
|
||||||
assert result["errors"] == {CONF_PORT: "cannot_connect"}
|
assert result.get("type") == data_entry_flow.FlowResultType.FORM
|
||||||
|
assert result.get("errors") == {CONF_PORT: "cannot_connect"}
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("config_entry")
|
@pytest.mark.usefixtures("config_entry")
|
||||||
async def test_abort_if_already_setup(hass: HomeAssistant):
|
async def test_abort_if_already_setup(hass: HomeAssistant):
|
||||||
"""Test we abort if Velbus is already setup."""
|
"""Test we abort if Velbus is already setup."""
|
||||||
flow = init_config_flow(hass)
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
DOMAIN,
|
||||||
result = await flow.async_step_user({CONF_PORT: PORT_TCP, CONF_NAME: "velbus test"})
|
context={"source": SOURCE_USER},
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.FORM
|
data={CONF_PORT: PORT_TCP, CONF_NAME: "velbus test"},
|
||||||
assert result["errors"] == {"port": "already_configured"}
|
)
|
||||||
|
assert result
|
||||||
|
assert result.get("type") == data_entry_flow.FlowResultType.ABORT
|
||||||
|
assert result.get("reason") == "already_configured"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("controller")
|
@pytest.mark.usefixtures("controller")
|
||||||
@ -121,14 +133,16 @@ async def test_flow_usb(hass: HomeAssistant):
|
|||||||
context={CONF_SOURCE: SOURCE_USB},
|
context={CONF_SOURCE: SOURCE_USB},
|
||||||
data=DISCOVERY_INFO,
|
data=DISCOVERY_INFO,
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.FORM
|
assert result
|
||||||
assert result["step_id"] == "discovery_confirm"
|
assert result.get("type") == data_entry_flow.FlowResultType.FORM
|
||||||
|
assert result.get("step_id") == "discovery_confirm"
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_configure(
|
result = await hass.config_entries.flow.async_configure(
|
||||||
result["flow_id"],
|
result["flow_id"],
|
||||||
user_input={},
|
user_input={},
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
|
assert result
|
||||||
|
assert result.get("type") == data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||||
|
|
||||||
# test an already configured discovery
|
# test an already configured discovery
|
||||||
entry = MockConfigEntry(
|
entry = MockConfigEntry(
|
||||||
@ -141,8 +155,9 @@ async def test_flow_usb(hass: HomeAssistant):
|
|||||||
context={CONF_SOURCE: SOURCE_USB},
|
context={CONF_SOURCE: SOURCE_USB},
|
||||||
data=DISCOVERY_INFO,
|
data=DISCOVERY_INFO,
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.ABORT
|
assert result
|
||||||
assert result["reason"] == "already_configured"
|
assert result.get("type") == data_entry_flow.FlowResultType.ABORT
|
||||||
|
assert result.get("reason") == "already_configured"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("controller_connection_failed")
|
@pytest.mark.usefixtures("controller_connection_failed")
|
||||||
@ -154,5 +169,6 @@ async def test_flow_usb_failed(hass: HomeAssistant):
|
|||||||
context={CONF_SOURCE: SOURCE_USB},
|
context={CONF_SOURCE: SOURCE_USB},
|
||||||
data=DISCOVERY_INFO,
|
data=DISCOVERY_INFO,
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.ABORT
|
assert result
|
||||||
assert result["reason"] == "cannot_connect"
|
assert result.get("type") == data_entry_flow.FlowResultType.ABORT
|
||||||
|
assert result.get("reason") == "cannot_connect"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user