Skip to main content

Airthings

AirthingsLogo

The Airthings connector brings indoor air quality, occupancy, and environmental telemetry from Airthings devices into the Mapped graph. It uses Airthings locations, segments, and devices to build a place and device model, receives live measurements through persistent webhooks, and can run an on-demand backfill job to import historical samples for the same points.

This connector uses Connector Entities: you import your Airthings locations, segments and devices into review grids, choose what to bring in, and save.

Use Cases​

  • Indoor air quality monitoring: Track CO₂, humidity, temperature, radon, particulate, TVOC, pressure, light, and sound measurements from Airthings sensors.
  • Occupancy insights: Capture occupancy count values from supported devices alongside the spaces and zones they serve.
  • Historical analysis: Backfill prior Airthings measurements into the same points used by the live webhook feed for trend analysis and reporting.

How it works​

Work through the Locations, Segments and Devices sections in that order. Segments need the buildings and floors they belong to, and devices need the places they sit in. Once devices are saved, live measurements flow in on their own. For older history, run the backfill job.


Configuration​

Auth Requirements​

The connector authenticates with Airthings using OAuth2 client_credentials.

FieldRequiredDescriptionWhere to Find
Client IDYesAirthings API client ID used to request OAuth access tokensYour Airthings API application in the Airthings developer portal
Client SecretYesAirthings API client secret paired with the Client IDYour Airthings API application in the Airthings developer portal

Advanced Options​

Set these before you import, because they decide the shape of what gets created.

OptionDefaultDescription
Materialize mapped spaces as ZonesfalseWhen enabled, imported Airthings segments are created as Zone vertices instead of Space vertices. Devices can still be located on them, and the connector still creates an additional child zone per device. See the graph shape when false (Segments become Spaces) and when true (Segments become Zones).
Temperature UnitCelciusControls whether temperature points are created in DEG_C or DEG_F, and aligns webhook and backfill temperature ingestion to the same unit.

Entities​

The connector exposes three sections, one per Airthings source type: Locations, Segments and Devices. Each section is its own Entities screen with a Grid and a Rules tab. In each one:

  1. Click Import to load the current list from Airthings.
  2. Tick the rows you want, and fill in or edit the cells (the tables below list them).
  3. Optionally use the Rules tab to fill cells and tick rows automatically. See Merge Rules.
  4. Click Save, review the changes, and Submit.

See Connector Entities for how the Grid, repeated imports and Save work.

Locations​

Locations come from the Airthings Location resource and are materialized as Mapped buildings.

FieldRequiredSourceDescription
NameYesAirthingsBuilding name from the Airthings location
Postal AddressYesUser (pre-filled when available)Building address used for the Mapped building
SiteYesUserExisting Mapped site that will own the building

Segments​

Segments come from the Airthings Segment resource and represent rooms or spaces inside a building.

FieldRequiredSourceDescription
NameYesAirthingsSegment name
Space CodeNoAirthings label / UserOptional room code used to contribute to an existing room in the graph
FloorYesUserExisting Mapped floor that will contain the segment

Note: Airthings does not provide a first-class floor resource, so floors must already exist in the Mapped graph and are selected by the user.

Devices​

Devices come from the Airthings Device resource. Hub devices are excluded; sensing devices are imported.

FieldRequiredSourceDescription
NameYesAirthingsDevice product name
exactTypeYesConnector defaultAir_Quality_Sensing_Device
LocationYesAirthings / UserTarget Mapped space or zone for the device. This is pre-filled when the reported Airthings segment already exists in the graph.

Enumerations​

This connector does not require user-defined enumeration mappings.


Actions​

Live measurements​

Once devices are saved, Airthings sends live measurements to Mapped through persistent webhooks. They are written to the points on each device (see Timeseries Points).

Backfill job​

An on-demand backfill job imports historical telemetry into the same points the live feed uses. It has these options:

  • Devices: all mapped devices, or only specific serial numbers
  • Date Range: the history window to import
  • Resolution: RAW, HOUR, FOUR_HOURS, DAY, THREE_DAYS, or WEEK

Mapped Concepts​

The connector creates buildings from locations, creates segment places beneath the floors you select, places air quality sensing devices in those segment places, attaches an additional device zone under each segment place, and writes live or historical measurements to points on each device.

Graph Entities​

API to Mapped Entities​

Airthings SourceMapped EntityexactTypeRelationship
LocationBuildingBuildingisPartOf → Site
SegmentSpace (default mode)SpaceisPartOf → Floor
SegmentZone (when Materialize mapped spaces as Zones is enabled)ZoneisPartOf → Floor
DeviceThingAir_Quality_Sensing_DevicehasLocation → imported segment place
Derived per-device zoneZoneOccupancy_ZonehasPart from the imported segment place; isServedBy from the device

Graph Shape: Default Mode​

Graph Shape: Segment-as-Zone Mode​

Time Series​

API to Mapped Points​

Points are created on each Airthings device according to the sensor list reported for that device. Live webhook events and backfill history both write into the same device points.

Airthings MeasurementMapped PointDatatypeUnitDescription
co2CO2_Level_SensorDOUBLEPPMCarbon dioxide concentration
humidityHumidity_SensorDOUBLEPERCENT_RHRelative humidity
pm1PM1_Level_SensorDOUBLEPPBPM1 concentration
pressurePressure_SensorDOUBLEHectoPAAir pressure
occupantsOccupancy_Count_SensorDOUBLENUMOccupancy count reported by the device
pm10PM10_Level_SensorDOUBLEPPBPM10 concentration
pm25PM2.5_Level_SensorDOUBLEPPBPM2.5 concentration
lightIlluminance_SensorDOUBLELUXIlluminance
tempAir_Temperature_SensorDOUBLEDEG_C or DEG_FTemperature, based on the configured temperature unit
radonShortTermAvgRadon_Concentration_SensorDOUBLEBQ-PER-M3Short-term average radon concentration
voc / tvocTVOC_SensorDOUBLEPPBTotal volatile organic compounds
sla / soundLevelASound_Pressure_Level_SensorDOUBLEDeciBSound pressure level, when the device exposes this measurement

Heartbeats​

This connector does not currently implement heartbeats.


Sample Code​

There are a few likely ways you'd want to retrieve the air quality data - first would be if you knew which sensor in specific you wanted to look up. Temperature points use the unit set in Temperature Unit (Fahrenheit in this example):

{
things(filter: {id: {eq: "THGu8jzPde0IgxLd6GncfBAep"}}) {
id
name
exactType
points {
id
name
unit {
name
}
series(latest: true) {
timestamp
value {
float64Value
}
}
}
}
}

An alternative might be to look up a specific space the sensor is located in:

{
spaces(filter: {id: {eq: "SPC8DwkNhFdnXsiVpzz63FfkC"}}) {
id
name
things {
id
name
points {
id
name
exactType
series(latest: true) {
timestamp
value {
float64Value
}
}
}
}
}
}

Each device is also attached to its own per-device zone (type Occupancy_Zone), so you can look up the same points through that zone:

{
zones (filter: {id: {eq: "ZONEUPgHV7iB3m03nbqnsGpWL"}}) {
id
name
things {
id
name
points {
id
name
exactType
series(latest: true) {
timestamp
value {
float64Value
}
}
}
}
}
}