Skip to content

V2.3.9 - sensor.community SPS30 X-PIN fix (12 -> 1)

Choose a tag to compare

@MMBytes MMBytes released this 09 May 00:27
· 337 commits to main since this release

What's new

Fixes a bug introduced in V2.3.2 where SPS30 sensor.community POSTs
went to the wrong X-PIN.

The bug

V2.3.2 sent SPS30 PM data on X-PIN 12. That value never appeared
in any authoritative source -- it was a research mistake from the
original SPS30 work that propagated into the project memory as
"canonical airrohr".

The fix

Send SPS30 on X-PIN 1 -- verified against TWO authoritative sources:

  1. devices.sensor.community/webapp/default_settings.py
    SENSOR_TYPES = { ..., 37: "1", # SPS30, ... }
  2. airrohr-firmware/ext_def.h
    #define SPS30_API_PIN 1

Why PIN 1 is shared

PIN 1 is the catch-all "particulate matter" pin in the sensor.community
registry. Every PM sensor uses it: SDS011 (ID 14), PMS3003/1003/7003/
5003/6003 (16, 21-24), HPM (25), SPS30 (37), HM3301 (38),
IPS-7100 (41), NextPM (42). The receiving server disambiguates between
them by the field-name prefix in the JSON body -- SPS30_* is what
tells SC the PIN 1 POST is from a Sensirion SPS30 specifically.

No data was misrouted

The only live device (Heltec at 192.0.2.52) is still on V2.3.5, which
predates the SPS30 TX path. No SPS30 hardware has been wired anyway.
The bug was caught before any cycle posted to the wrong PIN.

Other SC X-PINs verified correct

Sensor X-PIN Source
Si22G (radiation) 19 registry ID 36 + airrohr
BME280-relabeled SHT45+BMP581 11 registry ID 17 + airrohr
DNMS noise 15 registry ID 29 ("Lärm") + airrohr DNMS_API_PIN
SPS30 (PM) 1 registry ID 37 + airrohr SPS30_API_PIN (this fix)

Build sizes

  • heltec_v2: ~1,184,000 bytes (no change vs V2.3.8 -- 1-character fix)
  • feathers3_d: ~1,186,000 bytes

Lesson saved to memory

When my own memory note disagrees with an authoritative source: trust
the source, don't construct a narrative explaining why the source
would be wrong. The V2.3.2 memory said "dusty's PIN 1 was a SDS011
carryover" -- in fact dusty was reading the same airrohr defines we
should have been reading. That false rationalisation prevented me
from spotting the bug for seven releases.

Artefacts (5 per board, 10 total)

File Purpose
geiger_v2_<board>.bin OTA image
geiger_v2_merged_<board>.bin Full-flash image (initial cable flash)
bootloader_<board>.bin Bootloader
partition-table_<board>.bin Partition table
ota_data_initial_<board>.bin OTA selector seed