Thanks, that did the trick.
Does this mean the API documentation is wrong? It lists “P25” as a valid identifier for “2.5µm particles” alongside “P2”:
$ curl -X OPTIONS http://api.sensor.community/v1/push-sensor-data/ | jq
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 4890 0 4890 0 0 24929 0 --:--:-- --:--:-- --:--:-- 25076
{
"name": "Post Sensor Data List",
"description": "This endpoint is to POST data from the sensor to the api.",
"renders": [
"application/json",
"text/html"
],
"parses": [
"application/json",
"application/x-www-form-urlencoded",
"multipart/form-data"
],
"actions": {
"POST": {
"sensor": {
"type": "integer",
"required": false,
"read_only": false,
"label": "Sensor"
},
"sampling_rate": {
"type": "integer",
"required": false,
"read_only": false,
"label": "Sampling rate",
"help_text": "in milliseconds",
"min_value": -2147483648,
"max_value": 2147483647
},
"timestamp": {
"type": "datetime",
"required": false,
"read_only": false,
"label": "Timestamp"
},
"sensordatavalues": {
"type": "field",
"required": true,
"read_only": false,
"label": "Sensordatavalues",
"child": {
"type": "nested object",
"required": true,
"read_only": false,
"children": {
"value": {
"type": "string",
"required": true,
"read_only": false,
"label": "Value"
},
"value_type": {
"type": "choice",
"required": true,
"read_only": false,
"label": "Value type",
"choices": [
{
"value": "P01",
"display_name": "0.1µm particles"
},
{
"value": "P03",
"display_name": "0.3µm particles"
},
{
"value": "P05",
"display_name": "0.5µm particles"
},
{
"value": "P0",
"display_name": "1µm particles"
},
{
"value": "P2",
"display_name": "2.5µm particles"
},
{
"value": "P3",
"display_name": "3µm particles"
},
{
"value": "P4",
"display_name": "4µm particles"
},
{
"value": "P5",
"display_name": "5µm particles"
},
{
"value": "P1",
"display_name": "10µm particles"
},
{
"value": "durP1",
"display_name": "duration 1µm"
},
{
"value": "durP2",
"display_name": "duration 2.5µm"
},
{
"value": "ratioP1",
"display_name": "ratio 1µm in percent"
},
{
"value": "ratioP2",
"display_name": "ratio 2.5µm in percent"
},
{
"value": "samples",
"display_name": "samples"
},
{
"value": "interval",
"display_name": "measurement interval"
},
{
"value": "min_micro",
"display_name": "min_micro"
},
{
"value": "max_micro",
"display_name": "max_micro"
},
{
"value": "N01",
"display_name": "count 0.1µm particles"
},
{
"value": "N03",
"display_name": "count 0.3µm particles"
},
{
"value": "N05",
"display_name": "count 0.5µm particles"
},
{
"value": "N1",
"display_name": "count 1µm particles"
},
{
"value": "N25",
"display_name": "count 2.5µm particles"
},
{
"value": "N4",
"display_name": "count 4µm particles"
},
{
"value": "N5",
"display_name": "count 5µm particles"
},
{
"value": "N10",
"display_name": "count 1µm particles"
},
{
"value": "TS",
"display_name": "typical particle size"
},
{
"value": "temperature",
"display_name": "Temperature"
},
{
"value": "humidity",
"display_name": "Humidity"
},
{
"value": "pressure",
"display_name": "Pa"
},
{
"value": "altitude",
"display_name": "meter"
},
{
"value": "pressure_sealevel",
"display_name": "Pa (sealevel)"
},
{
"value": "brightness",
"display_name": "Brightness"
},
{
"value": "dust_density",
"display_name": "Dust density in mg/m3"
},
{
"value": "vo_raw",
"display_name": "Dust voltage raw"
},
{
"value": "voltage",
"display_name": "Dust voltage calculated"
},
{
"value": "P10",
"display_name": "1µm particles"
},
{
"value": "P25",
"display_name": "2.5µm particles"
},
{
"value": "durP10",
"display_name": "duration 1µm"
},
{
"value": "durP25",
"display_name": "duration 2.5µm"
},
{
"value": "ratioP10",
"display_name": "ratio 1µm in percent"
},
{
"value": "ratioP25",
"display_name": "ratio 2.5µm in percent"
},
{
"value": "door_state",
"display_name": "door state (open/closed)"
},
{
"value": "lat",
"display_name": "latitude"
},
{
"value": "lon",
"display_name": "longitude"
},
{
"value": "height",
"display_name": "height"
},
{
"value": "hdop",
"display_name": "horizontal dilusion of precision"
},
{
"value": "timestamp",
"display_name": "measured timestamp"
},
{
"value": "age",
"display_name": "measured age"
},
{
"value": "satelites",
"display_name": "number of satelites"
},
{
"value": "speed",
"display_name": "current speed over ground"
},
{
"value": "azimuth",
"display_name": "track angle"
},
{
"value": "noise_LA_min",
"display_name": "Sound level min"
},
{
"value": "noise_LA_max",
"display_name": "Sound level max"
},
{
"value": "noise_LA01",
"display_name": "Sound level L01"
},
{
"value": "noise_LA95",
"display_name": "Sound level L95"
},
{
"value": "noise_LAeq",
"display_name": "Sound level Leq"
},
{
"value": "counts_per_second",
"display_name": "Counts per second"
},
{
"value": "counts_per_minute",
"display_name": "Counts per minute"
},
{
"value": "radiation_msi",
"display_name": "MilliSievert"
},
{
"value": "hv_pulses",
"display_name": "Count of high voltage pulses"
},
{
"value": "counts",
"display_name": "Counts"
},
{
"value": "sample_time_ms",
"display_name": "Time per sample"
},
{
"value": "co_kohm",
"display_name": "CO in kOhm"
},
{
"value": "co_ppb",
"display_name": "CO in ppb"
},
{
"value": "eco2",
"display_name": "eCO2 in ppm"
},
{
"value": "co2_ppm",
"display_name": "CO2 in ppm"
},
{
"value": "no2_kohm",
"display_name": "NO2 in kOhm"
},
{
"value": "no2_ppb",
"display_name": "NO2 in ppb"
},
{
"value": "ozone_ppb",
"display_name": "O3 in ppb"
},
{
"value": "so2_ppb",
"display_name": "SO2 in ppb"
}
]
},
"sensordata": {
"type": "integer",
"required": false,
"read_only": true,
"label": "Sensordata"
}
}
}
},
"software_version": {
"type": "string",
"required": false,
"read_only": false,
"label": "Software version",
"help_text": "sensor software version",
"max_length": 100
}
}
}
}
Also, I noticed both “N1” and “N10” are documented as “count 1µm particles”, but the firmware sends 10um count to N10, so I did the same.