import pytz from datetime import timedelta from dateutil.parser import parse as dt_parse from isc_video_record.db import influxdb tz = pytz.timezone('Asia/Shanghai') class PreEvent(object): def __init__(self, start_time, end_time): influxdb.reconnect() self.start_time = start_time self.end_time = end_time self.invalid_hour = [0, 1, 2, 3, 4, 5, 6, 23] self.tz_start_time = dt_parse(self.start_time.replace(' ', 'T') + '.001000Z').astimezone(tz) self.tz_end_time = dt_parse(self.end_time.replace(' ', 'T') + '.001000Z').astimezone(tz) def get_alarm_list(self, camera_index): sql = ''' select * from "one_week"."event_vss" where $start_time <= time and time < $end_time and camera_index = $camera_index and event_type = '131331' order by time ''' res = influxdb.query(sql, bind_params={ 'start_time': self.start_time, 'end_time': self.end_time, 'camera_index': camera_index }) points = [] if res and len(res) > 0: points = res['event_vss'] return points def _alarm_point_to_event(self, alarm_list, full_day=False): pre_events = [] pre_status = -1 # 告警消息转换成事件 for alarm_point in alarm_list: # 报警时间转换成上海时区 alarm_time = dt_parse(alarm_point['time']).astimezone(tz) if not full_day and alarm_time.hour in self.invalid_hour: # 过滤无效时间 continue if alarm_point['status'] == 1: if pre_status == 1: pre_events[-1]['end_time'] = alarm_time else: # 预录5s pre_events.append({'start_time': alarm_time - timedelta(seconds=5)}) else: if pre_status == 1: pre_events[-1]['end_time'] = alarm_time + timedelta(seconds=10) elif pre_status == -1: pre_events.append({ 'start_time': self.tz_start_time, 'end_time': alarm_time + timedelta(seconds=10) }) else: pre_events.append({ 'start_time': alarm_time - timedelta(seconds=30), 'end_time': alarm_time + timedelta(seconds=10) }) pre_status = alarm_point['status'] if pre_status == 1: pre_events[-1]['end_time'] = self.tz_end_time return pre_events def merge_alarm_to_event(self, alarm_list, full_day=False): pre_events = self._alarm_point_to_event(alarm_list, full_day) # 合并时间间隔较短的事件或切分时间过长的事件 events = [] for pre_event_item in pre_events: if len(events) > 0 \ and pre_event_item['start_time'] - events[-1]['end_time'] <= timedelta(seconds=30) \ and events[-1]['end_time'] - events[-1]['start_time'] <= timedelta(hours=0.5): events[-1]['end_time'] = pre_event_item['end_time'] else: events.append({ 'start_time': pre_event_item['start_time'], 'end_time': pre_event_item['end_time'], }) return events