Files
wwtools/histdb/07-rest-api.md
T
Joseph Doherty 32f26272ae Initial commit: Wonderware / System Platform tools and reference
Five tools under one repo, all docs organized per DOCS-GUIDE.md:

- aalogcli: .NET 4.8 / x86 CliFx CLI for reading System Platform binary
  logs (*.aaLGX) for LLM debugging, built on aaOpenSource/aaLog. Commands:
  last, tail, range, unread, fields. Stable JSON envelope under --llm-json.
  Build template under lib/build/ for rebuilding aaLogReader.dll.

- aot: ArchestrA Object Toolkit 2014 v4.0 reference material. Dev guide
  (Markdown converted from CHM), API reference for the ArchestrA.Toolkit
  namespace, and the Monitor / Watchdog VS sample solutions.

- graccesscli: .NET 4.8 / x86 CliFx CLI that automates Galaxy
  configuration via the ArchestrA GRAccess COM interop. Includes session
  daemon, IPC protocol, and llm-json envelope contract.

- grdb: SQL/DDL exploration of the Galaxy Repository database. DDL
  captures, reusable queries, hierarchy / contained-name <-> tag-name
  translation notes.

- histdb: LLM-oriented reference for AVEVA Historian retrieval. INSQL
  linked-server, extension tables, every wwXxx time-domain extension,
  every retrieval mode, alarm/event SQL recipes, REST API. Distilled
  from the 243-page Historian Retrieval Guide.

Root contains:
- CLAUDE.md: thin index pointing into each tool's README.
- DOCS-GUIDE.md: doctrine for organizing docs for LLM consumption.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 18:22:20 -04:00

173 lines
8.7 KiB
Markdown

# Historian Data REST API
For when the consumer can't (or shouldn't) speak SQL — browsers, Excel, Power BI, Tableau, web frontends. Same data as the SQL extension tables, exposed as OData over HTTPS.
## Versions
Two API versions are supported by AVEVA Insight:
| Version | Recommended? | Notes |
| --- | --- | --- |
| `v2` | **Yes** | `TagFilter` (POST/GET) on `ProcessValues`, `AnalogSummary`, `StateSummary`. Single quotes are NOT used around `DateTime` in `$filter` (except for events). Summary entities use `StartDateTime` / `EndDateTime`; raw / process value entities use `DateTime`. |
| `v1` | Legacy | Still works. Uses `datetimeoffset'...'` quoting. Includes summary entities (`Summary`, `Daily`, `Hourly`, `Minutely`) that are v1-only. |
Pick **v2** for new code unless you need a v1-only summary entity.
## Authentication
Two flavors:
- **AVEVA Historian Insight (on-premises)** — Windows integrated security via Negotiate. The user must belong to `aaAdministrators`, `aaPowerUsers`, or `aaUsers`. Most modern browsers and Excel handle this transparently.
- **AVEVA Insight (cloud)** — OpenID Connect bearer-token, or Basic auth (`username` is treated as the API key). Some clients (older Excel) lack OIDC support; Basic remains as a fallback.
There's also a "solution-specific retrieval token" path: include the token in the URL and skip the `s/<solution_id>` segment.
## Endpoint shape
```
https://online.wonderware.com/s/<solution_id>/apis/historian/<api_version>/<resource>?<query_parameters>
```
- `<solution_id>` — your Insight solution. Omitted when using a solution-specific retrieval token.
- `<api_version>``v1` or `v2`.
- `<resource>` — one of the resources below.
- `<query_parameters>` — OData (`$filter`, `$top`, `$skip`, `$orderby`, `$select`, `$skiptoken`) or REST-style (`TagFilter=...&Resolution=...`).
In the URL: **`%20`** is space, **`%27`** is a single quote. The Chrome JSONView viewer also accepts `+` for space, which makes URLs more readable.
## OData operators
`eq`, `ne`, `gt`, `ge`, `lt`, `le`, `and`, `or`, `not`. Use parentheses for grouping. **A `$filter` may contain at most one time clause combined with one filter clause via `and`.** The filter clause itself may use any combination of operators internally.
If you need multiple values for the same field, use `or`:
```
((Priority eq 100 or Priority eq 200 or Priority eq 500) and (Severity le 2))
```
## `TagFilter` (REST-style)
Supported on `ProcessValues`, `AnalogSummary`, `StateSummary` (`v2`+). OData filter notation, with hard limits:
- Up to **20** `AND` clauses.
- Up to **20** `OR` clauses.
- Up to **2** UDF (user-defined function) clauses.
- **Cannot mix `AND` and `OR`** in the same `TagFilter`.
- Operators must be lowercase (`and`, not `And`).
- Most attribute searches are case-insensitive; case-sensitive ones are: `InterpolationType`, `MessageOn`, `MessageOff`.
Valid:
```
.../v2/ProcessValues?TagFilter=startswith(Source,'MVDS') and TagType eq 'string'
```
Invalid (mixed-case operator):
```
.../v2/ProcessValues?TagFilter=startswith(Source,'MVDS') And TagType eq 'string'
```
## Retrieval resources (the catalog)
| Resource | Verb(s) | Purpose |
| --- | --- | --- |
| `/ProcessValues` | GET | Raw value+time+quality (VTQ) records for one or more tags. |
| `/AnalogSummary` | GET | Aggregated analog statistics (min/max/avg/integral/etc.) over a window. |
| `/StateSummary` | GET | Time-in-state summaries for discrete/string/integer tags. |
| `/Events` | GET | Events and alarms (same content as the SQL `Events` table). |
| `/Tags` | GET / POST / DELETE | Tag metadata; v2 also returns extended properties. POST manages tags in bulk. |
| `/TagProperties` | GET | List of property names available on tags. |
| `/TagPropertyValues` | GET | Distinct values seen for a given tag property. |
| `/TagGroups` | GET | Groups of tags. |
| `/TagSuggest` | GET | Autocomplete-style tag-name suggestions. |
| `/TagSearch` | GET | Search tags by partial name / property. |
| `/TagExtendedProperties` | GET | Extended (custom) tag properties. |
| `/Summary` | GET | **v1-only.** Generic summary. |
| `/Daily`, `/Hourly`, `/Minutely` | GET | **v1-only.** Pre-bucketed summary periods. |
| `/SystemParameters` | GET | **On-premises only.** Server config. |
## `RetrievalMode` and `Resolution` (REST-side names)
Same modes as the SQL `wwRetrievalMode`. The REST query parameter is named `RetrievalMode`. Supported values from the v2 spec: `BestFit`, `Counter`, `Delta`, `Full`, `Interpolated`, `Maximum`, `Slope` (and `Cyclic`, the default for analog).
`Resolution` is in milliseconds, applies to `Raw`, `ProcessValues`, and the summary entities — picks the granularity of the returned data.
## `ProcessValues` — VTQ records
```http
GET /v2/ProcessValues?$filter=FQN+eq+'plant12.pump6'+and+DateTime+gt+2017-07-13T00:00:00Z
```
Required: `FQN` (`datasource.tagname`), and a time predicate (`DateTime` for v2). Optional: `OPCQuality`, `Value`, `Text` (string tags / discrete-tag message text). Returns 200 with `{ fqn, datetime, ... }`. 404 / 401 on missing FQN / unauthorized.
## `AnalogSummary` — windowed analog stats
```http
GET /v2/AnalogSummary
?$filter=FQN+eq+'Depot.Train09'
+and+StartDateTime+ge+2017-06-09T09:00:00-07:00
+and+EndDateTime+le+2017-06-09T10:00:00-07:00
&Resolution=3600000
```
Required: `FQN`, `StartDateTime`, `EndDateTime` (RFC 3339 / ISO 8601, UTC `Z` or explicit offset). Optional: `RetrievalMode` (`Cyclic`/`Full`, default `Cyclic`), `Resolution`, `SliceBy` (split summary by another tag's value at the same time, up to 10 SliceBy tags), `SliceByValue` (filter criterion for SliceBy), `OPCQuality`. Quality logic mirrors the SQL `wwQualityRule = 'Good'`: all-Good → Good, full gap → Bad, mixed → Doubtful (`64`).
## `StateSummary` — windowed time-in-state
Same shape as `AnalogSummary` but for state-tag data. Use `RetrievalMode=Cyclic` and a `Resolution` to bucket by time.
## `Events` — alarms and events
```http
GET /v2/Events?$filter=EventTime+gt+'2017-07-13T00:00:00'
```
Note the **single quotes around the datetime** for events specifically — events break the v2 "no quotes" rule because `EventTime` is treated as a string-style column.
Filterable optional parameters include `ID` (alarm GUID), `EventTime`, `Type` (`Alarm.Set` / `Alarm.Acknowledge` / `Alarm.Clear` / `Alarm.Write` / `User.Write` / `User.Write.Secured` / `User.Write.Verified` / `Application.Write`), `Priority` (1-999, lower = higher), `Namespace`, `Severity` (1=Critical, 2=Major, 3=Minor, 4=Informational), `EventTimeUTCOffsetMins`, `ReceivedTime`, `IsAlarm`. **Property values are case-sensitive.**
## Pagination — `$skiptoken`
Responses larger than ~5000 records are paginated. The response body includes a `nextLink` containing `$skiptoken=...` — follow it to fetch the next page. You don't need to construct `$skiptoken` yourself.
## Worked browser query
```
https://online.wonderware.com/s/ik97r5/apis/historian/v2/ProcessValues
?$filter=FQN+eq+'Baytown.tank_level'
+and+DateTime+gt+2017-07-13T00:00:00
&$top=200
```
Returns up to 200 raw VTQ records since the timestamp.
## Excel / Power BI hookups
The PDF chapter (pp. 232-240) walks through:
- **Excel** — `Data → Get Data → From Web`, paste the OData URL, sign in. Excel can refresh the connection on demand.
- **Postman** — pick GET, paste URL, set Auth (Basic for cloud / Negotiate for on-prem), Send.
- **Power BI** — `Get Data → OData feed`, paste the resource root (`.../v2/ProcessValues` or similar), authenticate, then build the report.
The shape of the data Power BI sees is identical to a JSON pull, so any aggregation you'd do in Power Query mirrors what `$filter` would have selected server-side.
## SSRS — Reporting Services extension
The **AVEVA Historian SQL Server Reporting Services Extension** lets SSRS report builders consume the same `INSQL` linked server queries documented in [`05-query-recipes.md`](05-query-recipes.md). PDF p. 241. Useful when the consumer is corporate reporting infrastructure rather than ad-hoc analysts.
## Errors
| Code | Meaning |
| --- | --- |
| 200 | OK with body. |
| 401 Unauthorized | Token expired / missing membership in the `aa*` Windows groups. |
| 404 Not Found | FQN doesn't exist, or solution / resource path wrong. |
| 5xx | Historian / Insight server-side issue. Retry with backoff. |
## Cross-references
- For the full property catalog of each resource, see PDF chapter "Browser-Friendly Data Retrieval" pp. 183-240.
- For SQL equivalents of every retrieval mode the REST API exposes, see [`03-retrieval-modes.md`](03-retrieval-modes.md).
- For options that map across (`Resolution``wwResolution`, `RetrievalMode``wwRetrievalMode`), see [`04-retrieval-options.md`](04-retrieval-options.md).