SDK
Technical documentation for integrating ESPectre: follow the quick start, and explore the architecture, detectors, API, and examples.
Use the full runtime for an ESP-IDF product.
ESPectre owns CSI capture, calibration, detection, and events. Your firmware keeps control of boot, connectivity, updates, and product behavior.
Download SDK
Choose how much of the stack you need.
Use the highest layer that fits your product. Lower layers give you more control, but also more lifecycle and sensing responsibilities.
Full runtime
Your firmware owns boot, Wi-Fi, provisioning, OTA, and product behavior. ESPectre owns CSI capture, calibration, detection, and events.
Core only
Use this only when your firmware already captures and normalizes CSI. You also own evaluation cadence, readiness, and hit filtering.
New runtime
Implement IEspectreRuntime when CSI capture and lifecycle come from another platform, while reusing the shared core and event contracts.
ESPectre also runs sensing directly in MicroPython.
ESPectre contributed direct ESP32 CSI access to mainline MicroPython. Micro-ESPectre uses that upstream foundation for on-device Python experiments, MQTT telemetry, and detector parity work; it remains a maintained R&D runtime rather than a stable embeddable SDK.
From source bundle to motion events.
Follow these three steps for the recommended full-runtime integration.
Add the SDK
Extract the release source bundle as components/espectre/, then declare the component from your application:
# main/CMakeLists.txt idf_component_register( SRCS "main.cpp" REQUIRES espectre )
The SDK is source-based, so there is no chip-specific library to link. Optional Direct WebSocket, MQTT, provisioning, OTA, and stream support stay disabled until selected in menuconfig. The first-party C++ frontends enable the Direct capability they use.
Drive the runtime
Start it after your station has joined Wi-Fi, call loop() continuously, and react to the events your product needs:
#include "espectre_sdk.h" class ProductFrontend : public espectre::IRuntimeListener { public: bool setup() { runtime_.set_config(espectre::RuntimeConfig{}); return runtime_.setup(this); } void loop() { runtime_.loop(); } void on_motion_state_changed( const espectre::RuntimeSnapshot& snapshot) override { if (!snapshot.ready_to_publish) return; publish_motion(snapshot.motion_state == espectre::MotionState::MOTION); } private: espectre::RuntimeFrontendController runtime_; };
Keep three contracts
- Publish only when
snapshot.ready_to_publishis true. - Run
setup(),loop(), andshutdown()on one task. - Check
capabilities()before exposing runtime controls.