ruview @ v0.5.4-esp32
integrity
- size
- 26.5 MiB
- downloaded
- last checked
release notes
ESP32-S3 CSI Firmware v0.5.4 — Cognitum Seed Integration
TL;DR
Your ESP32 can now remember what it senses. By connecting to a Cognitum Seed every presence detection, breathing measurement, and motion event gets stored as a searchable vector with cryptographic proof it happened.
What Changed (v0.5.3 → v0.5.4)
| Feature | v0.5.3 | v0.5.4 |
|---|---|---|
| CSI sensing | ✅ Real-time only | ✅ Real-time + persistent storage |
| Data retention | ❌ Lost on reboot | ✅ RVF vector store on Cognitum Seed |
| Similarity search | ❌ None | ✅ kNN queries ("find states like this one") |
| Data integrity | ❌ None | ✅ SHA-256 witness chain + Ed25519 signing |
| AI integration | ❌ None | ✅ 114-tool MCP proxy (Claude, GPT can query sensors) |
| Environmental sensors | ❌ CSI only | ✅ + BME280, PIR, vibration, ADC (via Seed) |
| Feature vectors | ❌ Raw only | ✅ 8-dim normalized @ 1 Hz (new packet 0xC5110003) |
| Security | Basic | ✅ Bearer tokens, TLS, source filtering, NaN rejection |
New: 8-Dimension Feature Vector
Every second, the ESP32 sends a compact 48-byte packet summarizing what it sees:
| Dim | What it measures | Example |
|---|---|---|
| 0 | Is someone there? (presence) | 0.45 = maybe, 0.95 = definitely |
| 1 | Are they moving? (motion) | 0.0 = still, 0.87 = active |
| 2 | Breathing rate | 0.69 = 20.8 BPM (normal) |
| 3 | Heart rate | 0.75 = 90 BPM (normal) |
| 4 | Signal quality (phase variance) | Higher = more activity |
| 5 | How many people? | 0.25 = 1 person, 0.50 = 2 |
| 6 | Fall detected? | 0.0 = no, 1.0 = yes |
| 7 | Signal strength (RSSI) | 0.54 = -46 dBm (good) |
These vectors are stored on the Cognitum Seed and can be searched: "Find the 10 most similar states to right now" — useful for anomaly detection, pattern recognition, and environment fingerprinting.
Architecture
ESP32-S3 ($9) ──UDP──> Your laptop ──HTTPS──> Cognitum Seed ($15)
WiFi CSI capture Bridge script Stores vectors forever
28 Hz raw frames Batches & validates kNN similarity search
1 Hz feature vectors NaN rejection Witness chain (proof)
1 Hz vital signs Source filtering 114-tool AI proxy
How to Use
# 1. Flash firmware to ESP32-S3
python -m esptool --chip esp32s3 --port COM9 --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
# 2. Set WiFi + target (your laptop IP)
python firmware/esp32-csi-node/provision.py --port COM9 \
--ssid "YourWiFi" --password "secret" \
--target-ip 192.168.1.20 --target-port 5006
# 3. Pair with Cognitum Seed (plug in via USB first)
curl -sk -X POST https://169.254.42.1:8443/api/v1/pair/window
curl -sk -X POST https://169.254.42.1:8443/api/v1/pair \
-H 'Content-Type: application/json' -d '{"client_name":"my-laptop"}'
# 4. Run the bridge
export SEED_TOKEN="<token-from-step-3>"
python scripts/seed_csi_bridge.py \
--seed-url https://169.254.42.1:8443 --token "$SEED_TOKEN" --validate
# 5. Check what's stored
python scripts/seed_csi_bridge.py --token "$SEED_TOKEN" --stats
No Cognitum Seed? The ESP32 firmware works exactly as before — all existing features (CSI streaming, vitals, presence, fall detection, mesh TDM) are unchanged. The Seed integration is additive.
Learn more: Cognitum.one · ADR-069 · User Guide
Validation Results
| Test | Result |
|---|---|
| Rust workspace | 1,463 passed, 0 failed |
| Python proof | VERDICT: PASS |
| Firmware size | 844 KB (55% flash free) |
| Feature vectors | 1 Hz, 8-dim, all in [0.0, 1.0] |
| Vitals ↔ Features | HR delta=0.0, BR delta=0.0 |
| Seed ingest | 941 vectors, 100% kNN match |
| Witness chain | SHA-256 verified (1,325 entries) |
| Regression | 6/6 PASSED — NO REGRESSIONS |
Binary Hashes (SHA-256)
cf05de2b esp32-csi-node.bin (844 KB)
cbb8e3ba bootloader.bin (19 KB)
4c2cc4ff partition-table.bin (3 KB)
7d2c7ac4 ota_data_initial.bin (8 KB)
Full Changelog: https://github.com/ruvnet/RuView/compare/v0.5.3-esp32...v0.5.4-esp32
download
curl -fL -o v0.5.4-esp32.zip https://ratatoskr.space/pkg/ruview/v0.5.4-esp32.zip
printf '%s %s\n' '8c10c85a80feffaf421bfc1108fd23a43cc68acf6a5a5536fd8ff3738d8a2cd6' 'v0.5.4-esp32.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v0.5.4-esp32.zip"
$out = "v0.5.4-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "8c10c85a80feffaf421bfc1108fd23a43cc68acf6a5a5536fd8ff3738d8a2cd6") { throw "sha256 mismatch" }
curl -fL -o v0.5.4-esp32.tar.gz https://ratatoskr.space/pkg/ruview/v0.5.4-esp32.tar.gz
printf '%s %s\n' '0f91b9ac7f6f76682aae3706dc7cc75e31b576725e57405360dd81f0da8e2566' 'v0.5.4-esp32.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v0.5.4-esp32.tar.gz"
$out = "v0.5.4-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "0f91b9ac7f6f76682aae3706dc7cc75e31b576725e57405360dd81f0da8e2566") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v0.5.4-esp32.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.4-esp32.zip
printf '%s %s\n' '8c10c85a80feffaf421bfc1108fd23a43cc68acf6a5a5536fd8ff3738d8a2cd6' 'v0.5.4-esp32.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.4-esp32.zip"
$out = "v0.5.4-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "8c10c85a80feffaf421bfc1108fd23a43cc68acf6a5a5536fd8ff3738d8a2cd6") { throw "sha256 mismatch" }
curl -fL -o v0.5.4-esp32.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.4-esp32.tar.gz
printf '%s %s\n' '0f91b9ac7f6f76682aae3706dc7cc75e31b576725e57405360dd81f0da8e2566' 'v0.5.4-esp32.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.4-esp32.tar.gz"
$out = "v0.5.4-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "0f91b9ac7f6f76682aae3706dc7cc75e31b576725e57405360dd81f0da8e2566") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v0.5.4-esp32.zip | zip | 26.5 MiB |
blake3-24 b28c83445181f6b6f21f455cfa504d06958df1ea3d084189
sha256 8c10c85a80feffaf421bfc1108fd23a43cc68acf6a5a5536fd8ff3738d8a2cd6
sha1 bd93f80dde2d1e51e5774e161d63352454780a6f
|
| v0.5.4-esp32.tar.gz | tar.gz | 25.5 MiB |
blake3-24 464541ba88bb9431cf9d3d3f7e7e251de094681eef4fd95f
sha256 0f91b9ac7f6f76682aae3706dc7cc75e31b576725e57405360dd81f0da8e2566
sha1 63c69d72486f5d23cbc8dc09283ed55b50bb6482
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v0.5.4-esp32.tar.gz"],
integrity = "sha256-D5G5rH9vdmgqrjcG3HzHXjG1dnJeV0BTYN2B8NqOJWY=",
strip_prefix = "ruview-v0.5.4-esp32",
)
.url = "https://ratatoskr.space/pkg/ruview/v0.5.4-esp32.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.4-esp32.tar.gz"],
integrity = "sha256-D5G5rH9vdmgqrjcG3HzHXjG1dnJeV0BTYN2B8NqOJWY=",
strip_prefix = "ruview-v0.5.4-esp32",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.5.4-esp32.tar.gz",