Working reference for the iotdata field type system: architecture, domain coverage, device constraints, and prioritisation.
This section captures the reasoning frameworks and external knowledge that informed the organisation of this document. It is deliberately separated from the actionable specification content in subsequent sections so that the "why we think this way" is preserved without cluttering the "what we do."
Several established standards address sensor data modelling. None solve the bit-packing and bandwidth-constrained encoding problem that iotdata targets, but they validate the architectural shape and provide vocabulary.
| Framework | Relevance to iotdata |
|---|---|
| OGC Observations & Measurements (ISO 19156) | Separates observable property (what), procedure (sensor/how), feature of interest (soil, water body, air mass), and result (encoded value). Maps to Sections 2/3/4 of this document. |
| QUDT Ontology | Distinguishes quantity kind (length, temperature — abstract) from unit (cm, °C — concrete). This is essentially the Layer 2 concept: encoding a physical unit without domain semantics. |
| SenML (RFC 8428) | Lightweight sensor measurement format. Faces scale, sign, and packing problems similar to iotdata but solves them with JSON verbosity rather than bit efficiency. |
| CayenneLPP | LoRaWAN-oriented compact encoding. iotdata replaces this with richer type semantics and variant-driven flexibility. |
| IEEE 1451 TEDS | Self-describing transducer metadata embedded in the device. Connects to the variant-map metadata question (§2.13) — whether scale/offset/unit hints travel with the data. |
| W3C SSN/SOSA Ontology | Formalises observation types: measurement, count, truth/boolean, category. Maps onto the scale-type vocabulary (§2.2). |
Key takeaway: The distinction between quantity kind and encoding is fundamental and well-established. iotdata's three-layer model captures this. What no existing standard addresses is the bit-packing problem under severe bandwidth constraints — that is the novel contribution.
The following principles guided the restructuring of these notes:
First-class treatment of recurring cross-cutting concerns. Several issues (log-scale encoding, signed vs unsigned, rate-of-change interpretation) appeared repeatedly across domain-specific sections as ad-hoc observations. These are not domain-specific — they are architectural properties. They have been extracted and defined as vocabulary in Section 2 (Encoding Architecture).
Separation of encoding from domain from device. Three distinct questions: (a) how do we encode a value? (b) what are we measuring? (c) what sensor produces the data? Each question has its own section. Cross-references link them. This prevents sensor-specific details from leaking into encoding decisions, and domain-specific semantics from constraining generic types.
Spatial, temporal, practical. Within the encoding architecture (Section 2), three orthogonal concerns structure the design. §2.2 (scale types and sign domains) addresses the spatial axis — how a value is interpreted within its measurement space. §2.4 (temporal interpretation) addresses the temporal axis — how a value relates to time, whether as a raw instantaneous sample, a statistical summary (average, min, max), an accumulation, or a derivative. §2.5 onward addresses practical encoding mechanics — bit-width trade-offs, expansion/contraction, bundling, naming. These three concerns are independent: any scale type can combine with any temporal mode and any bit-width strategy.
Precision about what the protocol controls. The protocol defines encoding resolution (quantisation step size). It does not define sensor accuracy, calibration state, or measurement methodology. These are device-layer concerns (Section 4). Being explicit about this boundary prevents over-specification at the protocol level and under-specification at the device level.
Derivation awareness. Some quantities in the catalogue are derivable from others (salinity from EC+temperature, flow from depth via rating curve, TDS from EC). The architecture should acknowledge which types are fundamental (require encoding) and which are derivable (could be computed at the gateway). This does not mean derived types are excluded — a sensor may transmit a derived value directly — but the relationship should be visible.
Prioritisation by leverage. A Layer 2 type that unlocks multiple Layer 3 domains across common, affordable sensor deployments has higher priority than a Layer 3 type serving a single niche. Section 5 applies this principle explicitly.
Covered: environmental monitoring, agriculture, smart buildings, weather stations, water quality, general IoT deployments using low-power, scalable electronics.
Not covered: factory/heavy-industrial sensors, extreme environment sensors (deep-sea, space, nuclear), medical-grade devices, high-frequency trading or sub-millisecond timing.
These fields are already defined in the iotdata protocol specification. No work is needed except where issues are flagged.
| Field | Bits | Range | Resolution | Notes |
|---|---|---|---|---|
| Battery | 6 | 0–100%, charging flag | ~3.2% | |
| Link | 6 | RSSI -120–-60 dBm, SNR -20–+10 dB | 4 dBm / 10 dB | |
| Temperature | 9 | -40 to +80°C | 0.25°C | Standalone + in Environment bundle |
| Pressure (baro) | 8 | 850–1105 hPa | 1 hPa | J.1: range too narrow, needs fix |
| Humidity | 7 | 0–100% | 1% | Standalone + in Environment bundle |
| Environment | 24 | Temp+Press+Humid bundle | as above | |
| Wind Speed | 7 | 0–63.5 m/s | 0.5 m/s | J.2: max may be too low |
| Wind Direction | 8 | 0–355° | ~1.41° | |
| Wind Gust | 7 | 0–63.5 m/s | 0.5 m/s | |
| Wind | 22 | Speed+Dir+Gust bundle | as above | |
| Rain Rate | 8 | 0–255 mm/hr | 1 mm/hr | |
| Rain Size | 4 | 0–6.0 mm | 0.25 mm | J.7: semantics undefined |
| Rain | 12 | Rate+Size bundle | as above | |
| Solar Irradiance | 10 | 0–1023 W/m² | 1 W/m² | J.11: may need 11 bits; J.15: no standalone |
| UV Index | 4 | 0–15 | 1 | J.8: max 15 may be low; J.15: no standalone |
| Solar | 14 | Irradiance+UV bundle | as above | |
| Clouds | 4 | 0–8 okta | 1 okta | |
| AQ Index | 9 | 0–500 AQI | 1 | |
| AQ PM | 4–36 | 0–1275 µg/m³ per channel | 5 µg/m³ | 4 channels: PM1, PM2.5, PM4, PM10 |
| AQ Gas | 8–84 | Variable per gas | Variable | VOC, NOx, CO₂, CO, HCHO, O₃ + 2 reserved |
| Air Quality | 21+ | Index+PM+Gas bundle | as above | |
| Radiation CPM | 14 | 0–16383 CPM | 1 CPM | |
| Radiation Dose | 14 | 0–163.83 µSv/h | 0.01 µSv/h | |
| Radiation | 28 | CPM+Dose bundle | as above | |
| Depth | 10 | 0–1023 cm | 1 cm | Generic: snow, water level, ice, soil depth |
| Position | 48 | Lat/lon ±90°/±180° | ~1.2 m | |
| Datetime | 24 | Year-relative, 5s ticks | 5 s | |
| Flags | 8 | 8-bit bitmask | — | Deployment-defined |
| Image | Variable | Pixel data + control | — | Experimental |
Known issues carried forward: J.1 (barometric pressure range), J.2 (wind speed max), J.7 (rain size semantics), J.8 (UV Index max), J.11 (irradiance bits), J.15 (no standalone irradiance/UV).
This section defines the vocabulary and mechanisms for encoding sensor values. It is domain-agnostic — "what it measures" comes from the variant label and domain layer (Section 3). The architecture here answers: how do we pack a value into bits, and what structural properties does that encoding have?
Field types are organised in three layers that represent increasing levels of semantic commitment.
Layer 1 — Generic / Flexible. Raw bit-width types with no protocol-defined semantics. The variant label provides all meaning. No quantisation, no units, no JSON structure — just N bits in the packet. Examples: UINT8, RAW16, BIT1, FLOAT32.
Layer 2 — Unit-Based. Types that encode a specific physical unit with a defined quantisation but no specific measurement context. "Distance in cm" is unit-based; "snow depth" is specific. Unit-based types can be reused across many variant labels. Each Layer 2 type has defined: bit width, value range, quantisation step, SI or conventional unit, scale type (§2.2), and sign domain (§2.2).
Layer 3 — Specific / Domain. Types with fully defined semantics: measurement context, quantisation, range, and JSON structure. Existing fields (Temperature, Pressure, Wind, etc.) are Layer 3. New Layer 3 types are defined in Section 3 under their respective domains.
The layers are not a strict compositional hierarchy. A higher layer may build on a lower layer — Soil Moisture is built on PERCENTAGE (Layer 2), which is a constrained form of UINT8 (Layer 1). But a higher layer type can equally originate as a root with its own encoding, owing nothing to the layers below. Water pH (Layer 3) has a bespoke 8-bit encoding with its own quantisation formula; it is not built on any Layer 2 or Layer 1 type. The Environment bundle (Layer 3) packs three measurements with a unique bit layout that doesn't decompose into reusable Layer 2 components.
What the layers provide is vocabulary and optionality, not a mandatory inheritance chain. When a natural building block exists at a lower layer, use it — this gives you reuse, decoder simplicity, and a shorter path to implementation. When it doesn't, define the type fresh at the layer where it belongs. The layer number reflects the level of semantic commitment (none → unit → full domain context), not a dependency relationship.
This layering also determines decoder capability. A decoder that knows only Layer 1 can extract and forward raw values from any field. A decoder that knows Layer 2 can produce correctly-typed numeric values with units. A decoder that knows Layer 3 can produce structured, domain-specific JSON. Each layer is a useful capability plateau — a deployment can operate at whatever layer its tooling supports.
Every encoded value has two interpretation properties: a scale type (how raw bits map to real-world values) and a sign domain (what region of the number line the value occupies). Together these fully characterise the decoder's job for a given field. Both are first-class properties of each Layer 2 type — not ad-hoc per-field decisions.
| Scale Type | Description | Examples | Encoding Behaviour |
|---|---|---|---|
| Linear | Uniform quantisation steps across the range. Most common. | Temperature, pressure, distance, voltage | value = offset + (raw × step) |
| Logarithmic | Steps proportional to value. Covers large dynamic ranges in few bits. | Lux, turbidity, some gas concentrations | value = base^(raw / steps_per_decade) × min_value (formula TBD — see §2.13) |
| Categorical | Discrete named levels from a finite, known set. No meaningful arithmetic between levels. | Cloud cover (okta), leaf wetness levels, Beaufort scale | value = lookup[raw]; no interpolation |
| Wrapping/Cyclic | Value wraps at boundaries. For counters: monotonic until overflow. For angles: continuous wrap. | Rain tips, energy totaliser, compass bearing | Counter: increment-only, wrap at max. Angle: 0° = 360°. |
| Ratio | Normalised 0.0–1.0 (or -1.0 to +1.0). Semantically a proportion, not a count. | NDVI, duty cycle, confidence score, reflectance | value = raw / max_raw |
| Identifier | Opaque reference to an entity. No ordering, no arithmetic, no pre-defined set. | RFID UID, barcode, QR content hash, UUID, NFC tag ID | Raw bytes; equality comparison only. |
The Identifier type is distinct from Categorical in an important way. Categorical values are drawn from a finite, pre-defined set — the decoder knows the possible values and can map them to labels. Identifier values are drawn from an open, unbounded space — the decoder cannot enumerate them in advance. It can only test equality ("is this the same tag I saw before?") or pass the value through for external resolution. Identifiers have no scale at all — they are not measurements. They carry provenance or reference information alongside measurements. In practice, Identifier maps to the RAW types (RAW8 through RAW128) at Layer 1. The scale type annotation tells the decoder not to attempt numeric interpretation, aggregation, or interpolation — just store and compare.
| Sign Domain | Description | Examples |
|---|---|---|
| Unsigned | Non-negative values only. All bits encode magnitude. | Distance, percentage, lux, counter, weight |
| Signed | Positive and negative values. MSB or offset encoding. | Acceleration, ORP, water potential, tilt |
| Cyclic | Wraps at domain boundaries. Neither positive nor negative — directional. | Compass bearing (0–360°), phase angle |
| N/A | Not applicable. Value is not numeric. | RAW types, Identifier scale type |
Cyclic sign domain is related to but distinct from the Wrapping/Cyclic scale type. A wrapping counter (rain tips, energy totaliser) has unsigned sign domain and wrapping scale type — it wraps due to overflow of a non-negative accumulator. A compass bearing has cyclic sign domain and linear scale type — it wraps because the domain is inherently circular (359° + 2° = 1°, not 361°). The combination of scale type and sign domain together captures this distinction.
When scale type and sign domain are defined per-type rather than per-deployment, decoders can apply the correct reconstruction formula without out-of-band metadata. A LOG type is decoded differently from a LINEAR type even if both are 8 bits. A SIGNED type is bit-shifted differently from an UNSIGNED type at the same width. Defining these properties at the type level means a generic decoder can handle any field it encounters, even one it has never seen before, provided it knows the Layer 2 type.
A single physical quantity can be transmitted with different temporal semantics. These are not different field types — they are interpretation modes defined by the variant configuration.
| Mode | Meaning | Examples |
|---|---|---|
| Instantaneous | Value at the moment of sampling. | Temperature reading, pH, GPS position |
| Averaged | Mean over the reporting interval. | Mean wind speed, average sound level |
| Peak / Max | Maximum observed during the reporting interval. | Wind gust, peak vibration |
| Minimum | Minimum observed during the reporting interval. | Overnight low temperature |
| Cumulative | Accumulated total, typically wrapping. | Rain accumulation, energy totaliser, flow volume |
| Rate | First derivative: change per unit time. | Temperature rate (°C/min), pressure rate (hPa/hr) |
The variant definition determines which mode a field slot uses (see §2.6 for the presence bit mechanism). The protocol encoding is identical regardless of mode — interpretation is semantic, not structural.
Note: averaged, peak, and minimum modes imply that the sensor is performing local aggregation between transmissions. The protocol does not mandate a specific aggregation interval — that is a deployment concern.
Where a measurement needs a wider range or finer resolution than the standard
encoding, a second field type is defined with the suffix _expanded. Both
encodings coexist in the protocol; the variant chooses which to use.
TEMPERATURE — 9 bits, -40 to +80°C, 0.25°C
TEMPERATURE_EXPANDED — 12 bits, -60 to +150°C, 0.05°C
PRESSURE — 8 bits, 850–1105 hPa, 1 hPa
PRESSURE_EXPANDED — 10 bits, 300–1100 hPa, ~0.8 hPa
DEPTH / DISTANCE_CM — 10 bits, 0–1023 cm, 1 cm
DISTANCE_CM_EXPANDED — 16 bits, 0–65535 cm, 1 cm
Rules:
- The
_expandedtype is a separate field type ID. - The variant picks one or the other — they never coexist for the same measurement in the same variant.
- The base type optimises for bit efficiency in the common case.
- The
_expandedtype covers edge cases (high altitude, extreme temperatures, precision distance) at the cost of more bits. - No in-band signalling is needed — the variant advertisement declares which encoding is used.
A presence bit in the variant table controls whether a field is included in a given packet. Beyond simple present/absent, the presence bit mechanism supports several patterns.
(a) Fixed interpretation. The variant defines a field as always absolute or always rate. Simplest case, no overhead.
Field S2: TEMPERATURE (absolute) — always transmits absolute temp
(b) Dynamic selector. The variant allocates two presence slots: a 1-bit flag (BIT1) indicating interpretation, followed by the measurement field. The flag costs 1 bit when present, but allows the sensor to dynamically choose absolute or rate per packet.
Field S2: BIT1 label="temp_is_rate" — 0 = absolute, 1 = rate of change
Field S3: TEMPERATURE label="temp" — value interpreted per S2
(c) Separate fields. The variant allocates separate slots for absolute and rate, each independently present/absent.
Field S2: TEMPERATURE label="temperature"
Field S3: TEMPERATURE label="temperature_rate"
(d) Zero-width / NULL field. A presence bit with no content (zero-width field). The mere presence of the bit in the packet carries 1 bit of information. This is the NULL type at Layer 1.
Field S4: NULL label="motion_detected" — 0 bits of data; present = true
The NULL type is the cheapest possible signalling mechanism — useful for binary state flags (motion, door, tamper, alarm) where the event itself is the data.
A bundle is a Layer 3 type that packs multiple related measurements into a single field with a single presence bit. Bundles save presence bits but are inflexible — all components are present or absent together.
Bundle policy (proposed rule): Define a bundle only when:
- A common sensor or sensor class always outputs all component values together (e.g., BME280 → temp + pressure + humidity; Teros 12 → VWC + EC + temp).
- The components are routinely consumed together (e.g., wind speed + direction + gust).
- The presence-bit savings are meaningful relative to the total packet size.
If components may be independently present/absent, use separate fields.
Existing bundles: Environment (24 bits), Wind (22 bits), Rain (12 bits), Solar (14 bits), Air Quality (21+ bits), Radiation (28 bits).
Candidate new bundles are defined in Section 3 under their respective domains.
| Element | Convention | Examples |
|---|---|---|
| Layer 1 types | ALL_CAPS, bit-width suffix | UINT8, INT16, RAW24, BIT1, NULL |
| Layer 2 types | ALL_CAPS, unit suffix | DISTANCE_CM, PERCENTAGE, CONDUCTIVITY, LUX |
| Alternative encodings | Base name + qualifier suffix | TEMPERATURE_EXPANDED, CONDUCTIVITY_COARSE, DISTANCE_MM_SHORT |
| Layer 3 types | Title Case in documentation, ALL_CAPS in protocol | Soil Moisture, Water pH, Lightning Bundle |
| Variant labels | snake_case, descriptive | soil_moisture, water_ec, temp_is_rate |
| JSON output keys | snake_case, matching variant label where applicable | soil_moisture_vwc, water_ph |
Where a single physical unit needs more than one encoding, alternative variants are defined with a qualifying suffix. These are all instances of the same concept — trading bit cost against range or resolution — viewed from different directions.
The two independent axes of variation are:
- Range: The span of values the encoding can represent (e.g., -40 to +80°C vs -60 to +150°C).
- Resolution: The smallest distinguishable step (e.g., 0.25°C vs 0.05°C).
An alternative encoding may change one or both of these relative to the base type. More bits typically buys more range, finer resolution, or both — but the designer chooses where to spend those bits.
| Direction | What it means | Suffix style | Examples |
|---|---|---|---|
| Expansion | Wider range and/or finer resolution, more bits | _EXPANDED |
TEMPERATURE_EXPANDED (12 bits vs 9) |
| Contraction | Narrower range or coarser resolution, fewer bits | Descriptive qualifier | CONDUCTIVITY_COARSE (10 bits vs 16), DISTANCE_MM_SHORT (10 bits vs 16) |
Both are "alternatives" — neither is inherently better. The base type optimises for bit efficiency in the common case. Expansions cover edge cases at higher bit cost. Contractions sacrifice precision or range to save bits where the full encoding is unnecessary.
Rules:
- Each alternative is a separate field type ID.
- The variant picks exactly one encoding per measurement — alternatives never coexist for the same measurement in the same variant.
- No in-band signalling is needed. The variant advertisement declares which encoding is used.
- The base type name (without suffix) should represent the most broadly useful encoding for the target deployment class. This is a judgement call per type.
When defining a new Layer 2 type, consider whether the common case and the edge case differ enough on range or resolution to justify an alternative. If they do, decide which axis matters: a high-altitude pressure sensor needs range expansion (300–1100 hPa vs 850–1105 hPa); a precision laboratory sensor needs resolution expansion (0.05°C vs 0.25°C); a brackish-water EC sensor needs range with resolution contraction (50 µS/cm steps to cover 0–51,150 in 10 bits vs 1 µS/cm steps in 16 bits). Making the axis explicit helps choose the right suffix and avoids defining alternatives that don't serve a real deployment need.
Some quantities are derivable from others. The protocol does not forbid encoding a derived value directly — a sensor may compute and transmit it — but awareness of the derivation network informs priority decisions and avoids redundant type definitions.
| Derived Quantity | Derived From | Notes |
|---|---|---|
| Total dissolved solids | Electrical conductivity | TDS ≈ EC × factor (0.5–0.7 typical) |
| Salinity | EC + temperature | Standard oceanographic formula |
| Flow rate (open channel) | Water depth + rating curve | Sensor transmits depth; gateway computes flow |
| Dew point | Temperature + humidity | Magnus formula |
| Heat index | Temperature + humidity | Steadman formula |
| Wind chill | Temperature + wind speed | Standard formula |
| UV Index (from sensor) | UV irradiance | Weighted spectral integral; some sensors output directly |
| AQI | PM2.5, PM10, O₃, etc. | EPA breakpoint interpolation |
| Power | Voltage × current | Ohm's law |
| Energy | Accumulated power × time | Totaliser |
| Altitude | Barometric pressure + temp | Barometric formula |
| Colour temperature | RGB values | Computed from chromaticity |
Implication for type priority: Types that are easily derived at the gateway (TDS, salinity, dew point, heat index, wind chill, altitude) have lower priority for dedicated encoding than fundamental types.
The protocol defines encoding resolution — the quantisation step size. This is a protocol-layer concern.
The protocol does NOT define sensor accuracy, calibration state, or measurement methodology. These are device-layer concerns (Section 4).
Example: TEMPERATURE has 0.25°C resolution. A TMP117 sensor has ±0.1°C accuracy (better than the encoding). A DHT11 has ±2°C accuracy (much worse than the encoding). Both use the same field type. The encoding resolution sets a floor on what precision the protocol can represent, but does not guarantee that the sensor achieves it.
This boundary prevents two failure modes:
- Over-specification: Defining encoding resolution to match a specific high-end sensor, wasting bits for most deployments.
- Under-specification: Failing to document that a cheap sensor's accuracy is far coarser than the encoding suggests, misleading consumers of the data.
Section 4 (Device Coverage) documents sensor accuracy alongside the encoding resolution from Section 2, making the gap visible.
No protocol-defined units or quantisation. Variant label gives meaning.
| Type | Bits | Range | Scale | Sign | Description |
|---|---|---|---|---|---|
| NULL | 0 | presence only | — | — | Zero-width flag. Presence bit = true. |
| BIT1 | 1 | 0/1 | Categ. | Unsigned | Boolean. Door, alarm, mode select. |
| UINT4 | 4 | 0–15 | Linear | Unsigned | Small enum, category, state machine. |
| UINT8 | 8 | 0–255 | Linear | Unsigned | Generic unsigned byte. |
| UINT10 | 10 | 0–1023 | Linear | Unsigned | Medium unsigned. |
| UINT16 | 16 | 0–65535 | Linear | Unsigned | Large unsigned, raw ADC. |
| UINT32 | 32 | 0–4,294,967,295 | Linear | Unsigned | Very large unsigned. |
| UINT64 | 64 | 0–1.8×10¹⁹ | Linear | Unsigned | Extended unsigned. Expensive (8 bytes). |
| INT8 | 8 | -128 to +127 | Linear | Signed | Signed byte. |
| INT16 | 16 | -32768 to +32767 | Linear | Signed | Signed word. |
| INT32 | 32 | ±2,147,483,647 | Linear | Signed | Large signed integer. |
| INT64 | 64 | ±9.2×10¹⁸ | Linear | Signed | Extended signed. Expensive (8 bytes). |
| Type | Bits | Range | Scale | Sign | Description |
|---|---|---|---|---|---|
| FLOAT16 | 16 | ±65,504 (~3 digits) | — | Signed | IEEE 754 half-precision. |
| FLOAT32 | 32 | ±3.4×10³⁸ (~7 digits) | — | Signed | IEEE 754 single-precision. |
| FLOAT64 | 64 | ±1.8×10³⁰⁸ (~15 digits) | — | Signed | IEEE 754 double-precision. Expensive. |
| Type | Bits | Range | Scale | Sign | Description |
|---|---|---|---|---|---|
| RAW8 | 8 | opaque | — | — | Opaque byte, no interpretation. |
| RAW16 | 16 | opaque | — | — | Opaque 2 bytes. |
| RAW24 | 24 | opaque | — | — | Opaque 3 bytes. |
| RAW32 | 32 | opaque | — | — | Opaque 4 bytes. |
| RAW64 | 64 | opaque | — | — | Opaque 8 bytes. |
| RAW128 | 128 | opaque | — | — | Opaque 16 bytes. |
Notes:
- Integer vs RAW: UINT/INT types are numeric (JSON outputs a number). RAW types are opaque (JSON outputs hex or base64). Semantics differ at the gateway.
- Float scale type is "—" because IEEE 754 encodes its own scale via mantissa and exponent. This is a meaningful distinction from integer types where the protocol defines scale via quantisation parameters.
- FLOAT16 (half-precision) is the recommended default for uncalibrated or prototype measurements where no domain-specific quantisation has been defined. Same cost as UINT16, but self-scaling.
- Cost awareness: 64-bit and 128-bit types are expensive in constrained payloads. A single FLOAT64 or RAW128 consumes 8–16 bytes — potentially 15–30% of a LoRa payload. Use only when narrower types cannot serve.
- Identifier payloads: RAW types (especially RAW64 and RAW128) serve
non-quantifiable data such as barcode values, QR code content hashes, RFID
UIDs, NFC tag identifiers, UUID device references, or cryptographic
signatures. These are not measurements — they carry identity or provenance
information. The variant label defines interpretation (e.g.,
label="rfid_uid",label="asset_barcode"). - BIT1 scale type is Categorical because 0/1 are discrete states. However, BIT1 also serves as a dynamic selector flag (§2.6b) — a structural role rather than a measurement.
- Variant map may optionally carry scale/offset hints for generic types in future (J.27 variant advertisement), but for now interpretation is out-of-band.
Defined quantisation for a physical unit. Reusable across many variant labels. No domain-specific semantics — "what it measures" comes from the variant label.
Each type specifies: bits, range, resolution, unit, scale type, and sign domain.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| DISTANCE_CM | 10 | 0–1023 cm | 1 cm | cm | Linear | Unsigned |
| DISTANCE_CM_EXPANDED | 16 | 0–65535 cm | 1 cm | cm | Linear | Unsigned |
| DISTANCE_MM | 16 | 0–65535 mm | 1 mm | mm | Linear | Unsigned |
| DISTANCE_MM_SHORT | 10 | 0–1023 mm | 1 mm | mm | Linear | Unsigned |
Use cases: snow depth, water level, soil depth, ultrasonic range, lidar, object distance, ice thickness, clearance.
Note: existing DEPTH (10 bits, 0–1023 cm) becomes an alias for DISTANCE_CM.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| PERCENTAGE | 7 | 0–100% | 1% | % | Linear | Unsigned |
| PERCENTAGE_FINE | 10 | 0–100.0% | 0.1% | % | Linear | Unsigned |
Use cases: soil moisture, leaf wetness, dissolved oxygen saturation, humidity (existing HUMIDITY is an alias), battery (different encoding though), signal quality, generic fill level.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| RATIO8 | 8 | 0.000–1.000 | ~1/255 | ratio | Ratio | Unsigned |
| RATIO16 | 16 | 0.0000–1.0000 | ~1/65535 | ratio | Ratio | Unsigned |
Use cases: NDVI, duty cycle, confidence score, reflectance, normalised index.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| TEMPERATURE | 9 | -40 to +80°C | 0.25°C | °C | Linear | Signed |
| TEMPERATURE_EXPANDED | 12 | -60 to +150°C | ~0.05°C | °C | Linear | Signed |
Existing TEMPERATURE unchanged. TEMPERATURE_EXPANDED for industrial, desert, high-altitude, or precision applications.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| PRESSURE | 8 | 850–1105 hPa | 1 hPa | hPa | Linear | Unsigned |
| PRESSURE_EXPANDED | 10 | 300–1100 hPa | ~0.8 hPa | hPa | Linear | Unsigned |
| PRESSURE_KPA | 14 | 0–10,000 kPa | ~0.6 kPa | kPa | Linear | Unsigned |
PRESSURE_EXPANDED addresses J.1 (altitude range issue). PRESSURE_KPA is non-atmospheric: pipe, hydraulic, tyre, water pressure.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| VOLTAGE_MV | 16 | 0–65535 mV | 1 mV | mV | Linear | Unsigned |
| CURRENT_MA | 16 | 0–65535 mA | 1 mA | mA | Linear | Unsigned |
| POWER_W | 16 | 0–65535 W | 1 W | W | Linear | Unsigned |
| ENERGY_WH | 16 | 0–65535 Wh | 1 Wh | Wh | Linear | Wrapping |
| CONDUCTIVITY | 16 | 0–65535 µS/cm | 1 µS/cm | µS/cm | Linear | Unsigned |
| CONDUCTIVITY_COARSE | 10 | 0–51,150 µS/cm | 50 µS/cm | µS/cm | Linear | Unsigned |
Notes:
- CONDUCTIVITY serves both soil EC and water EC — variant label distinguishes.
- Two resolutions: fine (1 µS/cm, 16 bits, freshwater precision) and coarse (50 µS/cm, 10 bits, covers brackish/seawater in fewer bits).
- ENERGY_WH is a wrapping totaliser (scale type = Wrapping).
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| FLOW_LPM | 10 | 0–1023 L/min | 1 L/min | L/min | Linear | Unsigned |
| FLOW_LPM_EXPANDED | 16 | 0–65535 L/min | 1 L/min | L/min | Linear | Unsigned |
| VOLUME_L | 16 | 0–65535 L | 1 L | L | Linear | Wrapping |
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| WEIGHT_G | 16 | 0–65535 g | 1 g | g | Linear | Unsigned |
| WEIGHT_G_EXPANDED | 24 | 0–16,777,215 g | 1 g | g | Linear | Unsigned |
| FORCE_N | 16 | 0–65535 N | 1 N | N | Linear | Unsigned |
WEIGHT_G_EXPANDED covers up to ~16.7 tonnes — sufficient for silo/tank monitoring and livestock scales.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| SPEED_MS | 7 | 0–63.5 m/s | 0.5 m/s | m/s | Linear | Unsigned |
| SPEED_MS_EXPANDED | 10 | 0–127.5 m/s | ~0.125 m/s | m/s | Linear | Unsigned |
Existing wind speed is an alias for SPEED_MS. SPEED_MS_EXPANDED addresses J.2.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| ANGLE_360 | 8 | 0–355° | ~1.41° | degrees | Linear | Cyclic |
| ANGLE_360_FINE | 10 | 0–359.6° | ~0.35° | degrees | Linear | Cyclic |
| ANGLE_SIGNED | 10 | -180 to +180° | ~0.35° | degrees | Linear | Signed |
| TILT | 8 | -90 to +90° | ~0.7° | degrees | Linear | Signed |
ANGLE_360 = existing wind direction encoding. TILT for inclinometers.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| COUNTER8 | 8 | 0–255 | 1 | wrapping count | Wrapping | Unsigned |
| COUNTER16 | 16 | 0–65535 | 1 | wrapping count | Wrapping | Unsigned |
Semantically distinct from UINT — counters wrap, measurements don't. JSON should note wrapping semantics. Use cases: rain tips, flow pulses, lightning strikes, event counts, energy totaliser.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| SOUND_DBA | 8 | 0–140 dBA | ~0.55 dBA | dBA | Linear | Unsigned |
| SOUND_DBA_EXPANDED | 10 | 0–140 dBA | ~0.14 dBA | dBA | Linear | Unsigned |
Note: dBA is itself a logarithmic unit (decibels), but the encoding of the dBA value is linear. The log transformation has already occurred at the sensor.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| LUX | 16 | 0–65535 lux | 1 lux | lux | Linear | Unsigned |
| LUX_LOG | 8 | ~1–120,000 lux | ~12%/step | lux | Logarithmic | Unsigned |
LUX_LOG covers the full outdoor range (starlight to bright sun) in 8 bits using logarithmic encoding. This is the first log-scale type — it sets the precedent for other skewed-distribution fields (see §2.13).
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| PPM | 16 | 0–65535 ppm | 1 ppm | ppm | Linear | Unsigned |
| PPB | 16 | 0–65535 ppb | 1 ppb | ppb | Linear | Unsigned |
| UGM3 | 16 | 0–65535 µg/m³ | 1 µg/m³ | µg/m³ | Linear | Unsigned |
Generic concentration types for gas/particulate measurements not covered by the existing AQ fields.
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| MAGNETIC_UT | 10 | -512 to +511 µT | 1 µT | µT | Linear | Signed |
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| ACCEL_G | 10 | -16.0 to +15.9 g | ~0.03 g | g | Linear | Signed |
| ACCEL_G_EXPANDED | 16 | -32.0 to +32.0 g | ~0.001 g | g | Linear | Signed |
| Type | Bits | Range | Resolution | Unit | Scale | Sign |
|---|---|---|---|---|---|---|
| RPM | 14 | 0–16383 RPM | 1 RPM | RPM | Linear | Unsigned |
These are unresolved questions that live at the encoding architecture level, not in any specific domain.
Log-scale encoding formula. LUX_LOG and Water Turbidity (§3.2) both need
logarithmic encoding. Define a general formula
(value = base^(raw / steps_per_decade) × min_value) or allow per-field
formulas? Need to decide on base and step count. A single formula with
per-type parameters (min, max, bits) would be cleanest.
Gas expansion strategy. Extend existing AQ Gas mask from 8 to 16 bits (adding CH₄, NH₃, H₂S, SO₂, O₂, Rn to existing structure) vs define standalone gas types using generic PPM/PPB with variant labels (simpler variants, but no bundle benefit). See §3.1.4 for the gas species list.
Generic type metadata in variant map. For Layer 1 types (UINT8 etc.), should the variant map (J.27 variant advertisement) carry scale/offset/unit metadata to enable automatic JSON output with correct units? Or is that purely out-of-band? If yes, this allows UINT16 with variant metadata "scale=0.1, offset=0, unit=kPa" to become a self-describing type. If no, the deployment documentation must provide this.
Bundle policy formalisation. The rule in §2.7 is "proposed" — needs to be confirmed. Open sub-question: should bundles allow optional components (some present, some absent within the bundle), or is a bundle strictly all-or-nothing? All-or-nothing is simpler and matches existing bundles.
Field type ID allocation. Need to define the global ID numbering scheme. Options: Layer 1 in one range, Layer 2 in another, Layer 3 in another? Or flat? Currently ~25 existing types. This document adds ~40-50 more candidates. The 7-bit global field type ID (J.27) supports 128 types — comfortable, but should we reserve ranges?
Canonical units. Should the protocol enforce a single canonical unit per physical quantity (e.g., always µS/cm for conductivity, always hPa for pressure), with unit conversion happening at the edge? Or support unit variants? Canonical units simplify decoders; unit variants add flexibility.
This section catalogues measurement types organised by environmental and application domain. For each domain: the measurements, their ranges and units, which Layer 2 types they use, and what Layer 3 specific types or bundles are needed.
Fully covered by existing protocol fields (Section 1). Key issues carried forward:
- J.1 — Barometric pressure range: 850–1105 hPa is too narrow for high-altitude deployments. PRESSURE_EXPANDED (10 bits, 300–1100 hPa) resolves this.
- J.2 — Wind speed maximum: 63.5 m/s may be too low for severe weather. SPEED_MS_EXPANDED (10 bits, 0–127.5 m/s) resolves this.
- J.7 — Rain size semantics: Undefined. Needs specification work.
- J.15 — Solar/UV standalone: Irradiance and UV Index currently exist only as bundle components. Standalone types needed (see §3.1.2).
No new Layer 3 types needed for basic weather beyond the expanded variants and standalone splits.
Existing: Solar bundle (14 bits: irradiance + UV).
New standalone types (split from Solar bundle — J.15):
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Standalone Irradiance | — | 10 | 0–1023 W/m² | 1 W/m² | Same encoding as in bundle |
| Standalone UV Index | — | 4 | 0–15 | 1 | Same encoding as in bundle |
Additional optical types (beyond solar):
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Illuminance | LUX | 16 | 0–65535 lux | 1 lux | BH1750, VEML7700 range |
| Illuminance (compact) | LUX_LOG | 8 | ~1–120,000 lux | ~12%/step | Log scale; full outdoor range in 8 bits |
| Colour RGB | — | 24 | 3×8 bits per channel | 1 | TCS34725 etc. |
| Infrared band power | UINT16 | 16 | 0–65535 (raw) | variant | Thermopile, pyroelectric; variant defines scaling |
Notes:
- Lux has enormous dynamic range — 0.001 (starlight) to 120,000 (bright sun). LUX_LOG is the primary encoding for outdoor deployments. Linear LUX is for indoor or constrained-range applications.
- CMYK colour (4×7=28 bits) was considered and dropped — not a sensor output in IoT contexts. If needed, compute from RGB at the gateway (derivable — §2.9).
- Colour temperature (K) is derivable from RGB (§2.9). Not a dedicated type.
- Infrared band power is niche (fire detection, presence sensing). Covered by UINT16 with variant label until demand justifies a specific type.
Fully covered by existing AQ PM fields (4–36 bits, 4 channels: PM1, PM2.5, PM4, PM10, 0–1275 µg/m³, 5 µg/m³ resolution).
No changes needed.
Existing AQ Gas field covers: VOC, NOx, CO₂, CO, HCHO, O₃ + 2 reserved slots (8-bit mask).
Additional gas species not covered:
| Gas | Units | Typical Range | Priority | Notes |
|---|---|---|---|---|
| Methane (CH₄) | ppm | 0–10,000 (LEL ~50,000) | High (agriculture, landfill) | MQ-4, Figaro TGS2611, Sensirion SGP41 |
| Ammonia (NH₃) | ppm | 0–100 (livestock), 0–500 (industrial) | High (livestock) | MQ-137, Sensirion SFA30, EC sense NH3/M-100 |
| Hydrogen sulfide (H₂S) | ppm | 0–100 | Medium (wastewater, mining) | Alphasense H2S-A4, Membrapor H2S/S-20 |
| Sulfur dioxide (SO₂) | ppb | 0–2000 | Medium (volcanic, industrial) | Alphasense SO2-A4, Membrapor SO2/S-20 |
| Oxygen concentration | % | 0–25 (ambient ~20.9) | Medium (confined space) | Alphasense O2-A2, SST LOX-02 |
| Radon (Rn) | Bq/m³ | 0–10,000 | Low (indoor air quality) | Airthings Wave, RadonEye RD200 |
| Gas flow rate | L/min | 0–100 | Low (medical/industrial) | Mass flow sensors |
Decision needed (§2.13): Extend AQ Gas mask from 8 to 16 bits to accommodate these, or define as standalone types using generic PPM/PPB/UGM3 with variant labels.
Arguments for mask extension: keeps the bundle benefit; consistent with existing AQ structure. Arguments for standalone: simpler variants for single-gas sensors (MQ-4, SFA30); doesn't force all gases into one structure.
CH₄ and NH₃ are highest priority for agricultural deployments. O₂% is distinct from dissolved oxygen (§3.2) — same quantity, different medium.
Fully covered by existing Radiation bundle (28 bits: CPM + dose).
No changes needed.
Not currently covered. Candidate for new Layer 3 types.
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Lightning Distance | UINT8 | 8 | 0–63 km | ~0.25 km | AS3935 range |
| Lightning Count | COUNTER8 | 8 | 0–255 | 1 | Strikes per period |
| Lightning Bundle | — | 16 | Dist+Cnt | mixed | Distance(8) + Count(8) |
The AS3935 is the only widely available IC-level lightning detector. Its output maps cleanly to this encoding.
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Water pH | — | 8 | 0–14.0 pH | ~0.055 | 255 steps over 14.0 |
| Water pH (expanded) | — | 10 | 0–14.00 pH | ~0.014 | Lab-grade resolution |
| Water EC | CONDUCTIVITY | 16 | 0–65535 µS/cm | 1 µS/cm | Alias for CONDUCTIVITY with variant label |
| Water EC (coarse) | CONDUCTIVITY_COARSE | 10 | 0–51,150 µS/cm | 50 µS/cm | Brackish/seawater in fewer bits |
| Water DO | — | 8 | 0–25.5 mg/L | 0.1 mg/L | Dissolved oxygen |
| Water DO (%) | PERCENTAGE | 7 | 0–200% (supersaturation needs expansion) | 1% | Saturation mode; may need UINT8 for >100% |
| Water Turbidity | LUX_LOG-style | 8 | ~0.1–10,000 NTU | ~12%/step | Log-scale, heavily right-skewed |
| Water ORP | — | 10 | -1000 to +1000 mV | ~2 mV | Redox potential |
| Water Quality Bundle | — | 34 | pH(8)+EC(10)+DO(8)+Temp(9) | mixed | Multi-parameter sonde pattern |
Additional water quality measurements (lower priority):
| Measurement | Units | Typical Range | Notes |
|---|---|---|---|
| Total dissolved solids | ppm | 0–50,000 | Derivable from EC (§2.9). Not a dedicated type. |
| Salinity | ppt | 0–40 (seawater ~35) | Derivable from EC + temp (§2.9). Not a dedicated type. |
| Chlorophyll-a | µg/L | 0–500 | Niche but important for aquaculture/eutrophication |
Notes:
- Turbidity has massive dynamic range — strong candidate for log-scale encoding, same formula family as LUX_LOG (§2.13).
- EC is unified with soil EC at Layer 2 (CONDUCTIVITY). The variant label distinguishes domain.
- DO saturation >100% (supersaturation) is physically possible. If using PERCENTAGE (7 bits, 0–100), this is truncated. A UINT8 variant (0–200% with 0.78% resolution) or PERCENTAGE_FINE may be needed.
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Flow rate (small) | FLOW_LPM | 10 | 0–1023 L/min | 1 L/min | Garden hose, small pipe, YF-S201 |
| Flow rate (large) | FLOW_LPM_EXPANDED | 16 | 0–65535 L/min | 1 L/min | Larger pipe, ultrasonic transit-time |
| Flow volume | VOLUME_L | 16 | 0–65535 L | 1 L | Wrapping totaliser |
Notes:
- Huge dynamic range problem — a garden hose vs a river. The two FLOW_LPM variants handle the smaller end. Very large flows (m³/s) are out of scope for the sensor class iotdata targets.
- Flow volume is a wrapping counter. Gateway must handle wrap-around.
- Many flow measurements are derived from water level via stage-discharge curve. Sensor transmits depth (existing DEPTH field), gateway computes flow. This is a derivation relationship (§2.9).
Covered by existing DEPTH field (10 bits, 0–1023 cm) via variant label. For deeper water or mm-precision, use DISTANCE_CM_EXPANDED or DISTANCE_MM.
No new types needed.
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Soil Moisture (VWC) | PERCENTAGE | 7 | 0–100% VWC | 1% | Variant label distinguishes from humidity |
| Soil Moisture (raw) | UINT16 | 16 | 1–80 ε (permittivity) | variant | Raw sensor output mode |
| Soil EC | CONDUCTIVITY | 16 | 0–65535 µS/cm | 1 µS/cm | Or CONDUCTIVITY_COARSE for 10 bits |
| Soil Water Potential | — | 10 | -1023 to 0 kPa | 1 kPa | Matric potential, always negative (signed) |
| Soil Temperature | TEMPERATURE | 9 | -40 to +80°C | 0.25°C | Reuse via variant label |
| Soil Bundle | — | 33 | VWC(7)+EC(16)+Temp(9)+Charging(1) | mixed | Teros 12 output pattern |
Notes:
- Soil moisture and humidity share the same 0–100% range. Reusing PERCENTAGE (Layer 2) with variant label is the correct approach.
- Soil EC and water EC are the same physical measurement (conductivity) at different typical ranges. Unified at Layer 2 as CONDUCTIVITY.
- Water potential is critical for irrigation scheduling. It is distinct from moisture content — a dry sandy soil and a dry clay soil can have the same potential but very different VWC.
- Many soil probes output all values simultaneously (SDI-12, I2C). The Soil Bundle matches the Teros 12 output pattern.
- Raw permittivity (ε) is the uncalibrated sensor output. Covered by UINT16 with variant label; calibration to VWC happens at the gateway or in post-processing.
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Leaf Wetness | UINT4 or PERCENTAGE | 4 or 7 | 0–15 or 0–100% | varies | Categorical (4 levels) or continuous |
| Surface Moisture | PERCENTAGE | 7 | 0–100% | 1% | Same encoding as leaf wetness continuous |
| PAR | UINT16 | 16 | 0–2500 µmol/m²/s | variant | Scale TBD; distinct from solar irradiance |
| NDVI | RATIO8 | 8 | 0.0–1.0 | ~1/255 | Normalised difference vegetation index |
| Dendrometer | UINT16 | 16 | 0–10,000 µm | variant | Stem diameter change |
Notes:
- PAR (photosynthetically active radiation) measures photosynthetic wavelengths only (400–700 nm). It is distinct from broadband solar irradiance.
- Leaf wetness could be 2-bit categorical (dry/dew/wet/saturated) or 7-bit percentage. Categorical is cheaper; percentage is more informative. The variant can choose.
- NDVI is a normalised ratio, perfectly served by RATIO8. No dedicated type needed at Layer 3 beyond the variant label.
- Dendrometer values are micro-scale (µm) and slow-changing. UINT16 with variant-defined scaling is adequate.
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Sound Level | SOUND_DBA | 8 | 0–140 dBA | ~0.55 dBA | Environmental noise compliance, wildlife |
| Sound Level (fine) | SOUND_DBA_EXPANDED | 10 | 0–140 dBA | ~0.14 dBA | Precision monitoring |
| Sound Frequency | UINT16 | 16 | 20–20,000 Hz | variant | Dominant frequency from FFT |
| Sound Bundle | — | 24 | Level(8)+Freq(16) | mixed | Level + dominant frequency |
Notes:
- Sound level monitoring use cases: environmental noise compliance, wildlife acoustic triggers, beehive health (bee buzz frequency changes with colony state).
- Frequency is niche — mostly for species ID triggers or machinery fault detection. Covered by UINT16 with variant label.
- A Sound Bundle (level + dominant frequency) could serve beehive monitoring and environmental compliance simultaneously.
The following measurement types are relevant to ecological monitoring but are not currently covered by dedicated types. Most can be served by Layer 1/2 generic types with variant labels.
| Measurement | Covered By | Notes |
|---|---|---|
| Species count | COUNTER8 / COUNTER16 | Acoustic or camera-trap triggered |
| Activity index | UINT8 | Derived from accelerometer (livestock monitoring) |
| Beehive weight | WEIGHT_G / WEIGHT_G_EXPANDED | Continuous monitoring for colony health |
| Beehive internal temp | TEMPERATURE | Via variant label |
| Beehive acoustics | SOUND_DBA + Sound Frequency | Bee health indicator |
No dedicated Layer 3 types needed — the generic and unit-based types cover these with appropriate variant labels.
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Supply Voltage | VOLTAGE_MV | 16 | 0–65535 mV | 1 mV | Solar panel, load monitoring |
| Current | CURRENT_MA | 16 | 0–65535 mA | 1 mA | Load monitoring |
| Power | POWER_W | 16 | 0–65535 W | 1 W | Computed from V×I or CT clamp |
| Energy Totaliser | ENERGY_WH | 16 | 0–65535 Wh | 1 Wh | Wrapping counter |
| Mains Frequency | UINT8 | 8 | 45.0–65.0 Hz | variant | ×10 for 0.1 Hz resolution; zero-crossing |
Notes:
- Voltage is already present in the Health TLV as supply_mv. As a data field, it serves solar panel monitoring, load monitoring, grid monitoring.
- Current + voltage → power → energy is a natural derivation chain (§2.9).
- Energy is a wrapping totaliser like flow volume.
- Mains frequency monitoring is niche but relevant for grid stability sensing. Covered by UINT8 with variant-defined scaling (value = 45.0 + raw × 0.1).
| Measurement | Units | Typical Range | Covered By | Notes |
|---|---|---|---|---|
| Strain | µε (microstrain) | ±10,000 | INT16 | Foil strain gauges, fibre Bragg gratings |
| Tilt / inclination | degrees | ±90° | TILT (Layer 2) | Landslide, structural monitoring |
| Crack width | mm | 0–50 | DISTANCE_MM_SHORT | LVDT or potentiometric |
| Vibration RMS | g | 0–10 | ACCEL_G | Processed from accelerometer FFT/RMS |
| Vibration frequency | Hz | 0–1000 | UINT16 | Dominant frequency from FFT |
Notes:
- Strain is structural health monitoring — bridges, buildings, dams. INT16 covers the range. Dedicated type not justified until demand emerges.
- Tilt is critical for landslide monitoring and is well served by the TILT Layer 2 type.
- Vibration RMS/peak is a processed derivative of raw acceleration data. ACCEL_G covers the encoding.
- Crack width is very niche. DISTANCE_MM_SHORT handles it.
| Measurement | Covered By | Notes |
|---|---|---|
| Occupancy count | UINT8 | PIR arrays, thermal arrays, radar |
| Motion detected | BIT1 or NULL | Binary: motion yes/no |
| Door state | BIT1 | Open/closed (reed switch, hall effect) |
| Vibration / tamper | BIT1 | Tamper alert flag |
| Comfort index (PMV) | INT8 | Predicted Mean Vote: -3 to +3, derivable |
| Presence | BIT1 or NULL | Room occupied yes/no |
| Water leak | BIT1 | Floor-level detection (binary) |
| Water leak depth | DISTANCE_MM_SHORT | If depth measurement available |
Notes:
- Indoor environment measurements are largely served by existing types and Layer 1 generics. The CO₂ field (existing AQ Gas) doubles as an occupancy proxy.
- PMV/PPD comfort indices are derivable from temperature, humidity, air speed, clothing, and metabolic rate (§2.9). Not a dedicated type.
- Aqara, Xiaomi, Shelly, and similar smart home sensors produce most of these measurements.
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Acceleration (per-axis or mag) | ACCEL_G | 10 | ±16g | ~0.03g | ADXL345, MPU6050, LIS3DH, BMI270 |
| Acceleration (expanded) | ACCEL_G_EXPANDED | 16 | ±32g | ~0.001g | High-precision structural monitoring |
| Tilt / inclination | TILT | 8 | -90 to +90° | ~0.7° | SCA100T, SCL3300, derived from accel |
| Rotation / RPM | RPM | 14 | 0–16,383 RPM | 1 RPM | Hall effect, optical encoders |
| Speed / velocity (generic) | SPEED_MS | 7 | 0–63.5 m/s | 0.5 m/s | Derived (GPS, wheel, ultrasonic) |
Notes:
- Acceleration: many sensors output 3-axis, but for telemetry often just
magnitude or per-axis max is transmitted. The variant label distinguishes
(e.g.,
accel_x,accel_y,accel_z,accel_magnitude). - Vibration RMS/peak is a processed derivative of raw acceleration — same encoding, different variant label and temporal mode (§2.4: peak mode).
- RPM is relevant for wind turbines, machinery monitoring. Low priority for environmental deployments.
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Magnetic field (axis) | MAGNETIC_UT | 10 | -512 to +511 µT | 1 µT | QMC5883L, LIS3MDL; per-axis via variant label |
| RF power / EMF | INT8 | 8 | -128 to +127 dBm | 1 dBm | Spectrum analysers, EMF meters; covered by INT8 |
Notes:
- Magnetic field is useful for vehicle detection (parking), compass heading,
geomagnetic monitoring. Per-axis measurements use three variant slots
(
mag_x,mag_y,mag_z). - RF power monitoring overlaps with the existing Link field (RSSI). As a data measurement (not a link quality indicator), INT8 covers it.
- Electric field strength (V/m) is a known gap — relevant for power line monitoring and EMC compliance, but no common low-cost sensor IC exists in the target deployment class. Revisit if affordable E-field sensors emerge.
Rate of change is not a domain — it is a temporal interpretation mode (§2.4). However, certain rate-of-change measurements are common enough to warrant specific Layer 3 type definitions for clarity and to set encoding ranges.
| Type | Built On | Bits | Range | Resolution | Notes |
|---|---|---|---|---|---|
| Temperature Rate | INT8 | 8 | ±12.7 °C/min | 0.1 °C/min | Fire/frost detection (J.17.9) |
| Pressure Rate | INT8 | 8 | ±12.7 hPa/hr | 0.1 hPa/hr | Storm prediction |
Notes:
- Temperature rate is highest priority (fire/frost detection).
- Pressure rate is useful for storm prediction — a rapid drop (>5 hPa/3hr) indicates approaching severe weather.
- Other rate measurements (PM2.5 rate, humidity rate) can use INT8 with variant-defined scaling. Dedicated types are not needed for these lower priority cases.
- All rate-of-change values are computed sensor-side from consecutive readings. No extra hardware needed — it is a firmware function.
This section catalogues sensor chips, modules, breakout boards, and integrated products commonly used in the deployments iotdata targets. It provides the practical constraints — ranges, accuracy, interfaces, cost tiers — that feed back into encoding decisions (Section 2) and domain type definitions (Section 3).
What the protocol cares about: The sensor's output range and resolution constrain the minimum useful encoding. If the best available sensor for a measurement has ±2°C accuracy, encoding at 0.01°C resolution wastes bits.
What the protocol does NOT care about: Sensor interface (I2C, SPI, UART, SDI-12), power consumption, physical form factor. These are deployment concerns. They are documented here for reference but do not affect encoding design.
These are ICs or small modules typically connected to a microcontroller (ESP32, STM32, nRF52, etc.) via I2C, SPI, UART, SDI-12, or analog output.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| DS18B20 | Maxim/Analog Devices | 1-Wire | -55 to +125°C, ±0.5°C (0.0625°C res) | Ubiquitous, waterproof probe versions, parasitic power, multi-drop bus |
| TMP117 | Texas Instruments | I2C | -55 to +150°C, ±0.1°C (0.0078°C res) | High accuracy, NIST-traceable, low power |
| TMP36 | Analog Devices | Analog | -40 to +125°C, ±2°C | Simple analog output, cheap, no calibration needed |
| MAX31865 | Maxim/Analog Devices | SPI | PT100/PT1000 RTD interface, -200 to +850°C | RTD-to-digital converter, very high precision |
| MAX31855 | Maxim/Analog Devices | SPI | K-type thermocouple, -200 to +1350°C, ±2°C | Cold junction compensated, also J/N/T variants |
| MCP9808 | Microchip | I2C | -40 to +125°C, ±0.25°C (0.0625°C res) | Programmable alert thresholds |
| Si7051 | Silicon Labs | I2C | -40 to +125°C, ±0.1°C (0.01°C res) | Very high precision, tiny package |
| NTC thermistor (10k) | Various (Murata, TDK, Vishay) | Analog | -40 to +125°C, accuracy depends on calibration | Cheapest option, needs ADC + Steinhart-Hart |
Encoding implications: Standard TEMPERATURE (9 bits, -40 to +80°C, 0.25°C) covers most environmental sensors. TMP117 and Si7051 exceed the encoding resolution — TEMPERATURE_EXPANDED (12 bits, 0.05°C) is needed for these. MAX31865 and MAX31855 exceed the range — these are industrial/lab sensors outside iotdata's primary scope but serviceable via TEMPERATURE_EXPANDED (-60 to +150°C).
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| SHT40 / SHT41 / SHT45 | Sensirion | I2C | RH: 0–100%, ±1.8% (SHT40) to ±1% (SHT45); Temp: -40 to +125°C, ±0.2°C | Current generation, replaces SHT3x. Very low power |
| SHT31 | Sensirion | I2C | RH: 0–100%, ±2%; Temp: -40 to +125°C, ±0.3°C | Previous gen, still widely used |
| HDC1080 | Texas Instruments | I2C | RH: 0–100%, ±2%; Temp: -40 to +125°C, ±0.2°C | Low power, cheap, integrated heater |
| DHT22 / AM2302 | Aosong | 1-Wire-like | RH: 0–100%, ±2–5%; Temp: -40 to +80°C, ±0.5°C | Very cheap, slow (2s sample), unreliable long-term |
| DHT11 | Aosong | 1-Wire-like | RH: 20–80%, ±5%; Temp: 0–50°C, ±2°C | Even cheaper, limited range, integer resolution |
| AHT20 | Aosong | I2C | RH: 0–100%, ±2%; Temp: -40 to +85°C, ±0.3°C | Cheap I2C upgrade from DHT series |
| SHTC3 | Sensirion | I2C | RH: 0–100%, ±2%; Temp: -40 to +125°C, ±0.2°C | Ultra-low power, wearable/battery focus |
| HIH6130 | Honeywell | I2C | RH: 10–90%, ±4%; Temp: -25 to +85°C | Industrial grade, condensation resistant |
| BME280 | Bosch | I2C/SPI | See multi-sensor section (§4.1.4) |
Encoding implications: Existing HUMIDITY (7 bits, 0–100%, 1%) matches all sensors listed. Even the best sensor (SHT45, ±1%) is coarser than 1% resolution. No changes needed.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| BME280 | Bosch | I2C/SPI | See multi-sensor section (§4.1.4) | |
| BMP280 | Bosch | I2C/SPI | 300–1100 hPa, ±1 hPa (0.16 Pa res); Temp: -40 to +85°C | Like BME280 minus humidity |
| BMP390 | Bosch | I2C/SPI | 300–1250 hPa, ±0.5 hPa (±0.03 hPa rel); Temp: -40 to +85°C | Higher accuracy than BMP280, lower noise |
| MS5611 | TE Connectivity | I2C/SPI | 10–1200 mbar, ±1.5 mbar (0.012 mbar res); Temp: -40 to +85°C | Popular in altimeters, very high resolution |
| LPS22HB | STMicroelectronics | I2C/SPI | 260–1260 hPa, ±0.1 hPa (abs); Temp included | Low power, high accuracy |
| DPS310 | Infineon | I2C/SPI | 300–1200 hPa, ±1 hPa (0.002 hPa precision); Temp: -40 to +85°C | Very high precision, good for indoor nav |
| SPL06-007 | Goertek | I2C/SPI | 300–1100 hPa, ±1 hPa; Temp: -40 to +85°C | Budget alternative to BMP280 |
| HP206C | HopeRF | I2C | 300–1200 hPa; Temp; Altitude computed | Integrated altimeter function |
Encoding implications: The BMP280 and most sensors support 300–1100+ hPa. The existing PRESSURE (8 bits, 850–1105 hPa) is too narrow — confirmed by multiple sensors going down to 300 hPa. PRESSURE_EXPANDED (10 bits, 300–1100 hPa) is essential (J.1).
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| BME280 | Bosch | I2C/SPI | Temp: -40 to +85°C, ±1°C; RH: 0–100%, ±3%; Press: 300–1100 hPa, ±1 hPa | The classic IoT weather sensor. Ubiquitous, cheap, well-supported |
| BME680 | Bosch | I2C/SPI | As BME280 + Gas resistance (VOC proxy), IAQ index | Adds MOX gas sensor for indoor air quality |
| BME688 | Bosch | I2C/SPI | As BME680 + AI gas scanning mode | Can identify gas signatures with Bosch AI library |
| ENS160 + AHT21 | ScioSense + Aosong | I2C | AQI, TVOC (0–65000 ppb), eCO₂ (400–65000 ppm) + RH + Temp | Common combo board (e.g. SparkFun) |
Encoding implications: The BME280's triple output (temp + humidity + pressure) maps directly to the existing Environment bundle (24 bits). This is the canonical example of why bundles work — the sensor always outputs all three. BME680/688 add gas, which maps to AQ Gas fields.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| PMS5003 / PMS7003 | Plantower | UART | PM1.0, PM2.5, PM10: 0–500 µg/m³; particle counts per 0.1L | Most common low-cost PM sensor. Fan-based, ~100mA active |
| PMS5003T | Plantower | UART | As PMS5003 + Temp + Humidity | Integrated T/H, saves external sensor |
| SPS30 | Sensirion | I2C/UART | PM1.0, PM2.5, PM4, PM10: 0–1000 µg/m³; mass + number conc. | Higher quality than Plantower, auto-clean, longer life (~8yr) |
| SEN5x (SEN54/SEN55) | Sensirion | I2C | PM1–10 + VOC index + NOx index + Temp + RH (SEN55) | All-in-one environmental module |
| PMSA003I | Plantower | I2C | As PMS5003 but I2C interface | Easier integration than UART versions |
| SDS011 | Nova Fitness | UART | PM2.5, PM10: 0–999.9 µg/m³ | Older design, larger, cheaper, noisier |
| HM3301 | Seeed/Grove | I2C | PM1.0, PM2.5, PM10: 1–500 µg/m³ | Grove ecosystem compatible |
Encoding implications: Existing AQ PM encoding (0–1275 µg/m³, 5 µg/m³ resolution) covers all listed sensors. The SPS30 goes to 1000 µg/m³ — within range. Resolution of 5 µg/m³ is appropriate given sensor accuracy (typically ±10 µg/m³ for low-cost sensors). No changes needed.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| SCD41 / SCD40 | Sensirion | I2C | CO₂: 400–5000 ppm, ±50 ppm; Temp; RH | True NDIR CO₂ (photoacoustic), gold standard for indoor CO₂ |
| SCD30 | Sensirion | I2C/UART | CO₂: 400–10,000 ppm, ±30 ppm; Temp; RH | Older NDIR module, larger, higher power |
| MH-Z19B / MH-Z19C | Winsen | UART/PWM | CO₂: 400–5000 ppm (up to 10,000), ±50 ppm | Cheap NDIR CO₂, widely used in DIY projects |
| SGP41 | Sensirion | I2C | VOC index: 0–500; NOx index: 0–500 | MOX sensor, outputs processed index values, needs algorithm library |
| SGP30 | Sensirion | I2C | TVOC: 0–60,000 ppb; eCO₂: 400–60,000 ppm | Older than SGP41, direct ppb/ppm output |
| CCS811 | ScioSense (was AMS) | I2C | eCO₂: 400–8192 ppm; TVOC: 0–1187 ppb | MOX, estimated CO₂ (not true NDIR), being discontinued |
| ENS160 | ScioSense | I2C | AQI (1–5); TVOC: 0–65,000 ppb; eCO₂: 400–65,000 ppm | CCS811 successor, multi-element MOX |
| MQ series (MQ-2, MQ-4, MQ-7, MQ-135, MQ-137) | Winsen/Hanwei | Analog | Various gases, ranges depend on model | Very cheap, analog, high power (~150mA heater), poor selectivity |
| MICS-6814 | SGX Sensortech | Analog | CO: 1–1000 ppm; NO₂: 0.05–10 ppm; NH₃: 1–500 ppm | Three-channel MOX, better than MQ series |
| ZE07-CO | Winsen | UART/Analog | CO: 0–500 ppm, ±3 ppm | Electrochemical, much better selectivity than MOX |
| ZE25-O3 | Winsen | UART/Analog | O₃: 0–10 ppm | Electrochemical ozone sensor |
| ZMOD4410 | Renesas | I2C | TVOC, IAQ, eCO₂ | Low power MOX, firmware-based gas detection |
Encoding implications: Existing AQ Gas field covers the most common gases. The MQ-4 (CH₄ to 10,000 ppm) and MQ-137/MICS-6814 (NH₃ to 500 ppm) produce values that need PPM or extended AQ Gas mask (§3.1.4 decision). MQ sensors have high power draw and poor selectivity — suitable for alarm thresholds but not precision monitoring.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| Teros 12 | Meter Group | SDI-12/DDI | VWC: 0–100%; EC: 0–20,000 µS/cm (bulk); Temp: -40 to +60°C | Research grade, capacitive FDR. Expensive (~$150+) |
| Teros 21 | Meter Group | SDI-12/DDI | Water potential: -100,000 to -9 kPa; Temp: -40 to +60°C | Matric potential sensor (MPS-6 successor) |
| 5TE | Meter/Decagon | SDI-12 | VWC, EC, Temp | Older Decagon design, still common in field |
| Capacitive soil moisture (generic) | Various (DFRobot, Adafruit, etc.) | Analog | VWC: ~0–100% (uncalibrated) | Very cheap (£2–5), no calibration, corrosion-resistant vs resistive |
| Watermark 200SS | Irrometer | Resistance | Water potential: 0–239 kPa (centibars) | Granular matrix sensor, widely used in irrigation |
| SoilWatch 10 | Pino-Tech | Analog/I2C | VWC: 0–60% calibrated | Open-source-friendly, well-documented |
| Chirp! | Catnip Electronics | I2C | Capacitive moisture (raw), Temp, Light | Open-source, good for hobby use |
Encoding implications: Teros 12 outputs VWC + EC + Temp — this is the canonical Soil Bundle pattern. EC range 0–20,000 µS/cm fits comfortably in CONDUCTIVITY (16 bits, 0–65535). Cheap capacitive sensors output uncalibrated 0–100% — PERCENTAGE (7 bits) is adequate. Watermark 200SS outputs water potential in centibars — needs conversion to kPa for Soil Water Potential type.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| EZO-pH | Atlas Scientific | I2C/UART | pH: 0.001–14.000, ±0.002 | Lab-grade, isolated, calibratable. Board ( |
| EZO-EC | Atlas Scientific | I2C/UART | EC: 0.07–500,000 µS/cm; TDS; Salinity; SG | K1.0 or K10 probe depending on range |
| EZO-DO | Atlas Scientific | I2C/UART | DO: 0–100 mg/L, ±0.05 mg/L | Galvanic probe, needs periodic membrane replacement |
| EZO-ORP | Atlas Scientific | I2C/UART | ORP: -1019.9 to +1019.9 mV | Platinum electrode |
| EZO-RTD | Atlas Scientific | I2C/UART | Temp: -200 to +850°C (PT100/1000) | For temperature compensation of other EZO sensors |
| EZO-HUM | Atlas Scientific | I2C/UART | RH + Temp + Dew point | Humidity module in same ecosystem |
| SEN0161 | DFRobot | Analog | pH: 0–14, ±0.1 | Budget pH, analog output, less precise than Atlas |
| SEN0244 | DFRobot | Analog | EC: 1–20,000 µS/cm (K=1) or up to 200,000 (K=10) | Budget EC, analog output |
| SEN0189 | DFRobot | Analog | Turbidity: 0–3000 NTU (approx) | IR-based, analog, rough readings |
| SEN0237 | DFRobot | Analog | DO: 0–20 mg/L | Budget dissolved oxygen |
| Gravity TDS Meter | DFRobot | Analog | TDS: 0–1000 ppm | Very cheap, derived from conductivity |
| TSS/turbidity (Seapoint) | Seapoint Sensors | Analog | Turbidity: 0–750 FTU (up to 1500) | Research-grade, underwater, expensive |
Encoding implications: Atlas EZO-pH (±0.002) exceeds Water pH (8 bits, ~0.055 resolution) — Water pH Expanded (10 bits, ~0.014) serves this. EZO-EC range goes to 500,000 µS/cm, exceeding CONDUCTIVITY (16 bits, 65535 µS/cm) — very high EC (seawater and above) needs CONDUCTIVITY_COARSE or out-of-band scaling. EZO-DO range (0–100 mg/L) exceeds Water DO (8 bits, 0–25.5 mg/L) — most environmental dissolved oxygen is 0–15 mg/L so this is acceptable for target deployments. Turbidity sensors confirm the log-scale need (0.1–10,000 NTU dynamic range across devices).
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| Davis 6410 anemometer | Davis Instruments | Pulse/Analog | Speed: 0–89 m/s (pulse); Direction: 0–360° (pot) | Cup anemometer + vane, standard amateur weather |
| Inspeed Vortex | Inspeed | Pulse/Analog | Speed: 0–80+ m/s; Direction: 0–360° | Alternative to Davis |
| Modern Device Rev P | Modern Device | Analog | Airspeed: ~0–40 m/s | Hot-wire anemometer, no moving parts, fragile |
| Ultrasonic (Gill, FT, Lufft) | Various | UART/RS485 | Speed: 0–60+ m/s; Dir: 0–360°; Temp | No moving parts, 2D or 3D, expensive (£200+) |
| Calypso ULP | Calypso | BLE/UART | Speed: 0–30 m/s; Dir: 0–360° | Ultra-low power ultrasonic, battery operated |
| SEN-15901 (SparkFun weather kit) | SparkFun/Argent | Pulse/Analog | Speed: 0–55 m/s; Dir: 0–360° (8 pos); Rain: 0.2794mm/tip | Cheap weather station kit, cups + vane + rain gauge |
Encoding implications: Davis 6410 goes to 89 m/s — exceeds existing Wind Speed (7 bits, 0–63.5 m/s). SPEED_MS_EXPANDED (10 bits, 0–127.5 m/s) confirms J.2 fix. Direction sensors are all 0–360° — existing ANGLE_360 (8 bits) is adequate.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| Hydreon RG-15 | Hydreon | UART/Digital | Accumulation (mm), rain intensity, event flag | Optical, solid-state, no tipping bucket, low maintenance |
| Hydreon RG-9 | Hydreon | Digital | Rain yes/no, 7 intensity levels | Simpler/cheaper than RG-15, digital output |
| Tipping bucket (generic) | Davis, Argent, Misol | Pulse | 0.2–0.5 mm per tip depending on model | Standard design, reed switch, simple pulse counting |
| Davis 6463M | Davis Instruments | Pulse | 0.2 mm per tip | AeroCone collector, improved accuracy in wind |
Encoding implications: Tipping bucket produces pulse counts — COUNTER16 is the natural encoding for accumulation. Hydreon RG-9's 7 intensity levels map to UINT4 (categorical). Hydreon RG-15 outputs continuous rain rate — existing Rain Rate (8 bits, 0–255 mm/hr) is adequate.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| BH1750 | Rohm | I2C | Lux: 1–65535 lux, 1 lux res | Very common, cheap, spectral response close to human eye |
| TSL2591 | AMS/OSRAM | I2C | Lux: 188 µlux–88,000 lux; separate visible + IR channels | Very wide dynamic range (600M:1), high sensitivity |
| VEML7700 | Vishay | I2C | Lux: 0–120,000 lux (with gain adjustment) | Good all-round ambient light, auto gain |
| MAX44009 | Maxim | I2C | Lux: 0.045–188,000 lux | Ultra-wide range, ultra-low power (0.65 µA) |
| LTR-390UV | Lite-On | I2C | UV Index + ALS (ambient light) in one | Dual UV + visible, good for outdoor |
| GUVA-S12SD | GenUV | Analog | UV-A irradiance: 240–370 nm band, ~0–15 UV index (derived) | Cheap UV-A photodiode, analog output |
| VEML6075 | Vishay | I2C | UVA + UVB irradiance, UV Index computed | Separate UVA/UVB channels, more accurate UV index |
| SI1145 | Silicon Labs | I2C | UV index (approx), Visible, IR | Digital proximity/UV/ambient light, UV is estimated not measured |
| ML8511 | Lapis | Analog | UV intensity: ~0–15 mW/cm² | Analog UV sensor, simple |
| Apogee SP-510 / SP-610 | Apogee Instruments | Analog/SDI-12 | Solar irradiance (pyranometer): 0–2000 W/m² | Thermopile-based, ISO 9060 compliant, research grade |
| Davis 6450 | Davis Instruments | Analog | Solar irradiance: 0–1800 W/m², ±5% | Silicon photodiode pyranometer, consumer grade |
| Apogee SQ-520 | Apogee Instruments | SDI-12/Analog | PAR: 0–4000 µmol/m²/s | Quantum sensor (PAR), research grade |
| LI-COR LI-190R | LI-COR | Analog | PAR: 0–3000+ µmol/m²/s | Gold standard PAR sensor, expensive (~$500+) |
| TCS34725 | AMS/OSRAM | I2C | RGBC (Red, Green, Blue, Clear): 16-bit per channel; colour temp; lux | Colour sensor, IR blocking filter, good for colour matching |
| APDS-9960 | Broadcom | I2C | RGBC + proximity + gesture | Multi-function: colour, proximity (0–20 cm), gesture recognition |
Encoding implications: VEML7700 and MAX44009 both exceed 65,535 lux — confirms the need for LUX_LOG (8 bits, logarithmic, up to ~120,000 lux). BH1750 tops out at 65,535 — fits linear LUX (16 bits). UV sensors all output 0–15 UV Index — existing encoding is adequate. Apogee pyranometers go to 2000 W/m² — existing Irradiance (10 bits, 0–1023 W/m²) needs J.11 fix (11 bits) or a variant with wider range. PAR sensors go to 4000 µmol/m²/s — UINT16 with variant scaling handles this.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| VL53L0X | STMicroelectronics | I2C | 30–1200 mm, ±3% | Time-of-Flight laser, small, cheap, 940nm |
| VL53L1X | STMicroelectronics | I2C | 40–4000 mm, ±3% | Longer range than L0X, ROI selection |
| VL53L4CD | STMicroelectronics | I2C | 1–1300 mm | Close-range ToF, high accuracy |
| HC-SR04 | Various | Trig/Echo | 2–400 cm, ±3 mm | Ultrasonic, ubiquitous, cheap, 40kHz |
| JSN-SR04T | Various | Trig/Echo/UART | 20–600 cm | Waterproof ultrasonic, good for water level |
| MB7389 (MaxSonar) | MaxBotix | Analog/PWM/UART | 30–500 cm, 1 cm res | Weather-resistant ultrasonic, IP67 |
| TFmini Plus | Benewake | UART/I2C | 10 cm–12 m, ±1–6 cm | LiDAR, works outdoors, 100 Hz update |
| TFmini-S | Benewake | UART | 10 cm–12 m | Smaller, cheaper variant |
| TF-Luna | Benewake | UART/I2C | 20 cm–8 m, ±2 cm | Cheapest LiDAR option (~$10) |
| US-100 | Various | UART/Trig-Echo | 2–450 cm | Ultrasonic with temp compensation |
| GP2Y0A21YK0F | Sharp | Analog | 10–80 cm | IR proximity, analog, cheap, noisy |
Encoding implications: Short-range sensors (VL53L0X/L1X) need mm precision — DISTANCE_MM_SHORT (10 bits, 0–1023 mm) or DISTANCE_MM (16 bits). Medium-range sensors (HC-SR04, MaxSonar) work in cm — existing DEPTH/DISTANCE_CM (10 bits, 0–1023 cm) covers most. LiDAR up to 12m = 1200 cm — exceeds 1023 cm, needs DISTANCE_CM_EXPANDED (16 bits).
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| HX711 | Avia Semiconductor | Digital (clock/data) | 24-bit ADC for load cells, 10 or 80 SPS | The standard load cell ADC, cheap, everywhere |
| NAU7802 | Nuvoton | I2C | 24-bit ADC for load cells, up to 320 SPS | Better than HX711 — I2C, lower noise, configurable |
| Load cell (bar type) | Various (SparkFun, CZL635, etc.) | Analog (via HX711) | 1 kg, 5 kg, 10 kg, 20 kg, 50 kg, 100 kg, 200 kg | Wheatstone bridge, needs amplifier ADC. Beehive: typically 4×50 kg |
Encoding implications: Beehive scale (4×50 kg = 200 kg max = 200,000 g) — exceeds WEIGHT_G (16 bits, 65,535 g). Needs WEIGHT_G_EXPANDED (24 bits, ~16.7 million g). Typical precision is ~50 g for beehive applications, so 1 g resolution is more than adequate.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| ADXL345 | Analog Devices | I2C/SPI | 3-axis: ±2/4/8/16g, 13-bit, up to 3200 Hz | Classic, cheap, tap/freefall/activity detection |
| MPU6050 | InvenSense/TDK | I2C | 3-axis: ±2/4/8/16g; 3-axis gyro: ±250–2000°/s | 6-DOF IMU, very common, DMP for orientation |
| MPU9250 | InvenSense/TDK | I2C/SPI | As MPU6050 + 3-axis magnetometer (AK8963) | 9-DOF IMU (discontinued but still available) |
| LIS3DH | STMicroelectronics | I2C/SPI | 3-axis: ±2/4/8/16g, 10/12-bit, up to 5.3 kHz | Low power (2 µA @ 1 Hz), FIFO buffer |
| BMI270 | Bosch | I2C/SPI | 3-axis: ±2/4/8/16g; 3-axis gyro: ±125–2000°/s | Ultra-low power IMU, wearable-grade |
| ICM-20948 | InvenSense/TDK | I2C/SPI | 9-DOF: accel ±2–16g, gyro ±250–2000°/s, mag ±4900 µT | MPU9250 successor, recommended for new designs |
| ADXL355 | Analog Devices | I2C/SPI | 3-axis: ±2/4/8g, 20-bit, very low noise | High precision, structural health monitoring |
| SCA100T | Murata | SPI/Analog | Tilt: ±90° (single/dual axis), 0.001° res | Dedicated inclinometer, industrial grade |
| SCL3300 | Murata | SPI | Tilt: ±90° 3-axis, 0.001° res | High precision tilt, MEMS |
Encoding implications: All accelerometers support ±16g — ACCEL_G (10 bits, ±16g, ~0.03g) is a good match. ADXL355 (20-bit, ±8g) exceeds the encoding precision — ACCEL_G_EXPANDED (16 bits, ~0.001g) serves this. SCA100T and SCL3300 (0.001° tilt resolution) far exceed TILT (8 bits, ~0.7°) — for structural monitoring, an expanded TILT type or ANGLE_SIGNED may be needed.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| QMC5883L | QST Corporation | I2C | 3-axis: ±8 or ±2 gauss (±800 / ±200 µT), 16-bit | HMC5883L replacement, very common, cheap |
| HMC5883L | Honeywell | I2C | 3-axis: ±1.3–8.1 gauss, 12-bit | Classic, now hard to source, many counterfeits are QMC5883L |
| LIS3MDL | STMicroelectronics | I2C/SPI | 3-axis: ±4/8/12/16 gauss, 16-bit | Good performance, pairs well with LIS3DH |
| MMC5603 | MEMSIC | I2C | 3-axis: ±30 gauss, 0.0625 mG res | Set/reset for offset, high accuracy |
| BMM150 | Bosch | I2C/SPI | 3-axis: ±1300 µT (XY), ±2500 µT (Z) | Often paired with BMI270 for 9-DOF |
Encoding implications: MAGNETIC_UT (10 bits, -512 to +511 µT) covers most sensors. LIS3MDL at ±16 gauss (±1600 µT) exceeds the range — would need an expanded variant or UINT16 with variant scaling. For typical environmental applications (vehicle detection, compass), ±512 µT is adequate.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| AS3935 | ScioSense (was AMS) | I2C/SPI | Distance: 1–40 km (5 levels); Lightning/disturber/noise event; Estimated energy | Only real option for IC-level lightning detection. Breakouts from SparkFun, DFRobot, CJMCU |
Encoding implications: AS3935 distance is quantised to ~5 levels (not continuous) — Lightning Distance (8 bits, 0–63 km, ~0.25 km) is generous. Strike count accumulates between reads — COUNTER8 is natural.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| ICS-43434 | InvenSense/TDK | I2S | Raw audio, -26 dBFS sensitivity, SNR 64 dBA | MEMS digital mic, good for SPL computation |
| SPH0645LM4H | Knowles | I2S | Raw audio, SNR 65 dBA | Popular I2S MEMS mic, Adafruit breakout |
| INMP441 | InvenSense/TDK | I2S | Raw audio, SNR 61 dBA | Very cheap I2S MEMS mic, common on ESP32 projects |
| MAX4466 | Maxim | Analog | Amplified analog mic output | Electret mic with adjustable gain preamp |
| MAX9814 | Maxim | Analog | Amplified analog mic output, auto gain | AGC electret mic amp, better than MAX4466 |
| SEN-15892 (Qwiic Loudness) | SparkFun | I2C/Analog | Raw ADC value proportional to SPL | Simple board, not calibrated dBA |
Encoding implications: These sensors output raw audio or uncalibrated levels. SPL in dBA is computed in firmware (FFT/weighted RMS). SOUND_DBA (8 bits, 0–140 dBA, ~0.55 dBA) is appropriate — environmental sound rarely needs finer than 1 dBA precision.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| Geiger tube (SBM-20, J305, M4011) | Various (Russian, Chinese) | Pulse | CPM, ~1 µSv/h per ~150 CPM (SBM-20) | Needs HV supply (400V). Conversion factor varies by tube |
| RadiationD v1.1 | RH Electronics | Pulse (via kit) | CPM via SBM-20 or similar | Arduino/ESP32 shield with HV supply |
| BME688 + firmware | Bosch | I2C | Some claim radon indication via gas scan | Very experimental, not validated for radon |
Encoding implications: Existing Radiation fields (CPM: 14 bits, 0–16383; Dose: 14 bits, 0–163.83 µSv/h) are adequate for all listed sensors.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| NEO-6M | u-blox | UART | Lat/Lon/Alt, ±2.5 m CEP, 5 Hz | Classic cheap GPS, still widely used |
| NEO-M8N | u-blox | UART/I2C | Lat/Lon/Alt, ±2.5 m CEP, 10 Hz; GLONASS+GPS | Multi-constellation, more reliable fix |
| NEO-M9N | u-blox | UART/I2C/SPI | Lat/Lon/Alt, ±1.5 m CEP, 25 Hz; quad constellation | Current gen, quad constellation |
| SAM-M10Q | u-blox | UART/I2C | As M9N, smaller module | Compact, low power |
| L76K / L80 / L86 | Quectel | UART | Lat/Lon/Alt, ±2.5 m; GPS+GLONASS or GPS+BeiDou | Budget alternative to u-blox |
| PA1010D | CDTop/Adafruit | I2C/UART | GPS+GLONASS, ±3 m | Antenna integrated, I2C, Adafruit breakout |
| ZED-F9P | u-blox | UART/I2C/SPI | RTK: ±1 cm with corrections; multi-band L1/L2 | High precision RTK, ~$200+, needs base station or NTRIP |
| BN-880 | Beitian | UART/I2C | GPS+GLONASS, ±2.5 m + compass (QMC5883L) | GPS + magnetometer combo module, popular in drones |
Encoding implications: Existing Position (48 bits, ~1.2 m resolution) matches consumer GPS accuracy (±2.5 m). RTK (±1 cm) far exceeds the encoding — ZED-F9P deployments would need a higher-resolution position type, but this is outside the primary target deployment class.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| INA219 | Texas Instruments | I2C | Voltage: 0–26V; Current: via shunt, ±3.2A (at 0.1Ω); Power computed | Bidirectional, programmable gain. Very common |
| INA260 | Texas Instruments | I2C | Voltage: 0–36V; Current: ±15A (integrated 2mΩ shunt); Power | No external shunt needed, easy to use |
| INA226 | Texas Instruments | I2C | Voltage: 0–36V; Current: via shunt, bidirectional; Power | Higher precision than INA219, alert function |
| ACS712 | Allegro | Analog | Current: ±5A, ±20A, or ±30A variants | Hall effect, analog output, isolated, cheap but noisy |
| ADS1115 | Texas Instruments | I2C | 4-ch 16-bit ADC, ±0.256V to ±6.144V FSR | Not a current sensor but essential for precise voltage |
| PZEM-004T | Peacefair | UART (Modbus) | Voltage: 80–260V AC; Current: 0–100A (CT); Power; Energy; Freq; PF | Mains monitoring with CT clamp, complete solution |
Encoding implications: INA219 at 26V = 26,000 mV — fits VOLTAGE_MV (16 bits, 65,535 mV). INA260 at 36V = 36,000 mV — also fits. Current at 15A = 15,000 mA — fits CURRENT_MA (16 bits). PZEM-004T for AC mains outputs voltage/current/power/energy/frequency — could justify a Power Bundle, but mains monitoring is lower priority.
| Sensor | Manufacturer | Interface | Range & Accuracy | Notes |
|---|---|---|---|---|
| SX1276 / SX1278 | Semtech | SPI | RSSI: -127 to 0 dBm; SNR: -20 to +10 dB; Packet RSSI | LoRa transceiver, 137–525 MHz (SX1278) or 868/915 (SX1276) |
| SX1262 / SX1268 | Semtech | SPI | RSSI, SNR, signal RSSI | Next-gen LoRa, lower power, better sensitivity |
| RFM95W / RFM96W | HopeRF | SPI | SX1276-based module, same outputs | Ready-made module, easier than bare IC |
| RYLR896 / RYLR998 | REYAX | UART (AT commands) | RSSI, SNR | Serial LoRa module, simple AT interface |
| E220-900T | Ebyte | UART | RSSI | SX1262-based, various power/antenna options |
Encoding implications: Existing Link field (6 bits: RSSI -120–-60 dBm, SNR -20–+10 dB) is a compact encoding for the most useful range. All LoRa modules output compatible values.
Complete sensor products or sensor ecosystems — not bare ICs. These produce data that might be ingested by an iotdata gateway or translated at a bridge.
| Product | Manufacturer | Connectivity | Measurements | Notes |
|---|---|---|---|---|
| Ecowitt GW2000 / HP2560 | Ecowitt | Wi-Fi gateway, 915/868 MHz to sensors | Temp, humidity, wind, rain, solar, UV, pressure (via gateway) | Cheap ecosystem, many compatible sensors, custom protocol on 915/868 |
| Ecowitt WS90 (Wittboy) | Ecowitt | 915/868 MHz | Wind (ultrasonic), temp, humidity, rain (haptic), light, UV | All-in-one array, no moving parts, solar powered |
| Ecowitt WH51 | Ecowitt | 915/868 MHz | Soil moisture: 0–100% | Cheap capacitive soil probe, CR2032 battery |
| Ecowitt WN34 | Ecowitt | 915/868 MHz | Temperature (waterproof probe) | Pool/soil/pipe temp, various probe lengths |
| Ecowitt WH45 | Ecowitt | 915/868 MHz | CO₂: 400–5000 ppm; PM2.5; PM10; Temp; Humidity | Indoor air quality 5-in-1 |
| Davis Vantage Vue | Davis Instruments | 915 MHz proprietary | Temp, humidity, wind, rain, pressure | Reliable, professional amateur, all-in-one outdoor sensor suite |
| Davis Vantage Pro2 | Davis Instruments | 915 MHz proprietary | As Vue + solar, UV; optional soil/leaf stations | Modular, add-on sensors, widely used in agriculture |
| Davis AirLink | Davis Instruments | Wi-Fi | PM1, PM2.5, PM10 + AQI | Pairs with Vantage ecosystem |
| Tempest (WeatherFlow) | WeatherFlow | 915 MHz + Wi-Fi hub | Wind (ultrasonic), temp, humidity, pressure, rain (haptic), solar, UV, lightning (AS3935) | All-in-one, solar powered, haptic rain sensor, built-in lightning |
| Ambient Weather WS-5000 | Ambient Weather | 915 MHz + Wi-Fi | Temp, humidity, wind, rain, solar, UV, pressure | Ecowitt OEM rebrand with different cloud service |
| Bresser 7-in-1 | Bresser | 868 MHz | Temp, humidity, wind, rain, solar, UV | European alternative, 868 MHz |
| MiSol weather sensors | MiSol | 433/868/915 MHz | Various: temp, humidity, wind, rain, soil | Very cheap, compatible with Ecowitt gateways in some models |
| Product | Manufacturer | Connectivity | Measurements | Notes |
|---|---|---|---|---|
| Meter Group Teros stations | Meter Group | SDI-12 → logger | VWC, EC, temp, water potential (sensor dependent) | Research grade, ZL6 logger with cellular/Wi-Fi |
| Meter Group Atmos 41 | Meter Group | SDI-12 | All-in-one: wind, temp, RH, pressure, solar, rain, lightning, tilt | All-in-one weather station for ag, SDI-12 output |
| Dragino LSE01 | Dragino | LoRaWAN | Soil moisture + EC + temp (capacitive) | LoRaWAN soil sensor, solar powered, cheap (~$40) |
| SenseCAP S2105 | Seeed Studio | LoRaWAN | Soil moisture + temp | LoRaWAN, IP66, RS485 sensor input |
| SenseCAP S2100 | Seeed Studio | LoRaWAN | Data logger for any RS485/analog/GPIO sensor | Versatile LoRaWAN gateway for third-party sensors |
| Milesight EM500 series | Milesight | LoRaWAN | Various: soil moisture/temp/EC, CO₂, light, temp/humidity | Industrial IoT LoRaWAN sensors, IP67, battery powered |
| RAK10701 Field Tester | RAKwireless | LoRaWAN | Coverage mapping (RSSI, SNR, GPS) | Not a sensor; useful for LoRa field testing |
| Product | Manufacturer | Connectivity | Measurements | Notes |
|---|---|---|---|---|
| Atlas Scientific Wi-Fi Pool Kit | Atlas Scientific | Wi-Fi (ESP32-based) | pH, ORP, DO, EC, Temp (modular EZO boards) | Build-your-own combo, Whitebox carrier + EZO modules |
| Atlas Scientific Gravity boards | Atlas Scientific | Analog (Arduino) | pH, EC, DO, ORP, Temp | Budget line, analog output, less precise than EZO |
| YSI EXO2 | Xylem/YSI | RS485/SDI-12/Bluetooth | pH, EC, DO, turbidity, chlorophyll, fDOM, temp, depth (modular) | Professional multi-parameter sonde, very expensive (~$10k+) |
| In-Situ Aqua TROLL series | In-Situ | SDI-12/Modbus/Bluetooth | Various: pH, EC, DO, turbidity, pressure, temp, ORP | Professional, submersible, field-swappable sensors |
| Hanna HI98194 | Hanna Instruments | Bluetooth | pH, EC, DO, pressure, temp | Portable multiparameter meter, lab-grade |
| LilyGo T-HiGrow | LilyGo | Wi-Fi (ESP32) | Soil moisture, temp, humidity, light, salt (conductivity), battery | Very cheap dev board, mediocre sensors, good for prototyping |
| Product | Manufacturer | Connectivity | Measurements | Notes |
|---|---|---|---|---|
| PurpleAir PA-II | PurpleAir | Wi-Fi | PM1, PM2.5, PM10 (dual PMS5003), temp, humidity, pressure | Dual laser counters for data validation, community network |
| Airthings Wave Plus | Airthings | BLE + hub | Radon (Bq/m³), CO₂, TVOC, temp, humidity, pressure | Indoor, radon is key differentiator |
| Airthings View Plus | Airthings | Wi-Fi/BLE | As Wave Plus + PM2.5 | Adds particulate |
| uRADMonitor A3 / model A | uRADMonitor | Wi-Fi/Ethernet | Radiation (CPM, µSv/h), PM2.5, CO₂, HCHO, VOC, temp, humidity, pressure | Environmental monitoring, community network |
| Air Gradient ONE / Open Air | Air Gradient | Wi-Fi (ESP32) | PM2.5 (PMS5003T), CO₂ (SenseAir S8), TVOC (SGP41), temp, humidity | Open-source design, kits available, ESPHome compatible |
| SenseCAP Indicator | Seeed Studio | Wi-Fi/BLE | CO₂ (SCD41), TVOC (SGP41), temp, humidity | Desk unit with screen, ESP32-S3 + RP2040 |
| Aranet4 | SAF Tehnika | BLE + optional hub | CO₂ (NDIR), temp, humidity, pressure | Very popular indoor CO₂ monitor, long battery life (2+ years) |
| Awair Element | Awair | Wi-Fi | CO₂, TVOC, PM2.5, temp, humidity | Consumer indoor AQ, good app, local API available |
| Product | Manufacturer | Connectivity | Measurements | Notes |
|---|---|---|---|---|
| Dragino LHT65N | Dragino | LoRaWAN | Temp + humidity (SHT31), external probe input | Cheap LoRaWAN sensor, external DS18B20 option |
| Dragino LDDS75 | Dragino | LoRaWAN | Distance (ultrasonic): 28–350 cm | Water level / bin level sensor |
| Dragino LSPH01 | Dragino | LoRaWAN | Soil pH | LoRaWAN soil pH sensor |
| Dragino LWL02 | Dragino | LoRaWAN | Water leak detection (binary + depth) | Flood detection |
| SenseCAP T1000 | Seeed Studio | LoRaWAN + GNSS | GPS, temp, light, 3-axis accel | Tracker/asset tag with environmental sensing |
| RAK Wisblock ecosystem | RAKwireless | LoRaWAN | Modular: base board + sensor boards (accel, env, GPS, etc.) | Build-your-own LoRaWAN sensor, very flexible |
| TTGO/LilyGo T-Beam | LilyGo | LoRa + Wi-Fi + BLE | GPS (NEO-6M or M8N), LoRa (SX1276/62), Wi-Fi, BLE | Dev board, popular for Meshtastic, needs external sensors |
| Heltec CubeCell series | Heltec | LoRaWAN | Various boards: GPS, solar, OLED options | Ultra-low power LoRa dev boards (ASR6501/ASR6502) |
| Decentlab sensors | Decentlab | LoRaWAN | Various: soil moisture, distance, pressure, CO₂, air temp/humidity, dendrometer | Swiss-made, research grade, expensive but reliable, IP67 |
| Milesight AM100 series | Milesight | LoRaWAN | Temp, humidity, CO₂, TVOC, light, motion, pressure, sound | Indoor ambiance monitoring, occupancy sensing |
| Elsys ERS series | Elsys | LoRaWAN | Temp, humidity, light, motion, CO₂, sound, acceleration | Indoor LoRaWAN multi-sensor, Scandinavian quality |
| Product | Manufacturer | Connectivity | Measurements | Notes |
|---|---|---|---|---|
| Arnia hive monitor | Arnia | Cellular/Wi-Fi | Weight, temp, humidity, acoustics (bee activity) | Commercial beehive monitoring |
| HiveMind (DIY) | Various open-source | LoRa/Wi-Fi | Weight (HX711 + 4×50kg load cells), temp, humidity | Common DIY beehive scale design |
| Digitanimal GPS collar | Digitanimal | Cellular | GPS, activity (accelerometer) | Livestock tracking |
| MOOvement ear tag | MOOvement | Cellular/LPWAN | GPS, activity, temperature | Cattle monitoring |
| Product | Manufacturer | Connectivity | Measurements | Notes |
|---|---|---|---|---|
| Aqara sensors (door, motion, temp) | Aqara | Zigbee | Various: door open/close, motion, temp/humidity, light, vibration | Consumer smart home, very cheap, Zigbee ecosystem |
| Xiaomi/Mi sensors | Xiaomi | BLE/Zigbee | Temp/humidity, door, motion, light, plant soil moisture | BLE advertising, can be captured by ESPHome |
| Shelly H&T | Shelly | Wi-Fi/MQTT | Temp: -40 to +60°C; Humidity: 0–100% | Wi-Fi, battery powered, MQTT/CoAP native |
| Shelly Flood | Shelly | Wi-Fi/MQTT | Water detection (binary), temperature | Floor-level water detection |
| Ruuvi RuuviTag | Ruuvi | BLE | Temp: -40 to +85°C; Humidity; Pressure; Acceleration (LIS2DH12) | BLE beacon with environmental sensing, open firmware, Nordic nRF52 |
| Blue Maestro Tempo Disc | Blue Maestro | BLE | Temp, humidity, dew point (±0.1°C) | BLE logger, long battery, data logging on device |
| SwitchBot Meter | SwitchBot | BLE + hub | Temp, humidity | Consumer, app-based, hub adds cloud connectivity |
- Prices fluctuate; approximate costs noted where they indicate tier (budget/mid/research-grade).
- Many sensors have Adafruit, SparkFun, DFRobot, or Seeed Studio breakout boards that make prototyping easier — search "[sensor] breakout" for options.
- SDI-12 sensors (Meter, Campbell) need an SDI-12 to UART/I2C adapter for microcontroller integration.
- Atlas Scientific EZO modules can be daisy-chained on I2C — good for multi-parameter water monitoring rigs.
- For LoRaWAN products, CayenneLPP and SenML are common payload formats — iotdata replaces these with a more efficient encoding.
Priority is determined by leverage: which encoding work (Section 2) unlocks the most domain coverage (Section 3) for the most common, affordable, scalable sensor deployments (Section 4)?
Criteria for high priority:
- The measurement is common across many deployments (environmental, agricultural, building)
- The sensors are affordable, widely available, and integrate with scalable electronics (I2C/SPI/UART, ESP32/nRF52/STM32)
- The encoding type serves multiple domains (e.g., CONDUCTIVITY serves both soil and water)
- The type unblocks a bundle or a frequently requested deployment pattern
These are essential for a credible v1.0. Without them, common deployments cannot be adequately encoded.
Layer 1 generics:
| Type | Rationale |
|---|---|
| NULL | Enables zero-overhead binary flags (motion, door, tamper) |
| BIT1 | Boolean + dynamic selector for rate/absolute (§2.6) |
| UINT8 | Most common generic escape hatch |
| UINT16 | Raw ADC, large measurements, foundation for many Layer 3 types |
| INT8 | Rate of change, signed small measurements |
| INT16 | Signed large measurements |
| COUNTER16 | Wrapping counters (rain tips, flow pulses, energy totaliser) |
| RAW8 | Opaque byte for proprietary/custom payloads |
| RAW16 | Opaque 2-byte for proprietary/custom payloads |
Layer 2 units:
| Type | Rationale |
|---|---|
| PERCENTAGE | Unlocks soil moisture, leaf wetness, DO saturation, fill level, etc. |
| CONDUCTIVITY | Unlocks both soil EC and water EC — high-leverage single type |
| TEMPERATURE_EXPANDED | Covers precision sensors (TMP117), high-altitude, industrial |
| PRESSURE_EXPANDED | Fixes J.1 — essential for any deployment above ~1500m |
| SPEED_MS_EXPANDED | Fixes J.2 — essential for severe weather deployments |
| DISTANCE_CM_EXPANDED | Covers LiDAR (>1023 cm), deep water level, extended range ultrasonic |
Layer 3 specifics:
| Type | Rationale |
|---|---|
| Standalone Irradiance | Fixes J.15 — many deployments want irradiance without UV |
| Standalone UV Index | Fixes J.15 — many deployments want UV without irradiance |
| Soil Moisture (VWC) | Core agriculture measurement; Ecowitt WH51, Teros 12, capacitive |
| Soil EC | Core agriculture; Teros 12, Dragino LSE01 |
| Soil Bundle | Teros 12 pattern (VWC+EC+Temp); Dragino LSE01 pattern |
| Water pH | Core water quality; Atlas EZO-pH, DFRobot SEN0161 |
| Water EC | Core water quality; alias for CONDUCTIVITY with label |
| Water Dissolved Oxygen | Core water quality; Atlas EZO-DO, DFRobot SEN0237 |
| Temperature Rate of Change | Fire/frost detection (J.17.9); computed in firmware, no extra HW |
| Pressure Rate of Change | Storm prediction; computed in firmware, no extra HW |
Important, but either needs further encoding analysis (log scale), serves fewer deployments, or has less common sensor availability.
Layer 1/2:
| Type | Rationale |
|---|---|
| UINT4 | Small enum, category |
| UINT10 | Medium unsigned, matches DEPTH encoding |
| RAW24 | Opaque 3-byte |
| RAW32 | Opaque 4-byte |
| RATIO8 | NDVI, duty cycle, confidence — useful but niche |
| SOUND_DBA | Environmental noise monitoring |
| LUX / LUX_LOG | Light sensing; LUX_LOG depends on log-scale formula decision (§2.13) |
| TILT | Landslide/structural monitoring |
| ACCEL_G | Vibration, motion, structural health |
| PRESSURE_KPA | Non-atmospheric pressure (pipe, hydraulic, tyre) |
| WEIGHT_G | Beehive scales, silo monitoring, livestock |
Layer 3:
| Type | Rationale |
|---|---|
| Water Turbidity | Important for water quality; needs log-scale decision (§2.13) |
| Water ORP | Redox potential for water treatment, aquaculture |
| Water Quality Bundle | Multi-parameter sonde pattern (Atlas, YSI) |
| Soil Water Potential | Critical for irrigation; Teros 21, Watermark 200SS |
| Leaf Wetness | Agricultural disease prediction |
| PAR | Photosynthetic radiation for agriculture/ecology |
| Lightning Bundle | Distance + count; AS3935 |
| Sound Level | Environmental noise compliance, wildlife monitoring |
| Colour RGB | TCS34725; niche but straightforward (24 bits) |
| Non-Atmospheric Pressure | PRESSURE_KPA alias for pipe/hydraulic/tyre applications |
Add when demand emerges. These are either niche measurements, served by generic types with variant labels, or dependent on decisions not yet made.
- All remaining gas species (CH₄, NH₃, H₂S, SO₂, O₂, radon — pending gas expansion strategy §2.13)
- Flow rate / volume totaliser (FLOW_LPM, VOLUME_L)
- NDVI (covered by RATIO8 + variant label)
- Chlorophyll-a (PPM or UGM3 + variant label)
- Dendrometer (UINT16 + variant label)
- Vibration frequency (UINT16 + variant label)
- RPM / rotation
- Magnetic field (MAGNETIC_UT)
- Strain (INT16 + variant label)
- Sound frequency (UINT16 + variant label)
- Colour temperature (derivable from RGB)
- CMYK colour (dropped — not a sensor output)
- Infrared band power (UINT16 + variant label)
- RF power / EMF (INT8 + variant label)
- Salinity / TDS (derivable from EC)
- Current / voltage / power / energy fields (VOLTAGE_MV, CURRENT_MA, POWER_W, ENERGY_WH)
- Mains frequency (UINT8 + variant scaling)
- PM2.5 rate of change (INT8 + variant label)
- Generic speed/velocity beyond wind (SPEED_MS + variant label)
- Distance short-range mm (DISTANCE_MM_SHORT, DISTANCE_MM)
- All remaining _EXPANDED variants not in Tier 1
- WEIGHT_G_EXPANDED, FLOW_LPM_EXPANDED, RATIO16, ACCEL_G_EXPANDED, ANGLE_360_FINE, ANGLE_SIGNED, COUNTER8, CONDUCTIVITY_COARSE, PERCENTAGE_FINE, SOUND_DBA_EXPANDED, FORCE_N
The following Tier 1 Layer 2 types each unlock multiple Layer 3 / domain uses:
| Layer 2 Type | Domains Unlocked |
|---|---|
| PERCENTAGE | Soil moisture, leaf wetness, DO saturation, fill level, generic % |
| CONDUCTIVITY | Soil EC, water EC, TDS (derived), salinity (derived) |
| TEMPERATURE_EXPANDED | Industrial, desert, high-altitude, precision deployments |
| PRESSURE_EXPANDED | All deployments above ~1500 m (including many agricultural sites) |
| COUNTER16 | Rain tips, flow pulses, lightning, energy, generic event counts |
| INT8 | Temperature rate, pressure rate, any signed small measurement |
Last updated: 2026-04-02