weheat 2024.11.1__py3-none-any.whl → 2025.11.24rc1__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.
Files changed (42) hide show
  1. weheat/__init__.py +6 -2
  2. weheat/abstractions/__init__.py +1 -1
  3. weheat/abstractions/discovery.py +11 -7
  4. weheat/abstractions/heat_pump.py +223 -81
  5. weheat/abstractions/user.py +16 -11
  6. weheat/api/__init__.py +1 -0
  7. weheat/api/energy_log_api.py +615 -127
  8. weheat/api/heat_pump_api.py +580 -374
  9. weheat/api/heat_pump_log_api.py +884 -360
  10. weheat/api/user_api.py +260 -115
  11. weheat/api_client.py +238 -265
  12. weheat/api_response.py +11 -15
  13. weheat/configuration.py +14 -9
  14. weheat/exceptions.py +59 -25
  15. weheat/models/__init__.py +8 -0
  16. weheat/models/boiler_type.py +8 -3
  17. weheat/models/device_state.py +9 -5
  18. weheat/models/dhw_type.py +8 -3
  19. weheat/models/energy_view_dto.py +87 -65
  20. weheat/models/heat_pump_log_view_dto.py +1394 -559
  21. weheat/models/heat_pump_model.py +8 -3
  22. weheat/models/heat_pump_status_enum.py +9 -4
  23. weheat/models/pagination_metadata.py +95 -0
  24. weheat/models/raw_heat_pump_log_dto.py +438 -375
  25. weheat/models/raw_heatpump_log_and_is_online_dto.py +578 -0
  26. weheat/models/read_all_heat_pump_dto.py +69 -53
  27. weheat/models/read_all_heat_pump_dto_paged_response.py +107 -0
  28. weheat/models/read_heat_pump_dto.py +64 -48
  29. weheat/models/read_user_dto.py +55 -37
  30. weheat/models/read_user_me_dto.py +124 -0
  31. weheat/models/role.py +10 -4
  32. weheat/models/total_energy_aggregate.py +111 -0
  33. weheat/rest.py +152 -259
  34. weheat-2025.11.24rc1.dist-info/METADATA +104 -0
  35. weheat-2025.11.24rc1.dist-info/RECORD +39 -0
  36. {weheat-2024.11.1.dist-info → weheat-2025.11.24rc1.dist-info}/WHEEL +1 -1
  37. weheat/abstractions/auth.py +0 -34
  38. weheat/models/heat_pump_type.py +0 -42
  39. weheat-2024.11.1.dist-info/METADATA +0 -107
  40. weheat-2024.11.1.dist-info/RECORD +0 -36
  41. {weheat-2024.11.1.dist-info → weheat-2025.11.24rc1.dist-info/licenses}/LICENSE +0 -0
  42. {weheat-2024.11.1.dist-info → weheat-2025.11.24rc1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,578 @@
1
+ # coding: utf-8
2
+
3
+ """
4
+ Weheat Backend
5
+
6
+ This is the backend for the Weheat project
7
+
8
+ The version of the OpenAPI document: v1
9
+ Generated by OpenAPI Generator (https://openapi-generator.tech)
10
+
11
+ Do not edit the class manually.
12
+ """ # noqa: E501
13
+
14
+
15
+ from __future__ import annotations
16
+ import pprint
17
+ import re # noqa: F401
18
+ import json
19
+
20
+ from datetime import datetime
21
+ from typing import Any, ClassVar, Dict, List, Optional, Union
22
+ from pydantic import BaseModel, StrictBool, StrictFloat, StrictInt, StrictStr
23
+ from pydantic import Field
24
+ try:
25
+ from typing import Self
26
+ except ImportError:
27
+ from typing_extensions import Self
28
+
29
+ class RawHeatpumpLogAndIsOnlineDto(BaseModel):
30
+ """
31
+ RawHeatpumpLogAndIsOnlineDto
32
+ """ # noqa: E501
33
+ heat_pump_id: StrictStr = Field(description="Identifier of the Heat Pump", alias="heatPumpId")
34
+ timestamp: datetime = Field(description="Timestamp of when this was logged to the server")
35
+ state: Optional[StrictInt] = Field(default=None, description="Current heat pump state (which is decoded in the view)")
36
+ control_bridge_status: Optional[StrictInt] = Field(default=None, description="Raw control bridge status of the heat pump (bitwise encoded)", alias="controlBridgeStatus")
37
+ control_bridge_status_decoded_water_pump: Optional[StrictBool] = Field(default=None, description="Water pump (requested) on/off flag of the control bridge status (0x01)", alias="controlBridgeStatusDecodedWaterPump")
38
+ control_bridge_status_decoded_gas_boiler: Optional[StrictBool] = Field(default=None, description="Gas boiler assistance (requested) on/off flag of the control bridge status (0x04) (Hybrid Only)", alias="controlBridgeStatusDecodedGasBoiler")
39
+ control_bridge_status_decoded_electric_heater: Optional[StrictBool] = Field(default=None, description="Electric heater assistance (requested) on/off flag of the control bridge status (0x08) (DHW Only)", alias="controlBridgeStatusDecodedElectricHeater")
40
+ control_bridge_status_decoded_water_pump2: Optional[StrictBool] = Field(default=None, description="Second water pump (requested) on/off flag of the control bridge status (0x010) (DHW Only)", alias="controlBridgeStatusDecodedWaterPump2")
41
+ t1: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature T1 (TOP) of the DHW sensors")
42
+ t2: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature T2 (BOTTOM) of the DHW sensors")
43
+ t_air_in: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature of the air going into the heat pump", alias="tAirIn")
44
+ t_air_out: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature of the air going out of the heat pump", alias="tAirOut")
45
+ t_water_in: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature of the water going into the heat pump", alias="tWaterIn")
46
+ t_water_out: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature of the water going out of the heat pump", alias="tWaterOut")
47
+ t_water_house_in: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature of the water going into the building", alias="tWaterHouseIn")
48
+ rpm: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Rpm of the compressor")
49
+ on_off_thermostat_state: Optional[StrictInt] = Field(default=None, description="State of the on/off thermostat", alias="onOffThermostatState")
50
+ t_room: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature of the room given by the OpenTherm thermostat", alias="tRoom")
51
+ t_room_target: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Target temperature of the room given by the OpenTherm thermostat", alias="tRoomTarget")
52
+ t_thermostat_setpoint: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Setpoint temperature of the OpenTherm thermostat OR the water setpoint of the heat pump", alias="tThermostatSetpoint")
53
+ ot_boiler_feed_temperature: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Feed temperature of the OpenTherm boiler", alias="otBoilerFeedTemperature")
54
+ ot_boiler_return_temperature: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Return temperature of the OpenTherm boiler", alias="otBoilerReturnTemperature")
55
+ central_heating_flow: Optional[StrictInt] = Field(default=None, description="Duty cycle read by pwm pump for central heating circuit", alias="centralHeatingFlow")
56
+ dhw_flow: Optional[StrictInt] = Field(default=None, description="Duty cycle read by pwm pump for DHW circuit", alias="dhwFlow")
57
+ interval: StrictInt = Field(description="Interval for this log in seconds")
58
+ input_status: Optional[StrictInt] = Field(default=None, description="Raw input status of the heat pump", alias="inputStatus")
59
+ current_control_method: Optional[StrictInt] = Field(default=None, description="Raw current control method state of the heat pump", alias="currentControlMethod")
60
+ signal_strength: Optional[StrictInt] = Field(default=None, description="Signal strength (rssi) reported by the modem of the control board", alias="signalStrength")
61
+ rpm_limiter: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Rpm limit of the compressor", alias="rpmLimiter")
62
+ rpm_limiter_type: Optional[StrictInt] = Field(default=None, description="Type of why the rpm is limited", alias="rpmLimiterType")
63
+ p_compressor_in: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Pressure of the compressor of the side where air goes into the compressor", alias="pCompressorIn")
64
+ p_compressor_out: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Pressure of the compressor of the side where air goes out of the compressor", alias="pCompressorOut")
65
+ p_compressor_in_target: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Target pressure of the compressor of the side where air goes into the compressor", alias="pCompressorInTarget")
66
+ t_compressor_in: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature of the compressor of the side where air goes into the compressor", alias="tCompressorIn")
67
+ t_compressor_out: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature of the compressor of the side where air goes out of the compressor", alias="tCompressorOut")
68
+ t_compressor_in_transient: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature transient of the compressor of the side where air goes into the compressor", alias="tCompressorInTransient")
69
+ t_compressor_out_transient: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature transient of the compressor of the side where air goes out of the compressor", alias="tCompressorOutTransient")
70
+ delta_t_compressor_in_superheat: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Difference in temperature for superheat based on the compressor temperatures", alias="deltaTCompressorInSuperheat")
71
+ fan: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="State of the fan")
72
+ fan_power: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Power used by the fan", alias="fanPower")
73
+ temperature_error_integral: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Current value of the temperature error integral", alias="temperatureErrorIntegral")
74
+ thermostat_status: Optional[StrictInt] = Field(default=None, description="Status of the OpenTherm thermostat", alias="thermostatStatus")
75
+ ot_boiler_status: Optional[StrictInt] = Field(default=None, description="Status of the OpenTherm boiler", alias="otBoilerStatus")
76
+ central_heating_pwm_requested_duty_cycle: Optional[StrictInt] = Field(default=None, description="Requested duty cycle to pwm pump for central heating circuit", alias="centralHeatingPwmRequestedDutyCycle")
77
+ dhw_pwm_requested_duty_cycle: Optional[StrictInt] = Field(default=None, description="Requested duty cycle to pwm pump for DHW circuit", alias="dhwPwmRequestedDutyCycle")
78
+ sinr: Optional[StrictInt] = Field(default=None, description="Signal to noise ratio of the modem of the control board (SINR)")
79
+ error: Optional[StrictInt] = Field(default=None, description="Current state of error in the heat pump (which is decoded in the view)")
80
+ error_decoded_dtc_none: Optional[StrictBool] = Field(default=None, description="None state of the error flag which isn't raw for practical timescale purposes (it was bitwise encoded)", alias="errorDecodedDtcNone")
81
+ error_decoded_dtc_continue: Optional[StrictBool] = Field(default=None, description="DTC continue state of the error flag which isn't raw for practical timescale purposes (it was bitwise encoded)", alias="errorDecodedDtcContinue")
82
+ error_decoded_dtc_compressor_off: Optional[StrictBool] = Field(default=None, description="DTC off state of the error flag which isn't raw for practical timescale purposes (it was bitwise encoded)", alias="errorDecodedDtcCompressorOff")
83
+ error_decoded_dtc_defrost_forbidden: Optional[StrictBool] = Field(default=None, description="DTC defrost forbidden state of the error flag which isn't raw for practical timescale purposes (it was bitwise encoded)", alias="errorDecodedDtcDefrostForbidden")
84
+ error_decoded_dtc_request_service: Optional[StrictBool] = Field(default=None, description="DTC request service state of the error flag which isn't raw for practical timescale purposes (it was bitwise encoded)", alias="errorDecodedDtcRequestService")
85
+ error_decoded_dtc_use_heating_curve: Optional[StrictBool] = Field(default=None, description="DTC use heating curve state of the error flag which isn't raw for practical timescale purposes (it was bitwise encoded)", alias="errorDecodedDtcUseHeatingCurve")
86
+ error_decoded_dtc_dhw_forbidden: Optional[StrictBool] = Field(default=None, description="DTC use heating curve state of the error flag which isn't raw for practical timescale purposes (it was bitwise encoded)", alias="errorDecodedDtcDhwForbidden")
87
+ error_decoded_dtc_error: Optional[StrictBool] = Field(default=None, description="DTC use heating curve state of the error flag which isn't raw for practical timescale purposes (it was bitwise encoded)", alias="errorDecodedDtcError")
88
+ error_decoded_dtc_inactive: Optional[StrictBool] = Field(default=None, description="DTC Inactive state of the error flag which isn't raw for practical timescale purposes (it was bitwise encoded)", alias="errorDecodedDtcInactive")
89
+ control_bridge_status_decoded_dhw_valve: Optional[StrictBool] = Field(default=None, description="DhwValve (requested) open/closed flag of the control bridge status (0x02) (DHW Only)", alias="controlBridgeStatusDecodedDhwValve")
90
+ t_board: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature of the control board", alias="tBoard")
91
+ t_inverter: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature of the inverter", alias="tInverter")
92
+ compressor_power_low_accuracy: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Power used by the compressor (low accuracy)", alias="compressorPowerLowAccuracy")
93
+ valve: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Position value of the valve")
94
+ inverter_input_voltage: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Input voltage measured by the compressor inverter float - 4 bytes", alias="inverterInputVoltage")
95
+ indoor_unit_heater_temperature: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Temperature of the indoor unit heater", alias="indoorUnitHeaterTemperature")
96
+ indoor_unit_input_current: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Current of the indoor unit heater", alias="indoorUnitInputCurrent")
97
+ cooling_status: Optional[StrictInt] = Field(default=None, description="Current status of cooling With enum values: 0 = idle, 1 = starting, 2 = active, 3 = stopping", alias="coolingStatus")
98
+ cm_mass_power_in: Optional[StrictInt] = Field(default=None, description="Power going into the heat pump", alias="cmMassPowerIn")
99
+ cm_mass_power_out: Optional[StrictInt] = Field(default=None, description="Power going out of the heat pump (in the form of usable heat)", alias="cmMassPowerOut")
100
+ debug_variable1: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Optional debug variable that can be set to anything in firmware and will be logged as a float float - 4 bytes", alias="debugVariable1")
101
+ debug_variable2: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Optional debug variable that can be set to anything in firmware and will be logged as a float float - 4 bytes", alias="debugVariable2")
102
+ debug_variable3: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Optional debug variable that can be set to anything in firmware and will be logged as a float float - 4 bytes", alias="debugVariable3")
103
+ debug_variable4: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Optional debug variable that can be set to anything in firmware and will be logged as a float float - 4 bytes", alias="debugVariable4")
104
+ debug_variable5: Optional[Union[StrictFloat, StrictInt]] = Field(default=None, description="Optional debug variable that can be set to anything in firmware and will be logged as a float float - 4 bytes", alias="debugVariable5")
105
+ is_online: StrictBool = Field(description="A boolean indicating if the heat pump is currently online", alias="isOnline")
106
+ __properties: ClassVar[List[str]] = ["heatPumpId", "timestamp", "state", "controlBridgeStatus", "controlBridgeStatusDecodedWaterPump", "controlBridgeStatusDecodedGasBoiler", "controlBridgeStatusDecodedElectricHeater", "controlBridgeStatusDecodedWaterPump2", "t1", "t2", "tAirIn", "tAirOut", "tWaterIn", "tWaterOut", "tWaterHouseIn", "rpm", "onOffThermostatState", "tRoom", "tRoomTarget", "tThermostatSetpoint", "otBoilerFeedTemperature", "otBoilerReturnTemperature", "centralHeatingFlow", "dhwFlow", "interval", "inputStatus", "currentControlMethod", "signalStrength", "rpmLimiter", "rpmLimiterType", "pCompressorIn", "pCompressorOut", "pCompressorInTarget", "tCompressorIn", "tCompressorOut", "tCompressorInTransient", "tCompressorOutTransient", "deltaTCompressorInSuperheat", "fan", "fanPower", "temperatureErrorIntegral", "thermostatStatus", "otBoilerStatus", "centralHeatingPwmRequestedDutyCycle", "dhwPwmRequestedDutyCycle", "sinr", "error", "errorDecodedDtcNone", "errorDecodedDtcContinue", "errorDecodedDtcCompressorOff", "errorDecodedDtcDefrostForbidden", "errorDecodedDtcRequestService", "errorDecodedDtcUseHeatingCurve", "errorDecodedDtcDhwForbidden", "errorDecodedDtcError", "errorDecodedDtcInactive", "controlBridgeStatusDecodedDhwValve", "tBoard", "tInverter", "compressorPowerLowAccuracy", "valve", "inverterInputVoltage", "indoorUnitHeaterTemperature", "indoorUnitInputCurrent", "coolingStatus", "cmMassPowerIn", "cmMassPowerOut", "debugVariable1", "debugVariable2", "debugVariable3", "debugVariable4", "debugVariable5", "isOnline"]
107
+
108
+ model_config = {
109
+ "populate_by_name": True,
110
+ "validate_assignment": True,
111
+ "protected_namespaces": (),
112
+ }
113
+
114
+
115
+ def to_str(self) -> str:
116
+ """Returns the string representation of the model using alias"""
117
+ return pprint.pformat(self.model_dump(by_alias=True))
118
+
119
+ def to_json(self) -> str:
120
+ """Returns the JSON representation of the model using alias"""
121
+ # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead
122
+ return json.dumps(self.to_dict())
123
+
124
+ @classmethod
125
+ def from_json(cls, json_str: str) -> Self:
126
+ """Create an instance of RawHeatpumpLogAndIsOnlineDto from a JSON string"""
127
+ return cls.from_dict(json.loads(json_str))
128
+
129
+ def to_dict(self) -> Dict[str, Any]:
130
+ """Return the dictionary representation of the model using alias.
131
+
132
+ This has the following differences from calling pydantic's
133
+ `self.model_dump(by_alias=True)`:
134
+
135
+ * `None` is only added to the output dict for nullable fields that
136
+ were set at model initialization. Other fields with value `None`
137
+ are ignored.
138
+ """
139
+ _dict = self.model_dump(
140
+ by_alias=True,
141
+ exclude={
142
+ },
143
+ exclude_none=True,
144
+ )
145
+ # set to None if state (nullable) is None
146
+ # and model_fields_set contains the field
147
+ if self.state is None and "state" in self.model_fields_set:
148
+ _dict['state'] = None
149
+
150
+ # set to None if control_bridge_status (nullable) is None
151
+ # and model_fields_set contains the field
152
+ if self.control_bridge_status is None and "control_bridge_status" in self.model_fields_set:
153
+ _dict['controlBridgeStatus'] = None
154
+
155
+ # set to None if control_bridge_status_decoded_water_pump (nullable) is None
156
+ # and model_fields_set contains the field
157
+ if self.control_bridge_status_decoded_water_pump is None and "control_bridge_status_decoded_water_pump" in self.model_fields_set:
158
+ _dict['controlBridgeStatusDecodedWaterPump'] = None
159
+
160
+ # set to None if control_bridge_status_decoded_gas_boiler (nullable) is None
161
+ # and model_fields_set contains the field
162
+ if self.control_bridge_status_decoded_gas_boiler is None and "control_bridge_status_decoded_gas_boiler" in self.model_fields_set:
163
+ _dict['controlBridgeStatusDecodedGasBoiler'] = None
164
+
165
+ # set to None if control_bridge_status_decoded_electric_heater (nullable) is None
166
+ # and model_fields_set contains the field
167
+ if self.control_bridge_status_decoded_electric_heater is None and "control_bridge_status_decoded_electric_heater" in self.model_fields_set:
168
+ _dict['controlBridgeStatusDecodedElectricHeater'] = None
169
+
170
+ # set to None if control_bridge_status_decoded_water_pump2 (nullable) is None
171
+ # and model_fields_set contains the field
172
+ if self.control_bridge_status_decoded_water_pump2 is None and "control_bridge_status_decoded_water_pump2" in self.model_fields_set:
173
+ _dict['controlBridgeStatusDecodedWaterPump2'] = None
174
+
175
+ # set to None if t1 (nullable) is None
176
+ # and model_fields_set contains the field
177
+ if self.t1 is None and "t1" in self.model_fields_set:
178
+ _dict['t1'] = None
179
+
180
+ # set to None if t2 (nullable) is None
181
+ # and model_fields_set contains the field
182
+ if self.t2 is None and "t2" in self.model_fields_set:
183
+ _dict['t2'] = None
184
+
185
+ # set to None if t_air_in (nullable) is None
186
+ # and model_fields_set contains the field
187
+ if self.t_air_in is None and "t_air_in" in self.model_fields_set:
188
+ _dict['tAirIn'] = None
189
+
190
+ # set to None if t_air_out (nullable) is None
191
+ # and model_fields_set contains the field
192
+ if self.t_air_out is None and "t_air_out" in self.model_fields_set:
193
+ _dict['tAirOut'] = None
194
+
195
+ # set to None if t_water_in (nullable) is None
196
+ # and model_fields_set contains the field
197
+ if self.t_water_in is None and "t_water_in" in self.model_fields_set:
198
+ _dict['tWaterIn'] = None
199
+
200
+ # set to None if t_water_out (nullable) is None
201
+ # and model_fields_set contains the field
202
+ if self.t_water_out is None and "t_water_out" in self.model_fields_set:
203
+ _dict['tWaterOut'] = None
204
+
205
+ # set to None if t_water_house_in (nullable) is None
206
+ # and model_fields_set contains the field
207
+ if self.t_water_house_in is None and "t_water_house_in" in self.model_fields_set:
208
+ _dict['tWaterHouseIn'] = None
209
+
210
+ # set to None if rpm (nullable) is None
211
+ # and model_fields_set contains the field
212
+ if self.rpm is None and "rpm" in self.model_fields_set:
213
+ _dict['rpm'] = None
214
+
215
+ # set to None if on_off_thermostat_state (nullable) is None
216
+ # and model_fields_set contains the field
217
+ if self.on_off_thermostat_state is None and "on_off_thermostat_state" in self.model_fields_set:
218
+ _dict['onOffThermostatState'] = None
219
+
220
+ # set to None if t_room (nullable) is None
221
+ # and model_fields_set contains the field
222
+ if self.t_room is None and "t_room" in self.model_fields_set:
223
+ _dict['tRoom'] = None
224
+
225
+ # set to None if t_room_target (nullable) is None
226
+ # and model_fields_set contains the field
227
+ if self.t_room_target is None and "t_room_target" in self.model_fields_set:
228
+ _dict['tRoomTarget'] = None
229
+
230
+ # set to None if t_thermostat_setpoint (nullable) is None
231
+ # and model_fields_set contains the field
232
+ if self.t_thermostat_setpoint is None and "t_thermostat_setpoint" in self.model_fields_set:
233
+ _dict['tThermostatSetpoint'] = None
234
+
235
+ # set to None if ot_boiler_feed_temperature (nullable) is None
236
+ # and model_fields_set contains the field
237
+ if self.ot_boiler_feed_temperature is None and "ot_boiler_feed_temperature" in self.model_fields_set:
238
+ _dict['otBoilerFeedTemperature'] = None
239
+
240
+ # set to None if ot_boiler_return_temperature (nullable) is None
241
+ # and model_fields_set contains the field
242
+ if self.ot_boiler_return_temperature is None and "ot_boiler_return_temperature" in self.model_fields_set:
243
+ _dict['otBoilerReturnTemperature'] = None
244
+
245
+ # set to None if central_heating_flow (nullable) is None
246
+ # and model_fields_set contains the field
247
+ if self.central_heating_flow is None and "central_heating_flow" in self.model_fields_set:
248
+ _dict['centralHeatingFlow'] = None
249
+
250
+ # set to None if dhw_flow (nullable) is None
251
+ # and model_fields_set contains the field
252
+ if self.dhw_flow is None and "dhw_flow" in self.model_fields_set:
253
+ _dict['dhwFlow'] = None
254
+
255
+ # set to None if input_status (nullable) is None
256
+ # and model_fields_set contains the field
257
+ if self.input_status is None and "input_status" in self.model_fields_set:
258
+ _dict['inputStatus'] = None
259
+
260
+ # set to None if current_control_method (nullable) is None
261
+ # and model_fields_set contains the field
262
+ if self.current_control_method is None and "current_control_method" in self.model_fields_set:
263
+ _dict['currentControlMethod'] = None
264
+
265
+ # set to None if signal_strength (nullable) is None
266
+ # and model_fields_set contains the field
267
+ if self.signal_strength is None and "signal_strength" in self.model_fields_set:
268
+ _dict['signalStrength'] = None
269
+
270
+ # set to None if rpm_limiter (nullable) is None
271
+ # and model_fields_set contains the field
272
+ if self.rpm_limiter is None and "rpm_limiter" in self.model_fields_set:
273
+ _dict['rpmLimiter'] = None
274
+
275
+ # set to None if rpm_limiter_type (nullable) is None
276
+ # and model_fields_set contains the field
277
+ if self.rpm_limiter_type is None and "rpm_limiter_type" in self.model_fields_set:
278
+ _dict['rpmLimiterType'] = None
279
+
280
+ # set to None if p_compressor_in (nullable) is None
281
+ # and model_fields_set contains the field
282
+ if self.p_compressor_in is None and "p_compressor_in" in self.model_fields_set:
283
+ _dict['pCompressorIn'] = None
284
+
285
+ # set to None if p_compressor_out (nullable) is None
286
+ # and model_fields_set contains the field
287
+ if self.p_compressor_out is None and "p_compressor_out" in self.model_fields_set:
288
+ _dict['pCompressorOut'] = None
289
+
290
+ # set to None if p_compressor_in_target (nullable) is None
291
+ # and model_fields_set contains the field
292
+ if self.p_compressor_in_target is None and "p_compressor_in_target" in self.model_fields_set:
293
+ _dict['pCompressorInTarget'] = None
294
+
295
+ # set to None if t_compressor_in (nullable) is None
296
+ # and model_fields_set contains the field
297
+ if self.t_compressor_in is None and "t_compressor_in" in self.model_fields_set:
298
+ _dict['tCompressorIn'] = None
299
+
300
+ # set to None if t_compressor_out (nullable) is None
301
+ # and model_fields_set contains the field
302
+ if self.t_compressor_out is None and "t_compressor_out" in self.model_fields_set:
303
+ _dict['tCompressorOut'] = None
304
+
305
+ # set to None if t_compressor_in_transient (nullable) is None
306
+ # and model_fields_set contains the field
307
+ if self.t_compressor_in_transient is None and "t_compressor_in_transient" in self.model_fields_set:
308
+ _dict['tCompressorInTransient'] = None
309
+
310
+ # set to None if t_compressor_out_transient (nullable) is None
311
+ # and model_fields_set contains the field
312
+ if self.t_compressor_out_transient is None and "t_compressor_out_transient" in self.model_fields_set:
313
+ _dict['tCompressorOutTransient'] = None
314
+
315
+ # set to None if delta_t_compressor_in_superheat (nullable) is None
316
+ # and model_fields_set contains the field
317
+ if self.delta_t_compressor_in_superheat is None and "delta_t_compressor_in_superheat" in self.model_fields_set:
318
+ _dict['deltaTCompressorInSuperheat'] = None
319
+
320
+ # set to None if fan (nullable) is None
321
+ # and model_fields_set contains the field
322
+ if self.fan is None and "fan" in self.model_fields_set:
323
+ _dict['fan'] = None
324
+
325
+ # set to None if fan_power (nullable) is None
326
+ # and model_fields_set contains the field
327
+ if self.fan_power is None and "fan_power" in self.model_fields_set:
328
+ _dict['fanPower'] = None
329
+
330
+ # set to None if temperature_error_integral (nullable) is None
331
+ # and model_fields_set contains the field
332
+ if self.temperature_error_integral is None and "temperature_error_integral" in self.model_fields_set:
333
+ _dict['temperatureErrorIntegral'] = None
334
+
335
+ # set to None if thermostat_status (nullable) is None
336
+ # and model_fields_set contains the field
337
+ if self.thermostat_status is None and "thermostat_status" in self.model_fields_set:
338
+ _dict['thermostatStatus'] = None
339
+
340
+ # set to None if ot_boiler_status (nullable) is None
341
+ # and model_fields_set contains the field
342
+ if self.ot_boiler_status is None and "ot_boiler_status" in self.model_fields_set:
343
+ _dict['otBoilerStatus'] = None
344
+
345
+ # set to None if central_heating_pwm_requested_duty_cycle (nullable) is None
346
+ # and model_fields_set contains the field
347
+ if self.central_heating_pwm_requested_duty_cycle is None and "central_heating_pwm_requested_duty_cycle" in self.model_fields_set:
348
+ _dict['centralHeatingPwmRequestedDutyCycle'] = None
349
+
350
+ # set to None if dhw_pwm_requested_duty_cycle (nullable) is None
351
+ # and model_fields_set contains the field
352
+ if self.dhw_pwm_requested_duty_cycle is None and "dhw_pwm_requested_duty_cycle" in self.model_fields_set:
353
+ _dict['dhwPwmRequestedDutyCycle'] = None
354
+
355
+ # set to None if sinr (nullable) is None
356
+ # and model_fields_set contains the field
357
+ if self.sinr is None and "sinr" in self.model_fields_set:
358
+ _dict['sinr'] = None
359
+
360
+ # set to None if error (nullable) is None
361
+ # and model_fields_set contains the field
362
+ if self.error is None and "error" in self.model_fields_set:
363
+ _dict['error'] = None
364
+
365
+ # set to None if error_decoded_dtc_none (nullable) is None
366
+ # and model_fields_set contains the field
367
+ if self.error_decoded_dtc_none is None and "error_decoded_dtc_none" in self.model_fields_set:
368
+ _dict['errorDecodedDtcNone'] = None
369
+
370
+ # set to None if error_decoded_dtc_continue (nullable) is None
371
+ # and model_fields_set contains the field
372
+ if self.error_decoded_dtc_continue is None and "error_decoded_dtc_continue" in self.model_fields_set:
373
+ _dict['errorDecodedDtcContinue'] = None
374
+
375
+ # set to None if error_decoded_dtc_compressor_off (nullable) is None
376
+ # and model_fields_set contains the field
377
+ if self.error_decoded_dtc_compressor_off is None and "error_decoded_dtc_compressor_off" in self.model_fields_set:
378
+ _dict['errorDecodedDtcCompressorOff'] = None
379
+
380
+ # set to None if error_decoded_dtc_defrost_forbidden (nullable) is None
381
+ # and model_fields_set contains the field
382
+ if self.error_decoded_dtc_defrost_forbidden is None and "error_decoded_dtc_defrost_forbidden" in self.model_fields_set:
383
+ _dict['errorDecodedDtcDefrostForbidden'] = None
384
+
385
+ # set to None if error_decoded_dtc_request_service (nullable) is None
386
+ # and model_fields_set contains the field
387
+ if self.error_decoded_dtc_request_service is None and "error_decoded_dtc_request_service" in self.model_fields_set:
388
+ _dict['errorDecodedDtcRequestService'] = None
389
+
390
+ # set to None if error_decoded_dtc_use_heating_curve (nullable) is None
391
+ # and model_fields_set contains the field
392
+ if self.error_decoded_dtc_use_heating_curve is None and "error_decoded_dtc_use_heating_curve" in self.model_fields_set:
393
+ _dict['errorDecodedDtcUseHeatingCurve'] = None
394
+
395
+ # set to None if error_decoded_dtc_dhw_forbidden (nullable) is None
396
+ # and model_fields_set contains the field
397
+ if self.error_decoded_dtc_dhw_forbidden is None and "error_decoded_dtc_dhw_forbidden" in self.model_fields_set:
398
+ _dict['errorDecodedDtcDhwForbidden'] = None
399
+
400
+ # set to None if error_decoded_dtc_error (nullable) is None
401
+ # and model_fields_set contains the field
402
+ if self.error_decoded_dtc_error is None and "error_decoded_dtc_error" in self.model_fields_set:
403
+ _dict['errorDecodedDtcError'] = None
404
+
405
+ # set to None if error_decoded_dtc_inactive (nullable) is None
406
+ # and model_fields_set contains the field
407
+ if self.error_decoded_dtc_inactive is None and "error_decoded_dtc_inactive" in self.model_fields_set:
408
+ _dict['errorDecodedDtcInactive'] = None
409
+
410
+ # set to None if control_bridge_status_decoded_dhw_valve (nullable) is None
411
+ # and model_fields_set contains the field
412
+ if self.control_bridge_status_decoded_dhw_valve is None and "control_bridge_status_decoded_dhw_valve" in self.model_fields_set:
413
+ _dict['controlBridgeStatusDecodedDhwValve'] = None
414
+
415
+ # set to None if t_board (nullable) is None
416
+ # and model_fields_set contains the field
417
+ if self.t_board is None and "t_board" in self.model_fields_set:
418
+ _dict['tBoard'] = None
419
+
420
+ # set to None if t_inverter (nullable) is None
421
+ # and model_fields_set contains the field
422
+ if self.t_inverter is None and "t_inverter" in self.model_fields_set:
423
+ _dict['tInverter'] = None
424
+
425
+ # set to None if compressor_power_low_accuracy (nullable) is None
426
+ # and model_fields_set contains the field
427
+ if self.compressor_power_low_accuracy is None and "compressor_power_low_accuracy" in self.model_fields_set:
428
+ _dict['compressorPowerLowAccuracy'] = None
429
+
430
+ # set to None if valve (nullable) is None
431
+ # and model_fields_set contains the field
432
+ if self.valve is None and "valve" in self.model_fields_set:
433
+ _dict['valve'] = None
434
+
435
+ # set to None if inverter_input_voltage (nullable) is None
436
+ # and model_fields_set contains the field
437
+ if self.inverter_input_voltage is None and "inverter_input_voltage" in self.model_fields_set:
438
+ _dict['inverterInputVoltage'] = None
439
+
440
+ # set to None if indoor_unit_heater_temperature (nullable) is None
441
+ # and model_fields_set contains the field
442
+ if self.indoor_unit_heater_temperature is None and "indoor_unit_heater_temperature" in self.model_fields_set:
443
+ _dict['indoorUnitHeaterTemperature'] = None
444
+
445
+ # set to None if indoor_unit_input_current (nullable) is None
446
+ # and model_fields_set contains the field
447
+ if self.indoor_unit_input_current is None and "indoor_unit_input_current" in self.model_fields_set:
448
+ _dict['indoorUnitInputCurrent'] = None
449
+
450
+ # set to None if cooling_status (nullable) is None
451
+ # and model_fields_set contains the field
452
+ if self.cooling_status is None and "cooling_status" in self.model_fields_set:
453
+ _dict['coolingStatus'] = None
454
+
455
+ # set to None if cm_mass_power_in (nullable) is None
456
+ # and model_fields_set contains the field
457
+ if self.cm_mass_power_in is None and "cm_mass_power_in" in self.model_fields_set:
458
+ _dict['cmMassPowerIn'] = None
459
+
460
+ # set to None if cm_mass_power_out (nullable) is None
461
+ # and model_fields_set contains the field
462
+ if self.cm_mass_power_out is None and "cm_mass_power_out" in self.model_fields_set:
463
+ _dict['cmMassPowerOut'] = None
464
+
465
+ # set to None if debug_variable1 (nullable) is None
466
+ # and model_fields_set contains the field
467
+ if self.debug_variable1 is None and "debug_variable1" in self.model_fields_set:
468
+ _dict['debugVariable1'] = None
469
+
470
+ # set to None if debug_variable2 (nullable) is None
471
+ # and model_fields_set contains the field
472
+ if self.debug_variable2 is None and "debug_variable2" in self.model_fields_set:
473
+ _dict['debugVariable2'] = None
474
+
475
+ # set to None if debug_variable3 (nullable) is None
476
+ # and model_fields_set contains the field
477
+ if self.debug_variable3 is None and "debug_variable3" in self.model_fields_set:
478
+ _dict['debugVariable3'] = None
479
+
480
+ # set to None if debug_variable4 (nullable) is None
481
+ # and model_fields_set contains the field
482
+ if self.debug_variable4 is None and "debug_variable4" in self.model_fields_set:
483
+ _dict['debugVariable4'] = None
484
+
485
+ # set to None if debug_variable5 (nullable) is None
486
+ # and model_fields_set contains the field
487
+ if self.debug_variable5 is None and "debug_variable5" in self.model_fields_set:
488
+ _dict['debugVariable5'] = None
489
+
490
+ return _dict
491
+
492
+ @classmethod
493
+ def from_dict(cls, obj: Dict) -> Self:
494
+ """Create an instance of RawHeatpumpLogAndIsOnlineDto from a dict"""
495
+ if obj is None:
496
+ return None
497
+
498
+ if not isinstance(obj, dict):
499
+ return cls.model_validate(obj)
500
+
501
+ _obj = cls.model_validate({
502
+ "heatPumpId": obj.get("heatPumpId"),
503
+ "timestamp": obj.get("timestamp"),
504
+ "state": obj.get("state"),
505
+ "controlBridgeStatus": obj.get("controlBridgeStatus"),
506
+ "controlBridgeStatusDecodedWaterPump": obj.get("controlBridgeStatusDecodedWaterPump"),
507
+ "controlBridgeStatusDecodedGasBoiler": obj.get("controlBridgeStatusDecodedGasBoiler"),
508
+ "controlBridgeStatusDecodedElectricHeater": obj.get("controlBridgeStatusDecodedElectricHeater"),
509
+ "controlBridgeStatusDecodedWaterPump2": obj.get("controlBridgeStatusDecodedWaterPump2"),
510
+ "t1": obj.get("t1"),
511
+ "t2": obj.get("t2"),
512
+ "tAirIn": obj.get("tAirIn"),
513
+ "tAirOut": obj.get("tAirOut"),
514
+ "tWaterIn": obj.get("tWaterIn"),
515
+ "tWaterOut": obj.get("tWaterOut"),
516
+ "tWaterHouseIn": obj.get("tWaterHouseIn"),
517
+ "rpm": obj.get("rpm"),
518
+ "onOffThermostatState": obj.get("onOffThermostatState"),
519
+ "tRoom": obj.get("tRoom"),
520
+ "tRoomTarget": obj.get("tRoomTarget"),
521
+ "tThermostatSetpoint": obj.get("tThermostatSetpoint"),
522
+ "otBoilerFeedTemperature": obj.get("otBoilerFeedTemperature"),
523
+ "otBoilerReturnTemperature": obj.get("otBoilerReturnTemperature"),
524
+ "centralHeatingFlow": obj.get("centralHeatingFlow"),
525
+ "dhwFlow": obj.get("dhwFlow"),
526
+ "interval": obj.get("interval"),
527
+ "inputStatus": obj.get("inputStatus"),
528
+ "currentControlMethod": obj.get("currentControlMethod"),
529
+ "signalStrength": obj.get("signalStrength"),
530
+ "rpmLimiter": obj.get("rpmLimiter"),
531
+ "rpmLimiterType": obj.get("rpmLimiterType"),
532
+ "pCompressorIn": obj.get("pCompressorIn"),
533
+ "pCompressorOut": obj.get("pCompressorOut"),
534
+ "pCompressorInTarget": obj.get("pCompressorInTarget"),
535
+ "tCompressorIn": obj.get("tCompressorIn"),
536
+ "tCompressorOut": obj.get("tCompressorOut"),
537
+ "tCompressorInTransient": obj.get("tCompressorInTransient"),
538
+ "tCompressorOutTransient": obj.get("tCompressorOutTransient"),
539
+ "deltaTCompressorInSuperheat": obj.get("deltaTCompressorInSuperheat"),
540
+ "fan": obj.get("fan"),
541
+ "fanPower": obj.get("fanPower"),
542
+ "temperatureErrorIntegral": obj.get("temperatureErrorIntegral"),
543
+ "thermostatStatus": obj.get("thermostatStatus"),
544
+ "otBoilerStatus": obj.get("otBoilerStatus"),
545
+ "centralHeatingPwmRequestedDutyCycle": obj.get("centralHeatingPwmRequestedDutyCycle"),
546
+ "dhwPwmRequestedDutyCycle": obj.get("dhwPwmRequestedDutyCycle"),
547
+ "sinr": obj.get("sinr"),
548
+ "error": obj.get("error"),
549
+ "errorDecodedDtcNone": obj.get("errorDecodedDtcNone"),
550
+ "errorDecodedDtcContinue": obj.get("errorDecodedDtcContinue"),
551
+ "errorDecodedDtcCompressorOff": obj.get("errorDecodedDtcCompressorOff"),
552
+ "errorDecodedDtcDefrostForbidden": obj.get("errorDecodedDtcDefrostForbidden"),
553
+ "errorDecodedDtcRequestService": obj.get("errorDecodedDtcRequestService"),
554
+ "errorDecodedDtcUseHeatingCurve": obj.get("errorDecodedDtcUseHeatingCurve"),
555
+ "errorDecodedDtcDhwForbidden": obj.get("errorDecodedDtcDhwForbidden"),
556
+ "errorDecodedDtcError": obj.get("errorDecodedDtcError"),
557
+ "errorDecodedDtcInactive": obj.get("errorDecodedDtcInactive"),
558
+ "controlBridgeStatusDecodedDhwValve": obj.get("controlBridgeStatusDecodedDhwValve"),
559
+ "tBoard": obj.get("tBoard"),
560
+ "tInverter": obj.get("tInverter"),
561
+ "compressorPowerLowAccuracy": obj.get("compressorPowerLowAccuracy"),
562
+ "valve": obj.get("valve"),
563
+ "inverterInputVoltage": obj.get("inverterInputVoltage"),
564
+ "indoorUnitHeaterTemperature": obj.get("indoorUnitHeaterTemperature"),
565
+ "indoorUnitInputCurrent": obj.get("indoorUnitInputCurrent"),
566
+ "coolingStatus": obj.get("coolingStatus"),
567
+ "cmMassPowerIn": obj.get("cmMassPowerIn"),
568
+ "cmMassPowerOut": obj.get("cmMassPowerOut"),
569
+ "debugVariable1": obj.get("debugVariable1"),
570
+ "debugVariable2": obj.get("debugVariable2"),
571
+ "debugVariable3": obj.get("debugVariable3"),
572
+ "debugVariable4": obj.get("debugVariable4"),
573
+ "debugVariable5": obj.get("debugVariable5"),
574
+ "isOnline": obj.get("isOnline")
575
+ })
576
+ return _obj
577
+
578
+