diff --git a/apps/alarmclock.py b/apps/alarmclock.py index dfd9a4d..95e3f1f 100644 --- a/apps/alarmclock.py +++ b/apps/alarmclock.py @@ -37,9 +37,8 @@ class AlarmClock(SmartObject): self.switch_alarmclock_secondary = self.args['switch_alarmclock_secondary'] self.inputdate_alarmclock_main = self.args['inputdate_alarmclock_main'] self.inputdate_alarmclock_secondary = self.args['inputdate_alarmclock_secondary'] - self.input_text_wakeup_time = self.args['input_text_wakeup_time'] self.output_workday_sensor = self.args['output_workday_sensor'] - #self.sensor_wakeup_datetime = self.args['sensor_wakeup_datetime'] + self.sensor_wakeup_datetime_sensor = self.args['sensor_wakeup_datetime'] self.sleeping_condition = SmartCondition.Evaluator(self, self.args['sleeping_condition'], condition_name="sleeping_condition", constants=self.constants, templates_library=self.templates_library) self.lock = Lock() @@ -54,11 +53,8 @@ class AlarmClock(SmartObject): self.run_hourly(self.on_refresh_cal,datetime.time(0, 0, 0)) - self.sensor_wakeup_datetime_entity = self.create_entity("sensor.wakeup_datetime", icon="mdi:alarm") + self.sensor_wakeup_datetime_entity = self.create_entity(self.sensor_wakeup_datetime_sensor, icon="mdi:alarm") self.workday_entity = self.create_entity(self.output_workday_sensor, icon="mdi:briefcase-check") - #sensor_wakeup_datetime_entity = self.get_entity(self.sensor_wakeup_datetime) - #if not sensor_wakeup_datetime_entity.exists(): - # sensor_wakeup_datetime_entity.add() self.calendar = list() self.refresh_cal() @@ -67,16 +63,17 @@ class AlarmClock(SmartObject): self.update_wakeup_time() def refresh_cal(self): - new_cal = list() - #if self.load_cal_from_google_calendar(new_cal): - if self.load_cal_from_ics(new_cal): - if not self.are_cal_identical(self.calendar,new_cal): - self.calendar = new_cal - self.log("Calendar has been updated!") - self.print_cal(self.calendar) - return True + with self.log_group("refresh_cal"): + new_cal = list() + #if self.load_cal_from_google_calendar(new_cal): + if self.load_cal_from_ics(new_cal): + if not self.are_cal_identical(self.calendar,new_cal): + self.calendar = new_cal + self.log_info("Calendar has been updated!") + self.print_cal(self.calendar) + return True - return False + return False def are_cal_identical(self,calendar1,calendar2): if len(calendar1) != len(calendar2): return False @@ -89,20 +86,20 @@ class AlarmClock(SmartObject): def print_cal(self,calendar): for event in calendar: - self.log(f"{event}") + self.log_info(f"{event}") def load_cal_from_ics(self,calendar): calendar.clear() try: - self.log(f"Retrieving calengar from outlook.office365.com") + self.log_info(f"Retrieving calengar from outlook.office365.com") r = get("https://outlook.office365.com/owa/calendar/0c64359c70eb41cd9713fe92c470d3df@ubisoft.com/5edb3fb5150f4203b66d9cf8db3184be11626033572842691749/calendar.ics", timeout=10)#, headers=headers, verify=False) - #self.log(f"Processing Calendar") + #self.log_info(f"Processing Calendar") today = datetime.datetime.combine(datetime.date.today(), datetime.time(0,0, 0)) start_load_date = today - datetime.timedelta(days=1) end_load_date = today + datetime.timedelta(days=2) - #self.log("[" + str(start_load_date) + "]-[" + str(end_load_date) + "]") + #self.log_info("[" + str(start_load_date) + "]-[" + str(end_load_date) + "]") calendar_ubi = icalendar.Calendar.from_ical(r.text) for component in calendar_ubi.walk(): @@ -111,7 +108,7 @@ class AlarmClock(SmartObject): if event_summary == "Away" or event_summary == "Absent(e)": event_type = EventType.Vacation elif event_summary == "Busy" or event_summary == "Occupé(e)": event_type = EventType.Busy elif event_summary == "Tentative" or event_summary == "Provisoire": event_type = EventType.Tentative - elif event_summary == "Working elsewhere" or event_summary == "Free": event_type = EventType.Flex + elif event_summary == "Working elsewhere" or event_summary == "Free" or event_summary == "Disponible": event_type = EventType.Flex else: event_type = None start_datetime = component.get('dtstart').dt @@ -138,16 +135,16 @@ class AlarmClock(SmartObject): if not outside_of_loading_period: if event_type: calendar.append(CalendarEvent(start_datetime,end_datetime,event_type)) - else: self.log(f"[Unknow event : {event_summary}]Start at {start_datetime},Finish at {end_datetime}",level = "WARNING") + else: self.log_warning(f"[Unknow event : {event_summary}]Start at {start_datetime},Finish at {end_datetime}") except ValueError: self.log_error("Couldn't load calendar") return False except (requests.exceptions.ConnectionError,requests.exceptions.ReadTimeout): - self.log("Couldn't load calendar, request Timeout",level = "WARNING") + self.log_warning("Couldn't load calendar, request Timeout") return False - #self.log(f"Calendar loaded") + #self.log_info(f"Calendar loaded") return True def on_alarm_clock_set(self, entity, attribute, old, new, kwargs): @@ -160,10 +157,11 @@ class AlarmClock(SmartObject): self.update_wakeup_time() def update_workday_status(self): - is_workday = self.is_wakeup_time_on_a_working_day(datetime.datetime.now()) - new_state = "on" if is_workday else "off" - if self.workday_entity.get_state() != new_state: - self.workday_entity.set_state(state=new_state) + with self.log_group("update_workday_status"): + is_workday = self.is_wakeup_time_on_a_working_day(datetime.datetime.now()) + new_state = "on" if is_workday else "off" + if self.workday_entity.get_state() != new_state: + self.workday_entity.set_state(state=new_state) def on_program_next_wakeup(self, kwargs): self.handle_program_next_wakueup_cb = None @@ -172,12 +170,12 @@ class AlarmClock(SmartObject): #le reveil principal se reactive chaque matin if self.get_state(self.switch_alarmclock_main) == 'off': - self.log("Turning on main alarm clock") + self.log_info("Turning on main alarm clock") no_switch_changed = False self.turn_on(self.switch_alarmclock_main) #le reveil secondaire ne sonne qu'une fois, il est donc desactivé chaque matin if self.get_state(self.switch_alarmclock_secondary) == 'on': - self.log("Turning off secondary alarm clock") + self.log_info("Turning off secondary alarm clock") no_switch_changed = False self.turn_off(self.switch_alarmclock_secondary) @@ -196,7 +194,7 @@ class AlarmClock(SmartObject): wakeup_message = "On se reveil dans " + str(wakeup_in) + " minutes" - self.log(wakeup_message) + self.log_info(wakeup_message) if self.sleeping_condition.evaluate() == SmartCondition.Result.Succeeded: self.fire_event("WAKEUP_IN", wakeup_in = wakeup_in) #self.call_service("notify/ios_iphone_de_pierre", title = "Reveil", message = wakeup_message) @@ -205,7 +203,7 @@ class AlarmClock(SmartObject): wakeup_message = "WAKE UP!!!! It's " + self.wakeup_time_str - self.log(wakeup_message) + self.log_info(wakeup_message) if self.sleeping_condition.evaluate() == SmartCondition.Result.Succeeded: self.fire_event("WAKEUP") #self.call_service("notify/ios_iphone_de_pierre", title = "Reveil", message = wakeup_message) @@ -248,11 +246,11 @@ class AlarmClock(SmartObject): wake_up_datetime = busy_event.start_time - datetime.timedelta(minutes=30) new_wake_up_time = wake_up_datetime.strftime("%H:%M") - self.log(f"A meeting have been found at {busy_event.start_time}, we'll wake up at {new_wake_up_time}") + self.log_info(f"A meeting have been found at {busy_event.start_time}, we'll wake up at {new_wake_up_time}") return new_wake_up_time new_wake_up_time = wakeup_datetime.strftime("%H:%M") - #self.log(f"No meeting have been found before {wake_up_time}, we'll wake up at {wake_up_time}") + #self.log_info(f"No meeting have been found before {wake_up_time}, we'll wake up at {wake_up_time}") return new_wake_up_time def calculate_wakeup_time(self): @@ -266,10 +264,10 @@ class AlarmClock(SmartObject): new_wakeup_time = self.get_state(self.inputdate_alarmclock_main)[0:5] new_wakeup_datetime = self.generate_wakeup_datetime_from_string(new_wakeup_time) if not self.is_wakeup_time_on_a_working_day(new_wakeup_datetime): - self.log(f"Primary Wake up time ({new_wakeup_datetime}) is not on a working day") + self.log_info(f"Primary Wake up time ({new_wakeup_datetime}) is not on a working day") new_wakeup_time = "--:--" elif self.is_wakeup_time_on_a_flex_day(max_flex_wakeup_datetime): - self.log(f"Flex Wake up time ({max_flex_wakeup_datetime}) is on a flex office day") + self.log_info(f"Flex Wake up time ({max_flex_wakeup_datetime}) is on a flex office day") new_wakeup_time = self.offset_wakeup_time_for_meeting(max_flex_wakeup_datetime) else: new_wakeup_time = self.offset_wakeup_time_for_meeting(new_wakeup_datetime) @@ -290,15 +288,15 @@ class AlarmClock(SmartObject): with self.lock: #first, cancel all previous callbacks if self.handle_program_next_wakueup_cb: - self.log("Canceling previous program next wakeup cb") + self.log_info("Canceling previous program next wakeup cb") self.cancel_timer(self.handle_program_next_wakueup_cb) self.handle_program_next_wakueup_cb = None if self.handle_prewakueup_cb: - self.log("Canceling previous pre wakeup cb") + self.log_info("Canceling previous pre wakeup cb") self.cancel_timer(self.handle_prewakueup_cb) self.handle_prewakueup_cb = None if self.handle_wakueup_cb: - self.log("Canceling previous wakeup cb") + self.log_info("Canceling previous wakeup cb") self.cancel_timer(self.handle_wakueup_cb) self.handle_wakueup_cb = None @@ -311,7 +309,7 @@ class AlarmClock(SmartObject): if datetime.datetime.now().hour >= 4: program_next_wakeup_time = program_next_wakeup_time + datetime.timedelta(days=1) - self.log("program next wakeup cb registered for " + str(program_next_wakeup_time)) + self.log_info("program next wakeup cb registered for " + str(program_next_wakeup_time)) self.handle_program_next_wakueup_cb = self.run_at(self.on_program_next_wakeup, program_next_wakeup_time) self.sensor_wakeup_datetime_entity.set_state(state = 'unavailable') else: @@ -326,17 +324,18 @@ class AlarmClock(SmartObject): prewakeup_datetime = wakeup_datetime - datetime.timedelta(minutes=prewakeup_offset) self.handle_prewakueup_cb = self.run_at(self.on_pre_wakeup, prewakeup_datetime,wakeup_in = prewakeup_offset) - self.log("prewakup cb registered for " + str(prewakeup_datetime)) + self.log_info("prewakup cb registered for " + str(prewakeup_datetime)) self.handle_wakueup_cb = self.run_at(self.on_wakeup, wakeup_datetime) - self.log("wakeup cb registered for " + str(wakeup_datetime)) + self.log_info("wakeup cb registered for " + str(wakeup_datetime)) self.handle_program_next_wakueup_cb = self.run_at(self.on_program_next_wakeup, program_next_wakeup_datetime) - self.log("program next wakeup cb registered for " + str(program_next_wakeup_datetime)) + self.log_info("program next wakeup cb registered for " + str(program_next_wakeup_datetime)) self.wakeup_time_str = wakeup_time_str - self.call_service("input_text/set_value", entity_id = self.input_text_wakeup_time, value = self.wakeup_time_str) + #self.call_service("input_text/set_value", entity_id = self.input_text_wakeup_time, value = self.wakeup_time_str) - def update_wakeup_time(self): - self.register_callbacks(self.calculate_wakeup_time()) + def update_wakeup_time(self): + with self.log_group("update_wakeup_time"): + self.register_callbacks(self.calculate_wakeup_time()) diff --git a/apps/rooms/bedroom.yaml b/apps/rooms/bedroom.yaml index 26ce44e..19a5ae9 100644 --- a/apps/rooms/bedroom.yaml +++ b/apps/rooms/bedroom.yaml @@ -181,7 +181,7 @@ alarm_clock: switch_alarmclock_secondary: input_boolean.secondary_alarmclock inputdate_alarmclock_main: input_datetime.main_alarmclock inputdate_alarmclock_secondary: input_datetime.secondary_alarmclock - input_text_wakeup_time: input_text.wakeup_time + sensor_wakeup_datetime: sensor.wakeup_datetime output_workday_sensor: binary_sensor.pierre_workday sleeping_condition: binary_sensor.is_bedroom_sleeping