yggvault ratatoskr-space connected via regular web
Color theme
also available via yggdrasil mesh http://[203:b338:2a84:a18f:986:47ae:1a4:d8d3]/pkg/ruview/v0.7.1-esp32
vault / ruview / v0.7.1-esp32

ruview @ v0.7.1-esp32

integrity

size
61.2 MiB
downloaded
last checked
source https://github.com/ruvnet/RuView · available · github

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

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

unix · zip
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 -
windows · zip
$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" }
unix · tar.gz
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 -
windows · tar.gz
$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
unix · zip
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 -
windows · zip
$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" }
unix · tar.gz
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 -
windows · tar.gz
$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

bazel
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",
)
zig
.url = "https://ratatoskr.space/pkg/ruview/v0.7.1-esp32.tar.gz",
install via yggdrasil mesh
bazel
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",
)
zig
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.7.1-esp32.tar.gz",
← v1611v1609 →