Fix RainMachine bugs (#106231)
This commit is contained in:
parent
c19688e2d2
commit
25f9c5f34b
7 changed files with 45 additions and 7 deletions
|
@ -38,6 +38,7 @@ from homeassistant.util.network import is_ip_address
|
||||||
|
|
||||||
from .config_flow import get_client_controller
|
from .config_flow import get_client_controller
|
||||||
from .const import (
|
from .const import (
|
||||||
|
CONF_ALLOW_INACTIVE_ZONES_TO_RUN,
|
||||||
CONF_DEFAULT_ZONE_RUN_TIME,
|
CONF_DEFAULT_ZONE_RUN_TIME,
|
||||||
CONF_DURATION,
|
CONF_DURATION,
|
||||||
CONF_USE_APP_RUN_TIMES,
|
CONF_USE_APP_RUN_TIMES,
|
||||||
|
@ -48,6 +49,7 @@ from .const import (
|
||||||
DATA_RESTRICTIONS_CURRENT,
|
DATA_RESTRICTIONS_CURRENT,
|
||||||
DATA_RESTRICTIONS_UNIVERSAL,
|
DATA_RESTRICTIONS_UNIVERSAL,
|
||||||
DATA_ZONES,
|
DATA_ZONES,
|
||||||
|
DEFAULT_ZONE_RUN,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
LOGGER,
|
LOGGER,
|
||||||
)
|
)
|
||||||
|
@ -249,8 +251,13 @@ async def async_setup_entry( # noqa: C901
|
||||||
**entry.options,
|
**entry.options,
|
||||||
CONF_DEFAULT_ZONE_RUN_TIME: data.pop(CONF_DEFAULT_ZONE_RUN_TIME),
|
CONF_DEFAULT_ZONE_RUN_TIME: data.pop(CONF_DEFAULT_ZONE_RUN_TIME),
|
||||||
}
|
}
|
||||||
|
entry_updates["options"] = {**entry.options}
|
||||||
if CONF_USE_APP_RUN_TIMES not in entry.options:
|
if CONF_USE_APP_RUN_TIMES not in entry.options:
|
||||||
entry_updates["options"] = {**entry.options, CONF_USE_APP_RUN_TIMES: False}
|
entry_updates["options"][CONF_USE_APP_RUN_TIMES] = False
|
||||||
|
if CONF_DEFAULT_ZONE_RUN_TIME not in entry.options:
|
||||||
|
entry_updates["options"][CONF_DEFAULT_ZONE_RUN_TIME] = DEFAULT_ZONE_RUN
|
||||||
|
if CONF_ALLOW_INACTIVE_ZONES_TO_RUN not in entry.options:
|
||||||
|
entry_updates["options"][CONF_ALLOW_INACTIVE_ZONES_TO_RUN] = False
|
||||||
if entry_updates:
|
if entry_updates:
|
||||||
hass.config_entries.async_update_entry(entry, **entry_updates)
|
hass.config_entries.async_update_entry(entry, **entry_updates)
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@ from homeassistant.data_entry_flow import FlowResult
|
||||||
from homeassistant.helpers import aiohttp_client, config_validation as cv
|
from homeassistant.helpers import aiohttp_client, config_validation as cv
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
|
CONF_ALLOW_INACTIVE_ZONES_TO_RUN,
|
||||||
CONF_DEFAULT_ZONE_RUN_TIME,
|
CONF_DEFAULT_ZONE_RUN_TIME,
|
||||||
CONF_USE_APP_RUN_TIMES,
|
CONF_USE_APP_RUN_TIMES,
|
||||||
DEFAULT_PORT,
|
DEFAULT_PORT,
|
||||||
|
@ -188,6 +189,12 @@ class RainMachineOptionsFlowHandler(config_entries.OptionsFlow):
|
||||||
CONF_USE_APP_RUN_TIMES,
|
CONF_USE_APP_RUN_TIMES,
|
||||||
default=self.config_entry.options.get(CONF_USE_APP_RUN_TIMES),
|
default=self.config_entry.options.get(CONF_USE_APP_RUN_TIMES),
|
||||||
): bool,
|
): bool,
|
||||||
|
vol.Optional(
|
||||||
|
CONF_ALLOW_INACTIVE_ZONES_TO_RUN,
|
||||||
|
default=self.config_entry.options.get(
|
||||||
|
CONF_ALLOW_INACTIVE_ZONES_TO_RUN
|
||||||
|
),
|
||||||
|
): bool,
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
|
@ -8,6 +8,7 @@ DOMAIN = "rainmachine"
|
||||||
CONF_DURATION = "duration"
|
CONF_DURATION = "duration"
|
||||||
CONF_DEFAULT_ZONE_RUN_TIME = "zone_run_time"
|
CONF_DEFAULT_ZONE_RUN_TIME = "zone_run_time"
|
||||||
CONF_USE_APP_RUN_TIMES = "use_app_run_times"
|
CONF_USE_APP_RUN_TIMES = "use_app_run_times"
|
||||||
|
CONF_ALLOW_INACTIVE_ZONES_TO_RUN = "allow_inactive_zones_to_run"
|
||||||
|
|
||||||
DATA_API_VERSIONS = "api.versions"
|
DATA_API_VERSIONS = "api.versions"
|
||||||
DATA_MACHINE_FIRMWARE_UPDATE_STATUS = "machine.firmware_update_status"
|
DATA_MACHINE_FIRMWARE_UPDATE_STATUS = "machine.firmware_update_status"
|
||||||
|
|
|
@ -24,7 +24,8 @@
|
||||||
"title": "Configure RainMachine",
|
"title": "Configure RainMachine",
|
||||||
"data": {
|
"data": {
|
||||||
"zone_run_time": "Default zone run time (in seconds)",
|
"zone_run_time": "Default zone run time (in seconds)",
|
||||||
"use_app_run_times": "Use zone run times from RainMachine app"
|
"use_app_run_times": "Use zone run times from the RainMachine app",
|
||||||
|
"allow_inactive_zones_to_run": "Allow disabled zones to be run manually"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
|
|
||||||
from . import RainMachineData, RainMachineEntity, async_update_programs_and_zones
|
from . import RainMachineData, RainMachineEntity, async_update_programs_and_zones
|
||||||
from .const import (
|
from .const import (
|
||||||
|
CONF_ALLOW_INACTIVE_ZONES_TO_RUN,
|
||||||
CONF_DEFAULT_ZONE_RUN_TIME,
|
CONF_DEFAULT_ZONE_RUN_TIME,
|
||||||
CONF_DURATION,
|
CONF_DURATION,
|
||||||
CONF_USE_APP_RUN_TIMES,
|
CONF_USE_APP_RUN_TIMES,
|
||||||
|
@ -300,7 +301,10 @@ class RainMachineActivitySwitch(RainMachineBaseSwitch):
|
||||||
The only way this could occur is if someone rapidly turns a disabled activity
|
The only way this could occur is if someone rapidly turns a disabled activity
|
||||||
off right after turning it on.
|
off right after turning it on.
|
||||||
"""
|
"""
|
||||||
if not self.coordinator.data[self.entity_description.uid]["active"]:
|
if (
|
||||||
|
not self._entry.options[CONF_ALLOW_INACTIVE_ZONES_TO_RUN]
|
||||||
|
and not self.coordinator.data[self.entity_description.uid]["active"]
|
||||||
|
):
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
f"Cannot turn off an inactive program/zone: {self.name}"
|
f"Cannot turn off an inactive program/zone: {self.name}"
|
||||||
)
|
)
|
||||||
|
@ -314,7 +318,10 @@ class RainMachineActivitySwitch(RainMachineBaseSwitch):
|
||||||
|
|
||||||
async def async_turn_on(self, **kwargs: Any) -> None:
|
async def async_turn_on(self, **kwargs: Any) -> None:
|
||||||
"""Turn the switch on."""
|
"""Turn the switch on."""
|
||||||
if not self.coordinator.data[self.entity_description.uid]["active"]:
|
if (
|
||||||
|
not self._entry.options[CONF_ALLOW_INACTIVE_ZONES_TO_RUN]
|
||||||
|
and not self.coordinator.data[self.entity_description.uid]["active"]
|
||||||
|
):
|
||||||
self._attr_is_on = False
|
self._attr_is_on = False
|
||||||
self.async_write_ha_state()
|
self.async_write_ha_state()
|
||||||
raise HomeAssistantError(
|
raise HomeAssistantError(
|
||||||
|
|
|
@ -8,6 +8,7 @@ from regenmaschine.errors import RainMachineError
|
||||||
from homeassistant import config_entries, data_entry_flow, setup
|
from homeassistant import config_entries, data_entry_flow, setup
|
||||||
from homeassistant.components import zeroconf
|
from homeassistant.components import zeroconf
|
||||||
from homeassistant.components.rainmachine import (
|
from homeassistant.components.rainmachine import (
|
||||||
|
CONF_ALLOW_INACTIVE_ZONES_TO_RUN,
|
||||||
CONF_DEFAULT_ZONE_RUN_TIME,
|
CONF_DEFAULT_ZONE_RUN_TIME,
|
||||||
CONF_USE_APP_RUN_TIMES,
|
CONF_USE_APP_RUN_TIMES,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
|
@ -106,12 +107,17 @@ async def test_options_flow(hass: HomeAssistant, config, config_entry) -> None:
|
||||||
|
|
||||||
result = await hass.config_entries.options.async_configure(
|
result = await hass.config_entries.options.async_configure(
|
||||||
result["flow_id"],
|
result["flow_id"],
|
||||||
user_input={CONF_DEFAULT_ZONE_RUN_TIME: 600, CONF_USE_APP_RUN_TIMES: False},
|
user_input={
|
||||||
|
CONF_DEFAULT_ZONE_RUN_TIME: 600,
|
||||||
|
CONF_USE_APP_RUN_TIMES: False,
|
||||||
|
CONF_ALLOW_INACTIVE_ZONES_TO_RUN: False,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
|
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
|
||||||
assert config_entry.options == {
|
assert config_entry.options == {
|
||||||
CONF_DEFAULT_ZONE_RUN_TIME: 600,
|
CONF_DEFAULT_ZONE_RUN_TIME: 600,
|
||||||
CONF_USE_APP_RUN_TIMES: False,
|
CONF_USE_APP_RUN_TIMES: False,
|
||||||
|
CONF_ALLOW_INACTIVE_ZONES_TO_RUN: False,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
from regenmaschine.errors import RainMachineError
|
from regenmaschine.errors import RainMachineError
|
||||||
|
|
||||||
from homeassistant.components.diagnostics import REDACTED
|
from homeassistant.components.diagnostics import REDACTED
|
||||||
|
from homeassistant.components.rainmachine.const import DEFAULT_ZONE_RUN
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
from tests.components.diagnostics import get_diagnostics_for_config_entry
|
from tests.components.diagnostics import get_diagnostics_for_config_entry
|
||||||
|
@ -28,7 +29,11 @@ async def test_entry_diagnostics(
|
||||||
"port": 8080,
|
"port": 8080,
|
||||||
"ssl": True,
|
"ssl": True,
|
||||||
},
|
},
|
||||||
"options": {"use_app_run_times": False},
|
"options": {
|
||||||
|
"zone_run_time": DEFAULT_ZONE_RUN,
|
||||||
|
"use_app_run_times": False,
|
||||||
|
"allow_inactive_zones_to_run": False,
|
||||||
|
},
|
||||||
"pref_disable_new_entities": False,
|
"pref_disable_new_entities": False,
|
||||||
"pref_disable_polling": False,
|
"pref_disable_polling": False,
|
||||||
"source": "user",
|
"source": "user",
|
||||||
|
@ -655,7 +660,11 @@ async def test_entry_diagnostics_failed_controller_diagnostics(
|
||||||
"port": 8080,
|
"port": 8080,
|
||||||
"ssl": True,
|
"ssl": True,
|
||||||
},
|
},
|
||||||
"options": {"use_app_run_times": False},
|
"options": {
|
||||||
|
"zone_run_time": DEFAULT_ZONE_RUN,
|
||||||
|
"use_app_run_times": False,
|
||||||
|
"allow_inactive_zones_to_run": False,
|
||||||
|
},
|
||||||
"pref_disable_new_entities": False,
|
"pref_disable_new_entities": False,
|
||||||
"pref_disable_polling": False,
|
"pref_disable_polling": False,
|
||||||
"source": "user",
|
"source": "user",
|
||||||
|
|
Loading…
Add table
Reference in a new issue