Skip to content

Telemetry Protocol

Luxnode frames are JSON objects. The SDK accepts both the compact V0 firmware payload and the richer protocol shape.

Compact V0 Firmware Payload

{
  "device": "luxnode-v0",
  "kind": "raw",
  "pixels": [102, 104, 110, 118]
}

LuxFrame.from_mapping() converts this into counts plus a default linear 340-850 nm wavelength axis.

Rich LuxFrame Payload

{
  "schema_version": "0.1.0",
  "device_id": "luxnode-v0-0001",
  "firmware_version": "0.1.0",
  "module_id": "vis-cuvette-v0",
  "frame_id": "018ff...",
  "timestamp_unix_ms": 1780272000000,
  "measurement_kind": "raw",
  "wavelengths_nm": [340.0, 341.8, 343.6],
  "counts": [112, 118, 122],
  "dark_counts": [11, 11, 12],
  "reference_counts": [50200, 50110, 49980],
  "telemetry": {
    "integration_time_ms": 2.5,
    "gain": 1.0,
    "led_current_ma": 20,
    "board_temperature_c": 31.2,
    "detector_temperature_c": 29.8,
    "battery_mv": 4090,
    "rssi_dbm": -51
  },
  "metadata": {
    "sample_id": "leaf-a-001",
    "operator": "lab"
  }
}

Required Fields

  • counts or pixels
  • wavelengths_nm unless the payload uses V0 pixels
  • schema_version
  • device_id
  • firmware_version
  • module_id
  • timestamp_unix_ms
  • dark_counts
  • reference_counts
  • telemetry.integration_time_ms
  • telemetry.board_temperature_c
  • metadata.sample_id

Storage Rule

Never store only processed spectra. Keep raw counts, dark counts, reference counts, telemetry, algorithm version, and module version so future calibration models can reprocess old measurements.