|
@@ -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}")
|
|
|
|
|
|
|
|
|
|