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.

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.

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

Place Mappings​

This connector uses the connector entity framework and exposes three entity selection sections: Locations, Segments, and Devices.

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 or Other Options​

This connector does not require user-defined enumeration mappings.

It also provides an on-demand backfill job for historical telemetry with these user-facing options:

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

Advanced Options​

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.
Temperature UnitCelciusControls whether temperature points are created in DEG_C or DEG_F, and aligns webhook/backfill temperature ingestion to the same unit.

Mapped Concepts​

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 zoneZoneZonehasPart from the imported segment place; isServedBy from the device

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
co2CO2LevelSensorDOUBLEPPMCarbon dioxide concentration
humidityHumiditySensorDOUBLEPERCENT_RHRelative humidity
pm1PM1LevelSensorDOUBLEPPBPM1 concentration
pressurePressureSensorDOUBLEHectoPAAir pressure
occupantsOccupancyCountSensorDOUBLENUMOccupancy count reported by the device
pm10PM10LevelSensorDOUBLEPPBPM10 concentration
pm25PM25LevelSensorDOUBLEPPBPM2.5 concentration
lightIlluminanceSensorDOUBLELUXIlluminance
tempAirTemperatureSensorDOUBLEDEG_C or DEG_FTemperature, based on the configured temperature unit
radonShortTermAvgRadonConcentrationSensorDOUBLEBQ-PER-M3Short-term average radon concentration
voc / tvocTVOCSensorDOUBLEPPBTotal volatile organic compounds
sla / soundLevelASoundPressureLevelSensorDOUBLEDeciBSound pressure level, when the device exposes this measurement

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:

{
things(filter: {id: {eq: "THGUeKkU5s1Lyg4sSieSg1abC"}}) {
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: "SPCLLKzRU2zqrQU2KSnmbabcD"}}) {
id
name
things {
id
name
points {
id
name
exactType
series(latest: true) {
timestamp
value {
float64Value
}
}
}
}
}
}

Note that in some cases, an occupancy sensor may not be assigned to a specific space - zone is another possibility:

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