ruview @ v0.7.1-esp32
integrity
- size
- 61.2 MiB
- downloaded
- last checked
release notes
Firmware update for the ESP32-S3 / ESP32-C6 CSI sensing node. Two hardware-validated fixes since v0.7.0-esp32.
Fixes
CSI callback now fires — wifi_csi_callback no longer starves (#954 / #985)
On v0.7.0 the CSI engine could sit at yield=0pps, parking the adaptive controller in DEGRADED with motion=presence=0 (only beacon frames were CSI-eligible, and APs send those at non-OFDM DSSS rates). The node now pins a guaranteed ~50 Hz OFDM unicast floor by self-pinging its gateway, so the CSI callback fires reliably (~13–19 pps) — additive to the existing promiscuous capture. If you saw a node "stream but sense nothing," this is the fix.
Heart rate corrected — no longer stuck at ~45 BPM or dropping wildly (#987)
On-device HR (0xC5110002, edge_tier≥1) reported ~45 BPM regardless of the real rate and swung frame-to-frame. Two causes: a stale fixed sample-rate assumption (made wrong by the self-ping raising the CSI rate) and the zero-crossing estimator locking onto a breathing harmonic. Now: the real sample rate is measured from frame timestamps (and re-tunes the filters), HR uses an autocorrelation estimator that rejects breathing harmonics, and the output is median-smoothed.
Validated (ESP32-S3, edge_tier=2) against an unmodified control board + an Apple Watch (87 BPM): control pegged 40–49 BPM; fixed board reaches the true 88–91 BPM and holds a stable physiological value.
Known limitation: under heavy subject motion the HR estimate still degrades (motion gating tracked as a follow-up in #987).
Binaries
- ESP32-S3 (8 MB, N16R8-class):
esp32-csi-node-s3-8mb.bin+bootloader-s3.bin+partition-table-s3.bin+ota_data_initial-s3.bin— hardware-verified on COM8 this release. - ESP32-C6 (4 MB):
esp32-csi-node-c6-4mb.bin+bootloader-c6.bin+partition-table-c6.bin+ota_data_initial-c6.bin— build-verified (no C6 hardware connected this cycle). SHA256SUMS.txt— verify withsha256sum -c SHA256SUMS.txt.
Flash (ESP32-S3, 8 MB)
python -m esptool --chip esp32s3 -b 460800 --before default_reset --after hard_reset \
write_flash --flash_mode dio --flash_size 8MB --flash_freq 80m \
0x0 bootloader-s3.bin 0x8000 partition-table-s3.bin \
0xf000 ota_data_initial-s3.bin 0x20000 esp32-csi-node-s3-8mb.bin
Then provision: python firmware/esp32-csi-node/provision.py --port <COM> --ssid <SSID> --password <PW> --target-ip <HOST_IP> (add --edge-tier 0 for raw-CSI calibration, default 2 for on-device vitals).
🤖 Generated with claude-flow
download
curl -fL -o v0.7.1-esp32.zip https://ratatoskr.space/pkg/ruview/v0.7.1-esp32.zip
printf '%s %s\n' 'a6af7c2d5713729d1ff2a13ec793d5651fc087d2c0959576c6af6b35edc99df0' 'v0.7.1-esp32.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v0.7.1-esp32.zip"
$out = "v0.7.1-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "a6af7c2d5713729d1ff2a13ec793d5651fc087d2c0959576c6af6b35edc99df0") { throw "sha256 mismatch" }
curl -fL -o v0.7.1-esp32.tar.gz https://ratatoskr.space/pkg/ruview/v0.7.1-esp32.tar.gz
printf '%s %s\n' 'f70353a3a866cd546b1399d5af8d8e4ddd86ef56398d09634d1e9df64318ca79' 'v0.7.1-esp32.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v0.7.1-esp32.tar.gz"
$out = "v0.7.1-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "f70353a3a866cd546b1399d5af8d8e4ddd86ef56398d09634d1e9df64318ca79") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v0.7.1-esp32.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.1-esp32.zip
printf '%s %s\n' 'a6af7c2d5713729d1ff2a13ec793d5651fc087d2c0959576c6af6b35edc99df0' 'v0.7.1-esp32.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.1-esp32.zip"
$out = "v0.7.1-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "a6af7c2d5713729d1ff2a13ec793d5651fc087d2c0959576c6af6b35edc99df0") { throw "sha256 mismatch" }
curl -fL -o v0.7.1-esp32.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.1-esp32.tar.gz
printf '%s %s\n' 'f70353a3a866cd546b1399d5af8d8e4ddd86ef56398d09634d1e9df64318ca79' 'v0.7.1-esp32.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.1-esp32.tar.gz"
$out = "v0.7.1-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "f70353a3a866cd546b1399d5af8d8e4ddd86ef56398d09634d1e9df64318ca79") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v0.7.1-esp32.zip | zip | 61.2 MiB |
blake3-24 1355e9775663c7f71bbaed39aa9074713df7f577ef374b14
sha256 a6af7c2d5713729d1ff2a13ec793d5651fc087d2c0959576c6af6b35edc99df0
sha1 ddcf3bc95e638ddc6c3f7e8505ce4f78064e94cc
|
| v0.7.1-esp32.tar.gz | tar.gz | 59.3 MiB |
blake3-24 3907708c70b4898b300d667091f21ca9a95e21d3f8227a21
sha256 f70353a3a866cd546b1399d5af8d8e4ddd86ef56398d09634d1e9df64318ca79
sha1 72cf81b4fba1ba3b931b3efd49d5bda3475766e1
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v0.7.1-esp32.tar.gz"],
integrity = "sha256-9wNTo6hmzVRrE5nVr42OTd2G71Y5jQljTR6d9kMYynk=",
strip_prefix = "ruview-v0.7.1-esp32",
)
.url = "https://ratatoskr.space/pkg/ruview/v0.7.1-esp32.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.1-esp32.tar.gz"],
integrity = "sha256-9wNTo6hmzVRrE5nVr42OTd2G71Y5jQljTR6d9kMYynk=",
strip_prefix = "ruview-v0.7.1-esp32",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.1-esp32.tar.gz",