History Read
Getting Started
Introduction ConnectionCore
Browsing Reading-writing Method-call Subscriptions History-readReference
Types Error-handling Security Architecture Extension-object-codecs Testing Events Trust-storeHistory Read
OPC UA servers with historizing enabled can store past values. This library supports three types of historical queries: raw, processed, and at-time.
Raw History
Get stored values within a time range, exactly as recorded:
use PhpOpcua\Client\Types\NodeId;
use PhpOpcua\Client\Types\StatusCode;
$now = new \DateTimeImmutable();
$oneHourAgo = $now->modify('-1 hour');
$values = $client->historyReadRaw(
'ns=2;i=1001', // or NodeId::numeric(2, 1001)
startTime: $oneHourAgo,
endTime: $now,
numValuesPerNode: 100,
returnBounds: false,
);
foreach ($values as $dv) {
echo sprintf(
"[%s] %s (status: %s)\n",
$dv->sourceTimestamp?->format('Y-m-d H:i:s.u'),
$dv->getValue(),
StatusCode::getName($dv->statusCode),
);
}Parameters
| Parameter | Default | Description |
|---|---|---|
nodeId |
(required) | Node to read history from |
startTime |
null |
Beginning of the time range |
endTime |
null |
End of the time range |
numValuesPerNode |
0 |
Maximum values to return (0 = no limit) |
returnBounds |
false |
Include bounding values at the edges of the range |
Processed History (Aggregates)
Get aggregated data over intervals. The server must support the HistoryRead service with processing:
$startTime = new \DateTimeImmutable('2024-01-01 00:00:00');
$endTime = new \DateTimeImmutable('2024-01-02 00:00:00');
$values = $client->historyReadProcessed(
'ns=2;i=1001',
$startTime,
$endTime,
processingInterval: 3600000.0, // 1 hour in ms
aggregateType: 'i=2342', // Average
);Common Aggregate Types
| Aggregate | NodeId |
|---|---|
| Average | NodeId::numeric(0, 2342) |
| Interpolative | NodeId::numeric(0, 2341) |
| Minimum | NodeId::numeric(0, 2346) |
| Maximum | NodeId::numeric(0, 2347) |
| Count | NodeId::numeric(0, 2352) |
| Total | NodeId::numeric(0, 2344) |
Note: Not all servers support all aggregate types. Check your server documentation or use
getEndpoints()to discover capabilities.
History at Specific Times
Get interpolated values at exact timestamps:
$timestamps = [
new \DateTimeImmutable('2024-01-01 08:00:00'),
new \DateTimeImmutable('2024-01-01 12:00:00'),
new \DateTimeImmutable('2024-01-01 16:00:00'),
new \DateTimeImmutable('2024-01-01 20:00:00'),
];
$values = $client->historyReadAtTime(
'ns=2;i=1001',
$timestamps,
);
foreach ($values as $i => $dv) {
echo sprintf(
"At %s: %s\n",
$timestamps[$i]->format('H:i:s'),
$dv->getValue(),
);
}Tip: All three history methods return
DataValue[]. EachDataValueincludes->statusCode,->sourceTimestamp, and->serverTimestampalongside the value itself.