PyPlumIO 0.5.22__py3-none-any.whl → 0.5.24__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {PyPlumIO-0.5.22.dist-info → PyPlumIO-0.5.24.dist-info}/METADATA +10 -8
- {PyPlumIO-0.5.22.dist-info → PyPlumIO-0.5.24.dist-info}/RECORD +18 -18
- {PyPlumIO-0.5.22.dist-info → PyPlumIO-0.5.24.dist-info}/WHEEL +1 -1
- pyplumio/_version.py +2 -2
- pyplumio/connection.py +1 -2
- pyplumio/devices/__init__.py +2 -2
- pyplumio/devices/ecomax.py +17 -17
- pyplumio/devices/mixer.py +6 -6
- pyplumio/devices/thermostat.py +6 -6
- pyplumio/helpers/event_manager.py +19 -10
- pyplumio/helpers/parameter.py +125 -57
- pyplumio/protocol.py +4 -3
- pyplumio/structures/ecomax_parameters.py +229 -208
- pyplumio/structures/mixer_parameters.py +80 -61
- pyplumio/structures/schedules.py +35 -15
- pyplumio/structures/thermostat_parameters.py +61 -42
- {PyPlumIO-0.5.22.dist-info → PyPlumIO-0.5.24.dist-info}/LICENSE +0 -0
- {PyPlumIO-0.5.22.dist-info → PyPlumIO-0.5.24.dist-info}/top_level.txt +0 -0
@@ -6,6 +6,8 @@ from collections.abc import Generator
|
|
6
6
|
from dataclasses import dataclass
|
7
7
|
from typing import TYPE_CHECKING, Any, Final
|
8
8
|
|
9
|
+
from dataslots import dataslots
|
10
|
+
|
9
11
|
from pyplumio.const import (
|
10
12
|
ATTR_DEVICE_INDEX,
|
11
13
|
ATTR_INDEX,
|
@@ -16,12 +18,14 @@ from pyplumio.const import (
|
|
16
18
|
)
|
17
19
|
from pyplumio.frames import Request
|
18
20
|
from pyplumio.helpers.parameter import (
|
19
|
-
|
20
|
-
|
21
|
+
SET_RETRIES,
|
22
|
+
Number,
|
23
|
+
NumberDescription,
|
21
24
|
Parameter,
|
22
25
|
ParameterDescription,
|
23
26
|
ParameterValues,
|
24
|
-
|
27
|
+
Switch,
|
28
|
+
SwitchDescription,
|
25
29
|
unpack_parameter,
|
26
30
|
)
|
27
31
|
from pyplumio.structures import StructureDecoder
|
@@ -35,8 +39,18 @@ ATTR_MIXER_PARAMETERS: Final = "mixer_parameters"
|
|
35
39
|
MIXER_PARAMETER_SIZE: Final = 3
|
36
40
|
|
37
41
|
|
42
|
+
@dataclass
|
43
|
+
class MixerParameterDescription(ParameterDescription):
|
44
|
+
"""Represents a mixer parameter description."""
|
45
|
+
|
46
|
+
__slots__ = ()
|
47
|
+
|
48
|
+
multiplier: float = 1.0
|
49
|
+
offset: int = 0
|
50
|
+
|
51
|
+
|
38
52
|
class MixerParameter(Parameter):
|
39
|
-
"""
|
53
|
+
"""Represent a mixer parameter."""
|
40
54
|
|
41
55
|
__slots__ = ()
|
42
56
|
|
@@ -55,186 +69,191 @@ class MixerParameter(Parameter):
|
|
55
69
|
},
|
56
70
|
)
|
57
71
|
|
58
|
-
async def set(self, value: ParameterValueType, retries: int = 5) -> bool:
|
59
|
-
"""Set a parameter value."""
|
60
|
-
if isinstance(value, (int, float)):
|
61
|
-
value = int((value + self.description.offset) / self.description.multiplier)
|
62
72
|
|
73
|
+
@dataslots
|
74
|
+
@dataclass
|
75
|
+
class MixerNumberDescription(MixerParameterDescription, NumberDescription):
|
76
|
+
"""Represent a mixer number description."""
|
77
|
+
|
78
|
+
|
79
|
+
class MixerNumber(MixerParameter, Number):
|
80
|
+
"""Represents a mixer number."""
|
81
|
+
|
82
|
+
__slots__ = ()
|
83
|
+
|
84
|
+
description: MixerNumberDescription
|
85
|
+
|
86
|
+
async def set(self, value: int | float, retries: int = SET_RETRIES) -> bool:
|
87
|
+
"""Set a parameter value."""
|
88
|
+
value = (value + self.description.offset) / self.description.multiplier
|
63
89
|
return await super().set(value, retries)
|
64
90
|
|
65
91
|
@property
|
66
|
-
def value(self) ->
|
92
|
+
def value(self) -> float:
|
67
93
|
"""Return the parameter value."""
|
68
94
|
return (
|
69
95
|
self.values.value - self.description.offset
|
70
96
|
) * self.description.multiplier
|
71
97
|
|
72
98
|
@property
|
73
|
-
def min_value(self) ->
|
99
|
+
def min_value(self) -> float:
|
74
100
|
"""Return the minimum allowed value."""
|
75
101
|
return (
|
76
102
|
self.values.min_value - self.description.offset
|
77
103
|
) * self.description.multiplier
|
78
104
|
|
79
105
|
@property
|
80
|
-
def max_value(self) ->
|
106
|
+
def max_value(self) -> float:
|
81
107
|
"""Return the maximum allowed value."""
|
82
108
|
return (
|
83
109
|
self.values.max_value - self.description.offset
|
84
110
|
) * self.description.multiplier
|
85
111
|
|
86
112
|
|
87
|
-
|
88
|
-
"""Represents a mixer binary parameter."""
|
89
|
-
|
90
|
-
__slots__ = ()
|
91
|
-
|
92
|
-
|
113
|
+
@dataslots
|
93
114
|
@dataclass
|
94
|
-
class MixerParameterDescription
|
95
|
-
"""Represents a mixer
|
115
|
+
class MixerSwitchDescription(MixerParameterDescription, SwitchDescription):
|
116
|
+
"""Represents a mixer switch description."""
|
96
117
|
|
97
|
-
multiplier: float = 1
|
98
|
-
offset: int = 0
|
99
118
|
|
119
|
+
class MixerSwitch(MixerParameter, Switch):
|
120
|
+
"""Represents a mixer switch."""
|
100
121
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
):
|
105
|
-
"""Represents a mixer binary parameter description."""
|
122
|
+
__slots__ = ()
|
123
|
+
|
124
|
+
description: MixerSwitchDescription
|
106
125
|
|
107
126
|
|
108
127
|
MIXER_PARAMETERS: dict[ProductType, tuple[MixerParameterDescription, ...]] = {
|
109
128
|
ProductType.ECOMAX_P: (
|
110
|
-
|
129
|
+
MixerNumberDescription(
|
111
130
|
name="mixer_target_temp",
|
112
131
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
113
132
|
),
|
114
|
-
|
133
|
+
MixerNumberDescription(
|
115
134
|
name="min_target_temp",
|
116
135
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
117
136
|
),
|
118
|
-
|
137
|
+
MixerNumberDescription(
|
119
138
|
name="max_target_temp",
|
120
139
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
121
140
|
),
|
122
|
-
|
141
|
+
MixerNumberDescription(
|
123
142
|
name="thermostat_decrease_target_temp",
|
124
143
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
125
144
|
),
|
126
|
-
|
145
|
+
MixerSwitchDescription(
|
127
146
|
name="weather_control",
|
128
147
|
),
|
129
|
-
|
148
|
+
MixerNumberDescription(
|
130
149
|
name="heating_curve",
|
131
150
|
multiplier=0.1,
|
132
151
|
),
|
133
|
-
|
152
|
+
MixerNumberDescription(
|
134
153
|
name="heating_curve_shift",
|
135
154
|
offset=20,
|
136
155
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
137
156
|
),
|
138
|
-
|
157
|
+
MixerNumberDescription(
|
139
158
|
name="weather_factor",
|
140
159
|
),
|
141
|
-
|
160
|
+
MixerNumberDescription(
|
142
161
|
name="work_mode",
|
143
162
|
),
|
144
|
-
|
163
|
+
MixerNumberDescription(
|
145
164
|
name="mixer_input_dead_zone",
|
146
165
|
multiplier=0.1,
|
147
166
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
148
167
|
),
|
149
|
-
|
168
|
+
MixerSwitchDescription(
|
150
169
|
name="thermostat_operation",
|
151
170
|
),
|
152
|
-
|
171
|
+
MixerNumberDescription(
|
153
172
|
name="thermostat_mode",
|
154
173
|
),
|
155
|
-
|
174
|
+
MixerSwitchDescription(
|
156
175
|
name="disable_pump_on_thermostat",
|
157
176
|
),
|
158
|
-
|
177
|
+
MixerSwitchDescription(
|
159
178
|
name="summer_work",
|
160
179
|
),
|
161
180
|
),
|
162
181
|
ProductType.ECOMAX_I: (
|
163
|
-
|
182
|
+
MixerNumberDescription(
|
164
183
|
name="work_mode",
|
165
184
|
),
|
166
|
-
|
185
|
+
MixerNumberDescription(
|
167
186
|
name="circuit_target_temp",
|
168
187
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
169
188
|
),
|
170
|
-
|
189
|
+
MixerNumberDescription(
|
171
190
|
name="day_target_temp",
|
172
191
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
173
192
|
),
|
174
|
-
|
193
|
+
MixerNumberDescription(
|
175
194
|
name="night_target_temp",
|
176
195
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
177
196
|
),
|
178
|
-
|
197
|
+
MixerNumberDescription(
|
179
198
|
name="min_target_temp",
|
180
199
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
181
200
|
),
|
182
|
-
|
201
|
+
MixerNumberDescription(
|
183
202
|
name="max_target_temp",
|
184
203
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
185
204
|
),
|
186
|
-
|
205
|
+
MixerSwitchDescription(
|
187
206
|
name="summer_work",
|
188
207
|
),
|
189
|
-
|
208
|
+
MixerSwitchDescription(
|
190
209
|
name="weather_control",
|
191
210
|
),
|
192
|
-
|
211
|
+
MixerNumberDescription(
|
193
212
|
name="enable_circuit",
|
194
213
|
),
|
195
|
-
|
214
|
+
MixerNumberDescription(
|
196
215
|
name="constant_water_preset_temp",
|
197
216
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
198
217
|
),
|
199
|
-
|
218
|
+
MixerNumberDescription(
|
200
219
|
name="thermostat_decrease_temp",
|
201
220
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
202
221
|
),
|
203
|
-
|
222
|
+
MixerNumberDescription(
|
204
223
|
name="thermostat_correction",
|
205
224
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
206
225
|
),
|
207
|
-
|
226
|
+
MixerSwitchDescription(
|
208
227
|
name="thermostat_pump_lock",
|
209
228
|
),
|
210
|
-
|
229
|
+
MixerNumberDescription(
|
211
230
|
name="valve_opening_time",
|
212
231
|
unit_of_measurement=UnitOfMeasurement.SECONDS,
|
213
232
|
),
|
214
|
-
|
233
|
+
MixerNumberDescription(
|
215
234
|
name="mixer_input_dead_zone",
|
216
235
|
multiplier=0.1,
|
217
236
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
218
237
|
),
|
219
|
-
|
238
|
+
MixerNumberDescription(
|
220
239
|
name="proportional_range",
|
221
240
|
),
|
222
|
-
|
241
|
+
MixerNumberDescription(
|
223
242
|
name="integration_time_constant",
|
224
243
|
),
|
225
|
-
|
244
|
+
MixerNumberDescription(
|
226
245
|
name="heating_curve",
|
227
246
|
multiplier=0.1,
|
228
247
|
),
|
229
|
-
|
248
|
+
MixerNumberDescription(
|
230
249
|
name="heating_curve_shift",
|
231
250
|
offset=20,
|
232
251
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
233
252
|
),
|
234
|
-
|
253
|
+
MixerNumberDescription(
|
235
254
|
name="thermostat_mode",
|
236
255
|
),
|
237
|
-
|
256
|
+
MixerNumberDescription(
|
238
257
|
name="decreasing_constant_water_temp",
|
239
258
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
240
259
|
),
|
pyplumio/structures/schedules.py
CHANGED
@@ -8,6 +8,8 @@ from functools import reduce
|
|
8
8
|
from itertools import chain
|
9
9
|
from typing import Any, Final
|
10
10
|
|
11
|
+
from dataslots import dataslots
|
12
|
+
|
11
13
|
from pyplumio.const import (
|
12
14
|
ATTR_PARAMETER,
|
13
15
|
ATTR_SCHEDULE,
|
@@ -19,11 +21,13 @@ from pyplumio.devices import AddressableDevice, Device
|
|
19
21
|
from pyplumio.exceptions import FrameDataError
|
20
22
|
from pyplumio.frames import Request
|
21
23
|
from pyplumio.helpers.parameter import (
|
22
|
-
|
23
|
-
|
24
|
+
Number,
|
25
|
+
NumberDescription,
|
24
26
|
Parameter,
|
25
27
|
ParameterDescription,
|
26
28
|
ParameterValues,
|
29
|
+
Switch,
|
30
|
+
SwitchDescription,
|
27
31
|
unpack_parameter,
|
28
32
|
)
|
29
33
|
from pyplumio.structures import Structure
|
@@ -80,12 +84,20 @@ SCHEDULES: tuple[str, ...] = (
|
|
80
84
|
)
|
81
85
|
|
82
86
|
|
87
|
+
@dataclass
|
88
|
+
class ScheduleParameterDescription(ParameterDescription):
|
89
|
+
"""Represent a schedule parameter description."""
|
90
|
+
|
91
|
+
__slots__ = ()
|
92
|
+
|
93
|
+
|
83
94
|
class ScheduleParameter(Parameter):
|
84
95
|
"""Represents a schedule parameter."""
|
85
96
|
|
86
97
|
__slots__ = ()
|
87
98
|
|
88
99
|
device: AddressableDevice
|
100
|
+
description: ScheduleParameterDescription
|
89
101
|
|
90
102
|
async def create_request(self) -> Request:
|
91
103
|
"""Create a request to change the parameter."""
|
@@ -97,32 +109,40 @@ class ScheduleParameter(Parameter):
|
|
97
109
|
)
|
98
110
|
|
99
111
|
|
100
|
-
|
101
|
-
|
112
|
+
@dataslots
|
113
|
+
@dataclass
|
114
|
+
class ScheduleNumberDescription(ScheduleParameterDescription, NumberDescription):
|
115
|
+
"""Represents a schedule number description."""
|
116
|
+
|
117
|
+
|
118
|
+
class ScheduleNumber(ScheduleParameter, Number):
|
119
|
+
"""Represents a schedule number."""
|
102
120
|
|
103
121
|
__slots__ = ()
|
104
122
|
|
123
|
+
description: ScheduleNumberDescription
|
105
124
|
|
125
|
+
|
126
|
+
@dataslots
|
106
127
|
@dataclass
|
107
|
-
class ScheduleParameterDescription
|
108
|
-
"""Represents a schedule
|
128
|
+
class ScheduleSwitchDescription(ScheduleParameterDescription, SwitchDescription):
|
129
|
+
"""Represents a schedule switch description."""
|
109
130
|
|
110
131
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
)
|
115
|
-
|
132
|
+
class ScheduleSwitch(ScheduleParameter, Switch):
|
133
|
+
"""Represents a schedule switch."""
|
134
|
+
|
135
|
+
__slots__ = ()
|
136
|
+
|
137
|
+
description: ScheduleSwitchDescription
|
116
138
|
|
117
139
|
|
118
140
|
SCHEDULE_PARAMETERS: list[ScheduleParameterDescription] = list(
|
119
141
|
chain.from_iterable(
|
120
142
|
[
|
121
143
|
[
|
122
|
-
|
123
|
-
|
124
|
-
),
|
125
|
-
ScheduleParameterDescription(name=f"{name}_{ATTR_SCHEDULE_PARAMETER}"),
|
144
|
+
ScheduleSwitchDescription(name=f"{name}_{ATTR_SCHEDULE_SWITCH}"),
|
145
|
+
ScheduleNumberDescription(name=f"{name}_{ATTR_SCHEDULE_PARAMETER}"),
|
126
146
|
]
|
127
147
|
for name in SCHEDULES
|
128
148
|
]
|
@@ -6,6 +6,8 @@ from collections.abc import Generator
|
|
6
6
|
from dataclasses import dataclass
|
7
7
|
from typing import TYPE_CHECKING, Any, Final
|
8
8
|
|
9
|
+
from dataslots import dataslots
|
10
|
+
|
9
11
|
from pyplumio.const import (
|
10
12
|
ATTR_INDEX,
|
11
13
|
ATTR_OFFSET,
|
@@ -16,12 +18,14 @@ from pyplumio.const import (
|
|
16
18
|
)
|
17
19
|
from pyplumio.frames import Request
|
18
20
|
from pyplumio.helpers.parameter import (
|
19
|
-
|
20
|
-
|
21
|
+
SET_TIMEOUT,
|
22
|
+
Number,
|
23
|
+
NumberDescription,
|
21
24
|
Parameter,
|
22
25
|
ParameterDescription,
|
23
26
|
ParameterValues,
|
24
|
-
|
27
|
+
Switch,
|
28
|
+
SwitchDescription,
|
25
29
|
unpack_parameter,
|
26
30
|
)
|
27
31
|
from pyplumio.structures import StructureDecoder
|
@@ -38,6 +42,16 @@ ATTR_THERMOSTAT_PARAMETERS: Final = "thermostat_parameters"
|
|
38
42
|
THERMOSTAT_PARAMETER_SIZE: Final = 3
|
39
43
|
|
40
44
|
|
45
|
+
@dataclass
|
46
|
+
class ThermostatParameterDescription(ParameterDescription):
|
47
|
+
"""Represents a thermostat parameter description."""
|
48
|
+
|
49
|
+
__slots__ = ()
|
50
|
+
|
51
|
+
multiplier: float = 1.0
|
52
|
+
size: int = 1
|
53
|
+
|
54
|
+
|
41
55
|
class ThermostatParameter(Parameter):
|
42
56
|
"""Represents a thermostat parameter."""
|
43
57
|
|
@@ -50,7 +64,7 @@ class ThermostatParameter(Parameter):
|
|
50
64
|
def __init__(
|
51
65
|
self,
|
52
66
|
device: Thermostat,
|
53
|
-
description:
|
67
|
+
description: ThermostatParameterDescription,
|
54
68
|
values: ParameterValues | None = None,
|
55
69
|
index: int = 0,
|
56
70
|
offset: int = 0,
|
@@ -74,119 +88,124 @@ class ThermostatParameter(Parameter):
|
|
74
88
|
},
|
75
89
|
)
|
76
90
|
|
77
|
-
async def set(self, value: ParameterValueType, retries: int = 5) -> bool:
|
78
|
-
"""Set a parameter value."""
|
79
|
-
if isinstance(value, (int, float)):
|
80
|
-
value = int(value / self.description.multiplier)
|
81
91
|
|
92
|
+
@dataslots
|
93
|
+
@dataclass
|
94
|
+
class ThermostatNumberDescription(ThermostatParameterDescription, NumberDescription):
|
95
|
+
"""Represent a thermostat number description."""
|
96
|
+
|
97
|
+
|
98
|
+
class ThermostatNumber(ThermostatParameter, Number):
|
99
|
+
"""Represents a thermostat number."""
|
100
|
+
|
101
|
+
__slots__ = ()
|
102
|
+
|
103
|
+
description: ThermostatNumberDescription
|
104
|
+
|
105
|
+
async def set(self, value: int | float, retries: int = SET_TIMEOUT) -> bool:
|
106
|
+
"""Set a parameter value."""
|
107
|
+
value = value / self.description.multiplier
|
82
108
|
return await super().set(value, retries)
|
83
109
|
|
84
110
|
@property
|
85
|
-
def value(self) ->
|
86
|
-
"""Return the
|
111
|
+
def value(self) -> float:
|
112
|
+
"""Return the value."""
|
87
113
|
return self.values.value * self.description.multiplier
|
88
114
|
|
89
115
|
@property
|
90
|
-
def min_value(self) ->
|
116
|
+
def min_value(self) -> float:
|
91
117
|
"""Return the minimum allowed value."""
|
92
118
|
return self.values.min_value * self.description.multiplier
|
93
119
|
|
94
120
|
@property
|
95
|
-
def max_value(self) ->
|
121
|
+
def max_value(self) -> float:
|
96
122
|
"""Return the maximum allowed value."""
|
97
123
|
return self.values.max_value * self.description.multiplier
|
98
124
|
|
99
125
|
|
100
|
-
|
101
|
-
"""Represents a thermostat binary parameter."""
|
102
|
-
|
103
|
-
__slots__ = ()
|
104
|
-
|
105
|
-
|
126
|
+
@dataslots
|
106
127
|
@dataclass
|
107
|
-
class ThermostatParameterDescription
|
108
|
-
"""Represents a thermostat
|
128
|
+
class ThermostatSwitchDescription(ThermostatParameterDescription, SwitchDescription):
|
129
|
+
"""Represents a thermostat switch description."""
|
109
130
|
|
110
|
-
multiplier: float = 1.0
|
111
|
-
size: int = 1
|
112
131
|
|
132
|
+
class ThermostatSwitch(ThermostatParameter, Switch):
|
133
|
+
"""Represents a thermostat switch."""
|
113
134
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
):
|
118
|
-
"""Represents a thermostat binary parameter description."""
|
135
|
+
__slots__ = ()
|
136
|
+
|
137
|
+
description: ThermostatSwitchDescription
|
119
138
|
|
120
139
|
|
121
140
|
THERMOSTAT_PARAMETERS: tuple[ThermostatParameterDescription, ...] = (
|
122
|
-
|
141
|
+
ThermostatNumberDescription(
|
123
142
|
name="mode",
|
124
143
|
),
|
125
|
-
|
144
|
+
ThermostatNumberDescription(
|
126
145
|
name="party_target_temp",
|
127
146
|
size=2,
|
128
147
|
multiplier=0.1,
|
129
148
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
130
149
|
),
|
131
|
-
|
150
|
+
ThermostatNumberDescription(
|
132
151
|
name="holidays_target_temp",
|
133
152
|
size=2,
|
134
153
|
multiplier=0.1,
|
135
154
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
136
155
|
),
|
137
|
-
|
156
|
+
ThermostatNumberDescription(
|
138
157
|
name="correction",
|
139
158
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
140
159
|
),
|
141
|
-
|
160
|
+
ThermostatNumberDescription(
|
142
161
|
name="away_timer",
|
143
162
|
unit_of_measurement=UnitOfMeasurement.DAYS,
|
144
163
|
),
|
145
|
-
|
164
|
+
ThermostatNumberDescription(
|
146
165
|
name="airing_timer",
|
147
166
|
unit_of_measurement=UnitOfMeasurement.DAYS,
|
148
167
|
),
|
149
|
-
|
168
|
+
ThermostatNumberDescription(
|
150
169
|
name="party_timer",
|
151
170
|
unit_of_measurement=UnitOfMeasurement.DAYS,
|
152
171
|
),
|
153
|
-
|
172
|
+
ThermostatNumberDescription(
|
154
173
|
name="holidays_timer",
|
155
174
|
unit_of_measurement=UnitOfMeasurement.DAYS,
|
156
175
|
),
|
157
|
-
|
176
|
+
ThermostatNumberDescription(
|
158
177
|
name="hysteresis",
|
159
178
|
multiplier=0.1,
|
160
179
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
161
180
|
),
|
162
|
-
|
181
|
+
ThermostatNumberDescription(
|
163
182
|
name="day_target_temp",
|
164
183
|
size=2,
|
165
184
|
multiplier=0.1,
|
166
185
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
167
186
|
),
|
168
|
-
|
187
|
+
ThermostatNumberDescription(
|
169
188
|
name="night_target_temp",
|
170
189
|
size=2,
|
171
190
|
multiplier=0.1,
|
172
191
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
173
192
|
),
|
174
|
-
|
193
|
+
ThermostatNumberDescription(
|
175
194
|
name="antifreeze_target_temp",
|
176
195
|
size=2,
|
177
196
|
multiplier=0.1,
|
178
197
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
179
198
|
),
|
180
|
-
|
199
|
+
ThermostatNumberDescription(
|
181
200
|
name="heating_target_temp",
|
182
201
|
size=2,
|
183
202
|
multiplier=0.1,
|
184
203
|
unit_of_measurement=UnitOfMeasurement.CELSIUS,
|
185
204
|
),
|
186
|
-
|
205
|
+
ThermostatNumberDescription(
|
187
206
|
name="heating_timer",
|
188
207
|
),
|
189
|
-
|
208
|
+
ThermostatNumberDescription(
|
190
209
|
name="off_timer",
|
191
210
|
),
|
192
211
|
)
|
File without changes
|
File without changes
|