ESPHome's development branch now has a mics_5524 sensor platform for the MiCS-5524 MEMS multi-gas sensor: the small 5 V analog modules with VCC, GND, A0 and EN pads, and the DFRobot Fermion breakout they are cloned from. nliaudat split the work into two pull requests. The first merged on 16 October 2026, the second on 17 October, and bdraco reviewed both. The documentation landed on the next branch of esphome.io at the same time. The platform is set for ESPHome 2026.11, with test builds for ESP32, ESP8266 and RP2040.

One output, five gases

The module has a single analog output that reacts to several reducing gases. One mics_5524 entry stands for one physical sensor. It reads that output once per update_interval (30 s by default) and publishes a separate sensor for each gas you list: carbon monoxide, hydrogen, ethanol, ammonia and methane.

The documentation is blunt about the limits. The MiCS-5524 is not a safety-grade sensor, it cannot tell those gases apart, individual units vary widely, and every value should be treated as an estimate. It suits trend graphs and air-quality experiments. It does not replace a certified CO alarm.

Two ways to turn voltage into ppm

The default, conversion: dfrobot, follows the DFRobot_MICS library the breakout is sold with. It compares how far the output sits below the supply voltage with the same value measured in clean air. conversion: datasheet works from the sensor resistance and a power-law curve instead. Only carbon monoxide ships with a datasheet fit, read off the graph in the SGX data sheet, which itself calls the curve indicative. Every other gas needs its own coefficient_a and coefficient_b.

Both models need a clean-air reference. You can hard-code it (air_reference: or r0:) or let the component capture it after boot with calibration: and keep it in flash. The heater warm-up defaults to 3 minutes, and the docs suggest 24 hours of burn-in for a new module. Keep the sensor in clean air while it calibrates, because the captured value becomes the baseline for every later reading.

Wiring

The analog output swings up to 5 V, so an ESP32 pin needs a divider in front of it. The platform can take its input from an existing adc or ADS1115 sensor (voltage:) or create the ADC sensor itself (pin:, with voltage_divider: and an optional enable_pin: for the active-low EN pad). The config check rejects wiring that would put more on the pin than the ADC can take. On the original ESP32 at the default 12db attenuation that range is about 2.45 V, so the 10k/20k divider from the vendor wiring does not fit a pin: source. The docs suggest 22k/20k, which brings 5 V down to 2.38 V.

Optional diagnostic sensors publish the voltage, the ratio and the sensor resistance, which helps when the ppm numbers look wrong.