コード例 #1
0
    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
コード例 #2
0
    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