跳到主要内容

read_history_processed (聚合)

最强大的 HistoryRead 模式, 配合标准聚合函数. 给区间 + 聚合函数 + 子区间宽度, 服务端返回每个子区间的聚合结果.

前置 / 配套

签名

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

下一步