#165·espectre

[BUG] Calibration does not finish, no `movement` measured

Author: djurnyCreated Sep 6, 2026Updated Sep 9, 2026
Labelsbugfrontend: esphomearea: sensingchip: esp32-s3

Before you start

  • I searched existing issues for similar reports.
  • I tested against the current website or a recent release or development build. If I could not, I explained why below.

Area affected

Home Assistant or controller integration

Firmware

ESPHome

Installation or connection

ESPHome local build

ESPectre version or commit

3.0.0-rc1

Board and chip

Seeed Xiao ESP32 S3 plus

Website page or origin

No response

Browser and version

No response

Host OS

No response

Controller or integration

HASS 2026.8.3

What happened?

movement_sensor is not reporting any values. calibration_active_sensor does not turn off (lightweight detector mode).

What did you expect to happen?

On the previous builds the movement_sensor reported a very noisy graph and motion_sensor tripped every now and then. On 3.0.0-rc1 movement_sensor is always 0 and motion_sensor never trips.

Steps to reproduce

Compile with ESPhome, check with HASS dashboarding.

Relevant config or command

Relevant ESPhome configuration (this is a package definition included by the overall YAML):

yaml
defaults:
  package:
    device:
      name:     "Wi-Fi CSI sensor in ${device.name} in ${area.name}"
      id:       wifi_csi_sensor_device_in_${device.id}_in_${area.id}
      area_id:  ${area.id}
  # defaults
  direct_api:                   false
  segmentation_window_size_ms:  1000
  csi_target_pps:               100
  csi_traffic_mode:             internal
  csi_traffic_multicast_group:  239.255.0.1
  evaluation_interval_ms:       250
  motion_on_hits:               4
  motion_off_hits:              3
  lowpass_enabled:              false
  lowpass_cutoff:               11.0
  hampel_enabled:               true
  hampel_window:                7
  hampel_threshold:             5.0
  traffic_generator_mode:       ping
  detection_algorithm:          lightweight

esphome:
  devices:
    - name: ${package.device.name}
      id:   ${package.device.id}

# Load ESPectre component from GitHub
external_components:
  - source:
      type:     local
      path:     components/espectre/src/cpp/frontend/esphome/components
    components: [ espectre ]

# ESPectre - WiFi CSI Motion Detection
espectre:
  id:                           wifi_csi
  direct_api:                   ${direct_api}
  segmentation_window_size_ms:  ${segmentation_window_size_ms}
  csi_target_pps:               ${csi_target_pps}
  csi_traffic_mode:             ${csi_traffic_mode}
  csi_traffic_multicast_group:  ${csi_traffic_multicast_group}
  evaluation_interval_ms:       ${evaluation_interval_ms}
  motion_on_hits:               ${motion_on_hits}
  motion_off_hits:              ${motion_off_hits}
  lowpass_enabled:              ${lowpass_enabled}
  lowpass_cutoff:               ${lowpass_cutoff}
  hampel_enabled:               ${hampel_enabled}
  hampel_window:                ${hampel_window}
  hampel_threshold:             ${hampel_threshold}
  traffic_generator_mode:       ${traffic_generator_mode}
  detection_algorithm:          ${detection_algorithm}

  movement_sensor:
    name:             Movement
    device_id:        ${package.device.id}
    icon:             mdi:waves
    # filters:
    #   - multiply:     100             # Scale 0-1 to 0-100
    #   - clamp:
    #       min_value:  0
    #       max_value:  100             # Cap at 100%
    #   - round:        1               # Round to 1 decimal
    # internal:         true            # Hide from Home Assistant
    disabled_by_default:  true
  motion_sensor:
    name:             Motion
    device_id:        ${package.device.id}
    # icon:             mdi:wifi-star
    device_class:     motion
    filters:
    - delayed_on_off:
        time_on: !lambda |-
          return id(${package.device.id}_motion_delayed_on).state * 1000.0;
        time_off: !lambda |-
          return id(${package.device.id}_motion_delayed_off).state * 1000.0;
  threshold_number:
    device_id:        ${package.device.id}
    name:             Threshold
    entity_category:  config
  recalibrate_button:
    device_id:        ${package.device.id}
    name:             Recalibrate
    entity_category:  config
  traffic_rate_sensor:
    name:             Traffic rate
    device_id:        ${package.device.id}
  csi_callback_rate_sensor:
    name:             CSI callback rate
    device_id:        ${package.device.id}
  csi_accepted_rate_sensor:
    name:             CSI accepted rate
    device_id:        ${package.device.id}
  csi_admitted_rate_sensor:
    name:             CSI admitted rate
    device_id:        ${package.device.id}
  csi_filtered_rate_sensor:
    name:             CSI filtered rate
    device_id:        ${package.device.id}
  csi_missing_rate_sensor:
    name:             CSI missing rate
    device_id:        ${package.device.id}
  csi_excess_rate_sensor:
    name:             CSI excess rate
    device_id:        ${package.device.id}
  csi_stale_rate_sensor:
    name:             CSI stale rate
    device_id:        ${package.device.id}
  csi_out_of_order_rate_sensor:
    name:             CSI out-of-order rate
    device_id:        ${package.device.id}
  csi_occupancy_sensor:
    name:             CSI occupancy
    device_id:        ${package.device.id}
  wifi_channel_sensor:
    name:             Wi-Fi channel
    device_id:        ${package.device.id}
  wifi_rssi_sensor:
    name:             Wi-Fi RSSI
    device_id:        ${package.device.id}
  diagnostics_button:
    name:             Get diagnostics
    device_id:        ${package.device.id}
  calibration_active_sensor:
    name:             Calibration active
    device_id:        ${package.device.id}
  # numbers
  motion_on_hits_number:
    name:             Hits for motion on
    device_id:        ${package.device.id}
  motion_off_hits_number:
    name:             Hits for motion off
    device_id:        ${package.device.id}
  detector_select:
    name:             Detector
    device_id:        ${package.device.id}
  csi_traffic_mode_select:
    name:             CSI traffic mode
    device_id:        ${package.device.id}
  traffic_generator_mode_select:
    name:             Traffic generator mode
    device_id:        ${package.device.id}
  sensing_switch:
    name:             Sensing
    device_id:        ${package.device.id}

number:
  - platform:             template
    name:                 "Motion delayed on time"
    id:                   ${package.device.id}_motion_delayed_on
    device_id:            ${package.device.id}
    icon:                 mdi:clock-start
    entity_category:      config
    min_value:             0.00
    max_value:            10.00
    initial_value:         2.00
    optimistic:           true
    step:                  0.05
    restore_value:        true
    unit_of_measurement:  seconds
    mode:                 slider
    disabled_by_default:  true
    # internal:             true

  - platform:             template
    name:                 "Motion delayed off time"
    id:                   ${package.device.id}_motion_delayed_off
    device_id:            ${package.device.id}
    icon:                 mdi:clock-end
    entity_category:      config
    min_value:             10.00
    max_value:            300.00
    initial_value:         10.00
    optimistic:           true
    step:                  10.00
    restore_value:        true
    unit_of_measurement:  seconds
    mode:                 slider
    disabled_by_default:  true
    # internal:             true

# EOF

Relevant HASS dashboard:

yaml
decluttering_templates:
  wifi_csi_sensor:
    card:
      type: vertical-stack
      cards:
        - type: entities
          entities:
            - entity: binary_sensor.[[sensor]]_motion
              name: Motion
              color: state
              secondary_info: last-changed
        - type: history-graph
          entities:
            - entity: sensor.[[sensor]]_movement
          hours_to_show: 0.025
          show_names: false
          min_y_axis: 0
          max_y_axis: 1
        - type: entities
          title: Settings
          entities:
            - entity: number.[[sensor]]_threshold
              icon: mdi:tune-vertical
              name: Threshold
              secondary_info: last-changed
            - entity: switch.[[sensor]]_sensing
              icon: mdi:refresh
              name: Sensing
            - entity: button.[[sensor]]_recalibrate
              icon: mdi:refresh
              name: Recalibrate
            - entity: binary_sensor.[[sensor]]_calibration_active
              icon: mdi:refresh
              name: Calibrating
        - type: custom:expander-card
          title: Diagnostics
          cards:
            - type: entities
              entities:
                - entity: button.[[sensor]]_get_diagnostics
                  name: Get diagnostics
                  secondary_info: last-changed
                - entity: sensor.[[sensor]]_csi_occupancy
                  name: Occupancy
                - entity: sensor.[[sensor]]_traffic_rate
                  name: Traffic rate
                - entity: sensor.[[sensor]]_csi_callback_rate
                  name: Callback rate
                - entity: sensor.[[sensor]]_csi_accepted_rate
                  name: Accepted rate
                - entity: sensor.[[sensor]]_csi_admitted_rate
                  name: Admitted rate
                - entity: sensor.[[sensor]]_csi_filtered_rate
                  name: Filtered rate
                - entity: sensor.[[sensor]]_csi_missing_rate
                  name: Missing rate
                - entity: sensor.[[sensor]]_csi_excess_rate
                  name: Excess rate
                - entity: sensor.[[sensor]]_csi_stale_rate
                  name: Stale rate
                - entity: sensor.[[sensor]]_csi_out_of_order_rate
                  name: Out-of-order rate
        - type: custom:expander-card
          title: Configuration
          cards:
            - type: entities
              title: Configuration
              entities:
                - entity: select.[[sensor]]_detector
                  name: Detector
                - entity: select.[[sensor]]_csi_traffic_mode
                  name: CSI traffic mode
                - entity: select.[[sensor]]_traffic_generator_mode
                  name: Traffic generator mode

To make the history-graph work, sensor.xxx_movement_sensor was enabled in HASS.

Relevant logs

11:46:59
[I]
[espectre.runtime:064]
[--------------------] | mvmt:0.000000 thr:0.662185 | CALIBRATING | csi:20/53 tx:99 occ:25% miss:67 excess:32 stale:0 ooo:0 | ch:1 rssi:-45
11:46:59
[I]
[espectre.runtime:064]
[--------------------] | mvmt:0.000000 thr:0.662185 | CALIBRATING | csi:37/96 tx:100 occ:37% miss:77 excess:58 stale:0 ooo:0 | ch:1 rssi:-44
11:46:59
[I]
[espectre.runtime:064]
[--------------------] | mvmt:0.000000 thr:0.662185 | CALIBRATING | csi:25/48 tx:100 occ:25% miss:74 excess:22 stale:0 ooo:0 | ch:1 rssi:-44
11:46:59
[I]
[espectre.runtime:064]
[--------------------] | mvmt:0.000000 thr:0.662185 | CALIBRATING | csi:19/59 tx:97 occ:19% miss:82 excess:40 stale:0 ooo:0 | ch:1 rssi:-44
11:46:59
[I]
[espectre.runtime:064]
[--------------------] | mvmt:0.000000 thr:0.662185 | CALIBRATING | csi:42/129 tx:99 occ:43% miss:58 excess:85 stale:0 ooo:0 | ch:1 rssi:-45
11:46:59
[I]
[espectre.runtime:064]
[--------------------] | mvmt:0.000000 thr:0.662185 | CALIBRATING | csi:47/148 tx:99 occ:48% miss:51 excess:100 stale:0 ooo:0 | ch:1 rssi:-45
11:47:00
[I]
[espectre.runtime:064]
[--------------------] | mvmt:0.000000 thr:0.662185 | CALIBRATING | csi:45/121 tx:100 occ:44% miss:55 excess:75 stale:0 ooo:0 | ch:1 rssi:-44
11:47:01
[I]
[espectre.runtime:064]
[--------------------] | mvmt:0.000000 thr:0.662185 | CALIBRATING | csi:47/104 tx:100 occ:50% miss:47 excess:56 stale:0 ooo:0 | ch:1 rssi:-45
11:47:02
[I]
[espectre.runtime:064]
[--------------------] | mvmt:0.000000 thr:0.662185 | CALIBRATING | csi:22/48 tx:99 occ:22% miss:78 excess:25 stale:0 ooo:0 | ch:1 rssi:-44

Crash debug artifacts

No response

Additional context

The ESP is running alongside bluetooth_proxy, ble_tracker and taixia components. This was also the case with previous release of espectre where movement_sensor did report values. Note that on the previous release, ble_channel_enabled was set to false. In the current release this configuration option is not available anymore.