Browse Source

异常消失

nifangxu 1 month ago
parent
commit
8638e9fe5b
2 changed files with 88 additions and 16 deletions
  1. 83 11
      core/alarm_plan.py
  2. 5 5
      core/alarm_plan_manager.py

+ 83 - 11
core/alarm_plan.py

@@ -146,15 +146,16 @@ class EventAttr_BathroomStayFrequency(EventAttr_Base):
 class EventAttr_TargetAbsence(EventAttr_Base):
     def __init__(self, event_type):
         self.event_type_ = event_type
-        self.enter_ts_: int  = -1    # 进入时间(ms)
         self.leave_ts_: int  = -1    # 离开时间(ms)
-        self.stay_time_: int = -1    # 停留时长(ms)
+        self.enter_ts_: int  = -1    # 进入时间(ms)
+        self.absence_time_: int = -1    # 消失时长(ms)
+        self.time_threshold_: int = 300    # 触发消失时间阈值(ms)
         return
 
     def reset(self):
-        self.enter_ts_  = -1
         self.leave_ts_  = -1
-        self.stay_time_ = -1
+        self.enter_ts_  = -1
+        self.absence_time_ = -1
 
 
 # 事件属性表
@@ -233,6 +234,8 @@ class AlarmPlan:
             if ((self.event_type_ == EventType.TOILETING_FREQUENCY_ABNORMAL.value) or
                 (self.event_type_ == EventType.NIGHT_TOILETING_FREQUENCY_ABNORMAL.value)):
                 event_attr.threshold_count_ = int(self.param_.get("count", 0))
+            if ((self.event_type_ == EventType.TARGET_ABSENCE.value)):
+                event_attr.time_threshold_ = int(self.param_.get("time_threshold", 0))
 
             return event_attr
 
@@ -336,8 +339,8 @@ class AlarmPlan:
             # 构造事件
             # 入库
             info = {
-                "enter_time": utc_to_bj_s(self.event_attr_.enter_ts_),
-                "leave_time": utc_to_bj_s(self.event_attr_.enter_ts_),
+                "start_time": utc_to_bj_s(self.event_attr_.enter_ts_),
+                "end_time": utc_to_bj_s(self.event_attr_.leave_ts_),
                 "stay_time": stay_time
             }
             event_uuid = str(uuid.uuid4())
@@ -409,8 +412,8 @@ class AlarmPlan:
             # 构造事件
             # 入库
             info = {
-                "enter_time": utc_to_bj_s(self.event_attr_.enter_ts_),
-                "leave_time": utc_to_bj_s(self.event_attr_.enter_ts_),
+                "start_time": utc_to_bj_s(self.event_attr_.enter_ts_),
+                "end_time": utc_to_bj_s(self.event_attr_.leave_ts_),
                 "stay_time": stay_time
             }
             event_uuid = str(uuid.uuid4())
@@ -482,8 +485,8 @@ class AlarmPlan:
             # 构造事件
             # 入库
             info = {
-                "enter_time": utc_to_bj_s(self.event_attr_.enter_ts_),
-                "leave_time": utc_to_bj_s(self.event_attr_.enter_ts_),
+                "start_time": utc_to_bj_s(self.event_attr_.enter_ts_),
+                "end_time": utc_to_bj_s(self.event_attr_.leave_ts_),
                 "stay_time": stay_time
             }
             event_uuid = str(uuid.uuid4())
@@ -698,7 +701,76 @@ class AlarmPlan:
 
     # 异常消失
     def handle_target_absence(self):
-        return
+        try:
+            dev_id = self.dev_id_
+            device:Device = dev_map_find(dev_id)
+            if not device:
+                return
+            now = get_utc_time_s()
+
+            threshold: int = self.event_attr_.time_threshold_
+
+            # 查找最新的落在检测区域的目标
+            rtd_unit = self.find_latest_rtd_in_region(device, self.rect_, now, 3)
+            if rtd_unit:
+                return
+
+            timestamp = get_utc_time_s()
+            if self.event_attr_.leave_ts_ == -1:
+                self.event_attr_.leave_ts_ = timestamp
+            else:
+                self.event_attr_.enter_ts_ = timestamp
+
+            if self.event_attr_.enter_ts_ == -1 or self.event_attr_.leave_ts_ == -1:
+                return
+
+            # 归并时间内,不认为事件结束
+            if now - self.event_attr_.enter_ts_  < self.merge_time_:
+                return
+
+            self.event_attr_.absence_time_ = self.event_attr_.enter_ts_ - self.event_attr_.leave_ts_
+            absence_time = self.event_attr_.absence_time_
+            # 时间小于触发时间阈值,忽略并重置
+            if absence_time < threshold :
+                self.event_attr_.reset()
+                LOGINFO(f"less than threshold_time, alarm_plan: {self.plan_uuid_}, event_type: {self.event_type_}")
+                return
+
+            # 构造事件
+            # 入库
+            info = {
+                "start_time": utc_to_bj_s(self.event_attr_.leave_ts_),
+                "end_time": utc_to_bj_s(self.event_attr_.enter_ts_),
+                "absence_time": absence_time
+            }
+            event_uuid = str(uuid.uuid4())
+            params = {
+                "dev_id": dev_id,
+                "uuid": event_uuid,
+                "plan_uuid": self.plan_uuid_,
+                "event_type": event_desc_map[self.event_type_],
+                "info": json.dumps(info),
+                "is_handle": 0,
+                "create_time": get_bj_time_s(),
+                "is_deleted": 0,
+                "remark": json.dumps({}, ensure_ascii=False) 
+            }
+            db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
+
+            # 通知
+            mqtt_send.alarm_event(dev_id, self.dev_name_, event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], info, "events")
+            LOGDBG(f"new event: {event_desc_map[self.event_type_]}, absence_time: {absence_time}")
+
+            self.event_attr_.reset()
+
+        except json.JSONDecodeError as e:
+            tb_info = traceback.extract_tb(e.__traceback__)
+            for frame in tb_info:
+                LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error:{e}, {e.doc}")
+        except Exception as e:
+            tb_info = traceback.extract_tb(e.__traceback__)
+            for frame in tb_info:
+                LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
 
 
 

+ 5 - 5
core/alarm_plan_manager.py

@@ -201,11 +201,11 @@ def start_event_dispatcher():
         EventType.RETENTION_DETECTION.value : AlarmPlan.handle_retention_detection,
         EventType.TOILETING_DETECTION.value : AlarmPlan.handle_toileting_detection,
         EventType.TOILETING_FREQUENCY.value : AlarmPlan.handle_toileting_frequency,
-        EventType.NIGHT_TOILETING_FREQUENCY.value : AlarmPlan.handle_night_toileting_frequency,
-        EventType.TOILETING_FREQUENCY_ABNORMAL.value : AlarmPlan.handle_toileting_frequency_abnormal,
+        EventType.NIGHT_TOILETING_FREQUENCY.value       : AlarmPlan.handle_night_toileting_frequency,
+        EventType.TOILETING_FREQUENCY_ABNORMAL.value    : AlarmPlan.handle_toileting_frequency_abnormal,
         EventType.NIGHT_TOILETING_FREQUENCY_ABNORMAL.value : AlarmPlan.handle_night_toileting_frequency_abnormal,
-        EventType.BATHROOM_STAY_FREQUENCY.value : AlarmPlan.handle_bathroom_stay_frequency,
-        EventType.TARGET_ABSENCE.value : AlarmPlan.handle_target_absence,
+        EventType.BATHROOM_STAY_FREQUENCY.value         : AlarmPlan.handle_bathroom_stay_frequency,
+        EventType.TARGET_ABSENCE.value                  : AlarmPlan.handle_target_absence,
     }
     g_las.g_event_dispatcher.start(handles)
 
@@ -265,7 +265,7 @@ def cb_handle_query_all_alarm_plan_info(result):
                     (event_type == EventType.NIGHT_TOILETING_FREQUENCY_ABNORMAL.value) or
                     (event_type == EventType.BATHROOM_STAY_FREQUENCY.value)):
                     cron = {
-                        "hour": 1,
+                        "hour": 6,
                         "minute": 0
                     }