Remove YAML support from nuheat (#45380)
This commit is contained in:
parent
e92c4c99d5
commit
a0b906005d
6 changed files with 29 additions and 98 deletions
|
@ -5,11 +5,9 @@ import logging
|
||||||
|
|
||||||
import nuheat
|
import nuheat
|
||||||
import requests
|
import requests
|
||||||
import voluptuous as vol
|
|
||||||
|
|
||||||
from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
CONF_DEVICES,
|
|
||||||
CONF_PASSWORD,
|
CONF_PASSWORD,
|
||||||
CONF_USERNAME,
|
CONF_USERNAME,
|
||||||
HTTP_BAD_REQUEST,
|
HTTP_BAD_REQUEST,
|
||||||
|
@ -24,49 +22,12 @@ from .const import CONF_SERIAL_NUMBER, DOMAIN, PLATFORMS
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema(
|
CONFIG_SCHEMA = cv.deprecated(DOMAIN)
|
||||||
{
|
|
||||||
DOMAIN: vol.Schema(
|
|
||||||
{
|
|
||||||
vol.Required(CONF_USERNAME): cv.string,
|
|
||||||
vol.Required(CONF_PASSWORD): cv.string,
|
|
||||||
vol.Required(CONF_DEVICES, default=[]): vol.All(
|
|
||||||
cv.ensure_list, [cv.string]
|
|
||||||
),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
},
|
|
||||||
extra=vol.ALLOW_EXTRA,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
async def async_setup(hass: HomeAssistant, config: dict):
|
async def async_setup(hass: HomeAssistant, config: dict):
|
||||||
"""Set up the NuHeat component."""
|
"""Set up the NuHeat component."""
|
||||||
hass.data.setdefault(DOMAIN, {})
|
hass.data.setdefault(DOMAIN, {})
|
||||||
conf = config.get(DOMAIN)
|
|
||||||
if not conf:
|
|
||||||
return True
|
|
||||||
|
|
||||||
for serial_number in conf[CONF_DEVICES]:
|
|
||||||
# Since the api currently doesn't permit fetching the serial numbers
|
|
||||||
# and they have to be specified we create a separate config entry for
|
|
||||||
# each serial number. This won't increase the number of http
|
|
||||||
# requests as each thermostat has to be updated anyways.
|
|
||||||
# This also allows us to validate that the entered valid serial
|
|
||||||
# numbers and do not end up with a config entry where half of the
|
|
||||||
# devices work.
|
|
||||||
hass.async_create_task(
|
|
||||||
hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN,
|
|
||||||
context={"source": SOURCE_IMPORT},
|
|
||||||
data={
|
|
||||||
CONF_USERNAME: conf[CONF_USERNAME],
|
|
||||||
CONF_PASSWORD: conf[CONF_PASSWORD],
|
|
||||||
CONF_SERIAL_NUMBER: serial_number,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -92,13 +92,6 @@ class ConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
||||||
step_id="user", data_schema=DATA_SCHEMA, errors=errors
|
step_id="user", data_schema=DATA_SCHEMA, errors=errors
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_step_import(self, user_input):
|
|
||||||
"""Handle import."""
|
|
||||||
await self.async_set_unique_id(user_input[CONF_SERIAL_NUMBER])
|
|
||||||
self._abort_if_unique_id_configured()
|
|
||||||
|
|
||||||
return await self.async_step_user(user_input)
|
|
||||||
|
|
||||||
|
|
||||||
class CannotConnect(exceptions.HomeAssistantError):
|
class CannotConnect(exceptions.HomeAssistantError):
|
||||||
"""Error to indicate we cannot connect."""
|
"""Error to indicate we cannot connect."""
|
||||||
|
|
|
@ -3,9 +3,15 @@ from unittest.mock import MagicMock, Mock
|
||||||
|
|
||||||
from nuheat.config import SCHEDULE_HOLD, SCHEDULE_RUN, SCHEDULE_TEMPORARY_HOLD
|
from nuheat.config import SCHEDULE_HOLD, SCHEDULE_RUN, SCHEDULE_TEMPORARY_HOLD
|
||||||
|
|
||||||
from homeassistant.components.nuheat.const import DOMAIN
|
from homeassistant.components.nuheat.const import CONF_SERIAL_NUMBER, DOMAIN
|
||||||
from homeassistant.const import CONF_DEVICES, CONF_PASSWORD, CONF_USERNAME
|
from homeassistant.const import CONF_DEVICES, CONF_PASSWORD, CONF_USERNAME
|
||||||
|
|
||||||
|
MOCK_CONFIG_ENTRY = {
|
||||||
|
CONF_USERNAME: "me",
|
||||||
|
CONF_PASSWORD: "secret",
|
||||||
|
CONF_SERIAL_NUMBER: 12345,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def _get_mock_thermostat_run():
|
def _get_mock_thermostat_run():
|
||||||
serial_number = "12345"
|
serial_number = "12345"
|
||||||
|
|
|
@ -4,19 +4,18 @@ from unittest.mock import patch
|
||||||
|
|
||||||
from homeassistant.components.nuheat.const import DOMAIN
|
from homeassistant.components.nuheat.const import DOMAIN
|
||||||
from homeassistant.const import ATTR_ENTITY_ID
|
from homeassistant.const import ATTR_ENTITY_ID
|
||||||
from homeassistant.setup import async_setup_component
|
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
from .mocks import (
|
from .mocks import (
|
||||||
|
MOCK_CONFIG_ENTRY,
|
||||||
_get_mock_nuheat,
|
_get_mock_nuheat,
|
||||||
_get_mock_thermostat_run,
|
_get_mock_thermostat_run,
|
||||||
_get_mock_thermostat_schedule_hold_available,
|
_get_mock_thermostat_schedule_hold_available,
|
||||||
_get_mock_thermostat_schedule_hold_unavailable,
|
_get_mock_thermostat_schedule_hold_unavailable,
|
||||||
_get_mock_thermostat_schedule_temporary_hold,
|
_get_mock_thermostat_schedule_temporary_hold,
|
||||||
_mock_get_config,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
from tests.common import async_fire_time_changed
|
from tests.common import MockConfigEntry, async_fire_time_changed
|
||||||
|
|
||||||
|
|
||||||
async def test_climate_thermostat_run(hass):
|
async def test_climate_thermostat_run(hass):
|
||||||
|
@ -28,7 +27,9 @@ async def test_climate_thermostat_run(hass):
|
||||||
"homeassistant.components.nuheat.nuheat.NuHeat",
|
"homeassistant.components.nuheat.nuheat.NuHeat",
|
||||||
return_value=mock_nuheat,
|
return_value=mock_nuheat,
|
||||||
):
|
):
|
||||||
assert await async_setup_component(hass, DOMAIN, _mock_get_config())
|
config_entry = MockConfigEntry(domain=DOMAIN, data=MOCK_CONFIG_ENTRY)
|
||||||
|
config_entry.add_to_hass(hass)
|
||||||
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
state = hass.states.get("climate.master_bathroom")
|
state = hass.states.get("climate.master_bathroom")
|
||||||
|
@ -59,7 +60,9 @@ async def test_climate_thermostat_schedule_hold_unavailable(hass):
|
||||||
"homeassistant.components.nuheat.nuheat.NuHeat",
|
"homeassistant.components.nuheat.nuheat.NuHeat",
|
||||||
return_value=mock_nuheat,
|
return_value=mock_nuheat,
|
||||||
):
|
):
|
||||||
assert await async_setup_component(hass, DOMAIN, _mock_get_config())
|
config_entry = MockConfigEntry(domain=DOMAIN, data=MOCK_CONFIG_ENTRY)
|
||||||
|
config_entry.add_to_hass(hass)
|
||||||
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
state = hass.states.get("climate.guest_bathroom")
|
state = hass.states.get("climate.guest_bathroom")
|
||||||
|
@ -87,7 +90,9 @@ async def test_climate_thermostat_schedule_hold_available(hass):
|
||||||
"homeassistant.components.nuheat.nuheat.NuHeat",
|
"homeassistant.components.nuheat.nuheat.NuHeat",
|
||||||
return_value=mock_nuheat,
|
return_value=mock_nuheat,
|
||||||
):
|
):
|
||||||
assert await async_setup_component(hass, DOMAIN, _mock_get_config())
|
config_entry = MockConfigEntry(domain=DOMAIN, data=MOCK_CONFIG_ENTRY)
|
||||||
|
config_entry.add_to_hass(hass)
|
||||||
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
state = hass.states.get("climate.available_bathroom")
|
state = hass.states.get("climate.available_bathroom")
|
||||||
|
@ -119,7 +124,9 @@ async def test_climate_thermostat_schedule_temporary_hold(hass):
|
||||||
"homeassistant.components.nuheat.nuheat.NuHeat",
|
"homeassistant.components.nuheat.nuheat.NuHeat",
|
||||||
return_value=mock_nuheat,
|
return_value=mock_nuheat,
|
||||||
):
|
):
|
||||||
assert await async_setup_component(hass, DOMAIN, _mock_get_config())
|
config_entry = MockConfigEntry(domain=DOMAIN, data=MOCK_CONFIG_ENTRY)
|
||||||
|
config_entry.add_to_hass(hass)
|
||||||
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
state = hass.states.get("climate.temp_bathroom")
|
state = hass.states.get("climate.temp_bathroom")
|
||||||
|
|
|
@ -53,45 +53,6 @@ async def test_form_user(hass):
|
||||||
assert len(mock_setup_entry.mock_calls) == 1
|
assert len(mock_setup_entry.mock_calls) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_form_import(hass):
|
|
||||||
"""Test we get the form with import source."""
|
|
||||||
await setup.async_setup_component(hass, "persistent_notification", {})
|
|
||||||
|
|
||||||
mock_thermostat = _get_mock_thermostat_run()
|
|
||||||
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.nuheat.config_flow.nuheat.NuHeat.authenticate",
|
|
||||||
return_value=True,
|
|
||||||
), patch(
|
|
||||||
"homeassistant.components.nuheat.config_flow.nuheat.NuHeat.get_thermostat",
|
|
||||||
return_value=mock_thermostat,
|
|
||||||
), patch(
|
|
||||||
"homeassistant.components.nuheat.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.nuheat.async_setup_entry", return_value=True
|
|
||||||
) as mock_setup_entry:
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
|
||||||
DOMAIN,
|
|
||||||
context={"source": config_entries.SOURCE_IMPORT},
|
|
||||||
data={
|
|
||||||
CONF_SERIAL_NUMBER: "12345",
|
|
||||||
CONF_USERNAME: "test-username",
|
|
||||||
CONF_PASSWORD: "test-password",
|
|
||||||
},
|
|
||||||
)
|
|
||||||
await hass.async_block_till_done()
|
|
||||||
|
|
||||||
assert result["type"] == "create_entry"
|
|
||||||
assert result["title"] == "Master bathroom"
|
|
||||||
assert result["data"] == {
|
|
||||||
CONF_SERIAL_NUMBER: "12345",
|
|
||||||
CONF_USERNAME: "test-username",
|
|
||||||
CONF_PASSWORD: "test-password",
|
|
||||||
}
|
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.mock_calls) == 1
|
|
||||||
|
|
||||||
|
|
||||||
async def test_form_invalid_auth(hass):
|
async def test_form_invalid_auth(hass):
|
||||||
"""Test we handle invalid auth."""
|
"""Test we handle invalid auth."""
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
|
|
|
@ -2,9 +2,10 @@
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
from homeassistant.components.nuheat.const import DOMAIN
|
from homeassistant.components.nuheat.const import DOMAIN
|
||||||
from homeassistant.setup import async_setup_component
|
|
||||||
|
|
||||||
from .mocks import _get_mock_nuheat
|
from .mocks import MOCK_CONFIG_ENTRY, _get_mock_nuheat
|
||||||
|
|
||||||
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
VALID_CONFIG = {
|
VALID_CONFIG = {
|
||||||
"nuheat": {"username": "warm", "password": "feet", "devices": "thermostat123"}
|
"nuheat": {"username": "warm", "password": "feet", "devices": "thermostat123"}
|
||||||
|
@ -20,5 +21,7 @@ async def test_init_success(hass):
|
||||||
"homeassistant.components.nuheat.nuheat.NuHeat",
|
"homeassistant.components.nuheat.nuheat.NuHeat",
|
||||||
return_value=mock_nuheat,
|
return_value=mock_nuheat,
|
||||||
):
|
):
|
||||||
assert await async_setup_component(hass, DOMAIN, VALID_CONFIG)
|
config_entry = MockConfigEntry(domain=DOMAIN, data=MOCK_CONFIG_ENTRY)
|
||||||
|
config_entry.add_to_hass(hass)
|
||||||
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
Loading…
Add table
Reference in a new issue