import pytz from datetime import timedelta from dateutil.parser import parse as dt_parse from hikvision_isc_client.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 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 @staticmethod def merge_alarm_to_event(alarm_list): events = [] for alarm_point in alarm_list: # 报警时间转换成上海时区 alarm_time = dt_parse(alarm_point['time']).astimezone(tz) if len(events) > 0 \ and alarm_time - events[-1]['end_time'] < timedelta(seconds=40) \ and events[-1]['end_time'] - events[-1]['start_time'] < timedelta(hours=0.5): events[-1]['end_time'] = alarm_time + timedelta(seconds=10) continue events.append({ 'start_time': alarm_time - timedelta(seconds=10), 'end_time': alarm_time + timedelta(seconds=20) }) return events if __name__ == '__main__': from hikvision_isc_client.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'])