def get_curr_status_door(cls, uuid, retBatteryLevel=False): ''' Returns list of status codes. See class vars Inputs: uuid (str) ''' # Get down periods now = datetime.datetime.now() down_periods = cls.get_down_periods_door(uuid=uuid, start_dt=now, end_dt=now) ret_codes = [] down = False for p in down_periods: # Check if current time is within a down period # print(p) if p[0] <= now and now <= p[1]: down = True break ret_codes.append(cls.CHECK_WARN if down else cls.OK) # Battery level? if retBatteryLevel == False: return ret_codes else: batt_lvl = [] last_batt = sysmon_log_DAO.get_last_battery_level(uuid=uuid) if last_batt != None: # Sysmon batt event found batt_lvl.append(last_batt.event) if last_batt.event < cls.batt_thresh: ret_codes.append(cls.LOW_BATT) return ret_codes, batt_lvl
def get_sensor_status(cls, uuid, retBatteryLevel=False): ''' Returns 'up' | 'down' status of sensors. For new sensors, Im assuming that at least a single record is sent and thus will trigger true. Inputs: uuid (str) retBatteryLevel (boolean) Return: 1. A List of status codes: See class variables 2. A list of Battery level - None if Juvo - Empty if no records found. e.g. Door sensors only send battery level logs when on low battery - Single value in % i.e. ([1,3], [75]) i.e. ([1] , []) // Battery or newly installed sensor i.e. ([0] , [None]]) // Juvo ''' # AREAS OF IMPROVEMENT # 1. Juvo Bed sensor: Warning triggered if no sleep in the past sleep period 9pm-9am. What about if sleep = 1sec? May also be a problem with elderly # - Maybe look at the breakdown period would be better >> light, deep, awake that kind of thing # 2. What if sensor partially breaks, sysmon sends, but no sensor logs? Dont think this can be detected also ret_codes = [] batt_lvl = None curr_time = datetime.datetime.now() curr_time_m1d = curr_time - datetime.timedelta(days=1) try: sensor = sensor_DAO.get_sensors(uuid=uuid)[0] except IndexError: ret_codes.append(cls.INVALID_SENSOR) return ret_codes uuid = sensor.uuid type = sensor.type isDoor = True if type == "door" else False isMotion = True if type == "motion" else False isBed = True if type == "bed sensor" else False #LEGACY -- "disconnected" only exists in master students' data set. As this was thrown by gateway last_sysmons = sysmon_log_DAO.get_last_sysmon(uuid) if len(last_sysmons) > 0: if last_sysmons[0].key == "disconnected": ret_codes.append(cls.DISCONNECTED) if isDoor: # DOOR SENSOR # Check1: sensor update within 24 hours # we are assuming that the door closes at least once a day past24hrs_data = sensor_log_DAO.get_logs( uuid=uuid, start_datetime=curr_time_m1d, end_datetime=curr_time) if len(past24hrs_data) > 0: ret_codes.append(cls.CHECK_WARN) else: ret_codes.append(cls.OK) elif isMotion: # MOTION SENSOR last_batt = sysmon_log_DAO.get_last_battery_level(uuid=uuid) if last_batt != None: batt_update_period = ( curr_time - last_batt.recieved_timestamp).total_seconds() # Check 1: hourly battery update. aeotec multisensor 6 should send battery level sysmon updates on the hour # This may just be Boon Thais' configs if batt_update_period > (60 * 60 * cls.motion_thresh): ret_codes.append(cls.CHECK_WARN) else: ret_codes.append(cls.OK) elif isBed: # BED SENSOR (JUVO) juvo = JuvoAPI() # Check 1: Sleep logged within past sleep period 9pm - 9am day_timebreak = curr_time.replace(hour=9, minute=0, second=0, microsecond=0) night_timebreak = curr_time.replace(hour=21, minute=0, second=0, microsecond=0) if curr_time > day_timebreak and curr_time < night_timebreak: # If current time is between 9am and 9pm sleeps = juvo.get_total_sleep_by_day(target=sensor.juvo_target, start_date=curr_time_m1d, end_date=curr_time_m1d) if len(sleeps) > 0: ret_codes.append(cls.OK) # sleep recorded else: ret_codes.append(cls.CHECK_WARN) # no sleep recorded else: ret_codes.append(cls.INVALID_SENSOR) # Check2: Battery level if isMotion or isDoor: last_batt = sysmon_log_DAO.get_last_battery_level(uuid=uuid) if last_batt != None: # Sysmon batt event found batt_lvl = last_batt.event if batt_lvl < cls.batt_thresh: ret_codes.append(cls.LOW_BATT) else: # No Sysmon batt event found, door sensor high batt, or newly installed sensor batt_lvl = [] # Return Values if retBatteryLevel: return ret_codes, batt_lvl else: return ret_codes