Environment sensor

ESPGeiger reads temperature, humidity and pressure off an I2C sensor wired to the device. Plug a supported one in, power up and it’s picked up automatically - nothing to flash, nothing to configure. The readings land on the /status page under the radiation numbers and go out on every channel (MQTT, Webhook, WebAPI, UDP, Serial templates, Thingspeak).

Supported sensors

Chip I2C address Provides Notes
BME280 0x76 / 0x77 T + H + P Most common, ±0.3 °C, ±3 % RH
BMP280 0x76 / 0x77 T + P No humidity, often mis-sold as BME280
AHT10 / AHT15 0x38 T + H Older Asair part
AHT20 / AHT21 0x38 T + H The dominant AHT module today
AHT25 0x38 T + H Precision-binned, ±0.2 °C
AHT30 0x38 T + H Wider temperature range (-40 to 120 °C)
AHT20 + BMP280 (combo) 0x38 + 0x76 T + H + P Sold as “BME280 replacement” - both chips on one board

Other Bosch parts (BMP180, BMP380, BME680) and other vendor parts (SHT4x, HTU21D, DPS310, etc.) are not currently supported.

Wiring

Connect SDA, SCL, VCC (3.3 V), GND. Default pins:

Platform SDA SCL
ESP8266 4 5
ESP32 (classic) 21 22
ESP32-S2 / S3 8 9
ESP32-C3 / C6 6 7

ESPGeiger uses a single I2C bus, shared with the OLED. OLED builds default to the OLED’s pins. Change the pins in the I2C Bus section of the Config page. A reboot is required to apply pin changes.

Settings

Setting Key Type Default Description
Temp unit env.unit 0 Celsius, 1 Fahrenheit, 2 Kelvin 0 Celsius Unit for the local display and Serial templates.
Temp offset env.temp_offset Int -100 to 100 0 0.1 C steps. -25 = -2.5 C.
Altitude (m) env.altitude_m Int 0-9000 0 Elevation in metres. Corrects pressure to sea level (0 = local station pressure).

env.unit only affects what is shown on the local /status page and Serial templates. All outputs (MQTT, Webhook, WebAPI, UDP, Thingspeak) always publish in canonical units (°C, %RH, hPa) so consumers can convert if they want.

Combo modules

The popular AliExpress “AHT20+BMP280” module has two chips on one board (AHT20 at 0x38, BMP280 at 0x76). ESPGeiger detects both, takes temperature and humidity from the AHT20 (higher precision) and pressure from the BMP280.

Output channels

When a sensor is present, the firmware adds the relevant fields to each output channel. Each field is sent independently, so a BMP280 ships temp + pressure but not humidity, an AHT alone ships temp + humidity but not pressure.

  • /status page: a single “Env” row appears under the radiation readings, e.g. 22.4°C 45% 1013 hPa. Updates live with the rest of the status polling.
  • MQTT: tele/sensor JSON gains t / h / p and the legacy topics stat/T / stat/H / stat/P. Home Assistant autodiscovery publishes one sensor entity per available field.
  • Webhook: JSON body gains t / h / p.
  • WebAPI: MsgPack payload gains t / h / p.
  • UDP / OSC: new /espg/<id>/env schema ,fff (temp, humidity, pressure) every 60 s.
  • Thingspeak: maps temp / humidity / pressure to field5 / field6 / field7. Configure those fields in your Thingspeak channel UI.
  • Serial template (sout.format=2): variables {t} {h} {p} available for substitution.

Historical trends are not stored on the device - if you want a 24-hour chart, point your MQTT broker at Home Assistant, Grafana, or any other dashboard tool.

Diagnostics

Visit /vars.json on the device to see the current rendered value of every variable, including environmental ones. Useful when authoring Serial templates or debugging a missing humidity reading.

Troubleshooting

  • Env row missing on /status. No sensor was found at boot. Check 3.3 V supply, pull-up resistors (4.7 kΩ typical), SDA/SCL wiring and the env.sda / env.scl pref values. Enable debug logging to see the probe attempt in the console.
  • Humidity missing from the row. You probably have a BMP280, not a BME280. The two parts look similar on a board but only BME280 has the humidity sensor. The boot log line Env: <chip> detected tells you which one you have (serial console, or the Console panel on the /status page).
  • Pressure missing. You probably have an AHT-only module without the paired BMP280. Add a BMP280 on the same I2C bus, or accept that pressure is not available.
  • Wrong temperature just after boot. The first reading sets the baseline. Allow 30 seconds for the smoothed value to settle.

This site uses Just the Docs, a documentation theme for Jekyll.