Bump python-hotspring to 3.0.0 (#182268)

Co-authored-by: Moustachauve <2206577+Moustachauve@users.noreply.github.com>
This commit is contained in:
Christophe Gagnier
2026-09-15 19:47:25 +02:00
committed by GitHub
co-authored by Moustachauve
parent 4d8106074b
commit f2f0c09ff5
7 changed files with 82 additions and 41 deletions
@@ -41,15 +41,17 @@ async def async_get_config_entry_diagnostics(
"data": {
"info": info,
"heater": asdict(spa.heater),
"jets": [asdict(jet) for jet in spa.jets],
"jets": [asdict(jet) for jet in spa.jets.values()],
"blower": asdict(spa.blower),
"light_zones": [asdict(zone) for zone in spa.light_zones],
"light_zones": [asdict(zone) for zone in spa.light_zones.values()],
"logo_light": asdict(spa.logo_light),
"clean_cycle": asdict(spa.clean_cycle),
"spa_lock": asdict(spa.spa_lock),
"water_care": asdict(spa.water_care),
"freshwater_iq": asdict(spa.freshwater_iq),
"energy_savings": [asdict(schedule) for schedule in spa.energy_savings],
"energy_savings": [
asdict(schedule) for schedule in spa.energy_savings.values()
],
"versions": asdict(spa.versions),
"connection_status": asdict(spa.connection_status),
"diagnostics": asdict(spa.diagnostics),
+2 -5
View File
@@ -40,7 +40,7 @@ async def async_setup_entry(
coordinator = entry.runtime_data
async_add_entities(
HotSpringLightEntity(coordinator, zone.zone_id)
for zone in coordinator.data.light_zones
for zone in coordinator.data.light_zones.values()
if zone.is_enabled
)
@@ -65,10 +65,7 @@ class HotSpringLightEntity(HotSpringEntity, LightEntity):
@property
def _zone(self) -> LightZone:
"""Return the light zone data."""
for zone in self.coordinator.data.light_zones:
if zone.zone_id == self._zone_id:
return zone
raise AssertionError("Light zone must exist in coordinator data")
return self.coordinator.data.light_zones[self._zone_id]
@property
@override
@@ -8,7 +8,7 @@
"iot_class": "local_polling",
"loggers": ["hotspring"],
"quality_scale": "platinum",
"requirements": ["python-hotspring==2.1.0"],
"requirements": ["python-hotspring==3.0.0"],
"zeroconf": [
{
"name": "watkins_spa*",
+1 -1
View File
@@ -2756,7 +2756,7 @@ python-homeassistant-analytics==0.9.0
python-homewizard-energy==10.2.0
# homeassistant.components.hotspring
python-hotspring==2.1.0
python-hotspring==3.0.0
# homeassistant.components.hp_ilo
python-hpilo==4.4.3
+12 -10
View File
@@ -107,13 +107,13 @@ def device_fixture() -> Spa:
boost_active=False,
salt_value=12,
)
spa.jets = [
Jet(jet_id=1, speed=JetSpeed.OFF, is_enabled=True, on_seconds=0),
Jet(jet_id=2, speed=JetSpeed.OFF, is_enabled=True, on_seconds=0),
]
spa.jets = {
1: Jet(jet_id=1, speed=JetSpeed.OFF, is_enabled=True, on_seconds=0),
2: Jet(jet_id=2, speed=JetSpeed.OFF, is_enabled=True, on_seconds=0),
}
spa.blower = Blower(is_enabled=False, is_on=False)
spa.light_zones = [
LightZone(
spa.light_zones = {
1: LightZone(
zone_id=1,
is_enabled=True,
is_on=False,
@@ -122,7 +122,7 @@ def device_fixture() -> Spa:
intensity=0,
loop_speed=0,
),
]
}
spa.logo_light = LogoLight(brightness=BrightnessLevel.LEVEL_1)
spa.clean_cycle = CleanCycle(is_enabled=False, vanishing_act=False)
spa.spa_lock = SpaLock(is_locked=False)
@@ -134,9 +134,11 @@ def device_fixture() -> Spa:
sensor_life_percentage=100.0,
installed=False,
)
spa.energy_savings = [
EnergySaving(schedule_id=1, mode=0, start_hour=0, start_minute=0, duration=0),
]
spa.energy_savings = {
1: EnergySaving(
schedule_id=1, mode=0, start_hour=0, start_minute=0, duration=0
),
}
spa.connection_status = ConnectionStatus(spa_connected=True)
spa.diagnostics = Diagnostics(
spa_failure_state=SpaFailureState.OK,
@@ -7,13 +7,17 @@
'is_on': False,
}),
'clean_cycle': dict({
'clean_timer_enabled': False,
'is_enabled': False,
'start_hour': 0,
'start_minute': 0,
'vanishing_act': False,
}),
'connection_status': dict({
'spa_connected': True,
}),
'diagnostics': dict({
'circulation_pump_flow_status': '0',
'heater_error': '0',
'heater_power': '0',
'heater_volts': 240.0,
@@ -22,8 +26,10 @@
'jet3_volts': 0.0,
'l1_n_volts': 120.0,
'l2_n_volts': 120.0,
'limit_thermistor_status': '0',
'power_frequency': '60',
'pressure_switch_status': '0',
'regulation_thermistor_temp_status': '0',
'small_loads_power': '0',
'spa_failure_state': dict({
'__type': "<enum 'SpaFailureState'>",
@@ -82,6 +88,8 @@
}),
'jets': list([
dict({
'concurrent_mode': False,
'current': 0.0,
'is_enabled': True,
'jet_id': 1,
'on_seconds': 0,
@@ -89,8 +97,14 @@
'__type': "<enum 'JetSpeed'>",
'repr': "<JetSpeed.OFF: 'off'>",
}),
'speed_type': dict({
'__type': "<enum 'JetSpeedType'>",
'repr': "<JetSpeedType.UNKNOWN: 'unknown'>",
}),
}),
dict({
'concurrent_mode': False,
'current': 0.0,
'is_enabled': True,
'jet_id': 2,
'on_seconds': 0,
@@ -98,6 +112,10 @@
'__type': "<enum 'JetSpeed'>",
'repr': "<JetSpeed.OFF: 'off'>",
}),
'speed_type': dict({
'__type': "<enum 'JetSpeedType'>",
'repr': "<JetSpeedType.UNKNOWN: 'unknown'>",
}),
}),
]),
'light_zones': list([
@@ -157,6 +175,8 @@
'cartridge_installed': True,
'level': 2,
'one_twenty_day_timer': 117,
'power_a': False,
'power_b': False,
'salt_value': 12,
'system_enabled': True,
'ten_day_timer': 0,
@@ -175,13 +195,17 @@
'is_on': False,
}),
'clean_cycle': dict({
'clean_timer_enabled': False,
'is_enabled': False,
'start_hour': 0,
'start_minute': 0,
'vanishing_act': False,
}),
'connection_status': dict({
'spa_connected': True,
}),
'diagnostics': dict({
'circulation_pump_flow_status': '0',
'heater_error': '0',
'heater_power': '0',
'heater_volts': 240.0,
@@ -190,8 +214,10 @@
'jet3_volts': 0.0,
'l1_n_volts': 120.0,
'l2_n_volts': 120.0,
'limit_thermistor_status': '0',
'power_frequency': '60',
'pressure_switch_status': '0',
'regulation_thermistor_temp_status': '0',
'small_loads_power': '0',
'spa_failure_state': dict({
'__type': "<enum 'SpaFailureState'>",
@@ -250,6 +276,8 @@
}),
'jets': list([
dict({
'concurrent_mode': False,
'current': 0.0,
'is_enabled': True,
'jet_id': 1,
'on_seconds': 0,
@@ -257,8 +285,14 @@
'__type': "<enum 'JetSpeed'>",
'repr': "<JetSpeed.OFF: 'off'>",
}),
'speed_type': dict({
'__type': "<enum 'JetSpeedType'>",
'repr': "<JetSpeedType.UNKNOWN: 'unknown'>",
}),
}),
dict({
'concurrent_mode': False,
'current': 0.0,
'is_enabled': True,
'jet_id': 2,
'on_seconds': 0,
@@ -266,6 +300,10 @@
'__type': "<enum 'JetSpeed'>",
'repr': "<JetSpeed.OFF: 'off'>",
}),
'speed_type': dict({
'__type': "<enum 'JetSpeedType'>",
'repr': "<JetSpeedType.UNKNOWN: 'unknown'>",
}),
}),
]),
'light_zones': list([
@@ -325,6 +363,8 @@
'cartridge_installed': True,
'level': 2,
'one_twenty_day_timer': 117,
'power_a': False,
'power_b': False,
'salt_value': 12,
'system_enabled': True,
'ten_day_timer': 0,
+21 -21
View File
@@ -60,8 +60,8 @@ async def test_turn_on_default(
assert state.attributes.get(ATTR_BRIGHTNESS) is None
def _set_light_brightness(zone: int, brightness: int) -> None:
device_fixture.light_zones[0].intensity = brightness
device_fixture.light_zones[0].is_on = brightness > 0
device_fixture.light_zones[1].intensity = brightness
device_fixture.light_zones[1].is_on = brightness > 0
mock_hotspring.set_light_brightness.side_effect = _set_light_brightness
@@ -88,8 +88,8 @@ async def test_turn_on_with_brightness(
"""Test turning on light with brightness."""
def _set_light_brightness(zone: int, brightness: int) -> None:
device_fixture.light_zones[0].intensity = brightness
device_fixture.light_zones[0].is_on = brightness > 0
device_fixture.light_zones[1].intensity = brightness
device_fixture.light_zones[1].is_on = brightness > 0
mock_hotspring.set_light_brightness.side_effect = _set_light_brightness
@@ -137,8 +137,8 @@ async def test_turn_on_with_rgb_color_when_on(
device_fixture: Spa,
) -> None:
"""Test setting rgb color when light is already on."""
device_fixture.light_zones = [
LightZone(
device_fixture.light_zones = {
1: LightZone(
zone_id=1,
is_enabled=True,
is_on=True,
@@ -147,7 +147,7 @@ async def test_turn_on_with_rgb_color_when_on(
intensity=3,
loop_speed=0,
),
]
}
await setup_with_selected_platforms(hass, mock_config_entry, [Platform.LIGHT])
await hass.services.async_call(
@@ -192,8 +192,8 @@ async def test_rgb_color_active_custom(
device_fixture: Spa,
) -> None:
"""Test rgb_color property returns custom RGB values when active."""
device_fixture.light_zones = [
LightZone(
device_fixture.light_zones = {
1: LightZone(
zone_id=1,
is_enabled=True,
is_on=True,
@@ -206,7 +206,7 @@ async def test_rgb_color_active_custom(
c_blue=50,
rgb_state="active",
),
]
}
await setup_with_selected_platforms(hass, mock_config_entry, [Platform.LIGHT])
state = hass.states.get(ENTITY_ID)
@@ -221,8 +221,8 @@ async def test_rgb_color_all_zero(
device_fixture: Spa,
) -> None:
"""Test rgb_color property returns (0, 0, 0) when rgb_state is active."""
device_fixture.light_zones = [
LightZone(
device_fixture.light_zones = {
1: LightZone(
zone_id=1,
is_enabled=True,
is_on=True,
@@ -235,7 +235,7 @@ async def test_rgb_color_all_zero(
c_blue=0,
rgb_state="active",
),
]
}
await setup_with_selected_platforms(hass, mock_config_entry, [Platform.LIGHT])
state = hass.states.get(ENTITY_ID)
@@ -250,8 +250,8 @@ async def test_turn_off(
device_fixture: Spa,
) -> None:
"""Test turning off light."""
device_fixture.light_zones = [
LightZone(
device_fixture.light_zones = {
1: LightZone(
zone_id=1,
is_enabled=True,
is_on=True,
@@ -260,12 +260,12 @@ async def test_turn_off(
intensity=5,
loop_speed=0,
),
]
}
await setup_with_selected_platforms(hass, mock_config_entry, [Platform.LIGHT])
def _turn_off_light(zone: int) -> None:
device_fixture.light_zones[0].intensity = 0
device_fixture.light_zones[0].is_on = False
device_fixture.light_zones[1].intensity = 0
device_fixture.light_zones[1].is_on = False
mock_hotspring.turn_off_light.side_effect = _turn_off_light
@@ -352,8 +352,8 @@ async def test_disabled_zone_not_added(
entity_registry: er.EntityRegistry,
) -> None:
"""Test disabled light zones are not added to entity registry."""
device_fixture.light_zones = [
LightZone(
device_fixture.light_zones = {
1: LightZone(
zone_id=1,
is_enabled=False,
is_on=False,
@@ -362,7 +362,7 @@ async def test_disabled_zone_not_added(
intensity=0,
loop_speed=0,
),
]
}
await setup_with_selected_platforms(hass, mock_config_entry, [Platform.LIGHT])
assert not entity_registry.async_is_registered(ENTITY_ID)