Skip to content

Commit 08dcccf

Browse files
authored
Merge pull request #1137 from liudger/copilot/fix-1136
2 parents 7ddab24 + 1bb2dd5 commit 08dcccf

7 files changed

Lines changed: 329 additions & 5 deletions

File tree

examples/control.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
State,
1818
StaticState,
1919
)
20+
from bsblan.models import DHWTimeSwitchPrograms
2021

2122

2223
async def get_attribute(
@@ -157,6 +158,27 @@ async def print_hot_water_state(hot_water_state: HotWaterState) -> None:
157158
"Current Temperature": await get_attribute(
158159
hot_water_state.dhw_actual_value_top_temperature, "value", "N/A"
159160
),
161+
"Time Program Monday": await get_attribute(
162+
hot_water_state.dhw_time_program_monday, "value", "N/A"
163+
),
164+
"Time Program Tuesday": await get_attribute(
165+
hot_water_state.dhw_time_program_tuesday, "value", "N/A"
166+
),
167+
"Time Program Wednesday": await get_attribute(
168+
hot_water_state.dhw_time_program_wednesday, "value", "N/A"
169+
),
170+
"Time Program Thursday": await get_attribute(
171+
hot_water_state.dhw_time_program_thursday, "value", "N/A"
172+
),
173+
"Time Program Friday": await get_attribute(
174+
hot_water_state.dhw_time_program_friday, "value", "N/A"
175+
),
176+
"Time Program Saturday": await get_attribute(
177+
hot_water_state.dhw_time_program_saturday, "value", "N/A"
178+
),
179+
"Time Program Sunday": await get_attribute(
180+
hot_water_state.dhw_time_program_sunday, "value", "N/A"
181+
),
160182
}
161183
print_attributes("Hot Water State", attributes)
162184

@@ -202,6 +224,14 @@ async def main() -> None:
202224
hot_water_state: HotWaterState = await bsblan.hot_water_state()
203225
await print_hot_water_state(hot_water_state)
204226

227+
# Example: Set DHW time program for Monday
228+
print("\nSetting DHW time program for Monday to 13:00-14:00")
229+
230+
dhw_programs = DHWTimeSwitchPrograms(
231+
monday="13:00-14:00 ##:##-##:## ##:##-##:##"
232+
)
233+
await bsblan.set_hot_water(dhw_time_programs=dhw_programs)
234+
205235

206236
if __name__ == "__main__":
207237
asyncio.run(main())

src/bsblan/__init__.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,22 @@
22

33
from .bsblan import BSBLAN, BSBLANConfig
44
from .exceptions import BSBLANConnectionError, BSBLANError
5-
from .models import Device, HotWaterState, Info, Sensor, State, StaticState
5+
from .models import (
6+
Device,
7+
DHWTimeSwitchPrograms,
8+
HotWaterState,
9+
Info,
10+
Sensor,
11+
State,
12+
StaticState,
13+
)
614

715
__all__ = [
816
"BSBLAN",
917
"BSBLANConfig",
1018
"BSBLANConnectionError",
1119
"BSBLANError",
20+
"DHWTimeSwitchPrograms",
1221
"Info",
1322
"State",
1423
"Device",

src/bsblan/bsblan.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,15 @@
3434
BSBLANInvalidParameterError,
3535
BSBLANVersionError,
3636
)
37-
from .models import Device, HotWaterState, Info, Sensor, State, StaticState
37+
from .models import (
38+
Device,
39+
DHWTimeSwitchPrograms,
40+
HotWaterState,
41+
Info,
42+
Sensor,
43+
State,
44+
StaticState,
45+
)
3846
from .utility import APIValidator
3947

4048
if TYPE_CHECKING:
@@ -558,25 +566,50 @@ async def set_hot_water(
558566
nominal_setpoint: float | None = None,
559567
reduced_setpoint: float | None = None,
560568
operating_mode: str | None = None,
569+
dhw_time_programs: DHWTimeSwitchPrograms | None = None,
561570
) -> None:
562571
"""Change the state of the hot water system through BSB-Lan.
563572
564573
Args:
565574
nominal_setpoint (float | None): The nominal setpoint temperature to set.
566575
reduced_setpoint (float | None): The reduced setpoint temperature to set.
576+
operating_mode (str | None): The operating mode to set.
577+
dhw_time_programs (DHWTimeSwitchPrograms | None): Time switch programs.
567578
568579
"""
580+
# Validate only one parameter is being set
581+
time_program_params = []
582+
if dhw_time_programs:
583+
if dhw_time_programs.monday:
584+
time_program_params.append(dhw_time_programs.monday)
585+
if dhw_time_programs.tuesday:
586+
time_program_params.append(dhw_time_programs.tuesday)
587+
if dhw_time_programs.wednesday:
588+
time_program_params.append(dhw_time_programs.wednesday)
589+
if dhw_time_programs.thursday:
590+
time_program_params.append(dhw_time_programs.thursday)
591+
if dhw_time_programs.friday:
592+
time_program_params.append(dhw_time_programs.friday)
593+
if dhw_time_programs.saturday:
594+
time_program_params.append(dhw_time_programs.saturday)
595+
if dhw_time_programs.sunday:
596+
time_program_params.append(dhw_time_programs.sunday)
597+
if dhw_time_programs.standard_values:
598+
time_program_params.append(dhw_time_programs.standard_values)
599+
569600
self._validate_single_parameter(
570601
nominal_setpoint,
571602
reduced_setpoint,
572603
operating_mode,
604+
*time_program_params,
573605
error_msg=MULTI_PARAMETER_ERROR_MSG,
574606
)
575607

576608
state = self._prepare_hot_water_state(
577609
nominal_setpoint,
578610
reduced_setpoint,
579611
operating_mode,
612+
dhw_time_programs,
580613
)
581614
await self._set_hot_water_state(state)
582615

@@ -585,12 +618,15 @@ def _prepare_hot_water_state(
585618
nominal_setpoint: float | None,
586619
reduced_setpoint: float | None,
587620
operating_mode: str | None,
621+
dhw_time_programs: DHWTimeSwitchPrograms | None = None,
588622
) -> dict[str, Any]:
589623
"""Prepare the hot water state for setting.
590624
591625
Args:
592626
nominal_setpoint (float | None): The nominal setpoint temperature to set.
593627
reduced_setpoint (float | None): The reduced setpoint temperature to set.
628+
operating_mode (str | None): The operating mode to set.
629+
dhw_time_programs (DHWTimeSwitchPrograms | None): Time switch programs.
594630
595631
Returns:
596632
dict[str, Any]: The prepared state for the hot water.
@@ -616,6 +652,23 @@ def _prepare_hot_water_state(
616652
"Type": "1",
617653
},
618654
)
655+
656+
if dhw_time_programs:
657+
time_program_mapping = {
658+
"561": dhw_time_programs.monday,
659+
"562": dhw_time_programs.tuesday,
660+
"563": dhw_time_programs.wednesday,
661+
"564": dhw_time_programs.thursday,
662+
"565": dhw_time_programs.friday,
663+
"566": dhw_time_programs.saturday,
664+
"567": dhw_time_programs.sunday,
665+
"576": dhw_time_programs.standard_values,
666+
}
667+
668+
for param, value in time_program_mapping.items():
669+
if value is not None:
670+
state.update({"Parameter": param, "Value": value, "Type": "1"})
671+
619672
if not state:
620673
raise BSBLANError(NO_STATE_ERROR_MSG)
621674
return state

src/bsblan/constants.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ class APIConfig(TypedDict):
6262
"1643": "legionella_function_time",
6363
"8830": "dhw_actual_value_top_temperature",
6464
"8820": "state_dhw_pump",
65+
"561": "dhw_time_program_monday",
66+
"562": "dhw_time_program_tuesday",
67+
"563": "dhw_time_program_wednesday",
68+
"564": "dhw_time_program_thursday",
69+
"565": "dhw_time_program_friday",
70+
"566": "dhw_time_program_saturday",
71+
"567": "dhw_time_program_sunday",
72+
"576": "dhw_time_program_standard_values",
6573
},
6674
}
6775

@@ -101,6 +109,14 @@ class APIConfig(TypedDict):
101109
"1644": "legionella_function_time",
102110
"8830": "dhw_actual_value_top_temperature",
103111
"8820": "state_dhw_pump",
112+
"561": "dhw_time_program_monday",
113+
"562": "dhw_time_program_tuesday",
114+
"563": "dhw_time_program_wednesday",
115+
"564": "dhw_time_program_thursday",
116+
"565": "dhw_time_program_friday",
117+
"566": "dhw_time_program_saturday",
118+
"567": "dhw_time_program_sunday",
119+
"576": "dhw_time_program_standard_values",
104120
},
105121
}
106122

src/bsblan/models.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,20 @@
1414
from bsblan.constants import TEMPERATURE_UNITS
1515

1616

17+
@dataclass
18+
class DHWTimeSwitchPrograms:
19+
"""Dataclass for DHW time switch programs."""
20+
21+
monday: str | None = None
22+
tuesday: str | None = None
23+
wednesday: str | None = None
24+
thursday: str | None = None
25+
friday: str | None = None
26+
saturday: str | None = None
27+
sunday: str | None = None
28+
standard_values: str | None = None
29+
30+
1731
class DataType(IntEnum):
1832
"""Enumeration of BSB-LAN data types."""
1933

@@ -163,7 +177,7 @@ class Sensor(DataClassJSONMixin):
163177

164178

165179
@dataclass
166-
class HotWaterState(DataClassJSONMixin):
180+
class HotWaterState(DataClassJSONMixin): # pylint: disable=too-many-instance-attributes
167181
"""Object holds info about object for hot water climate."""
168182

169183
operating_mode: EntityInfo | None = None
@@ -178,6 +192,14 @@ class HotWaterState(DataClassJSONMixin):
178192
legionella_function_time: EntityInfo | None = None
179193
dhw_actual_value_top_temperature: EntityInfo | None = None
180194
state_dhw_pump: EntityInfo | None = None
195+
dhw_time_program_monday: EntityInfo | None = None
196+
dhw_time_program_tuesday: EntityInfo | None = None
197+
dhw_time_program_wednesday: EntityInfo | None = None
198+
dhw_time_program_thursday: EntityInfo | None = None
199+
dhw_time_program_friday: EntityInfo | None = None
200+
dhw_time_program_saturday: EntityInfo | None = None
201+
dhw_time_program_sunday: EntityInfo | None = None
202+
dhw_time_program_standard_values: EntityInfo | None = None
181203

182204

183205
@dataclass

0 commit comments

Comments
 (0)