Summary
- New ESPHome config
configs/m5stack-airq.yamlfor the M5Stack AirQ (K131, StampS3 / ESP32-S3FN8), replacing the stock ThingsCloud firmware. - Reads onboard SCD40 (CO2) + SEN55 (PM1/2.5/4/10, VOC, NOx) over internal I2C
bus_a; renders CO2 + PMs + VOC/NOx to the 1.54" e-ink and serves all of it over web/API. - Air quality only by design. The SCD40 self-heats ~15.6 C in this enclosure (validated against a SwitchBot + 3 HomePods), so its temp/RH/VPD are useless. They are kept internal-only to satisfy the scd4x_stats/scd4x_alerts refs; no environment data or alerts are surfaced.
- Reuses this repo's scd4x_stats (daily max CO2 + moving avg) and scd4x_alerts (CO2 high/low) unchanged: the SCD40 is the same SCD4x family as the AtomS3U rig's SCD41.
Notes
- E-ink uses
full_update_every: 1(this panel ghosts badly on partial refresh). - SEN55 is power-gated by GPIO10, driven HIGH on_boot (priority 800) before sensor init.
Test plan
esphome compileclean; flashed to hardware (USB first, then OTA).- Verified live over web server: CO2 ~1.1k ppm, all four PM sizes, VOC ~100, NOx 1; temp/RH/VPD confirmed absent.
Known follow-up: scd4x_alerts CO2 threshold number widgets read 0 (component does not seed them from the YAML thresholds). Separate PR.
## Summary
- New ESPHome config `configs/m5stack-airq.yaml` for the M5Stack AirQ (K131, StampS3 / ESP32-S3FN8), replacing the stock ThingsCloud firmware.
- Reads onboard SCD40 (CO2) + SEN55 (PM1/2.5/4/10, VOC, NOx) over internal I2C `bus_a`; renders CO2 + PMs + VOC/NOx to the 1.54" e-ink and serves all of it over web/API.
- Air quality only by design. The SCD40 self-heats ~15.6 C in this enclosure (validated against a SwitchBot + 3 HomePods), so its temp/RH/VPD are useless. They are kept internal-only to satisfy the scd4x_stats/scd4x_alerts refs; no environment data or alerts are surfaced.
- Reuses this repo's scd4x_stats (daily max CO2 + moving avg) and scd4x_alerts (CO2 high/low) unchanged: the SCD40 is the same SCD4x family as the AtomS3U rig's SCD41.
## Notes
- E-ink uses `full_update_every: 1` (this panel ghosts badly on partial refresh).
- SEN55 is power-gated by GPIO10, driven HIGH on_boot (priority 800) before sensor init.
## Test plan
- `esphome compile` clean; flashed to hardware (USB first, then OTA).
- Verified live over web server: CO2 ~1.1k ppm, all four PM sizes, VOC ~100, NOx 1; temp/RH/VPD confirmed absent.
Known follow-up: scd4x_alerts CO2 threshold number widgets read 0 (component does not seed them from the YAML thresholds). Separate PR.