Build a hardware Monitor
The Monitor side of Wewe doesn't have to be a spare phone. It's also an ESPHome component — flash a cheap ESP32 board with a microphone and it pairs with the app exactly the same way a phone Monitor does.
What you need
- An ESP32 board with WiFi — a generic
esp32devdevkit is enough; nothing exotic is required. - A PDM microphone breakout, wired to two GPIO pins (clock + data) — any I2S-PDM-compatible mic module works.
- ESPHome installed on a computer to do the flashing:
pip install esphome(or the ESPHome CLI/Home Assistant add-on, if you already use either). - A USB cable to flash the board the first time.
No display, no buttons beyond what you wire up yourself, no case design decisions made for you. This is the bare component — see firmware/core2-spike in the repo for a worked example that adds a screen and touch controls on an M5Stack Core2, if you want something more finished.
Set it up
-
Create a secrets file alongside your config
(
secrets.yaml) with your WiFi credentials:wifi_ssid: "your-network" wifi_password: "your-password" -
Write the config. This is the smallest thing that
produces a working Monitor — a bare board, no screen, pairing via
the devkit's onboard BOOT button:
esphome: name: my-monitor esp32: board: esp32dev framework: type: esp-idf external_components: - source: type: git url: https://github.com/grantstephens/wewe path: firmware/wewe_monitor wewe_monitor: id: monitor signal_url: "wss://wewe-api.hub13.xyz" clk_pin: GPIO32 din_pin: GPIO33 binary_sensor: - platform: gpio name: "Pair button" pin: number: GPIO0 mode: input: true pullup: true inverted: true on_press: - lambda: id(monitor).on_pair_tapped(); wifi: ssid: !secret wifi_ssid password: !secret wifi_password network: enable_ipv6: true logger:clk_pin/din_pinare whichever two GPIOs your mic breakout is wired to — swap them for your actual wiring.signal_urlcan stay pointed at the default relay above, or your own self-hosted one (see the app's privacy policy for why that's an option at all). -
Flash it, connected over USB:
Pick the serial port when prompted. The device reboots onto WiFi once it's done.esphome run my-monitor.yaml -
Pair it with the app. Press and hold the board's
BOOT button — that arms a six-digit pairing code, the same way the
Monitor screen in the app shows one. Since this board has no
display, read the code from the ESPHome logs instead
(
esphome logs my-monitor.yaml— look for a line likeInvite code: 482917). Enter that code in the app's "Add Monitor" flow, same as pairing two phones.
Config reference
| Key | Required | Default |
|---|---|---|
signal_url | yes | — |
clk_pin | yes | — |
din_pin | yes | — |
max_listeners | no | 3 |
ice_servers | no | Google's public STUN pair |
Full details, including why those two FreeRTOS task-stack sizes in the component aren't arbitrary, are in the component's own README.
Once it's paired
From here it behaves exactly like a phone Monitor: a local noise gate only sends audio when it actually hears something, the Parent app alerts on a detected cry, and push-to-talk works the same way. Nothing about pairing, alerting, or the signaling relay cares which kind of Monitor it's talking to.