73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""iAOP-Template-Ti 一期 · 缺省通用点位集 sanity 检查(离线基本验证)。
|
||
|
||
检查项:
|
||
1. 点位字典 CSV:表头与内核 `core/edge-gateway/config/point_dict.example.csv`
|
||
对齐(9 列),且非空、无空行、每行列数一致;
|
||
2. protocol 列为合法采集协议(对齐内核 schema.VALID_PROTOCOLS);
|
||
3. sampleRate 为正整数。
|
||
|
||
用法:python _sanity_check.py
|
||
"""
|
||
import csv
|
||
import os
|
||
import sys
|
||
|
||
HERE = os.path.dirname(os.path.abspath(__file__))
|
||
|
||
# 对齐 core/edge-gateway/config/point_dict.example.csv 表头
|
||
EXPECTED_COLUMNS = [
|
||
"device_id", "point_id", "name", "unit", "dataType",
|
||
"sampleRate", "qualityCode", "opcNode", "protocol",
|
||
]
|
||
|
||
# 对齐内核 schema.VALID_PROTOCOLS(缺省点位集全部使用 simulator 演示驱动)
|
||
VALID_PROTOCOLS = {
|
||
"opcua", "s7", "modbus", "weighing", "energy", "simulator",
|
||
}
|
||
|
||
|
||
def main() -> int:
|
||
failures: list[str] = []
|
||
|
||
# 1) 点位字典 CSV
|
||
csv_path = os.path.join(HERE, "point_dict.default.csv")
|
||
with open(csv_path, "r", encoding="utf-8") as fh:
|
||
rows = list(csv.reader(fh))
|
||
if not rows:
|
||
failures.append("point_dict.default.csv 为空")
|
||
else:
|
||
header = [c.strip() for c in rows[0]]
|
||
if header != EXPECTED_COLUMNS:
|
||
failures.append(
|
||
f"CSV 表头与内核 schema 不一致:{header} != {EXPECTED_COLUMNS}")
|
||
if len(rows) < 2:
|
||
failures.append("CSV 缺少数据行")
|
||
for i, row in enumerate(rows[1:], 2):
|
||
if not row or all(not c for c in row):
|
||
failures.append(f"CSV 第 {i} 行为空行")
|
||
elif len(row) != len(EXPECTED_COLUMNS):
|
||
failures.append(f"CSV 第 {i} 行列数异常:{len(row)}")
|
||
else:
|
||
# 2) protocol 合法
|
||
proto = row[8].strip().lower()
|
||
if proto not in VALID_PROTOCOLS:
|
||
failures.append(
|
||
f"CSV 第 {i} 行非法协议:'{proto}'(合法值见内核 schema.VALID_PROTOCOLS)")
|
||
# 3) sampleRate 正整数
|
||
rate = row[5].strip()
|
||
if not rate.isdigit() or int(rate) <= 0:
|
||
failures.append(f"CSV 第 {i} 行 sampleRate 必须为正整数:'{rate}'")
|
||
|
||
if failures:
|
||
print("FAIL")
|
||
for f in failures:
|
||
print(" -", f)
|
||
return 1
|
||
print(f"OK: 点位 {len(rows) - 1} 条,表头/协议/采样率校验通过")
|
||
return 0
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|