fieldmesh

What the SensorThings 2.0 draft looks like#

Read Oct 7, 2026, against the editor's rendering of OGC 23-019 and the published 1.1 standard (OGC 18-088). Written to answer one question: what changes for layer zero, and does it change the decision to ship on 1.1.

Snapshot caveat. The copy read here is stamped Version 0.1, submission date 2025-11-26, with approval and publication dates still XXXX-XX-XX and the standard draft notice attached ("This document is not an OGC Standard"). Repository activity suggests later revisions exist, so treat specific attribute names below as true of this snapshot and re-check before implementing.

Status#

Document OGC 23-019, OGC SensorThings API 2.0
Editor Hylke van der Schaaf
Version read 0.1, submitted 2025-11-26
Approval / publication Not yet — both dates are placeholders
Public comment 19 Dec 2025 – 18 Jan 2026, via issues on the OGC SensorThings GitHub repository
Expected publication 2026

The acknowledged contributors are worth noticing: BRGM, Datacove, Fraunhofer IOSB, the OGC/WMO Water Quality IE, the OGC GeoTech IE, OneWater, Secure Dimensions, SensorUP, Universitat Autònoma de Barcelona (CREAF), the University of Calgary, and the Water4All partnership. This is a hydrology, water-quality and environmental-monitoring revision, not an IoT-vendor revision — which explains both its strengths for a farm (sampling, features of interest) and the one thing it drops.

The two structural changes#

1. The result structure moves into SWE-Common. A Datastream no longer declares observationType and unitOfMeasurement. It declares:

The unit of measure is now a field inside resultType, and unitOfMeasurement no longer exists as a Datastream attribute. Because SWE-Common can describe a structure covering several observed properties, MultiDatastream is obsolete and a Datastream may link to multiple ObservedProperties.

2. Features are restructured. FeatureOfInterest is renamed Feature, a new FeatureType entity carries type information, and the single mandatory Observation→Feature link becomes a three-way arrangement:

The draft's own example: in water quality the ultimate feature is the river, the proximate feature is a section or a specific point where samples are taken. It also explicitly covers the case where the observation's target is part of the Thing itself, giving a drone's battery level as the example.

Entities#

Nine: Thing, Location, HistoricalLocation, Datastream, Sensor, ObservedProperty, Observation, Feature, FeatureType.

The Observation entity, in full#

Table 17 — attributes:

Name Type Multiplicity Note
id ANY 1 Read-only
phenomenonTime TM_Object 1 Mandatory, but a client may omit it on POST because "many resource-constrained sensing devices do not have a clock"
result ANY 1 "The estimated value of an ObservedProperty from the Observation"
resultTime TM_Instant 0..1 Now optional; in 1.1 it was mandatory-but-nullable
validTime TM_Period 0..1 The period during which the result may be used
properties JSON_Object 0..1 Renamed from parameters

Table 18 — relations: Datastream (1), ProximateFeatureOfInterest (Feature, 0..1).

TM_Object encodes as a complex type with a mandatory start and an optional end, so one type covers both an instant and an interval.

The finding that changes our spec: no resultQuality#

SensorThings 1.1 has it. Its Observation table defines resultQuality — "Describes the quality of the result" — typed DQ_Element, multiplicity zero-to-many. A structured, repeatable quality element: exactly the right home for a set of quality assertions.

The 2.0 draft does not. Table 17 above is the complete attribute list. The strings resultQuality and DQ_Element appear nowhere in the document. This is not an extraction artifact — the property tables parse cleanly as text, validTime and parameters are both found, and the Datastream table extracts in full.

Consequences for layer zero:

The second finding, stated fairly: tasking lives in a different document#

The words tasking, ControlStream, actuation and command do not appear in the 2.0 draft. That is not a regression, and it would be wrong to read it as one: tasking was never in Part 1. It has always lived in a separate document, SensorThings API Part 2 — Tasking Core (OGC 17-079r1), and 1.1's Part 1 has no tasking either. 23-019 is a Part 1 / Sensing revision, so the absence is exactly what the document's scope implies.

What is genuinely unknown is whether Part 2 gets a 2.0 revision, and nothing in 23-019 commits to one. So the practical position is unchanged: the command contract in v0.1 §6 aligns to Part 2 Tasking Core as it stands, or to OGC API — Connected Systems Part 2, whose ControlStreams are published and purpose-built. That is Q3b, and the 1.1-versus-2.0 choice does not bear on it.

The Datastream entity#

Changes from 1.1: resultType and resultEncoding added; unitOfMeasurement and observationType removed; definition added; description now optional; observedArea, phenomenonTime and resultTime server-generated and 0..1; properties 0..1. Relations: Thing (1), Sensor (1), ObservedProperty (now potentially several), plus the two Feature links.

API-level changes#

Units#

UCUM appears in 2.0 only in the abbreviations list. The normative statement lives in 1.1, whose unitOfMeasurement is a JSON object of name, symbol and definition whose values "SHOULD follow the Unified Code for Unit of Measure (UCUM)". In 2.0 the unit moved inside SWE-Common's structure description, which carries UCUM codes in its own unit-of-measure field. So UCUM remains the answer in both versions; only its location changes. This is why v0.1 §3.4 treats UCUM as an alignment rather than a preference.

Mapping table for layer zero#

Layer zero field SensorThings 1.1 SensorThings 2.0 draft
measured_at phenomenonTime phenomenonTime
measured_at_uncertainty parameters properties
received_at parameters properties
seq, boot, clock_quality parameters properties
result result result
Quality assertion resultQuality (DQ_Element, 0..*) properties — no equivalent
calibration, supersedes, provenance parameters properties
Datastream unit unitOfMeasurement.definition (UCUM) inside resultType (SWE-Common, UCUM)
Datastream feature — (feature was per-Observation) UltimateFeaturesOfInterest
Observation feature override FeatureOfInterest (mandatory) ProximateFeatureOfInterest (optional)
Raw vs derived datastream Two Datastreams Two Datastreams
Device health (battery, RSSI) A Datastream on the sensor's Thing Same, and explicitly blessed

Two things in the 2.0 model are better fits for layer zero than 1.1:

Neither is a reason to wait for 2.0. Both mean the 2.0 migration will simplify the adapter rather than complicate it.

Will vendors move to 2.0, and does it matter?#

They will, eventually. It costs us almost nothing, for four reasons.

1. The reference implementation already serves both at once. FROST-Server — Fraunhofer IOSB's server, the most widely deployed open-source STA implementation, from the same institute as the 2.0 editor — has shipped both a 2.0 data-model plugin and a 2.0 API plugin since version 2.8.0, both disabled by default. Its documentation notes that the two API plugins can be enabled simultaneously, while only one data-model plugin can. So the expected deployment pattern for the whole ecosystem is one data model serving two API versions side by side. Dual-serving is not a workaround; it is how the reference implementation is built.

2. We are a server, not a client. The SensorThings adapter is out-only (v0.1 §10). A client consuming vendor feeds is bound by the vendor's version choice; a server publishing data is not — clients adapt to servers. We can expose /sta/v1.1/ and /sta/v2.0/ from one internal model, and the internal model is richer than both.

3. The migration will be slow for everyone, because 2.0 breaks clients. Annotation renames (@iot.id → id), inverted deep-update semantics, MultiDatastream removal and the resultType restructuring each break existing clients independently. SensorThings' installed base is national environmental monitoring networks, water and hydrology services, smart-city platforms and research infrastructure — none of which migrate quickly, and all of which will keep 1.1 endpoints running for years.

4. 2.0's direction suits us better, not worse. Feature on the Datastream and observations whose target is part of the Thing itself are both things v0.1 does and 1.1 makes awkward. Wider 2.0 adoption makes our model more natural to express, not less.

Who the vendors actually are#

Worth separating two meanings of "vendor", because they pull in opposite directions:

So the version question is not "what will our hardware suppliers adopt". It is "what will the research and GIS tools that read our data support", and the answer is both, for a long time.

The one genuine exposure#

If 2.0 becomes the norm with no structured quality field, our quality assertions become non-standard precisely when the data most needs to be credible to an outsider — a researcher, a certifier, a buyer. That is the argument for raising it now rather than later, and the constituency already exists inside the 2.0 contributor list: water-quality and hydrology programmes are built on QA/QC flags. See Q18.

Verdict: ship on 1.1#

Sources#