SDK

Technical documentation for integrating ESPectre: follow the quick start, and explore the architecture, detectors, API, and examples.

A laptop, build step, processor, and ESP32 arranged as an SDK firmware pipeline
The source-based SDK brings ESPectre capture, sensing, and runtime events into an ESP-IDF product firmware.
START HERE

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.

INTEGRATION PATHS

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.

Advanced

Core only

Use this only when your firmware already captures and normalizes CSI. You also own evaluation cadence, readiness, and hit filtering.

Portable C++17
Platform port

New runtime

Implement IEspectreRuntime when CSI capture and lifecycle come from another platform, while reusing the shared core and event contracts.

Arduino or Linux · not shipped today
MICROPYTHON RUNTIME

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.

QUICK START

From source bundle to motion events.

Follow these three steps for the recommended full-runtime integration.

01

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.

02

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_;
};
03

Keep three contracts

  • Publish only when snapshot.ready_to_publish is true.
  • Run setup(), loop(), and shutdown() on one task.
  • Check capabilities() before exposing runtime controls.
GO DEEPER

Open the reference that answers your next question.