Skip to content

Commit 3b60961

Browse files
authored
Miele refrigerators cause index out of range errors when offline (home-assistant#151299)
1 parent 0d9079e commit 3b60961

File tree

6 files changed

+851
-10
lines changed

6 files changed

+851
-10
lines changed

homeassistant/components/miele/climate.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from typing import Any, Final, cast
99

1010
import aiohttp
11-
from pymiele import MieleDevice
11+
from pymiele import MieleDevice, MieleTemperature
1212

1313
from homeassistant.components.climate import (
1414
ClimateEntity,
@@ -31,6 +31,15 @@
3131
_LOGGER = logging.getLogger(__name__)
3232

3333

34+
def _get_temperature_value(
35+
temperatures: list[MieleTemperature], index: int
36+
) -> float | None:
37+
"""Return the temperature value for the given index."""
38+
if len(temperatures) > index:
39+
return cast(int, temperatures[index].temperature) / 100.0
40+
return None
41+
42+
3443
@dataclass(frozen=True, kw_only=True)
3544
class MieleClimateDescription(ClimateEntityDescription):
3645
"""Class describing Miele climate entities."""
@@ -62,11 +71,10 @@ class MieleClimateDefinition:
6271
description=MieleClimateDescription(
6372
key="thermostat",
6473
value_fn=(
65-
lambda value: cast(int, value.state_temperatures[0].temperature) / 100.0
74+
lambda value: _get_temperature_value(value.state_temperatures, 0)
6675
),
6776
target_fn=(
68-
lambda value: cast(int, value.state_target_temperature[0].temperature)
69-
/ 100.0
77+
lambda value: _get_temperature_value(value.state_target_temperature, 0)
7078
),
7179
zone=1,
7280
),
@@ -84,11 +92,10 @@ class MieleClimateDefinition:
8492
description=MieleClimateDescription(
8593
key="thermostat2",
8694
value_fn=(
87-
lambda value: cast(int, value.state_temperatures[1].temperature) / 100.0
95+
lambda value: _get_temperature_value(value.state_temperatures, 1)
8896
),
8997
target_fn=(
90-
lambda value: cast(int, value.state_target_temperature[1].temperature)
91-
/ 100.0
98+
lambda value: _get_temperature_value(value.state_target_temperature, 1)
9299
),
93100
translation_key="zone_2",
94101
zone=2,
@@ -107,11 +114,10 @@ class MieleClimateDefinition:
107114
description=MieleClimateDescription(
108115
key="thermostat3",
109116
value_fn=(
110-
lambda value: cast(int, value.state_temperatures[2].temperature) / 100.0
117+
lambda value: _get_temperature_value(value.state_temperatures, 2)
111118
),
112119
target_fn=(
113-
lambda value: cast(int, value.state_target_temperature[2].temperature)
114-
/ 100.0
120+
lambda value: _get_temperature_value(value.state_target_temperature, 2)
115121
),
116122
translation_key="zone_3",
117123
zone=3,
@@ -219,6 +225,8 @@ def target_temperature(self) -> float | None:
219225
@property
220226
def max_temp(self) -> float:
221227
"""Return the maximum target temperature."""
228+
if len(self.action.target_temperature) < self.entity_description.zone:
229+
return super().max_temp
222230
return cast(
223231
float,
224232
self.action.target_temperature[self.entity_description.zone - 1].max,
@@ -227,6 +235,8 @@ def max_temp(self) -> float:
227235
@property
228236
def min_temp(self) -> float:
229237
"""Return the minimum target temperature."""
238+
if len(self.action.target_temperature) < self.entity_description.zone:
239+
return super().min_temp
230240
return cast(
231241
float,
232242
self.action.target_temperature[self.entity_description.zone - 1].min,
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"processAction": [],
3+
"light": [],
4+
"ambientLight": [],
5+
"startTime": [],
6+
"ventilationStep": [],
7+
"programId": [],
8+
"targetTemperature": [],
9+
"deviceName": false,
10+
"powerOn": false,
11+
"powerOff": false,
12+
"colors": [],
13+
"modes": [],
14+
"runOnTime": []
15+
}

tests/components/miele/fixtures/fridge_freezer.json

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,5 +110,82 @@
110110
"ecoFeedback": null,
111111
"batteryLevel": null
112112
}
113+
},
114+
"DummyAppliance_Fridge_Freezer_Offline": {
115+
"ident": {
116+
"type": {
117+
"key_localized": "Device type",
118+
"value_raw": 21,
119+
"value_localized": "Fridge freezer"
120+
},
121+
"deviceName": "",
122+
"protocolVersion": 203,
123+
"deviceIdentLabel": {
124+
"fabNumber": "**REDACTED**",
125+
"fabIndex": "00",
126+
"techType": "KFN 7734 C",
127+
"matNumber": "12336150",
128+
"swids": []
129+
},
130+
"xkmIdentLabel": {
131+
"techType": "EK037LHBM",
132+
"releaseVersion": "32.33"
133+
}
134+
},
135+
"state": {
136+
"ProgramID": {
137+
"value_raw": null,
138+
"value_localized": "",
139+
"key_localized": "Program name"
140+
},
141+
"status": {
142+
"value_raw": 255,
143+
"value_localized": "Not connected",
144+
"key_localized": "status"
145+
},
146+
"programType": {
147+
"value_raw": null,
148+
"value_localized": "",
149+
"key_localized": "Program type"
150+
},
151+
"programPhase": {
152+
"value_raw": null,
153+
"value_localized": "",
154+
"key_localized": "Program phase"
155+
},
156+
"remainingTime": [],
157+
"startTime": [],
158+
"targetTemperature": [],
159+
"coreTargetTemperature": [],
160+
"temperature": [],
161+
"coreTemperature": [],
162+
"remoteEnable": {
163+
"fullRemoteControl": false,
164+
"smartGrid": false,
165+
"mobileStart": null
166+
},
167+
"ambientLight": null,
168+
"light": null,
169+
"elapsedTime": [],
170+
"spinningSpeed": {
171+
"unit": "rpm",
172+
"value_raw": null,
173+
"value_localized": null,
174+
"key_localized": "Spin speed"
175+
},
176+
"dryingStep": {
177+
"value_raw": null,
178+
"value_localized": "",
179+
"key_localized": "Drying level"
180+
},
181+
"ventilationStep": {
182+
"value_raw": null,
183+
"value_localized": "",
184+
"key_localized": "Fan level"
185+
},
186+
"plateStep": [],
187+
"ecoFeedback": null,
188+
"batteryLevel": null
189+
}
113190
}
114191
}

0 commit comments

Comments
 (0)