ruview @ v0.5.0-esp32
integrity
- size
- 25.1 MiB
- downloaded
- last checked
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:
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:
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:
python firmware/esp32-csi-node/provision.py --port COM7 \
--ssid "YourWiFi" --password "YourPassword" --target-ip 192.168.1.20
Full Changelog
See CHANGELOG.md
Closes #269
download
curl -fL -o v0.5.0-esp32.zip https://ratatoskr.space/pkg/ruview/v0.5.0-esp32.zip
printf '%s %s\n' 'a0c3354d709c05bfc7b56100c7db320e227bea395f446b6dd46db37a889bbc19' 'v0.5.0-esp32.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v0.5.0-esp32.zip"
$out = "v0.5.0-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "a0c3354d709c05bfc7b56100c7db320e227bea395f446b6dd46db37a889bbc19") { throw "sha256 mismatch" }
curl -fL -o v0.5.0-esp32.tar.gz https://ratatoskr.space/pkg/ruview/v0.5.0-esp32.tar.gz
printf '%s %s\n' 'ec4c3e823127e0aede02c686b3ac04a47fd6aeca45bd5809a12dbfeec2a65c40' 'v0.5.0-esp32.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v0.5.0-esp32.tar.gz"
$out = "v0.5.0-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "ec4c3e823127e0aede02c686b3ac04a47fd6aeca45bd5809a12dbfeec2a65c40") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v0.5.0-esp32.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.0-esp32.zip
printf '%s %s\n' 'a0c3354d709c05bfc7b56100c7db320e227bea395f446b6dd46db37a889bbc19' 'v0.5.0-esp32.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.0-esp32.zip"
$out = "v0.5.0-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "a0c3354d709c05bfc7b56100c7db320e227bea395f446b6dd46db37a889bbc19") { throw "sha256 mismatch" }
curl -fL -o v0.5.0-esp32.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.0-esp32.tar.gz
printf '%s %s\n' 'ec4c3e823127e0aede02c686b3ac04a47fd6aeca45bd5809a12dbfeec2a65c40' 'v0.5.0-esp32.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.0-esp32.tar.gz"
$out = "v0.5.0-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "ec4c3e823127e0aede02c686b3ac04a47fd6aeca45bd5809a12dbfeec2a65c40") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v0.5.0-esp32.zip | zip | 25.1 MiB |
blake3-24 394e94a757e4fbf466c7294d4ac22ba3f5c1eb0c7d06672a
sha256 a0c3354d709c05bfc7b56100c7db320e227bea395f446b6dd46db37a889bbc19
sha1 ae245e204679d96c4706c09ae69c7ca8c8f992c4
|
| v0.5.0-esp32.tar.gz | tar.gz | 24.2 MiB |
blake3-24 519abaf3f4ea0db148fd70b78c634febeffcd657244bd64a
sha256 ec4c3e823127e0aede02c686b3ac04a47fd6aeca45bd5809a12dbfeec2a65c40
sha1 220addbbee905da19a64fdb3f96f7f595c814ce5
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v0.5.0-esp32.tar.gz"],
integrity = "sha256-7Ew+gjEn4K7eAsaGs6wEpH/WrspFvVgJoS2/7sKmXEA=",
strip_prefix = "ruview-v0.5.0-esp32",
)
.url = "https://ratatoskr.space/pkg/ruview/v0.5.0-esp32.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.0-esp32.tar.gz"],
integrity = "sha256-7Ew+gjEn4K7eAsaGs6wEpH/WrspFvVgJoS2/7sKmXEA=",
strip_prefix = "ruview-v0.5.0-esp32",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.0-esp32.tar.gz",