Add Support for SleepIQ Foot Warmers (#105931)

* Add foot warmer support

* Add Tests for foot warmers

* Move attr options out of constructor

* Change options to lowercase

* Update test and translations

* Switch back to entity

* Update homeassistant/components/sleepiq/strings.json

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
This commit is contained in:
Keilin Bickar 2023-12-26 17:31:00 -05:00 committed by GitHub
parent 51a50fc134
commit 615cd56f03
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 271 additions and 11 deletions

View file

@ -1,6 +1,8 @@
"""Tests for the SleepIQ select platform."""
from unittest.mock import MagicMock
from asyncsleepiq import FootWarmingTemps
from homeassistant.components.select import DOMAIN, SERVICE_SELECT_OPTION
from homeassistant.const import (
ATTR_ENTITY_ID,
@ -15,8 +17,15 @@ from .conftest import (
BED_ID,
BED_NAME,
BED_NAME_LOWER,
FOOT_WARM_TIME,
PRESET_L_STATE,
PRESET_R_STATE,
SLEEPER_L_ID,
SLEEPER_L_NAME,
SLEEPER_L_NAME_LOWER,
SLEEPER_R_ID,
SLEEPER_R_NAME,
SLEEPER_R_NAME_LOWER,
setup_platform,
)
@ -115,3 +124,74 @@ async def test_single_foundation_preset(
mock_asyncsleepiq_single_foundation.beds[BED_ID].foundation.presets[
0
].set_preset.assert_called_with("Zero G")
async def test_foot_warmer(hass: HomeAssistant, mock_asyncsleepiq: MagicMock) -> None:
"""Test the SleepIQ select entity for foot warmers."""
entry = await setup_platform(hass, DOMAIN)
entity_registry = er.async_get(hass)
state = hass.states.get(
f"select.sleepnumber_{BED_NAME_LOWER}_{SLEEPER_L_NAME_LOWER}_foot_warmer"
)
assert state.state == FootWarmingTemps.MEDIUM.name.lower()
assert state.attributes.get(ATTR_ICON) == "mdi:heat-wave"
assert (
state.attributes.get(ATTR_FRIENDLY_NAME)
== f"SleepNumber {BED_NAME} {SLEEPER_L_NAME} Foot Warmer"
)
entry = entity_registry.async_get(
f"select.sleepnumber_{BED_NAME_LOWER}_{SLEEPER_L_NAME_LOWER}_foot_warmer"
)
assert entry
assert entry.unique_id == f"{SLEEPER_L_ID}_foot_warmer"
await hass.services.async_call(
DOMAIN,
SERVICE_SELECT_OPTION,
{
ATTR_ENTITY_ID: f"select.sleepnumber_{BED_NAME_LOWER}_{SLEEPER_L_NAME_LOWER}_foot_warmer",
ATTR_OPTION: "off",
},
blocking=True,
)
await hass.async_block_till_done()
mock_asyncsleepiq.beds[BED_ID].foundation.foot_warmers[
0
].turn_off.assert_called_once()
state = hass.states.get(
f"select.sleepnumber_{BED_NAME_LOWER}_{SLEEPER_R_NAME_LOWER}_foot_warmer"
)
assert state.state == FootWarmingTemps.OFF.name.lower()
assert state.attributes.get(ATTR_ICON) == "mdi:heat-wave"
assert (
state.attributes.get(ATTR_FRIENDLY_NAME)
== f"SleepNumber {BED_NAME} {SLEEPER_R_NAME} Foot Warmer"
)
entry = entity_registry.async_get(
f"select.sleepnumber_{BED_NAME_LOWER}_{SLEEPER_R_NAME_LOWER}_foot_warmer"
)
assert entry
assert entry.unique_id == f"{SLEEPER_R_ID}_foot_warmer"
await hass.services.async_call(
DOMAIN,
SERVICE_SELECT_OPTION,
{
ATTR_ENTITY_ID: f"select.sleepnumber_{BED_NAME_LOWER}_{SLEEPER_R_NAME_LOWER}_foot_warmer",
ATTR_OPTION: "high",
},
blocking=True,
)
await hass.async_block_till_done()
mock_asyncsleepiq.beds[BED_ID].foundation.foot_warmers[
1
].turn_on.assert_called_once()
mock_asyncsleepiq.beds[BED_ID].foundation.foot_warmers[
1
].turn_on.assert_called_with(FootWarmingTemps.HIGH, FOOT_WARM_TIME)