Skip to content

Telemetry Format

Each smart buoy transmits a telemetry packet at configurable intervals (default: every 15 minutes when idle, immediately on catch events).

The telemetry payload (opcode 0x81) contains 24 bytes:

OffsetSizeFieldUnitDescription
04latitude1e-7 degreesSigned 32-bit, WGS84
44longitude1e-7 degreesSigned 32-bit, WGS84
82depth_cmcentimetersPressure-derived depth
102water_temp0.1°CSigned 16-bit
122battery_mvmillivoltsBuoy battery voltage
141solar_stateenum0=dark, 1=charging, 2=full
151door_stateenum0=locked, 1=unlocked, 2=fault
161keeper_countcountClassified keepers since last reset
171bycatch_countcountClassified bycatch since last reset
181release_countcountAutonomous releases since last reset
191classification_modeenum0=auto, 1=manual, 2=log-only
202uptime_hourshoursTime since last reboot
221rssidBmLast received signal strength
231flagsbitfieldSee flag table below
BitNameDescription
0DRIFT_ALERTPosition has moved > 50m from deployment point
1LOW_BATTERYBattery below 3.3V
2CAMERA_FAULTESP32-CAM not responding
3SERVO_FAULTDoor servo not responding
4GPS_FIX1 = valid fix, 0 = no fix
5IMAGE_PENDINGCaptured image waiting for download
6–7Reserved
ConditionInterval
Idle, no catchEvery 15 minutes
Catch eventImmediate (within 2 seconds)
Alert conditionImmediate + every 5 minutes until resolved
Sleep modeDisabled (wake-on-command only)
typedef struct __attribute__((packed)) {
int32_t latitude; // 1e-7 degrees
int32_t longitude; // 1e-7 degrees
uint16_t depth_cm;
int16_t water_temp; // 0.1°C
uint16_t battery_mv;
uint8_t solar_state;
uint8_t door_state;
uint8_t keeper_count;
uint8_t bycatch_count;
uint8_t release_count;
uint8_t classification_mode;
uint16_t uptime_hours;
int8_t rssi;
uint8_t flags;
} telemetry_t;