@@ -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