Skip to content

State Model

The processor is the authority for external motor and group state.

Motor Records

External motor records include:

  • display_name
  • online
  • optional state
  • optional percent
  • optional target_percent
  • optional travel_time_10ms

online is the external availability and commandability signal. If limits are not set, percent is omitted.

percent and target_percent are JSON numbers from 0 through 100 with up to two decimal places. The processor derives them from the motor's calibrated encoder range and reports the effective percentage represented by the selected or observed encoder tick, rounded to two decimals. Feedback may therefore differ slightly from a requested target.

Two-decimal addressing is not a guarantee of two-decimal physical accuracy. Encoder range, mechanics, calibration, and fabric behavior all affect achievable alignment. Raw encoder limits and positions remain internal setup/diagnostic data and are not exposed by this profile. battery_percent, where used internally, remains integer-only.

Group Snapshots

Group records in a query_state snapshot include:

  • display_name
  • group_state
  • optional percent
  • optional target_percent

External group snapshots contain neither members nor member_count. Membership topology remains processor-internal; external clients do not need it to command a stored group because group_command addresses the group_id.

Group state is processor-derived. Drivers should consume the processor's group_state snapshots and events rather than re-deriving display state.

Group position derivation retains hundredth precision. The uniform tolerance remains ±1 percentage point.

A group create/update registry_event exposes only display_name, never membership or derived fields. Membership-only changes therefore emit no external registry update. Consume group_state events for live derived state and use query_state again when rebuilding a complete baseline.

Ordering

Ordering is per connection stream only; the external profile exposes no daemon or per-motor sequence counters. Reconnect requires query_state and subscribe again.