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.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 time >= $start_time and time < $end_time and camera_index = $camera_index ''' 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 merge_alarm_to_event(self, alarm_list): pre_events = [] pre_status = -1 # 告警消息转换成事件 for alarm_point in alarm_list: # 报警时间转换成上海时区 alarm_time = dt_parse(alarm_point['time']).astimezone(tz) 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 # 合并时间间隔较短的事件或切分时间过长的事件 events = [] for pre_event in pre_events: if len(events) > 0 \ and pre_event['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['end_time'] else: events.append({ 'start_time': pre_event['start_time'], 'end_time': pre_event['end_time'], }) return events if __name__ == '__main__': from isc_video_record.recorder import recorder pre_event = PreEvent('2021-04-26 00:00:00', '2021-04-26 16:00:00') alarm_points = pre_event.get_alarm_list('f8a3c4d9b8ae42118b4db9fcf7895031') for event in pre_event.merge_alarm_to_event(alarm_points): recorder('f8a3c4d9b8ae42118b4db9fcf7895031', event['start_time'], event['end_time'])