github ruvnet/RuView v0.7.1-esp32
ESP32 firmware v0.7.1 — CSI self-ping + heart-rate fix

5 hours ago

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.binhardware-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 with sha256sum -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

Don't miss a new RuView release

NewReleases is sending notifications on new releases.