|
|
@@ -494,15 +494,18 @@ def monitor_device(device):
|
|
|
while True:
|
|
|
control_value = get_device_value(device["control_payload"], name) # 控制字
|
|
|
if control_value is not None and int(control_value) == 26: # 控制字 等于 26
|
|
|
- logger.info("控制字变为26,开始收集10分钟数据")
|
|
|
+ logger.info("控制字变为26,开始收集数据(控制字在22-26范围内有效)")
|
|
|
break
|
|
|
time.sleep(POLL_INTERVAL)
|
|
|
|
|
|
- # 阶段2: 收集10分钟数据并计算平均值
|
|
|
- logger.info("开始收集10分钟TMP数据")
|
|
|
+ # 阶段2: 收集数据(控制字在22-26范围内视为有效,初始10分钟,未收集到有效数据时延长到30分钟)
|
|
|
+ logger.info("开始收集TMP数据(控制字在22-26范围内有效)")
|
|
|
collected_values = []
|
|
|
start_collection_time = datetime.now()
|
|
|
- collection_duration = timedelta(minutes=10) # 10分钟
|
|
|
+ initial_duration = timedelta(minutes=10) # 初始10分钟
|
|
|
+ extended_duration = timedelta(minutes=30) # 延长到30分钟
|
|
|
+ collection_duration = initial_duration
|
|
|
+ has_valid_data = False # 标记是否收集到22-26范围内的有效数据
|
|
|
|
|
|
# 日志计数器,每收集60个点打印一次,避免日志过多
|
|
|
log_interval = 60
|
|
|
@@ -511,26 +514,37 @@ def monitor_device(device):
|
|
|
current_value = get_device_value(device["target_payload"], name) # 当前值
|
|
|
control_value = get_device_value(device["control_payload"], name) # 检查控制字
|
|
|
|
|
|
- # 检查控制字是否保持26
|
|
|
- if control_value is not None and int(control_value) != 26:
|
|
|
- logger.warning(f"数据收集期间控制字发生变化: {control_value},停止收集")
|
|
|
+ if control_value is not None:
|
|
|
+ control_int = int(control_value)
|
|
|
+
|
|
|
# 如果控制字变为95,说明系统重置了,需要重新开始
|
|
|
- if int(control_value) == TRIGGER_VALUE:
|
|
|
+ if control_int == TRIGGER_VALUE:
|
|
|
logger.info("控制字变为95,系统重置,重新开始监控")
|
|
|
break
|
|
|
- else:
|
|
|
- logger.info("控制字变为其他值,等待重置")
|
|
|
- break
|
|
|
|
|
|
- if current_value is not None:
|
|
|
- collected_values.append(current_value)
|
|
|
- # 每收集60个点或第一个点时打印日志,减少日志数量
|
|
|
- if len(collected_values) == 1 or len(collected_values) % log_interval == 0:
|
|
|
- logger.info(f"收集TMP值 {current_value:.4f} 已收集 {len(collected_values)} 个数据点")
|
|
|
+ # 如果控制字在22-26范围内,视为有效,收集数据
|
|
|
+ elif 22 <= control_int <= 26:
|
|
|
+ has_valid_data = True
|
|
|
+ if current_value is not None:
|
|
|
+ collected_values.append(current_value)
|
|
|
+ # 每收集60个点或第一个点时打印日志,减少日志数量
|
|
|
+ if len(collected_values) == 1 or len(collected_values) % log_interval == 0:
|
|
|
+ logger.info(f"收集TMP值 {current_value:.4f} 控制字={control_int} 已收集 {len(collected_values)} 个数据点")
|
|
|
+
|
|
|
+ # 如果控制字不在22-26范围内,不停止,继续等待(可能后续会回到22-26范围)
|
|
|
+ # 不记录日志,避免日志过多
|
|
|
+
|
|
|
time.sleep(POLL_INTERVAL)
|
|
|
+
|
|
|
+ # 如果10分钟内没有收集到22-26范围内的数据,延长收集时间到30分钟
|
|
|
+ elapsed_time = datetime.now() - start_collection_time
|
|
|
+ if elapsed_time >= initial_duration and not has_valid_data and collection_duration == initial_duration:
|
|
|
+ logger.info("10分钟内未收集到22-26范围内的数据,延长收集时间到30分钟")
|
|
|
+ collection_duration = extended_duration
|
|
|
|
|
|
- if not collected_values:
|
|
|
- logger.warning("10分钟内未收集到有效数据,跳过本轮")
|
|
|
+ # 检查是否收集到了22-26范围内的有效数据
|
|
|
+ if not has_valid_data:
|
|
|
+ logger.warning("30分钟内未收集到22-26范围内的有效数据,跳过本轮")
|
|
|
# 检查控制字状态,如果已经是95则直接开始新一轮
|
|
|
control_value = get_device_value(device["control_payload"], name)
|
|
|
if control_value is not None and int(control_value) == TRIGGER_VALUE:
|
|
|
@@ -541,6 +555,18 @@ def monitor_device(device):
|
|
|
logger.info("等待控制字重置...")
|
|
|
time.sleep(10) # 等待10秒
|
|
|
continue
|
|
|
+
|
|
|
+ # 如果收集到了有效数据但数据为空
|
|
|
+ if not collected_values:
|
|
|
+ logger.warning("收集到有效控制字但未收集到TMP数据,跳过本轮")
|
|
|
+ control_value = get_device_value(device["control_payload"], name)
|
|
|
+ if control_value is not None and int(control_value) == TRIGGER_VALUE:
|
|
|
+ logger.info("控制字已经是95,直接开始新一轮")
|
|
|
+ continue
|
|
|
+ else:
|
|
|
+ logger.info("等待控制字重置...")
|
|
|
+ time.sleep(10)
|
|
|
+ continue
|
|
|
|
|
|
# 阶段3: 决策计算
|
|
|
logger.info(f"数据收集完成,共收集 {len(collected_values)} 个数据点,开始决策计算")
|