One eye, tilted toward the floor.

Half a slice, with a single eye on the front. It sees when you get out of bed, measures light, temperature and air, and tells the base what to do. No camera, no radar.

Back to how it works

The sensor module on its own on a dark surface: a square, matte black, 24 millimeter plate with a single round eye on the front.
The module’s eye, up close: the black cone, the glossy dome of the PIR sensor and, below it, the small dot of the light guide.
The eye is 17 millimeters wide at the mouth and narrows to 9.2. The PIR dome sits at the bottom of the cone, and the dot at 6 o’clock is the end of the light guide.

At night, the light comes from below.

The module exists for a single scene: it’s three in the morning, you get out of bed and you want neither to hunt for a switch nor to be blinded by a lamp. The eye sees the floor, and the base lights the lowest slice, slowly and dimly, just enough to see where you’re stepping. When you get back into bed, the light turns off on its own.

That’s why the motion sensor is a PIR, not an mmWave radar. A PIR only sees heat that moves within its cone, and our cone is tilted 20 degrees down, toward the floor. It doesn’t see you when you turn over in bed, and it doesn’t see you through the wall either. It sees your feet when they touch the floor. That’s all.

Next to the PIR, in the same eye, sits a light sensor. If there’s already light in the room, the lamp doesn’t turn on. The two readings, motion and lux, reach the base together, and the base decides.

Four sensors, one module.

The PIR is the one that sees motion. In the prototype it’s an AM312, and for the product we want a Panasonic EKMB, with a black lens, so the dome disappears into the eye. Next to it, at 6 o’clock in the cone, is the end of a light guide: a piece of 1.75 millimeter clear filament, cut flush and polished, that carries the light from the room to a VEML7700. That’s how we measure lux without a second window on the front.

At the back, in a separate chamber, sit the other two: an SHT40, for temperature and humidity, and an SGP41, for air quality, meaning volatile organic compounds and nitrogen oxides. Both sit on M2.5 nylon standoffs, away from the walls, so the air can flow past them.

At first we designed two separate modules, one for the night and one for the air. On October 29, 2026 we merged them into a single 24 millimeter module: a shorter stack, one connector fewer and a single place to look.

Drawing of the sensor module housing, seen from above: the thickened wall with the hole for the eye, the air chamber at the back with the vertical slots, the connector window and the screw bosses.
The housing, in the parametric model: the eye at the front, the air chamber with its nine slots at the back, the connector window in the middle.

Air comes in low and goes out high.

An air sensor shut inside a box measures the air in the box. That’s why the module has nine vertical slots at the back, facing the wall. Warm air rises, comes in through the bottom of the slots, flows past the SHT40 and SGP41 and leaves through the top. Their chamber is separated from the rest of the module by a wall, so the wires and magnets stay out of the airflow.

The module sits below the light, not above it. The heat from the LEDs rises, away from the sensors. The recommended stack is the base, then the sensors, then the light slices.

The base underneath still warms the air a little, so the SHT40 reads a few tenths of a degree higher than a thermometer placed next to it. We don’t hide that: in ESPHome you set an offset, calibrated after a day next to a thermometer you trust.

It tells the base, the base decides.

The module has no brain. The three addressable sensors, VEML7700, SHT40 and SGP41, talk to the Pico in the base over I²C, through the bus’s SDA and SCL lines. The base recognizes them by their addresses, so it knows on its own that you’ve put a sensor module on it.

The PIR doesn’t wait to be asked. When it sees something, it pulls the bus’s INT line to ground. The line is open-drain, so several modules can use it without getting in each other’s way, and the base reacts immediately, not at the next reading.

At the bottom, the module is closed by a bottom plate held with two M3 screws hidden underneath, and it couples to the rest of the stack with the same four magnets in the corners, in only one orientation. Only the eye remains on the front.

Specifications.

Internal code S24. The dimensions are those of the v0 prototype and may change.

Height
24 mm, half a slice
Motion
PIR AM312 (prototype) or Panasonic EKMB (product)
Light
VEML7700, through a light guide made of 1.75 mm clear filament
Temperature and humidity
SHT40, with an offset in ESPHome
Air quality
SGP41, VOC and NOx
The eye
Ø 17 mm at the mouth, Ø 9.2 mm at the lip, tilted 20° toward the floor
Ventilation
9 vertical slots at the back, intake low, outlet high, separate chamber
Bus
I²C on SDA and SCL, open-drain INT for the PIR
Mounting
4 magnets 6 × 3 in the corners, bottom plate held by 2 hidden M3 screws
Place in the stack
below the light, recommended B40 + S24 + L48
Status
parametric model ready, chosen on October 29, 2026 instead of the N20 and A40 modules