read_history_processed (聚合)
最强大的 HistoryRead 模式, 配合标准聚合函数. 给区间 + 聚合函数 + 子区间宽度, 服务端返回每个子区间的聚合结果.
前置 / 配套
- 拉所有原始点请用 read_history (Raw).
- 指定时间点的内插值请用 read_history_at_time.
签名
def read_history_processed(self,
node_id: str,
start_utc: datetime,
end_utc: datetime,
processing_interval_ms: float,
aggregate_node_id: str) -> List[OpcUaDataValue]: ...
HistoryAggregate 常量 (推荐)
from darra_opcua import HistoryAggregate
HistoryAggregate.AVERAGE # i=2342 算术平均
HistoryAggregate.MINIMUM # i=2346 最小值
HistoryAggregate.MAXIMUM # i=2347 最大值
HistoryAggregate.COUNT # i=2352 Good 状态点数
HistoryAggregate.TOTAL # i=2348 累加 (代数和)
HistoryAggregate.STANDARD_DEVIATION_SAMPLE # i=11427 样本标准差
HistoryAggregate.TIME_AVERAGE # i=11285 时间加权平均
HistoryAggregate.RANGE # i=2353 Max - Min
HistoryAggregate.DELTA # i=11286 区间末-区间始
完整列表见 OPC UA Part 13 §5.4 Aggregate Functions.
用法
24 小时温度的每小时平均
import datetime as dt
from darra_opcua import HistoryAggregate
today = dt.datetime.now(dt.timezone.utc).replace(
hour=0, minute=0, second=0, microsecond=0)
yesterday = today - dt.timedelta(days=1)
values = ua.read_history_processed(
node_id="ns=2;s=Temperature",
start_utc=yesterday,
end_utc=today,
processing_interval_ms=3_600_000, # 1 hour
aggregate_node_id=HistoryAggregate.AVERAGE)
# 返回 24 个 OpcUaDataValue, 每个是该小时的平均值
一周每天的最大温度
maxes = ua.read_history_processed(
"ns=2;s=Temperature",
start_utc=today - dt.timedelta(days=7),
end_utc=today,
processing_interval_ms=86_400_000, # 1 day
aggregate_node_id=HistoryAggregate.MAXIMUM)
一小时累计流量
import datetime as dt
now = dt.datetime.now(dt.timezone.utc)
totals = ua.read_history_processed(
"ns=2;s=FlowRate",
start_utc=now - dt.timedelta(hours=1),
end_utc=now,
processing_interval_ms=3_600_000, # 1 hour bucket
aggregate_node_id=HistoryAggregate.TOTAL)
性能优势
- 避免拉百万点原始数据再客户端算
- 服务端常对历史数据建索引, 聚合极快
- 跨日 / 跨周报表的标准方案
服务端要求
- Historian 必须实现该聚合函数 (服务端 ServerCapabilities/AggregateFunctions 列出支持的)
- 不支持的聚合返回
BadAggregateNotSupported