An ongoing home lab build: a custom smart hub replacing an off-the-shelf smart home device that never quite did what I wanted. Built around an ESP32-S3-DevKitC-1-N16R8 (16MB flash, 8MB octal PSRAM) housed in the original enclosure, wired into Home Assistant over ESPHome.
Sensors
Air-quality package: SCD41 (photoacoustic NDIR for CO₂) with BMP280 pressure compensation, SHT45 for temperature and humidity, and a DFRobot SEN0466 electrochemical CO monitor. Hardware selected; integration is next on the workbench.
Audio and voice
MAX98357A I²S amplifier for audio output, driving a French text-to-speech pipeline via Pocket TTS. The voice is Avina_24k — a custom clone trained from Mass Effect Andromeda audio, because the default TTS voices lack character. Critical alerts play pre-generated WAV files for guaranteed reliability; everything else is synthesized on-demand and cached.
Buzzer
A TFM-28 piezo transducer driven through a discrete C1815 oscillator with a 60mH center-tapped inductor, switched by a BC238 commutator on GPIO16. Old-school analog circuitry meeting modern firmware — because sometimes you just want a real buzzer, not another WAV file.
Alert state machine
Five levels: notification-low (LED pulse), notification-medium (LED + buzzer), moderate alarm (slow buzzer with daily reminders), urgent alarm (fast buzzer, gyrophare LED, escalating reminders), and critical (no dismissal, never goes chronic). TTS and buzzer are coordinated — the buzzer plays while TTS prepares, cuts during the announcement, and resumes when the speaker goes idle.
Coming next
INMP441 microphone for a local voice assistant via microWakeWord. A dedicated ESP32-C3 for the video interphone integration (doorbell detection, gate relay control). And eventually a Bluetooth proxy on the older ESP32-WROOM-32U with its external antenna, kept separate from the main hub.