diff --git a/config.yaml b/config.yaml index fe6011d..19f09d8 100644 --- a/config.yaml +++ b/config.yaml @@ -28,15 +28,6 @@ user_ids: - "35393" - "26292" - "24857" - 4GA-供油站: - high: - - "2152" - - "2050" - all: - - "2043" - - "29246" - - "2090" - - "24857" 4DB-供油站: high: - "2152" @@ -46,17 +37,32 @@ user_ids: - "35393" - "26292" - "24857" + 4DB-供油站(测温): + high: + - "2152" + - "2050" + all: + - "5791" + - "35393" + - "26292" + - "24857" + 4GA-供油站: + high: + - "2152" + - "2050" + all: + - "2043" + - "29246" + - "2090" + - "24857" 4GA-供油站(测温): high: - "2152" - "2050" all: - - "24857" - 4GB-供油站(测温): - high: - - "2152" - - "2050" - all: + - "2043" + - "29246" + - "2090" - "24857" A区_北油库_气体探测器: high: @@ -78,15 +84,15 @@ user_ids: - "24857" # b区 4GB-供油站: - high: [ ] + high: [] all: - "1823" - "2164" - "2166" - "30024" - "2078" - 4DB-供油站(测温): - high: [ ] + 4GB-供油站(测温): + high: [] all: - "1823" - "2164" @@ -94,7 +100,7 @@ user_ids: - "30024" - "2078" B区油库_气体探测器: - high: [ ] + high: [] all: - "1823" - "2164" @@ -362,135 +368,6 @@ user_ids: - "1926" - "2097" -# T2变电所: -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# A区北油库: -# - "5791" -# - "35393" -# - "26292" -# B区西~油库: -# - "1823" -# - "2164" -# - "2166" -# - "30024" -# - "2078" -# 二厂平台~东: -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# T1变电所: -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# A区南~油库: -# - "2043" -# - "29246" -# - "2090" -# T3变电所: -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# T11变电所: -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# 二厂平台~西: -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# 二厂平台~中01: -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# 二厂平台~中02: -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# T9变压器: -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# T6变压器: -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# B区西~油库(测温): -# - "1823" -# - "2164" -# - "2166" -# - "30024" -# - "2078" -# T2变电所 (测温): -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# 二厂平台~西(测温): -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# 二厂平台~中01(测温): -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# T1变电所(测温): -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# 二厂平台~东(测温): -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# 二厂平台~中02(测温): -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# T3变电所(测温): -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# T11变电所(测温): -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# A区南~油库(测温): -# - "2043" -# - "29246" -# - "2090" -# T9变压器(测温): -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# T6变压器(测温): -# - "1815" -# - "1899" -# - "1926" -# - "2097" -# A区北油库(测温): -# - "5791" -# - "35393" -# - "26292" - # srcIndex 与设备名称 map devices: f5ac885b1c39411695d575b99771855d: 4DB供油站8号台架01 diff --git a/hik_push/read_event.py b/hik_push/read_event.py index c3b8c50..5285293 100644 --- a/hik_push/read_event.py +++ b/hik_push/read_event.py @@ -11,7 +11,9 @@ async def read_event(): logging.basicConfig(level=logging.INFO) # 读取配置文件 home_dir = Path.home() - with open(home_dir / '.config' / 'hik-push' / 'config.yaml', 'r', encoding='utf-8') as f: + with open( + home_dir / ".config" / "hik-push" / "config.yaml", "r", encoding="utf-8" + ) as f: config = yaml.safe_load(f) if "user_ids" not in config: logging.error("请配置user_ids") @@ -30,92 +32,133 @@ async def read_event(): return logging.info(config) - user_map = config['user_ids'] - device_map = config['devices'] - event_map = config['event_type'] - push_url = config['push_url'] - event_level = config['event_level'] - redis_client = await aioredis.Redis(host="127.0.0.1", port=7019, password="SMHdFrlK") + user_map = config["user_ids"] + device_map = config["devices"] + event_map = config["event_type"] + push_url = config["push_url"] + event_level = config["event_level"] + redis_client = await aioredis.Redis( + host="127.0.0.1", port=7019, password="SMHdFrlK" + ) while True: try: data = await redis_client.brpop("hik-sub-event") - sub_json = json.loads(data[1].decode('utf-8')) + sub_json = json.loads(data[1].decode("utf-8")) events = sub_json["params"]["events"] for event in events: # 如果是ai事件 if event["srcType"] == "eventRule": event_details = event["eventDetails"] for event_detail in event_details: + # 设置默认事件等级 + handle_event_level( + event_detail, event_level, event_detail["eventType"] + ) # 事件类型 id 替换为 str - event_type_str = event_map.get(event_detail['eventType'], "未知事件类型") - event_detail['eventType'] = event_type_str + event_type_str = event_map.get( + event_detail["eventType"], "未知事件类型" + ) + event_detail["eventType"] = event_type_str # 添加设备名称 src_index = event_detail["srcIndex"] device_name = device_map.get(src_index, "未知设备") - event_detail['deviceName'] = device_name - # 默认事件等级为2 - if "eventLvl" not in event_detail: - event_detail['eventLvl'] = 2 + event_detail["deviceName"] = device_name # 根据设备名称获取 user_ids - user_all = user_map.get("all", []) # 接受全部通知的用户 - user_ids = user_map.get(device_name, []) - user_ids = user_ids + user_all - event_detail['userIds'] = user_ids + user_ids = [] + # 高级 + if event_detail["eventLvl"] == 3: + user_all = user_map.get("all", {}).get("high", []) + # 接受全部通知的用户 + user_ids = user_map.get(device_name, {}).get("high", []) + user_ids = user_ids + user_all + # 中级 + else: + user_all = user_map.get("all", {}).get("all", []) + # 接受全部通知的用户 + user_ids = user_map.get(device_name, {}).get("all", []) + user_ids = user_ids + user_all + event_detail["userIds"] = user_ids # 添加其他字段 - event_detail["eventLvl"] = event['eventLvl'] - event_detail["happenTime"] = event['happenTime'] + event_detail["eventLvl"] = event["eventLvl"] + event_detail["happenTime"] = event["happenTime"] # 如果存在 data 属性 if "data" in event_detail: # 替换分析结果字段 - if "eventType" in event_detail['data']: - detection_field_name = event_detail['data']['eventType'] - if detection_field_name in event_detail['data']: - event_detail['data']["_detectionResult"] = event_detail['data'].pop( - detection_field_name) - if isinstance(event_detail['data']["_detectionResult"], list) and len( - event_detail['data']["_detectionResult"]): - event_detail['data']["_detectionResult"] = \ - event_detail['data']["_detectionResult"][0] - replace_image_host(event_detail['data']["_detectionResult"]) + if "eventType" in event_detail["data"]: + detection_field_name = event_detail["data"]["eventType"] + if detection_field_name in event_detail["data"]: + event_detail["data"]["_detectionResult"] = ( + event_detail["data"].pop(detection_field_name) + ) + if isinstance( + event_detail["data"]["_detectionResult"], list + ) and len(event_detail["data"]["_detectionResult"]): + event_detail["data"]["_detectionResult"] = ( + event_detail["data"]["_detectionResult"][0] + ) + replace_image_host( + event_detail["data"]["_detectionResult"] + ) logging.info(event_detail) try: - push_resp = requests.post(push_url, json=event_detail).content.decode('utf-8') + push_resp = requests.post( + push_url, json=event_detail + ).content.decode("utf-8") logging.info(push_resp) except Exception as e: logging.error(f"网络错误推送失败: {e}") else: + # 设置默认事件等级 + handle_event_level(event, event_level, event["eventType"]) # 将 eventType ID 替换为中文字符串 - event_type = event['eventType'] + event_type = event["eventType"] logging.info(event_type) event_type_str = event_map.get(event_type, "未知事件类型") - event['eventType'] = event_type_str + event["eventType"] = event_type_str # 添加设备名称 src_index = event["srcIndex"] device_name = device_map.get(src_index, "未知设备") # 默认事件等级为2 if "eventLvl" not in event: - event['eventLvl'] = 2 + event["eventLvl"] = 2 # 根据设备名称获取 user_ids - user_all = user_map.get("all", []) # 接受全部通知的用户 - user_ids = user_map.get(device_name, []) - user_ids = user_ids + user_all - event['deviceName'] = device_name - event['userIds'] = user_ids + user_ids = [] + # 高级 + if event["eventLvl"] == 3: + user_all = user_map.get("all", {}).get("high", []) + # 接受全部通知的用户 + user_ids = user_map.get(device_name, {}).get("high", []) + user_ids = user_ids + user_all + # 中级 + else: + user_all = user_map.get("all", {}).get("all", []) + # 接受全部通知的用户 + user_ids = user_map.get(device_name, {}).get("all", []) + user_ids = user_ids + user_all + event["deviceName"] = device_name + event["userIds"] = user_ids if "data" in event: # 如果存在 data 属性 # 替换分析结果字段 - if "eventType" in event['data']: - detection_field_name = event['data']['eventType'] - if detection_field_name in event['data']: - event['data']["_detectionResult"] = event['data'].pop(detection_field_name) - if isinstance(event['data']["_detectionResult"], list) and len( - event['data']["_detectionResult"]): - event['data']["_detectionResult"] = event['data']["_detectionResult"][0] - replace_image_host(event['data']["_detectionResult"]) + if "eventType" in event["data"]: + detection_field_name = event["data"]["eventType"] + if detection_field_name in event["data"]: + event["data"]["_detectionResult"] = event["data"].pop( + detection_field_name + ) + if isinstance( + event["data"]["_detectionResult"], list + ) and len(event["data"]["_detectionResult"]): + event["data"]["_detectionResult"] = event["data"][ + "_detectionResult" + ][0] + replace_image_host(event["data"]["_detectionResult"]) # 请求推送 api logging.info(event) try: - push_resp = requests.post(push_url, json=event).content.decode('utf-8') + push_resp = requests.post(push_url, json=event).content.decode( + "utf-8" + ) logging.info(push_resp) except Exception as e: logging.error(f"网络错误推送失败: {e}") @@ -129,9 +172,20 @@ async def read_event(): def replace_image_host(detection_data): if "imageUrl" in detection_data: - detection_data["imageUrl"] = detection_data["imageUrl"].replace("192.168.1.250", "192.168.11.180") + detection_data["imageUrl"] = detection_data["imageUrl"].replace( + "192.168.1.250", "192.168.11.180" + ) if "visiblePicUrl" in detection_data: - detection_data["visiblePicUrl"] = detection_data["visiblePicUrl"].replace("192.168.1.250", "192.168.11.180") + detection_data["visiblePicUrl"] = detection_data["visiblePicUrl"].replace( + "192.168.1.250", "192.168.11.180" + ) + + +def handle_event_level(event_detail, event_levels, event_type): + if event_type in event_levels["high"]: + event_detail["eventLvl"] = 3 + elif "eventLvl" not in event_detail: + event_detail["eventLvl"] = 2 def run_app():