Skip to content

Commit ffe57ee

Browse files
committed
Added info and debug logging to ThermostatDataGenerator
1 parent 800099b commit ffe57ee

File tree

1 file changed

+71
-10
lines changed

1 file changed

+71
-10
lines changed

fritz_advanced_thermostat/utils.py

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,50 +71,74 @@ def __init__(self, sid: str, fritz_requests: FritzRequests) -> None:
7171
self._logger = logging.getLogger("FritzAdvancedThermostatLogger")
7272

7373
def _get_object(self, device: dict, unit_name: str, skill_type: str, skill_name: str | None = None) -> any:
74+
self._logger.debug("Getting object: unit_name=%s, skill_type=%s, skill_name=%s", unit_name, skill_type, skill_name)
7475
thermostat_obj = None
7576
for unit in device["units"]:
7677
if unit["type"] == unit_name:
7778
if skill_name:
7879
for skill in unit["skills"]:
7980
if skill["type"] == skill_type:
8081
thermostat_obj = skill[skill_name]
82+
self._logger.debug("Found object: %s", thermostat_obj)
8183
else:
8284
thermostat_obj = unit
85+
self._logger.debug("Found unit: %s", thermostat_obj)
86+
if thermostat_obj is None:
87+
self._logger.warning("Object not found: unit_name=%s, skill_type=%s", unit_name, skill_type)
8388
return thermostat_obj
8489

8590
def _get_schedule(self, schedules: list, schedule_name: str) -> dict | None:
91+
self._logger.debug("Getting schedule: %s", schedule_name)
8692
schedule = [x for x in schedules if x["name"] == schedule_name]
87-
return schedule[0] if schedule else None
93+
if schedule:
94+
self._logger.debug("Schedule found: %s", schedule[0])
95+
return schedule[0]
96+
else:
97+
self._logger.warning("Schedule not found: %s", schedule_name)
98+
return None
8899

89100
def _get_temperature(self, presets: list, target: str) -> str:
90-
temp = "7.5" # Represents Off / AUS
101+
self._logger.debug("Getting temperature preset: %s", target)
102+
temp = "7.5" # Default: Off/AUS
91103
for preset in presets:
92104
if preset["name"] == target:
93105
temp = str(preset["temperature"])
106+
self._logger.debug("Temperature found: %s", temp)
107+
break
94108
return temp
95109

96110
def _get_lock(self, locks: list, target: str) -> bool:
111+
self._logger.debug("Checking lock status: %s", target)
97112
locked = False
98113
for lock in locks:
99114
if lock["devControlName"] == target and lock["isLocked"]:
100115
locked = True
116+
self._logger.debug("%s is locked", target)
117+
break
101118
return locked
102119

103120
def _get_holiday_temp(self, device_id: int) -> str:
104121
# I found no other way then to parse the HTML with a regex, I don't know where I can find this.
122+
self._logger.info("Getting holiday temperature for device ID: %s", device_id)
105123
payload = {
106124
"sid": self._sid,
107125
"xhr": "1",
108126
"device": device_id,
109-
"page": "home_auto_hkr_edit"}
110-
response = self.fritz_requests.post(payload, "data.lua")
127+
"page": "home_auto_hkr_edit"
128+
}
129+
response = self._fritz_requests.post(payload, "data.lua")
111130
regex = r'(?<=<input type="hidden" name="Holidaytemp" value=")\d+\.?\d?(?=" id="uiNum:Holidaytemp">)'
112-
return re.findall(regex, response)[0]
131+
holiday_temp = re.findall(regex, response)[0]
132+
self._logger.debug("Holiday temperature found: %s", holiday_temp)
133+
return holiday_temp
113134

114135
def _first_day_in_bitmask(self, bitmask: int) -> int:
136+
self._logger.debug("Determining first day in bitmask: %s", bitmask)
115137
for i in range(7):
116138
if bitmask & (1 << i):
139+
self._logger.debug("First day in bitmask: %s", i)
117140
return i
141+
self._logger.warning("No day found in bitmask")
118142
return -1
119143

120144
def _generate_weekly_timers(self, raw_timers: dict) -> dict:
@@ -130,6 +154,8 @@ def _generate_weekly_timers(self, raw_timers: dict) -> dict:
130154
This means turn the device on at 5:30 on all days of the week
131155
"""
132156

157+
self._logger.debug("Generating weekly timers for raw timers: %s", raw_timers)
158+
133159
weekly_timers = {}
134160
# day - bitmask mapping
135161
day_to_bit = {
@@ -176,10 +202,14 @@ def _generate_weekly_timers(self, raw_timers: dict) -> dict:
176202

177203
for i, ((time_str, category), bitmask) in enumerate(sorted_times):
178204
weekly_timers[f"timer_item_{i}"] = "{time_str};{category};{bitmask}"
205+
self._logger.debug("Generated weekly timer: timer_item_%s = %s", i, weekly_timers[f"timer_item_{i}"])
179206

207+
self._logger.info("Weekly timers generation complete")
180208
return weekly_timers
181209

182210
def _generate_holiday_schedule(self, raw_holidays: dict, device_id) -> dict:
211+
self._logger.debug("Generating holiday schedule for device %s", device_id)
212+
183213
holiday_schedule = {}
184214
if raw_holidays["isEnabled"]:
185215
holiday_id_count = 0
@@ -194,29 +224,46 @@ def _generate_holiday_schedule(self, raw_holidays: dict, device_id) -> dict:
194224
holiday_schedule[f"Holiday{i}StartDay"] = str(int(holiday["timeSetting"]["startDate"].split("-")[2]))
195225
holiday_schedule[f"Holiday{i}StartHour"] = str(int(holiday["timeSetting"]["startTime"].split(":")[1]))
196226
holiday_schedule[f"Holiday{i}StartMonth"] = str(int(holiday["timeSetting"]["startDate"].split("-")[1]))
227+
self._logger.debug("Holiday schedule %s generated: %s", i, holiday_schedule)
228+
197229
holiday_schedule["HolidayEnabledCount"] = str(holiday_id_count - 1)
198230
holiday_schedule["Holidaytemp"] = self._get_holiday_temp(device_id)
231+
self._logger.debug("Holiday temperature for device %s: %s", device_id, holiday_schedule["Holidaytemp"])
232+
else:
233+
self._logger.info("Holiday schedule is not enabled for device %s", device_id)
199234

235+
self._logger.info("Holiday schedule generation complete for device %s", device_id)
200236
return holiday_schedule
201237

238+
202239
def _generate_summer_time_schedule(self, raw_summer_time: dict) -> dict:
240+
self._logger.debug("Generating summer time schedule")
241+
203242
summer_time_schedule = {}
204243
if raw_summer_time["isEnabled"]:
205244
summer_time_schedule["SummerEnabled"] = "1"
206245
summer_time_schedule["SummerEndDay"] = str(int(raw_summer_time["actions"][0]["timeSetting"]["endDate"].split("-")[2]))
207246
summer_time_schedule["SummerEndMonth"] = str(int(raw_summer_time["actions"][0]["timeSetting"]["endDate"].split("-")[1]))
208247
summer_time_schedule["SummerStartDay"] = str(int(raw_summer_time["actions"][0]["timeSetting"]["startDate"].split("-")[2]))
209248
summer_time_schedule["SummerStartMonth"] = str(int(raw_summer_time["actions"][0]["timeSetting"]["startDate"].split("-")[1]))
249+
self._logger.debug("Summer time schedule generated: %s", summer_time_schedule)
210250
else:
211251
summer_time_schedule["SummerEnabled"] = "0"
252+
self._logger.info("Summer time schedule is not enabled")
253+
254+
self._logger.info("Summer time schedule generation complete")
212255
return summer_time_schedule
213256

257+
214258
def generate(self, raw_device_data) -> dict:
259+
self._logger.debug("Starting to generate thermostat data for raw device data: %s", raw_device_data)
260+
215261
thermostat_data = {}
216262
for device in raw_device_data["devices"]:
217263
name = device["displayName"]
218264
grouped = name in [i["displayName"] for i in [i["members"] for i in raw_device_data["groups"]][0]]
219265
if device["category"] == "THERMOSTAT":
266+
self._logger.debug("Processing thermostat device: %s", name)
220267
thermostat_data[name] = {}
221268
thermostat_data[name]["Offset"] = str(
222269
self._get_object(device, "TEMPERATURE_SENSOR", "SmartHomeTemperatureSensor", "offset"))
@@ -229,27 +276,41 @@ def generate(self, raw_device_data) -> dict:
229276
# 12 (11) 9 -> hoch
230277
thermostat_data[name]["WindowOpenTrigger"] = str(
231278
self._get_object(device, "THERMOSTAT", "SmartHomeThermostat", "temperatureDropDetection")["sensitivity"] + 3)
279+
self._logger.debug("Offset and window settings for %s: Offset=%s, WindowOpenTimer=%s, WindowOpenTrigger=%s",
280+
name, thermostat_data[name]["Offset"], thermostat_data[name]["WindowOpenTimer"], thermostat_data[name]["WindowOpenTrigger"])
232281

233282
locks = self._get_object(device, "THERMOSTAT", "SmartHomeThermostat")["interactionControls"]
234283
thermostat_data[name]["locklocal"] = self._get_lock(locks, "BUTTON")
235284
thermostat_data[name]["lockuiapp"] = self._get_lock(locks, "EXTERNAL")
285+
self._logger.debug("Lock settings for %s: locklocal=%s, lockuiapp=%s",
286+
name, thermostat_data[name]["locklocal"], thermostat_data[name]["lockuiapp"])
236287

237288
adaptiv_heating = self._get_object(device, "THERMOSTAT", "SmartHomeThermostat", "adaptivHeating")
238289
thermostat_data[name]["hkr_adaptheat"] = adaptiv_heating['isEnabled'] and adaptiv_heating['supported']
290+
self._logger.debug("Adaptive heating for %s: %s", name, thermostat_data[name]["hkr_adaptheat"])
239291

240292
if not grouped:
241293
thermostat_data[name]['graphState'] = "1"
242294
temperatures = self._get_object(device, "THERMOSTAT", "SmartHomeThermostat", "presets")
243295
thermostat_data[name]["Absenktemp"] = self._get_temperature(temperatures, "LOWER_TEMPERATURE")
244296
thermostat_data[name]["Heiztemp"] = self._get_temperature(temperatures, "UPPER_TEMPERATURE")
297+
self._logger.debug("Temperature settings for %s: Absenktemp=%s, Heiztemp=%s",
298+
name, thermostat_data[name]["Absenktemp"], thermostat_data[name]["Heiztemp"])
245299

246-
summer_time = self._get_schedule(self._get_object(device, "THERMOSTAT", "SmartHomeThermostat", "timeControl")["timeSchedules"], "SUMMER_TIME")
247-
thermostat_data[name] |= self._generate_summer_time_schedule(summer_time)
300+
summer_time = self._get_schedule(self._get_object(device, "THERMOSTAT", "SmartHomeThermostat", "timeControl")["timeSchedules"], "SUMMER_TIME")
301+
if summer_time:
302+
thermostat_data[name] |= self._generate_summer_time_schedule(summer_time)
303+
self._logger.debug("Summer time schedule for %s generated", name)
248304

249-
holidays = self._get_schedule(self._get_object(device, "THERMOSTAT", "SmartHomeThermostat", "timeControl")["timeSchedules"], "HOLIDAYS")
250-
thermostat_data[name] |= self._generate_holiday_schedule(holidays, device["id"])
305+
holidays = self._get_schedule(self._get_object(device, "THERMOSTAT", "SmartHomeThermostat", "timeControl")["timeSchedules"], "HOLIDAYS")
306+
if holidays:
307+
thermostat_data[name] |= self._generate_holiday_schedule(holidays, device["id"])
308+
self._logger.debug("Holiday schedule for %s generated", name)
251309

252310
raw_weekly_timetable = self._get_schedule(self._get_object(device, "THERMOSTAT", "SmartHomeThermostat", "timeControl")["timeSchedules"], "TEMPERATURE")
253-
thermostat_data[name] |= self._generate_weekly_timers(raw_weekly_timetable)
311+
if raw_weekly_timetable:
312+
thermostat_data[name] |= self._generate_weekly_timers(raw_weekly_timetable)
313+
self._logger.debug("Weekly timers for %s generated", name)
254314

315+
self._logger.info("Thermostat data generation complete")
255316
return thermostat_data

0 commit comments

Comments
 (0)