Fits over a dial thermostat and turns the dial on command.
- Case
- 173.5 × 136.4 × 53.5 mm
- Power
- 3 × AA cells
- Link
- Bluetooth Low Energy
- Dial travel
- 180°
- Battery life
- ≈ 1.7 yearsAlkaline cells, 4 moves a day, calculated
Section 01 · The unit
No buttons. No screen. No lights.
The shape carries the style: cut edges, clipped corners, sides that angle in toward the wall, a gap where the cover meets the base, and the EMBER wordmark. Every picture here is path-traced from the CAD model with Mitsuba 3, and lit like the room the unit is for: a lamp on the left and low sun from the right.
In the room it is for
The render placed into two photos of the thermostat's wall, in place of its original cover, under the photos' own light. These are composites: the unit is not built yet.
Section 02 · What it does
Turns the dial you already have.
Ember fits on a line-voltage dial thermostat that switches electric in-floor heating. It has one job: turn that dial to off, or to on, when the Raspberry Pi tells it to.
-
F-01
Uses the thermostat on the wall
Ember replaces only the snap-on plastic cover of an 859M dial thermostat. The thermostat's metal plate and its two screws stay where they are.
-
F-02
On and off from the Raspberry Pi
The Pi sends the command over Bluetooth Low Energy. A Seeed XIAO nRF52840 receives it and turns the dial with a 28BYJ-48 stepper motor.
-
F-03
Knows where the dial is
An AS5600 magnetic sensor on the dial shaft reads its angle in steps of 0.088 degrees. If the angle does not change while the motor runs, the motor stops and the unit reports it.
-
F-04
Three AA cells
About 2.4 years on alkaline cells when the heating switches 4 times a day from October to April (calculated). The cells change without taking the unit off the wall.
-
F-05
Comes off in one piece
Loosen the two side screws and pull the unit straight off: case, motor, cord drive and sensor come away together. The sector is a push fit on the dial shaft, so the original knob goes back on.
-
F-06
Keeps clear of the mains parts
The plate has openings that show the thermostat's mains-voltage parts. No screw, contact, magnet or wire goes near them, and solid plastic closes them off. The USB port faces the bottom wall, out of sight.
Section 03 · Inside
Everything in its place.
Front view with the cover off, drawn from the CAD model of wall case v6.6. Every part below is placed in the model, and the build script reports any overlap between them. Choose a number to find the part.
Wall case v6.6 · front · cover off · 173.5 mm wide
- 1Battery bay v1 Three AA cells in series. Each contact sits in its own pocket, and the + pads are keyed so a cell put in backwards cannot touch them.
- 2ULN2003 driver board Switches the motor's four coils. The XIAO's pins cannot supply that current themselves.
- 328BYJ-48 motor and capstan v6 42 mm left of the dial shaft.
- 4Sector v6 On the dial shaft. The cord runs round its rim, and two sleds and two screw clamps hold the cord's ends.
- 5AS5600 angle sensor Centred on the dial shaft, its chip 2.0 mm in front of a magnet in the sector's hub.
- 6Seeed XIAO nRF52840 Bottom left, pins to the front, with its USB-C socket 0.2 mm from the bottom wall.
- 7Wires Every wire routed in the model with its length, and kept clear of every part.
- 8Side screws One each side, 35 mm above the dial. Each pushes a plastic tongue onto the edge of the thermostat's plate.
Section 04 · Cord drive
6.30 turns of the motor for one turn of the dial.
The motor turns a small grooved capstan. A braided cord 0.50 mm across is wrapped round the capstan, and its two ends are held on a sector (a slice of a disc) fixed to the dial shaft. The cord sits at a radius of 5.66 mm on the capstan and 35.66 mm on the sector, so the dial turns 6.30 times slower than the motor and gets 6.30 times its torque, less friction.
Drawn to scale from the v6 numbers, shapes simplified. Shaft spacing 42 mm. Scale: degrees of travel from OFF.
Thermostat off
The buttons play a move 10 times faster than the motor makes it. A full move is 12,902 half steps at 2.0 ms each: 25.8 s. The thermostat switches on 140 degrees past its LO stop, which is 120 degrees of travel from OFF. OFF is 20 degrees short of the LO stop, so the drive never presses the dial against it.
Drive log
Six versions to keep a cord on a drum.
- v1The cord slid off the edge of the sector: its face had no spare width.
- v2Lips on the sector kept it there, but the cord slid along the capstan, piled up at one end and came off.
- v3A lip at each end of the capstan.
- v4A sector for the wall unit, whose D hole takes the whole D part of the dial shaft. Not printed.
- v5Each cord end tightened by a screw-driven sled. Fitted on 2026-10-15: the sleds' 3.6 mm of take-up left about 5 mm of slack.
- v6A capstan groove sized for the 0.50 mm cord, with spare turns, and a screw clamp for each cord end. Sent to the printer on 2026-10-16; not yet fitted.
Section 05 · Power
Three AA cells, no charger, no regulator.
The cells feed the XIAO's battery pads and the motor driver directly. Between moves the motor coils and the angle sensor are switched off; only the radio stays on, so the Pi can connect.
Battery life, alkaline cells
2.4years
864 days at 4 moves a day, October to April
- Charge on a day with moves
- 3.7 mAh
- Share taken by the motor
- 81 %
Years of battery life by moves a day
Choose a bar. Calculated by battery_model.py from Energizer's published discharge curves for the E91 cell and the circuit's currents; not yet measured on the real unit.
- 0.75 mAhfor one move on average: 180 degrees of dial, 25.8 s of motor
- 20 µAbetween moves (estimate): 0.48 mAh a day, plus 0.24 mAh a day the cells lose by themselves
- 81 %of an alkaline cell's charge is usable here: after that the voltage during a move falls below the motor's cutoff, 3.3 V for three cells (estimate)
- 0.7 pointsaverage error of the battery percentage the Pi works out from the unit's voltage readings, over 200 simulated sets of cells
Section 06 · Circuit
Fifteen wires, thirteen solder joints.
A Seeed XIAO nRF52840 drives the motor through a ULN2003 board and reads the AS5600 sensor over I2C. The sensor is powered from two XIAO pins, only while it reads. The motor's current returns straight to the cells, not across the XIAO's board.
Power
- Battery +XIAO BAT+soldered
- Battery +ULN2003 +socket
- Battery −XIAO BAT−soldered
- Battery −ULN2003 −socket
Angle sensor
- XIAO D0 + D1AS5600 VCCsocket
- XIAO D4AS5600 SDAsocket
- XIAO D5AS5600 SCLsocket
- XIAO GNDAS5600 GNDsocket
- AS5600 GNDAS5600 DIRsoldered
Motor
- XIAO D7ULN2003 IN1jumper
- XIAO D8ULN2003 IN2jumper
- XIAO D9ULN2003 IN3jumper
- XIAO D10ULN2003 IN4jumper
- Motor plugULN2003 socketplug
Spare D2 · D3 · D6
Take one cell out before connecting USB
The battery pads also feed the XIAO's lithium charger. With USB connected it would try to charge the AA cells, which can make them leak.
- Three fresh alkaline cells give about 4.8 V. Every part on the XIAO's battery pads is rated for at least 6 V, so there is about 1 V to spare. Four cells (about 6.4 V) would be over that limit.
- The step signals use D7 to D10. The sensor wires leave along the XIAO's USB-C end and the motor wires from the top of the other row, so the two groups do not cross.
- Wires with a socket at one end are female-to-female jumpers cut in half, so no other hookup wire is needed.
Section 07 · Design history
Thirteen versions in one day.
On 2026-10-15 each version of the case was built by its own script, saved with its own STEP file, opened in Autodesk Fusion and reviewed. The verdict on each card is the one given at the time. The lamp is lit on each version that was liked or carried forward.
-
v1
One box: slanted front, three colour stripes, a grille and a ring panel over the dial.
Too much like the 1980s, not enough futurism.
-
v2
Separate raised forms: a battery pod and an eight-sided dial pod.
Not reviewed; reference images came instead.
-
v3
A flat cover in a deeper base, a large plain disc over the dial, round vent holes.
Not interesting enough: wanted interesting edges and corners, and sides that angle in.
-
v4
The sides angle in toward the wall; the front edges are cut by different amounts; an L-shaped battery cover.
Liked. Saved as a favourite.
-
v5 seen from below
No disc. Top and bottom angle in steeply, leaving the plate's edges open to the room.
Interesting, but the angle is too steep and goes too far in.
-
v6 seen from below
Flat top and bottom, with a port over each of the plate's edges.
Loved. Saved as a favourite.
-
v7 seen from below
Three tries at a new direction: asymmetric cuts, a tower and pod, then a hull with a fin and a drum over the dial.
Still too close to the earlier designs.
-
v6.1 – v6.2 seen from below
Back to v6: EMBER on the front, finger indents, an open gap where cover meets base. Then the Stop letters in a frame.
The design to go with.
-
v6.3 – v6.5
Fitted to the thermostat as measured with calipers; side screws; the same 16 mm clip on all four corners.
Looks good; wanted the screws on opposite sides.
-
v6.6 working version
One side screw each side, directly opposite; a lip and a 3.0 mm gap all round. Changed in place from here on.
Right, and moving in the direction wanted.
Section 08 · Specifications
Data plate.
Each value is marked with where it comes from: the design (the CAD model), a calculation, a datasheet, or an estimate.
- Case
- 173.5 × 136.4 × 53.5 mm; 157.5 × 122.4 mm on the wall design
- Fits
- 859M line-voltage dial thermostat, in place of its snap-on cover design
- Mounting
- On the thermostat's metal plate; two M3 side screws press plastic tongues onto its edges design
- Motor
- 28BYJ-48 stepper, ULN2003 driver board datasheet
- Drive
- Capstan and sector, 0.50 mm braided cord (85 lb), ratio 6.30 : 1 design
- Dial travel
- 180° from OFF; OFF is 20° short of the LO stop design
- One move
- 12,902 half steps, 25.8 s at 2.0 ms per half step calculated
- Controller
- Seeed XIAO nRF52840 datasheet
- Radio
- Bluetooth Low Energy, commands from a Raspberry Pi design
- Angle sensor
- AS5600 magnetic, 12-bit: 0.088° per count datasheet
- Power
- 3 × AA, alkaline or NiMH, about 4.8 V with new alkaline cells datasheet
- Charge per move
- 0.75 mAh on average calculated
- Between moves
- 20 µA estimate
- Battery life
- 2.4 years at 4 moves a day, October to April; 1.7 years at 4 moves every day (alkaline) calculated
- Material
- PLA, printed on a Bambu Lab P1S with a 0.4 mm nozzle design
- Fasteners
- M3 screws into brass heat-set inserts, 5 mm across, 4 mm long design
- Units
- One to three to be built plan
Section 09 · Status · 2026-10-17
Where it stands.
Ember is in progress. A lit lamp is done, a half-lit lamp is under way, and a dark lamp is not started or not tested.
- Motor on the deskESP32 and ULN2003 board: the motor turned both ways on 2026-10-13.
- Cord sleds v5Printed and fitted on 2026-10-15.
- Capstan v6 and sector v6Sent to the printer on 2026-10-16; not yet fitted.
- Wall case v6.6Designed and fitted to the measured thermostat; not printed. The cover's fastening is not designed.
- Battery bay v1Modelled from estimates; waiting for caliper values of a cell and the contacts.
- WiringPlanned and routed in the model with every wire's length; not built.
- Motor torque on three AA cellsNot tested on the real dial.
- Battery lifeCalculated; not measured.