English
Query
The Query page lets you explore the time-series data Pulse collects from your data sources — OPC UA servers, S7 PLCs, Prometheus endpoints, and heartbeats. Instead of looking at a single monitor, you build one or more ad-hoc queries — pick the data points, choose how to aggregate them, and see the result as charts or a table.
This is read-only analysis. Queries never change your monitors, thresholds, or incidents.
How a query is built
Each query is one row in the Define panel, assembled from three parts shown side by side:
- SELECT — the aggregation to compute (e.g. average, maximum, a percentile).
- WHERE — the data points to include.
- GROUP BY — how to split the results into separate series.
The time range and granularity are set from the clock icon in the panel header and apply to every query on the page, so all the charts share one x-axis and can be read at the same instant. Press Run Query to execute (or use ⌘ Enter / Ctrl Enter), or Cancel to clear the current results.
Running a query also gives the result its own address: the page's URL changes to name the run, and opening that URL later — or sending it to a colleague — shows the numbers that run produced rather than asking the question again over a newer time range. Press Run Query again whenever you want fresh numbers; that is a new run with a URL of its own, so a link you have already shared keeps showing what it showed. A result is kept for 30 days, after which its link asks you to run the query again.
Comparing several queries
Press + Add query to add another row, up to six. Each row asks about its own subject — its own data points and tags, its own grouping, its own aggregations. That is how you compare different variables: the temperature on one line against the throughput on another, or the value of a sensor against the latency of the connection reading it.
Several aggregations of the same subject do not need a second query — put them in the one row and it asks for them together (see SELECT below).
A new row starts empty. The ⋮ menu on a row offers:
- Duplicate — a copy of the row, ready to be edited into the thing you want to compare against.
- Remove — delete the row. The last remaining query cannot be removed.
Each query is identified by a letter (A, B, C…) shown on its row and on its chart. Click the letter to give the query a name instead — useful when two queries would otherwise look alike. The name appears on the chart heading, in the Overview, and in the Table tab's query picker, and it travels with the link when you share the page.
Ask AI for help
Click the Ask AI for help button (✦) in the toolbar to open AI Canvas with a prompt pre-filled to guide the assistant through building a query. The assistant asks what you want to find out, constructs the query, and shows you the results.
SELECT — the aggregation
An aggregation reduces all the readings in a time bucket to a single number. A query carries one to four of them, and each gets its own chart — so asking for the average and the maximum of one sensor is one query, one request, and two graphs.
An aggregation is a function applied to a field:
- Functions — Count, Sum, Average, Min, Max, Latest, and percentiles (P1, P5, P10, P25, P50/median, P75, P90, P95, P99, and finer steps such as P0.1 and P99.9).
- Fields — the value being aggregated:
- Value — the numeric reading from the data point. Boolean readings count as
0or1. - Latency — how long the read took, in milliseconds. Useful for spotting slow or degrading connections.
- Value — the numeric reading from the data point. Boolean readings count as
Count does not need a field — it counts the number of samples in each bucket. Latest returns the value at the sample with the greatest timestamp in the bucket — useful when you want the most recent reading rather than an aggregate like the average or maximum.
To set the aggregation, start typing a function name. Type the function followed by ( to choose a field — for example avg( then pick Value or Latency. The result reads back as a chip like avg(value) or max(latency).
Pick again to add another; each one reads back as its own chip, and each chip's × removes it — the same way the WHERE field takes and drops data points. Four is the limit, because that is how many a single request can carry; a fifth aggregation belongs in a second query.
TIP
Only successful reads are included. A reading is counted only when the source reported a good status (OPC UA status Good, S7 read status OK). Failed or stale reads are excluded, so the aggregates reflect healthy data only.
WHERE — data points and tags
The WHERE field selects which data points feed the query.
Start typing a data source name to find it, then pick one of its data points — an OPC UA node, an S7 address, a Prometheus series, or a heartbeat. Choose * to include everything that source measures at once. Selected data points appear as chips; remove one with its × or by pressing Backspace.
You can mix data points from several sources, of any kind. They are queried together and combined into one result set.
What * leaves out
* covers what a source measures, not its health signals. A source's own reachability, and any OPC UA node watched for whether it still exists rather than for its value, are left out — each reports a constant, and averaging one in beside a temperature would flatten the result. Select either by name to chart it on its own.
You can also filter by monitor tags — the labels you assign to monitors. Tags appear in the same dropdown, organized by category. Select one or more tags to restrict the query to data from monitors that carry those tags. Tag chips show the tag color and name alongside any selected data point chips. Remove a tag chip with its × or by pressing Backspace. A query may use tags alone, without selecting specific data points.
WARNING
At least one data point or tag is required, for every query on the page. A query with an empty WHERE field will not run, and the error is shown against the row it belongs to.
GROUP BY — splitting into series
By default, every data point a query selects is aggregated together into a single series. Group By splits that single series into several:
- Monitor — one series per condition monitor that reads the selected data points.
- Data Point — one series per data point.
- Data Source — one series per data source.
You can combine them. avg(value) grouped by Data Point gives one line per point, which is the quickest way to compare readings against each other. Add Monitor to break each point out by the monitor watching it — a point read by two monitors then appears once under each.
Time range and granularity
Open the clock icon in the panel header to set:
- Time Range — a quick range (last 15 minutes through last 30 days) or a custom start/end.
- Granularity — the size of each time bucket (10 seconds up to 1 week). Leave it on Auto to let Pulse pick a sensible bucket for the chosen range. When granularity is not set explicitly, Pulse buckets data by the hour.
Finer granularity gives more detail but more points; coarser granularity smooths the data and runs faster over long ranges.
Comparing to a previous period
Open the clock icon in the panel header and scroll to the Compare to previous time period section. Choose an offset — how far back the second period sits — and the page fetches both the current window and the same-length window ending that far back, then draws them together.
Available offsets depend on the window you have selected: only offsets that are at least as long as the window are offered, so the two periods cannot overlap. For example, a 7-day window offers "Previous 7 days" and "Previous 28 days", but not "Previous 1 hour".
To disable comparison, press Off in the same section.
Overlay and side-by-side
While comparison is on, a Display as overlay toggle appears below the offsets:
- Off (default) — each chart splits into two panels, one per period, each with its own time axis. Reading across both panels shows how the same slice of time compares: bucket index i is the same distance into each period.
- On — both periods are drawn on one chart and one time axis. The current period uses solid lines; the previous period uses dashed lines of the same color. Useful for a quick visual comparison when the exact bucket alignment matters less than the overall shape.
Per-chart mode
When comparison is running, each chart's header shows a Current / Compare toggle. Use it to switch that chart between showing the current period and showing the previous period. This lets you put a current chart next to a previous one — or focus a single chart entirely on the earlier window — without changing the comparison settings for the whole page.
How offsets are applied
PQL aligns time buckets to the epoch. When the offset you chose is not a whole number of buckets — for example, "Previous 30 days" against a window that buckets by week — Pulse snaps it to the nearest whole number of buckets at that granularity. The period captions on the charts and the headings in the Overview reflect the offset that was actually applied, so you always know which interval the earlier period covers.
Reading the results
After a run, the charts appear below the builder, with an Overview and a Table view in a tabbed control beneath them. A small summary line shows how long the slowest query took, the number of time buckets returned, and the granularity that was actually applied.
Charts
The charts are always shown. Every aggregation of every query gets its own chart, in the order they are defined, so different units and scales never share a single axis — a query with count and avg(value) produces two graphs. Within each chart, every Group By series is drawn as its own line.
Every chart is headed by the query's letter or name, its aggregation, and a line naming what it reads — which matters once two charts are both headed avg(value) and mean different sensors.
Moving the pointer anywhere over the stack draws a crosshair at the same instant on every chart, so one moment can be read across all of them at once. All the charts share the page's time range, and a query with no reading at some instant shows a gap there rather than a line drawn through a value it never read.
If one query fails or returns nothing, only its own charts say so; the others still answer their questions.
The colors are explained by the Overview table below, where each row carries the same color as its line.
When a query returns more than one aggregation, moving the pointer over the charts draws a shared crosshair — a vertical line at the same time bucket across all aggregation charts simultaneously. This makes it straightforward to compare, for example, average and maximum values at the same instant. The crosshair tracks the pointer anywhere across the chart column, including in the gaps between charts and on the axis labels. A value tooltip appears only for the chart the pointer is directly over.
Incident markers
Incidents that occurred during the time window are drawn on every chart as vertical markers at the same position, colored by status (unacknowledged, acknowledged, resolved). Use the Incidents button above the charts to show or hide individual incidents — handy for lining up a spike in one query with a dip in another, and with the incident that followed.
Overview
The Overview tab summarizes the whole window, with one block per query — not per chart — under its letter or name, and one row per group inside it. A query's aggregations are columns here, where they are separate pictures above. When you group by Monitor, Data Point, or Data Source those appear as columns too, and a colored dot on each row matches that group's line in the charts.
A query with no Group By has one row covering everything it selected, so instead of a group column it carries a Reads column naming its subject.
These totals are computed over all readings in the window — so avg(value) is the true average across the window, percentiles are exact, and count is the total — not a combination of the per-bucket numbers.
When comparison is on, each aggregation column gains two more: Previous, the same aggregate over the earlier period, and Δ, the percentage change from the earlier value to the current one — positive in green, negative in amber. A dash means no earlier reading exists or the earlier value was zero.
Narrowing from the overview
Each row in the Overview carries a ⋯ button on the right (or can be right-clicked). The menu offers actions based on what that row is grouped by:
- Narrow to this data point — rewrites the query's WHERE to that single data point and re-runs immediately. Available when the query is grouped by Data Point or Data Source.
- Narrow to this monitor — rewrites the query's WHERE to that single monitor and re-runs immediately. Available when the query is grouped by Monitor.
An action is disabled when the query is already narrowed to that item — the page is already showing the narrower answer, so pressing it again would change nothing.
When a query is narrowed to a monitor, the WHERE field shows a chip with the monitor name alongside any data point and tag chips. Remove it with the × on the chip to widen the subject again.
Table
The Table tab shows the time-series breakdown — one row per time bucket and group. Columns are sortable. Use the table when you want the exact per-bucket numbers rather than a trend or a window total. With more than one query on the page, pick which one the table shows using the selector above it.
Suggested queries
Below the builder, Suggested Queries offers ready-made starting points for common questions, such as average value per data point, peak values, polling latency, the slowest data sources, and sample volume per data source.
Selecting a suggestion fills in the SELECT, GROUP BY, granularity, and time range for you while keeping the data points you have already chosen. A suggestion that asks more than one thing — the operating envelope, say, which wants both the minimum and the maximum — becomes one query per question, all reading the same data points. If you have not selected a data point yet, pick one in the WHERE field first, then run the suggestion.
The suggestions disappear once you run a query and return when you press Cancel.
On mobile, the panel is replaced by a Suggested Queries button. Tapping it opens a bottom drawer that lists all suggestions with their names and descriptions. Tap any suggestion to run it immediately.
Related documentation
- Monitors — the condition monitors that alert on the readings you query here.
- OPC UA, Siemens S7, and Heartbeat — how the underlying data is collected.
- AI Canvas — ask the assistant to build and run queries on your behalf.

