v0.5.0-esp32

ruvnet/RuViewv0.5.0-esp32Mar 15, 2026by ruvnet

AI Summary

Major firmware update introducing mmWave Sensor Fusion, combining 60 GHz radar data with WiFi CSI for enhanced vital sign detection and presence sensing.

Key Highlights

  • 60 GHz mmWave Radar Fusion
  • Auto-detection of mmWave sensors (MR60BHA2, LD2410)
  • Weighted Kalman averaging (80% mmWave + 20% CSI)
  • Server-side fusion bridge script

New Features

  • mmWave Sensor Fusion with WiFi CSI
  • Auto-detection of UART mmWave sensors
  • 48-byte fused vitals packet format
  • Server-side fusion bridge for separate devices

Full Release Notes

## ESP32-S3 CSI Firmware v0.5.0 — mmWave Sensor Fusion (ADR-063/064)

### What's New

**60 GHz mmWave Radar Fusion** — The firmware now auto-detects mmWave radar modules connected via UART and fuses their data with WiFi CSI for dramatically improved sensing.

**Supported mmWave sensors:**

| Sensor | Frequency | Capabilities | Cost |
|--------|-----------|-------------|------|
| Seeed MR60BHA2 | 60 GHz | Heart rate, breathing, presence, distance | ~$15 |
| HLK-LD2410 | 24 GHz | Presence, distance (motion + static) | ~$3 |

**Auto-detection:** The firmware probes UART1 (GPIO17/18) at boot — first at 115200 baud (MR60BHA2), then 256000 baud (LD2410). If a sensor is found, it registers capabilities and starts a background parsing task. No configuration needed.

**48-byte fused vitals packet** (magic `0xC5110004`): When mmWave is active, vitals are fused using weighted Kalman averaging (mmWave 80% + CSI 20%). Falls back to the standard 32-byte CSI-only packet when no mmWave is detected — fully backward compatible.

**Server-side fusion bridge** (`scripts/mmwave_fusion_bridge.py`): For setups where the mmWave runs on a separate ESP32 (e.g., ESP32-C6 with ESPHome), this script reads both serial ports and fuses data in real-time.

### Hardware Verified

**Dual-sensor live capture (30 seconds, 2026-03-15):**
- COM7 (ESP32-S3): WiFi CSI on channel 5, RSSI -41 dBm
- COM4 (ESP32-C6 + MR60BHA2): HR 75 bpm, BR 25/min, person at 52 cm
- Both sensors feeding data concurrently

### Also Includes (from v0.4.3.1)
- Fall detection fix: threshold 15.0 rad/s², 3-frame debounce, 5s cooldown (#263)
- Task watchdog fix: vTaskDelay after every frame (#266)
- 4MB flash support (#265)
- All 11 QEMU CI jobs green

### Download Guide

| File | Flash | Size |
|------|-------|------|
| `esp32-csi-node.bin` | 8MB | 990 KB |
| `bootloader.bin` | Both | 18 KB |
| `partition-table.bin` | 8MB | 3 KB |
| `ota_data_initial.bin` | Both | 8 KB |
| `esp32-csi-node-4mb.bin` | 4MB | 773 KB |
| `partition-table-4mb.bin` | 4MB | 3 KB |

### Flash — 8MB:
```bash
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
  write_flash --flash_mode dio --flash_size 8MB --flash_freq 80m \
  0x0 bootloader.bin 0x8000 partition-table.bin \
  0xf000 ota_data_initial.bin 0x20000 esp32-csi-node.bin
```

### Flash — 4MB:
```bash
python -m esptool --chip esp32s3 --port COM7 --baud 460800 \
  write_flash --flash_mode dio --flash_size 4MB --flash_freq 80m \
  0x0 bootloader.bin 0x8000 partition-table-4mb.bin \
  0xF000 ota_data_initial.bin 0x20000 esp32-csi-node-4mb.bin
```

### Provision:
```bash
python firmware/esp32-csi-node/provision.py --port COM7 \
  --ssid "YourWiFi" --password "YourPassword" --target-ip 192.168.1.20
```

### Full Changelog
See [CHANGELOG.md](https://github.com/ruvnet/RuView/blob/main/CHANGELOG.md)

Closes #269