mirror of
https://github.com/home-assistant/core.git
synced 2025-06-28 08:57:07 +00:00
Configurable maximum concurrency in Risco local (#115226)
* Configurable maximum concurrency in Risco local * Show advanced Risco options in advanced mode
This commit is contained in:
parent
af7d0187cb
commit
a852a38d24
@ -38,7 +38,9 @@ from homeassistant.helpers.storage import Store
|
|||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
|
CONF_CONCURRENCY,
|
||||||
DATA_COORDINATOR,
|
DATA_COORDINATOR,
|
||||||
|
DEFAULT_CONCURRENCY,
|
||||||
DEFAULT_SCAN_INTERVAL,
|
DEFAULT_SCAN_INTERVAL,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
EVENTS_COORDINATOR,
|
EVENTS_COORDINATOR,
|
||||||
@ -85,7 +87,10 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
|
|
||||||
async def _async_setup_local_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
async def _async_setup_local_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||||
data = entry.data
|
data = entry.data
|
||||||
risco = RiscoLocal(data[CONF_HOST], data[CONF_PORT], data[CONF_PIN])
|
concurrency = entry.options.get(CONF_CONCURRENCY, DEFAULT_CONCURRENCY)
|
||||||
|
risco = RiscoLocal(
|
||||||
|
data[CONF_HOST], data[CONF_PORT], data[CONF_PIN], concurrency=concurrency
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await risco.connect()
|
await risco.connect()
|
||||||
|
@ -35,8 +35,10 @@ from .const import (
|
|||||||
CONF_CODE_ARM_REQUIRED,
|
CONF_CODE_ARM_REQUIRED,
|
||||||
CONF_CODE_DISARM_REQUIRED,
|
CONF_CODE_DISARM_REQUIRED,
|
||||||
CONF_COMMUNICATION_DELAY,
|
CONF_COMMUNICATION_DELAY,
|
||||||
|
CONF_CONCURRENCY,
|
||||||
CONF_HA_STATES_TO_RISCO,
|
CONF_HA_STATES_TO_RISCO,
|
||||||
CONF_RISCO_STATES_TO_HA,
|
CONF_RISCO_STATES_TO_HA,
|
||||||
|
DEFAULT_ADVANCED_OPTIONS,
|
||||||
DEFAULT_OPTIONS,
|
DEFAULT_OPTIONS,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
MAX_COMMUNICATION_DELAY,
|
MAX_COMMUNICATION_DELAY,
|
||||||
@ -225,11 +227,8 @@ class RiscoOptionsFlowHandler(OptionsFlow):
|
|||||||
self._data = {**DEFAULT_OPTIONS, **config_entry.options}
|
self._data = {**DEFAULT_OPTIONS, **config_entry.options}
|
||||||
|
|
||||||
def _options_schema(self) -> vol.Schema:
|
def _options_schema(self) -> vol.Schema:
|
||||||
return vol.Schema(
|
schema = vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Required(
|
|
||||||
CONF_SCAN_INTERVAL, default=self._data[CONF_SCAN_INTERVAL]
|
|
||||||
): int,
|
|
||||||
vol.Required(
|
vol.Required(
|
||||||
CONF_CODE_ARM_REQUIRED, default=self._data[CONF_CODE_ARM_REQUIRED]
|
CONF_CODE_ARM_REQUIRED, default=self._data[CONF_CODE_ARM_REQUIRED]
|
||||||
): bool,
|
): bool,
|
||||||
@ -239,6 +238,19 @@ class RiscoOptionsFlowHandler(OptionsFlow):
|
|||||||
): bool,
|
): bool,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
if self.show_advanced_options:
|
||||||
|
self._data = {**DEFAULT_ADVANCED_OPTIONS, **self._data}
|
||||||
|
schema = schema.extend(
|
||||||
|
{
|
||||||
|
vol.Required(
|
||||||
|
CONF_SCAN_INTERVAL, default=self._data[CONF_SCAN_INTERVAL]
|
||||||
|
): int,
|
||||||
|
vol.Required(
|
||||||
|
CONF_CONCURRENCY, default=self._data[CONF_CONCURRENCY]
|
||||||
|
): int,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return schema
|
||||||
|
|
||||||
async def async_step_init(
|
async def async_step_init(
|
||||||
self, user_input: dict[str, Any] | None = None
|
self, user_input: dict[str, Any] | None = None
|
||||||
|
@ -14,6 +14,7 @@ DATA_COORDINATOR = "risco"
|
|||||||
EVENTS_COORDINATOR = "risco_events"
|
EVENTS_COORDINATOR = "risco_events"
|
||||||
|
|
||||||
DEFAULT_SCAN_INTERVAL = 30
|
DEFAULT_SCAN_INTERVAL = 30
|
||||||
|
DEFAULT_CONCURRENCY = 4
|
||||||
|
|
||||||
TYPE_LOCAL = "local"
|
TYPE_LOCAL = "local"
|
||||||
|
|
||||||
@ -25,6 +26,7 @@ CONF_CODE_DISARM_REQUIRED = "code_disarm_required"
|
|||||||
CONF_RISCO_STATES_TO_HA = "risco_states_to_ha"
|
CONF_RISCO_STATES_TO_HA = "risco_states_to_ha"
|
||||||
CONF_HA_STATES_TO_RISCO = "ha_states_to_risco"
|
CONF_HA_STATES_TO_RISCO = "ha_states_to_risco"
|
||||||
CONF_COMMUNICATION_DELAY = "communication_delay"
|
CONF_COMMUNICATION_DELAY = "communication_delay"
|
||||||
|
CONF_CONCURRENCY = "concurrency"
|
||||||
|
|
||||||
RISCO_GROUPS = ["A", "B", "C", "D"]
|
RISCO_GROUPS = ["A", "B", "C", "D"]
|
||||||
RISCO_ARM = "arm"
|
RISCO_ARM = "arm"
|
||||||
@ -44,9 +46,13 @@ DEFAULT_HA_STATES_TO_RISCO = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
DEFAULT_OPTIONS = {
|
DEFAULT_OPTIONS = {
|
||||||
CONF_SCAN_INTERVAL: DEFAULT_SCAN_INTERVAL,
|
|
||||||
CONF_CODE_ARM_REQUIRED: False,
|
CONF_CODE_ARM_REQUIRED: False,
|
||||||
CONF_CODE_DISARM_REQUIRED: False,
|
CONF_CODE_DISARM_REQUIRED: False,
|
||||||
CONF_RISCO_STATES_TO_HA: DEFAULT_RISCO_STATES_TO_HA,
|
CONF_RISCO_STATES_TO_HA: DEFAULT_RISCO_STATES_TO_HA,
|
||||||
CONF_HA_STATES_TO_RISCO: DEFAULT_HA_STATES_TO_RISCO,
|
CONF_HA_STATES_TO_RISCO: DEFAULT_HA_STATES_TO_RISCO,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFAULT_ADVANCED_OPTIONS = {
|
||||||
|
CONF_SCAN_INTERVAL: DEFAULT_SCAN_INTERVAL,
|
||||||
|
CONF_CONCURRENCY: DEFAULT_CONCURRENCY,
|
||||||
|
}
|
||||||
|
@ -36,7 +36,8 @@
|
|||||||
"init": {
|
"init": {
|
||||||
"title": "Configure options",
|
"title": "Configure options",
|
||||||
"data": {
|
"data": {
|
||||||
"scan_interval": "How often to poll Risco (in seconds)",
|
"scan_interval": "How often to poll Risco Cloud (in seconds)",
|
||||||
|
"concurrency": "Maximum concurrent requests in Risco local",
|
||||||
"code_arm_required": "Require PIN to arm",
|
"code_arm_required": "Require PIN to arm",
|
||||||
"code_disarm_required": "Require PIN to disarm"
|
"code_disarm_required": "Require PIN to disarm"
|
||||||
}
|
}
|
||||||
|
@ -46,11 +46,15 @@ TEST_HA_TO_RISCO = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_OPTIONS = {
|
TEST_OPTIONS = {
|
||||||
"scan_interval": 10,
|
|
||||||
"code_arm_required": True,
|
"code_arm_required": True,
|
||||||
"code_disarm_required": True,
|
"code_disarm_required": True,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_ADVANCED_OPTIONS = {
|
||||||
|
"scan_interval": 10,
|
||||||
|
"concurrency": 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
async def test_cloud_form(hass: HomeAssistant) -> None:
|
async def test_cloud_form(hass: HomeAssistant) -> None:
|
||||||
"""Test we get the cloud form."""
|
"""Test we get the cloud form."""
|
||||||
@ -387,6 +391,53 @@ async def test_options_flow(hass: HomeAssistant) -> None:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async def test_advanced_options_flow(hass: HomeAssistant) -> None:
|
||||||
|
"""Test options flow."""
|
||||||
|
entry = MockConfigEntry(
|
||||||
|
domain=DOMAIN,
|
||||||
|
unique_id=TEST_CLOUD_DATA["username"],
|
||||||
|
data=TEST_CLOUD_DATA,
|
||||||
|
)
|
||||||
|
|
||||||
|
entry.add_to_hass(hass)
|
||||||
|
|
||||||
|
result = await hass.config_entries.options.async_init(
|
||||||
|
entry.entry_id, context={"show_advanced_options": True}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["type"] is FlowResultType.FORM
|
||||||
|
assert result["step_id"] == "init"
|
||||||
|
assert "concurrency" in result["data_schema"].schema
|
||||||
|
assert "scan_interval" in result["data_schema"].schema
|
||||||
|
result = await hass.config_entries.options.async_configure(
|
||||||
|
result["flow_id"], user_input={**TEST_OPTIONS, **TEST_ADVANCED_OPTIONS}
|
||||||
|
)
|
||||||
|
assert result["type"] is FlowResultType.FORM
|
||||||
|
assert result["step_id"] == "risco_to_ha"
|
||||||
|
|
||||||
|
result = await hass.config_entries.options.async_configure(
|
||||||
|
result["flow_id"],
|
||||||
|
user_input=TEST_RISCO_TO_HA,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["type"] is FlowResultType.FORM
|
||||||
|
assert result["step_id"] == "ha_to_risco"
|
||||||
|
|
||||||
|
with patch("homeassistant.components.risco.async_setup_entry", return_value=True):
|
||||||
|
result = await hass.config_entries.options.async_configure(
|
||||||
|
result["flow_id"],
|
||||||
|
user_input=TEST_HA_TO_RISCO,
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["type"] is FlowResultType.CREATE_ENTRY
|
||||||
|
assert entry.options == {
|
||||||
|
**TEST_OPTIONS,
|
||||||
|
**TEST_ADVANCED_OPTIONS,
|
||||||
|
"risco_states_to_ha": TEST_RISCO_TO_HA,
|
||||||
|
"ha_states_to_risco": TEST_HA_TO_RISCO,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
async def test_ha_to_risco_schema(hass: HomeAssistant) -> None:
|
async def test_ha_to_risco_schema(hass: HomeAssistant) -> None:
|
||||||
"""Test that the schema for the ha-to-risco mapping step is generated properly."""
|
"""Test that the schema for the ha-to-risco mapping step is generated properly."""
|
||||||
entry = MockConfigEntry(
|
entry = MockConfigEntry(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user