|
@@ -16,6 +16,8 @@ from common.sys_comm import (
|
|
from core.time_plan import TimePlan
|
|
from core.time_plan import TimePlan
|
|
from core.event_type import EventType, event_desc_map
|
|
from core.event_type import EventType, event_desc_map
|
|
import core.g_LAS as g_las
|
|
import core.g_LAS as g_las
|
|
|
|
+import core.alarm_plan_helper as helper
|
|
|
|
+
|
|
from device.dev_mng import (
|
|
from device.dev_mng import (
|
|
Device,
|
|
Device,
|
|
dev_map_push, dev_map_pop, dev_map_find, dev_map_delete
|
|
dev_map_push, dev_map_pop, dev_map_find, dev_map_delete
|
|
@@ -35,7 +37,8 @@ class EventAttr_Base:
|
|
|
|
|
|
# 事件属性 事件事件
|
|
# 事件属性 事件事件
|
|
class EventAttr_StayDetection(EventAttr_Base):
|
|
class EventAttr_StayDetection(EventAttr_Base):
|
|
- def __init__(self):
|
|
|
|
|
|
+ def __init__(self, event_type):
|
|
|
|
+ self.event_type_ = event_type
|
|
self.enter_ts_: int = -1 # 进入时间(s)
|
|
self.enter_ts_: int = -1 # 进入时间(s)
|
|
self.leave_ts_: int = -1 # 离开时间(s)
|
|
self.leave_ts_: int = -1 # 离开时间(s)
|
|
self.stay_time_: int = -1 # 停留时长(s)
|
|
self.stay_time_: int = -1 # 停留时长(s)
|
|
@@ -49,7 +52,8 @@ class EventAttr_StayDetection(EventAttr_Base):
|
|
|
|
|
|
# 事件属性 滞留事件
|
|
# 事件属性 滞留事件
|
|
class EventAttr_RetentionDetection(EventAttr_Base):
|
|
class EventAttr_RetentionDetection(EventAttr_Base):
|
|
- def __init__(self):
|
|
|
|
|
|
+ def __init__(self, event_type):
|
|
|
|
+ self.event_type_ = event_type
|
|
self.enter_ts_: int = -1 # 进入时间(s)
|
|
self.enter_ts_: int = -1 # 进入时间(s)
|
|
self.leave_ts_: int = -1 # 离开时间(s)
|
|
self.leave_ts_: int = -1 # 离开时间(s)
|
|
self.stay_time_: int = -1 # 停留时长(s)
|
|
self.stay_time_: int = -1 # 停留时长(s)
|
|
@@ -63,7 +67,8 @@ class EventAttr_RetentionDetection(EventAttr_Base):
|
|
|
|
|
|
# 事件属性 如厕事件
|
|
# 事件属性 如厕事件
|
|
class EventAttr_ToiletingDetection(EventAttr_Base):
|
|
class EventAttr_ToiletingDetection(EventAttr_Base):
|
|
- def __init__(self):
|
|
|
|
|
|
+ def __init__(self, event_type):
|
|
|
|
+ self.event_type_ = event_type
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
@@ -76,7 +81,8 @@ class EventAttr_ToiletingDetection(EventAttr_Base):
|
|
|
|
|
|
# 事件属性 如厕频次统计
|
|
# 事件属性 如厕频次统计
|
|
class EventAttr_ToiletingFrequency(EventAttr_Base):
|
|
class EventAttr_ToiletingFrequency(EventAttr_Base):
|
|
- def __init__(self):
|
|
|
|
|
|
+ def __init__(self, event_type):
|
|
|
|
+ self.event_type_ = event_type
|
|
self.count_: int = 0
|
|
self.count_: int = 0
|
|
self.event_list: list = []
|
|
self.event_list: list = []
|
|
return
|
|
return
|
|
@@ -85,9 +91,11 @@ class EventAttr_ToiletingFrequency(EventAttr_Base):
|
|
self.count_ = 0
|
|
self.count_ = 0
|
|
self.event_list = []
|
|
self.event_list = []
|
|
|
|
|
|
|
|
+
|
|
# 事件属性 夜间如厕频次统计
|
|
# 事件属性 夜间如厕频次统计
|
|
class EventAttr_NightToiletingFrequency(EventAttr_Base):
|
|
class EventAttr_NightToiletingFrequency(EventAttr_Base):
|
|
- def __init__(self):
|
|
|
|
|
|
+ def __init__(self, event_type):
|
|
|
|
+ self.event_type_ = event_type
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
@@ -100,7 +108,8 @@ class EventAttr_NightToiletingFrequency(EventAttr_Base):
|
|
|
|
|
|
# 事件属性 如厕频次异常
|
|
# 事件属性 如厕频次异常
|
|
class EventAttr_ToiletingFrequencyAbnormal(EventAttr_Base):
|
|
class EventAttr_ToiletingFrequencyAbnormal(EventAttr_Base):
|
|
- def __init__(self):
|
|
|
|
|
|
+ def __init__(self, event_type):
|
|
|
|
+ self.event_type_ = event_type
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
@@ -113,7 +122,8 @@ class EventAttr_ToiletingFrequencyAbnormal(EventAttr_Base):
|
|
|
|
|
|
# 事件属性 起夜异常
|
|
# 事件属性 起夜异常
|
|
class EventAttr_NightToiletingFrequencyAbnormal(EventAttr_Base):
|
|
class EventAttr_NightToiletingFrequencyAbnormal(EventAttr_Base):
|
|
- def __init__(self):
|
|
|
|
|
|
+ def __init__(self, event_type):
|
|
|
|
+ self.event_type_ = event_type
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
@@ -126,7 +136,8 @@ class EventAttr_NightToiletingFrequencyAbnormal(EventAttr_Base):
|
|
|
|
|
|
# 事件属性 卫生间频次统计
|
|
# 事件属性 卫生间频次统计
|
|
class EventAttr_BathroomStayFrequency(EventAttr_Base):
|
|
class EventAttr_BathroomStayFrequency(EventAttr_Base):
|
|
- def __init__(self):
|
|
|
|
|
|
+ def __init__(self, event_type):
|
|
|
|
+ self.event_type_ = event_type
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
@@ -139,7 +150,8 @@ class EventAttr_BathroomStayFrequency(EventAttr_Base):
|
|
|
|
|
|
# 事件属性 异常消失
|
|
# 事件属性 异常消失
|
|
class EventAttr_TargetAbsence(EventAttr_Base):
|
|
class EventAttr_TargetAbsence(EventAttr_Base):
|
|
- def __init__(self):
|
|
|
|
|
|
+ def __init__(self, event_type):
|
|
|
|
+ self.event_type_ = event_type
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.enter_ts_: int = -1 # 进入时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.leave_ts_: int = -1 # 离开时间(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
self.stay_time_: int = -1 # 停留时长(ms)
|
|
@@ -211,8 +223,7 @@ class AlarmPlan:
|
|
def execute(self):
|
|
def execute(self):
|
|
if self.status_ != 1:
|
|
if self.status_ != 1:
|
|
return
|
|
return
|
|
- if not self.cron_:
|
|
|
|
- g_las.g_event_dispatcher.dispatch(self.event_type_, self)
|
|
|
|
|
|
+ g_las.g_event_dispatcher.dispatch(self.event_type_, self)
|
|
|
|
|
|
|
|
|
|
# 初始化事件属性
|
|
# 初始化事件属性
|
|
@@ -221,7 +232,7 @@ class AlarmPlan:
|
|
if event_cls is None:
|
|
if event_cls is None:
|
|
return None
|
|
return None
|
|
|
|
|
|
- event_attr = event_cls()
|
|
|
|
|
|
+ event_attr = event_cls(self.event_type_)
|
|
return event_attr
|
|
return event_attr
|
|
|
|
|
|
|
|
|
|
@@ -318,7 +329,6 @@ class AlarmPlan:
|
|
"enter_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"enter_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"leave_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"leave_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"stay_time": stay_time
|
|
"stay_time": stay_time
|
|
-
|
|
|
|
}
|
|
}
|
|
event_uuid = str(uuid.uuid4())
|
|
event_uuid = str(uuid.uuid4())
|
|
params = {
|
|
params = {
|
|
@@ -330,7 +340,7 @@ class AlarmPlan:
|
|
"is_handle": 0,
|
|
"is_handle": 0,
|
|
"create_time": get_bj_time_s(),
|
|
"create_time": get_bj_time_s(),
|
|
"is_deleted": 0,
|
|
"is_deleted": 0,
|
|
- "remark": {}
|
|
|
|
|
|
+ "remark": json.dumps({}, ensure_ascii=False)
|
|
}
|
|
}
|
|
db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
|
|
db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
|
|
|
|
|
|
@@ -392,7 +402,6 @@ class AlarmPlan:
|
|
"enter_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"enter_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"leave_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"leave_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"stay_time": stay_time
|
|
"stay_time": stay_time
|
|
-
|
|
|
|
}
|
|
}
|
|
event_uuid = str(uuid.uuid4())
|
|
event_uuid = str(uuid.uuid4())
|
|
params = {
|
|
params = {
|
|
@@ -404,7 +413,7 @@ class AlarmPlan:
|
|
"is_handle": 0,
|
|
"is_handle": 0,
|
|
"create_time": get_bj_time_s(),
|
|
"create_time": get_bj_time_s(),
|
|
"is_deleted": 0,
|
|
"is_deleted": 0,
|
|
- "remark": {}
|
|
|
|
|
|
+ "remark": json.dumps({}, ensure_ascii=False)
|
|
}
|
|
}
|
|
db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
|
|
db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
|
|
|
|
|
|
@@ -466,7 +475,6 @@ class AlarmPlan:
|
|
"enter_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"enter_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"leave_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"leave_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
"stay_time": stay_time
|
|
"stay_time": stay_time
|
|
-
|
|
|
|
}
|
|
}
|
|
event_uuid = str(uuid.uuid4())
|
|
event_uuid = str(uuid.uuid4())
|
|
params = {
|
|
params = {
|
|
@@ -478,7 +486,7 @@ class AlarmPlan:
|
|
"is_handle": 0,
|
|
"is_handle": 0,
|
|
"create_time": get_bj_time_s(),
|
|
"create_time": get_bj_time_s(),
|
|
"is_deleted": 0,
|
|
"is_deleted": 0,
|
|
- "remark": {}
|
|
|
|
|
|
+ "remark": json.dumps({}, ensure_ascii=False)
|
|
}
|
|
}
|
|
db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
|
|
db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
|
|
|
|
|
|
@@ -506,62 +514,78 @@ class AlarmPlan:
|
|
device:Device = dev_map_find(dev_id)
|
|
device:Device = dev_map_find(dev_id)
|
|
if not device:
|
|
if not device:
|
|
return
|
|
return
|
|
- now = get_utc_time_s()
|
|
|
|
-
|
|
|
|
- # 查找最新的落在检测区域的目标
|
|
|
|
- rtd_unit = self.find_latest_rtd_in_region(device, self.rect_, now, 3)
|
|
|
|
- if rtd_unit:
|
|
|
|
- timestamp = rtd_unit["timestamp"]
|
|
|
|
- pose = rtd_unit["pose"]
|
|
|
|
- target_point = rtd_unit["target_point"]
|
|
|
|
-
|
|
|
|
- if self.event_attr_.enter_ts_ == -1:
|
|
|
|
- self.event_attr_.enter_ts_ = timestamp
|
|
|
|
- else:
|
|
|
|
- self.event_attr_.leave_ts_ = timestamp
|
|
|
|
-
|
|
|
|
- if self.event_attr_.enter_ts_ == -1 or self.event_attr_.leave_ts_ == -1:
|
|
|
|
- return
|
|
|
|
-
|
|
|
|
- # 归并时间内,不认为事件结束
|
|
|
|
- if now - self.event_attr_.leave_ts_ < self.merge_time_:
|
|
|
|
- return
|
|
|
|
-
|
|
|
|
- self.event_attr_.stay_time_ = self.event_attr_.leave_ts_ - self.event_attr_.enter_ts_
|
|
|
|
- stay_time =self.event_attr_.stay_time_
|
|
|
|
- # 时间小于触发时间阈值,忽略并重置
|
|
|
|
- if stay_time < self.threshold_time_ :
|
|
|
|
- self.event_attr_.reset()
|
|
|
|
- LOGINFO(f"less than threshold_time, alarm_plan: {self.plan_uuid_}, event_type: {self.event_type_}")
|
|
|
|
- return
|
|
|
|
|
|
|
|
- # 构造事件
|
|
|
|
- # 入库
|
|
|
|
- info = {
|
|
|
|
- "enter_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
|
|
- "leave_time": utc_to_bj_s(self.event_attr_.enter_ts_),
|
|
|
|
- "stay_time": stay_time
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
- event_uuid = str(uuid.uuid4())
|
|
|
|
|
|
+ start_dt, end_dt = helper.get_query_time_range(self.param_)
|
|
params = {
|
|
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": {}
|
|
|
|
|
|
+ "event_type": event_desc_map[EventType.TOILETING_DETECTION.value],
|
|
|
|
+ "start_dt": start_dt,
|
|
|
|
+ "end_dt": end_dt
|
|
}
|
|
}
|
|
- db_req_que.put(DBRequest(sql=sqls.sql_insert_events, params=params, callback=None))
|
|
|
|
|
|
+ db_req_que.put(DBRequest(
|
|
|
|
+ sql=sqls.sql_query_events_by_datetime,
|
|
|
|
+ params=params,
|
|
|
|
+ callback=self.cb_toileting_frequency))
|
|
|
|
|
|
- # 通知
|
|
|
|
- mqtt_send.alarm_event(dev_id, event_uuid, self.plan_uuid_, event_desc_map[self.event_type_], info, "events")
|
|
|
|
- LOGDBG(f"new event: {event_desc_map[self.event_type_]}, stay_time: {stay_time}")
|
|
|
|
|
|
+ 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}")
|
|
|
|
|
|
- self.event_attr_.reset()
|
|
|
|
|
|
+
|
|
|
|
+ def cb_toileting_frequency(self, result):
|
|
|
|
+ try:
|
|
|
|
+ if result:
|
|
|
|
+ count = 0
|
|
|
|
+ event_list = []
|
|
|
|
+
|
|
|
|
+ for row in result:
|
|
|
|
+ dev_id: str = row.get("dev_id")
|
|
|
|
+ event_uuid: str = row.get("uuid")
|
|
|
|
+ plan_uuid: str = row.get("plan_uuid")
|
|
|
|
+ event_type: int = row.get("event_type")
|
|
|
|
+ info: dict = json.loads(row["info"]) if row.get("info") else {}
|
|
|
|
+ is_handle: str = row.get("is_handle")
|
|
|
|
+ create_time: str = row.get("create_time")
|
|
|
|
+ update_time: str = row.get("update_time")
|
|
|
|
+ is_deleted: str = row.get("is_deleted")
|
|
|
|
+ remark: str = row.get("remark")
|
|
|
|
+
|
|
|
|
+ event_list.append(info)
|
|
|
|
+
|
|
|
|
+ this_event_uuid = str(uuid.uuid4())
|
|
|
|
+ new_param = helper.normalize_param_time(self.param_)
|
|
|
|
+ last_info = {
|
|
|
|
+ "start_time" : new_param["start_time"],
|
|
|
|
+ "end_time" : new_param["end_time"],
|
|
|
|
+ "count" : len(event_list),
|
|
|
|
+ "event_list" : event_list
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ # 入库
|
|
|
|
+ event_uuid = str(uuid.uuid4())
|
|
|
|
+ params = {
|
|
|
|
+ "dev_id": dev_id,
|
|
|
|
+ "uuid": this_event_uuid,
|
|
|
|
+ "plan_uuid": self.plan_uuid_,
|
|
|
|
+ "event_type": event_desc_map[self.event_type_],
|
|
|
|
+ "info": json.dumps(last_info, ensure_ascii=False),
|
|
|
|
+ "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, this_event_uuid, plan_uuid, event_desc_map[self.event_type_], last_info, "events")
|
|
|
|
+
|
|
|
|
+ LOGINFO(f"EventAttr_ToiletingFrequency succeed")
|
|
|
|
+ else:
|
|
|
|
+ LOGDBG("EventAttr_ToiletingFrequency, empty result")
|
|
|
|
|
|
except json.JSONDecodeError as e:
|
|
except json.JSONDecodeError as e:
|
|
tb_info = traceback.extract_tb(e.__traceback__)
|
|
tb_info = traceback.extract_tb(e.__traceback__)
|
|
@@ -571,6 +595,7 @@ class AlarmPlan:
|
|
tb_info = traceback.extract_tb(e.__traceback__)
|
|
tb_info = traceback.extract_tb(e.__traceback__)
|
|
for frame in tb_info:
|
|
for frame in tb_info:
|
|
LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
|
|
LOGERR(f"[{frame.filename}:{frame.lineno}] @{frame.name}(), error: {e}")
|
|
|
|
+ return
|
|
|
|
|
|
|
|
|
|
# 夜间如厕频次统计
|
|
# 夜间如厕频次统计
|