Files
web/packages/protobufs/meshtastic/telemetry.proto
Ben Meadors bbe9a0d5cd feat(protobufs): sync to firmware-current and consume workspace package (#1097)
* feat(protobufs): sync to firmware-current and consume workspace package

Sync the vendored .proto sources to firmware-current (v2.7.25+48), regenerate the v2 TS bindings, and consume the workspace @meshtastic/protobufs (workspace:*) in place of the stale JSR 2.7.20 — finishing the monorepo migration (core was already workspace:*).

Includes the one required breaking-change fix: admin nodedb_reset changed int32 to bool, so resetNodes() now sends value: true.

* build(protobufs): vendor generated bindings for workspace consumers

The package is consumed via workspace:* — its exports point at the TS source, which imports ./dist/meshtastic/*_pb.ts — so the generated output must exist at build time. CI builds web/core with no codegen step and the runners have no buf CLI, so the bindings are vendored here (kept gitignored; lint/format skip them). Regenerate with: pnpm --filter @meshtastic/protobufs gen

* fix(protobufs): clean script removes the actual generated output dir

buf writes bindings to packages/ts/dist, but clean was removing a non-existent root dist — so it never cleaned stale output. Addresses Copilot review feedback.

* refactor: move web app packages/web -> apps/web

Aligns the web app with the apps/web layout (matching the Vercel web-test Root Directory and the SDK-migration direction). Pure directory move plus root config: pnpm-workspace (adds apps/*), vitest projects, root tsconfig reference, and the pr/release-web/nightly workflows. vercel.json moved with the app. Build + 36 validation tests green.

* feat: config fields, module pages, key verification, telemetry capture

Incorporates the firmware-current feature work onto the protobuf foundation: new config fields (Display message bubbles; LoRa fem_lna_mode + serial_hal_only; Telemetry air_quality_screen_enabled); 4 new ModuleConfig pages (TrafficManagement, StatusMessage, TAK, RemoteHardware); the manual Key Verification flow (sendKeyVerification + ClientNotificationDialog stages + Verify Key button); live telemetry capture (nodeDB addDeviceMetrics) and admin hardening (toggleMutedNode, graceful PortNum default); plus the sdk-preview ConfigEditor demo and store/config tests. Build + lint + format + 131 tests green.

* chore: drop #1062 (unsaved-change-detection) to match upstream revert

#1062 was merged to main by accident (per @danditomaso) and is being reverted. Reverse-applied its diff here via 3-way so #1097 stays consistent with where main is headed, while keeping the feature changes layered on the same files (deviceStore/changeRegistry). Build + 131 tests + lint + format green.

* fix(nodes): clean up SNR display in node table and map popup

SNR is a ratio measured in dB, not dBm (which is absolute power); the
node table and map popup both mislabeled it and crammed three values
together: '0dBm/50%/50raw'. The trailing '%/raw' pair was the same
heuristic ((snr+10)*5) shown twice — once clamped, once not.

Render SNR in dB rounded to one decimal, color-coded by a 0-100%
signal-quality heuristic (green/yellow/red), with the quality percentage
as a muted secondary. Drop the redundant raw value. Adds unit.db; this
matches the existing SNRTooltip, which already renders dB.
2026-06-15 13:23:28 -05:00

945 lines
16 KiB
Protocol Buffer
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "TelemetryProtos";
option java_package = "org.meshtastic.proto";
option swift_prefix = "";
/*
* Key native device metrics such as battery level
*/
message DeviceMetrics {
/*
* 0-100 (>100 means powered)
*/
optional uint32 battery_level = 1;
/*
* Voltage measured
*/
optional float voltage = 2;
/*
* Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise).
*/
optional float channel_utilization = 3;
/*
* Percent of airtime for transmission used within the last hour.
*/
optional float air_util_tx = 4;
/*
* How long the device has been running since the last reboot (in seconds)
*/
optional uint32 uptime_seconds = 5;
}
/*
* Weather station or other environmental metrics
*/
message EnvironmentMetrics {
/*
* Temperature measured
*/
optional float temperature = 1;
/*
* Relative humidity percent measured
*/
optional float relative_humidity = 2;
/*
* Barometric pressure in hPA measured
*/
optional float barometric_pressure = 3;
/*
* Gas resistance in MOhm measured
*/
optional float gas_resistance = 4;
/*
* Voltage measured (To be depreciated in favor of PowerMetrics in Meshtastic 3.x)
*/
optional float voltage = 5;
/*
* Current measured (To be depreciated in favor of PowerMetrics in Meshtastic 3.x)
*/
optional float current = 6;
/*
* relative scale IAQ value as measured by Bosch BME680 . value 0-500.
* Belongs to Air Quality but is not particle but VOC measurement. Other VOC values can also be put in here.
*/
optional uint32 iaq = 7;
/*
* RCWL9620 Doppler Radar Distance Sensor, used for water level detection. Float value in mm.
*/
optional float distance = 8;
/*
* VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor.
*/
optional float lux = 9;
/*
* VEML7700 high accuracy white light(irradiance) not calibrated digital 16-bit resolution sensor.
*/
optional float white_lux = 10;
/*
* Infrared lux
*/
optional float ir_lux = 11;
/*
* Ultraviolet lux
*/
optional float uv_lux = 12;
/*
* Wind direction in degrees
* 0 degrees = North, 90 = East, etc...
*/
optional uint32 wind_direction = 13;
/*
* Wind speed in m/s
*/
optional float wind_speed = 14;
/*
* Weight in KG
*/
optional float weight = 15;
/*
* Wind gust in m/s
*/
optional float wind_gust = 16;
/*
* Wind lull in m/s
*/
optional float wind_lull = 17;
/*
* Radiation in µR/h
*/
optional float radiation = 18;
/*
* Rainfall in the last hour in mm
*/
optional float rainfall_1h = 19;
/*
* Rainfall in the last 24 hours in mm
*/
optional float rainfall_24h = 20;
/*
* Soil moisture measured (% 1-100)
*/
optional uint32 soil_moisture = 21;
/*
* Soil temperature measured (*C)
*/
optional float soil_temperature = 22;
/*
* One-wire temperature (*C)
*/
repeated float one_wire_temperature = 23;
}
/*
* Power Metrics (voltage / current / etc)
*/
message PowerMetrics {
/*
* Voltage (Ch1)
*/
optional float ch1_voltage = 1;
/*
* Current (Ch1)
*/
optional float ch1_current = 2;
/*
* Voltage (Ch2)
*/
optional float ch2_voltage = 3;
/*
* Current (Ch2)
*/
optional float ch2_current = 4;
/*
* Voltage (Ch3)
*/
optional float ch3_voltage = 5;
/*
* Current (Ch3)
*/
optional float ch3_current = 6;
/*
* Voltage (Ch4)
*/
optional float ch4_voltage = 7;
/*
* Current (Ch4)
*/
optional float ch4_current = 8;
/*
* Voltage (Ch5)
*/
optional float ch5_voltage = 9;
/*
* Current (Ch5)
*/
optional float ch5_current = 10;
/*
* Voltage (Ch6)
*/
optional float ch6_voltage = 11;
/*
* Current (Ch6)
*/
optional float ch6_current = 12;
/*
* Voltage (Ch7)
*/
optional float ch7_voltage = 13;
/*
* Current (Ch7)
*/
optional float ch7_current = 14;
/*
* Voltage (Ch8)
*/
optional float ch8_voltage = 15;
/*
* Current (Ch8)
*/
optional float ch8_current = 16;
}
/*
* Air quality metrics
*/
message AirQualityMetrics {
/*
* Concentration Units Standard PM1.0 in ug/m3
*/
optional uint32 pm10_standard = 1;
/*
* Concentration Units Standard PM2.5 in ug/m3
*/
optional uint32 pm25_standard = 2;
/*
* Concentration Units Standard PM10.0 in ug/m3
*/
optional uint32 pm100_standard = 3;
/*
* Concentration Units Environmental PM1.0 in ug/m3
*/
optional uint32 pm10_environmental = 4;
/*
* Concentration Units Environmental PM2.5 in ug/m3
*/
optional uint32 pm25_environmental = 5;
/*
* Concentration Units Environmental PM10.0 in ug/m3
*/
optional uint32 pm100_environmental = 6;
/*
* 0.3um Particle Count in #/0.1l
*/
optional uint32 particles_03um = 7;
/*
* 0.5um Particle Count in #/0.1l
*/
optional uint32 particles_05um = 8;
/*
* 1.0um Particle Count in #/0.1l
*/
optional uint32 particles_10um = 9;
/*
* 2.5um Particle Count in #/0.1l
*/
optional uint32 particles_25um = 10;
/*
* 5.0um Particle Count in #/0.1l
*/
optional uint32 particles_50um = 11;
/*
* 10.0um Particle Count in #/0.1l
*/
optional uint32 particles_100um = 12;
/*
* CO2 concentration in ppm
*/
optional uint32 co2 = 13;
/*
* CO2 sensor temperature in degC
*/
optional float co2_temperature = 14;
/*
* CO2 sensor relative humidity in %
*/
optional float co2_humidity = 15;
/*
* Formaldehyde sensor formaldehyde concentration in ppb
*/
optional float form_formaldehyde = 16;
/*
* Formaldehyde sensor relative humidity in %RH
*/
optional float form_humidity = 17;
/*
* Formaldehyde sensor temperature in degrees Celsius
*/
optional float form_temperature = 18;
/*
* Concentration Units Standard PM4.0 in ug/m3
*/
optional uint32 pm40_standard = 19;
/*
* 4.0um Particle Count in #/0.1l
*/
optional uint32 particles_40um = 20;
/*
* PM Sensor Temperature
*/
optional float pm_temperature = 21;
/*
* PM Sensor humidity
*/
optional float pm_humidity = 22;
/*
* PM Sensor VOC Index
*/
optional float pm_voc_idx = 23;
/*
* PM Sensor NOx Index
*/
optional float pm_nox_idx = 24;
/*
* Typical Particle Size in um
*/
optional float particles_tps = 25;
}
/*
* Local device mesh statistics
*/
message LocalStats {
/*
* How long the device has been running since the last reboot (in seconds)
*/
uint32 uptime_seconds = 1;
/*
* Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise).
*/
float channel_utilization = 2;
/*
* Percent of airtime for transmission used within the last hour.
*/
float air_util_tx = 3;
/*
* Number of packets sent
*/
uint32 num_packets_tx = 4;
/*
* Number of packets received (both good and bad)
*/
uint32 num_packets_rx = 5;
/*
* Number of packets received that are malformed or violate the protocol
*/
uint32 num_packets_rx_bad = 6;
/*
* Number of nodes online (in the past 2 hours)
*/
uint32 num_online_nodes = 7;
/*
* Number of nodes total
*/
uint32 num_total_nodes = 8;
/*
* Number of received packets that were duplicates (due to multiple nodes relaying).
* If this number is high, there are nodes in the mesh relaying packets when it's unnecessary, for example due to the ROUTER/REPEATER role.
*/
uint32 num_rx_dupe = 9;
/*
* Number of packets we transmitted that were a relay for others (not originating from ourselves).
*/
uint32 num_tx_relay = 10;
/*
* Number of times we canceled a packet to be relayed, because someone else did it before us.
* This will always be zero for ROUTERs/REPEATERs. If this number is high, some other node(s) is/are relaying faster than you.
*/
uint32 num_tx_relay_canceled = 11;
/*
* Number of bytes used in the heap
*/
uint32 heap_total_bytes = 12;
/*
* Number of bytes free in the heap
*/
uint32 heap_free_bytes = 13;
/*
* Number of packets that were dropped because the transmit queue was full.
*/
uint32 num_tx_dropped = 14;
/*
* Noise floor value measured in dBm
*/
int32 noise_floor = 15;
}
/*
* Traffic management statistics for mesh network optimization
*/
message TrafficManagementStats {
/*
* Total number of packets inspected by traffic management
*/
uint32 packets_inspected = 1;
/*
* Number of position packets dropped due to deduplication
*/
uint32 position_dedup_drops = 2;
/*
* Number of NodeInfo requests answered from cache
*/
uint32 nodeinfo_cache_hits = 3;
/*
* Number of packets dropped due to rate limiting
*/
uint32 rate_limit_drops = 4;
/*
* Number of unknown/undecryptable packets dropped
*/
uint32 unknown_packet_drops = 5;
/*
* Number of packets with hop_limit exhausted for local-only broadcast
*/
uint32 hop_exhausted_packets = 6;
/*
* Number of times router hop preservation was applied
*/
uint32 router_hops_preserved = 7;
}
/*
* Health telemetry metrics
*/
message HealthMetrics {
/*
* Heart rate (beats per minute)
*/
optional uint32 heart_bpm = 1;
/*
* SpO2 (blood oxygen saturation) level
*/
optional uint32 spO2 = 2;
/*
* Body temperature in degrees Celsius
*/
optional float temperature = 3;
}
/*
* Linux host metrics
*/
message HostMetrics {
/*
* Host system uptime
*/
uint32 uptime_seconds = 1;
/*
* Host system free memory
*/
uint64 freemem_bytes = 2;
/*
* Host system disk space free for /
*/
uint64 diskfree1_bytes = 3;
/*
* Secondary system disk space free
*/
optional uint64 diskfree2_bytes = 4;
/*
* Tertiary disk space free
*/
optional uint64 diskfree3_bytes = 5;
/*
* Host system one minute load in 1/100ths
*/
uint32 load1 = 6;
/*
* Host system five minute load in 1/100ths
*/
uint32 load5 = 7;
/*
* Host system fifteen minute load in 1/100ths
*/
uint32 load15 = 8;
/*
* Optional User-provided string for arbitrary host system information
* that doesn't make sense as a dedicated entry.
*/
optional string user_string = 9;
}
/*
* Types of Measurements the telemetry module is equipped to handle
*/
message Telemetry {
/*
* Seconds since 1970 - or 0 for unknown/unset
*/
fixed32 time = 1;
oneof variant {
/*
* Key native device metrics such as battery level
*/
DeviceMetrics device_metrics = 2;
/*
* Weather station or other environmental metrics
*/
EnvironmentMetrics environment_metrics = 3;
/*
* Air quality metrics
*/
AirQualityMetrics air_quality_metrics = 4;
/*
* Power Metrics
*/
PowerMetrics power_metrics = 5;
/*
* Local device mesh statistics
*/
LocalStats local_stats = 6;
/*
* Health telemetry metrics
*/
HealthMetrics health_metrics = 7;
/*
* Linux host metrics
*/
HostMetrics host_metrics = 8;
/*
* Traffic management statistics
*/
TrafficManagementStats traffic_management_stats = 9;
}
}
/*
* Supported I2C Sensors for telemetry in Meshtastic
*/
enum TelemetrySensorType {
/*
* No external telemetry sensor explicitly set
*/
SENSOR_UNSET = 0;
/*
* High accuracy temperature, pressure, humidity
*/
BME280 = 1;
/*
* High accuracy temperature, pressure, humidity, and air resistance
*/
BME680 = 2;
/*
* Very high accuracy temperature
*/
MCP9808 = 3;
/*
* Moderate accuracy current and voltage
*/
INA260 = 4;
/*
* Moderate accuracy current and voltage
*/
INA219 = 5;
/*
* High accuracy temperature and pressure
*/
BMP280 = 6;
/*
* TODO - REMOVE High accuracy temperature and humidity
*/
SHTC3 = 7;
/*
* High accuracy pressure
*/
LPS22 = 8;
/*
* 3-Axis magnetic sensor
*/
QMC6310 = 9;
/*
* 6-Axis inertial measurement sensor
*/
QMI8658 = 10;
/*
* 3-Axis magnetic sensor
*/
QMC5883L = 11;
/*
* TODO - REMOVE High accuracy temperature and humidity
*/
SHT31 = 12;
/*
* PM2.5 air quality sensor
*/
PMSA003I = 13;
/*
* INA3221 3 Channel Voltage / Current Sensor
*/
INA3221 = 14;
/*
* BMP085/BMP180 High accuracy temperature and pressure (older Version of BMP280)
*/
BMP085 = 15;
/*
* RCWL-9620 Doppler Radar Distance Sensor, used for water level detection
*/
RCWL9620 = 16;
/*
* TODO - REMOVE Sensirion High accuracy temperature and humidity
*/
SHT4X = 17;
/*
* VEML7700 high accuracy ambient light(Lux) digital 16-bit resolution sensor.
*/
VEML7700 = 18;
/*
* MLX90632 non-contact IR temperature sensor.
*/
MLX90632 = 19;
/*
* TI OPT3001 Ambient Light Sensor
*/
OPT3001 = 20;
/*
* Lite On LTR-390UV-01 UV Light Sensor
*/
LTR390UV = 21;
/*
* AMS TSL25911FN RGB Light Sensor
*/
TSL25911FN = 22;
/*
* AHT10 Integrated temperature and humidity sensor
*/
AHT10 = 23;
/*
* DFRobot Lark Weather station (temperature, humidity, pressure, wind speed and direction)
*/
DFROBOT_LARK = 24;
/*
* NAU7802 Scale Chip or compatible
*/
NAU7802 = 25;
/*
* BMP3XX High accuracy temperature and pressure
*/
BMP3XX = 26;
/*
* ICM-20948 9-Axis digital motion processor
*/
ICM20948 = 27;
/*
* MAX17048 1S lipo battery sensor (voltage, state of charge, time to go)
*/
MAX17048 = 28;
/*
* Custom I2C sensor implementation based on https://github.com/meshtastic/i2c-sensor
*/
CUSTOM_SENSOR = 29;
/*
* MAX30102 Pulse Oximeter and Heart-Rate Sensor
*/
MAX30102 = 30;
/*
* MLX90614 non-contact IR temperature sensor
*/
MLX90614 = 31;
/*
* SCD40/SCD41 CO2, humidity, temperature sensor
*/
SCD4X = 32;
/*
* ClimateGuard RadSens, radiation, Geiger-Muller Tube
*/
RADSENS = 33;
/*
* High accuracy current and voltage
*/
INA226 = 34;
/*
* DFRobot Gravity tipping bucket rain gauge
*/
DFROBOT_RAIN = 35;
/*
* Infineon DPS310 High accuracy pressure and temperature
*/
DPS310 = 36;
/*
* RAKWireless RAK12035 Soil Moisture Sensor Module
*/
RAK12035 = 37;
/*
* MAX17261 lipo battery gauge
*/
MAX17261 = 38;
/*
* PCT2075 Temperature Sensor
*/
PCT2075 = 39;
/*
* ADS1X15 ADC
*/
ADS1X15 = 40;
/*
* ADS1X15 ADC_ALT
*/
ADS1X15_ALT = 41;
/*
* Sensirion SFA30 Formaldehyde sensor
*/
SFA30 = 42;
/*
* SEN5X PM SENSORS
*/
SEN5X = 43;
/*
* TSL2561 light sensor
*/
TSL2561 = 44;
/*
* BH1750 light sensor
*/
BH1750 = 45;
/*
* HDC1080 Temperature and Humidity Sensor
*/
HDC1080 = 46;
/*
* TODO - REMOVE STH21 Temperature and R. Humidity sensor
*/
SHT21 = 47;
/*
* Sensirion STC31 CO2 sensor
*/
STC31 = 48;
/*
* SCD30 CO2, humidity, temperature sensor
*/
SCD30 = 49;
/*
* SHT family of sensors for temperature and humidity
*/
SHTXX = 50;
/*
* DS248X Bridge for one-wire temperature sensors
*/
DS248X = 51;
/*
* MMC5983MA 3-Axis Digital Magnetic Sensor
*/
MMC5983MA = 52;
/*
* ICM-42607-P 6Axis IMU
*/
ICM42607P = 53;
}
/*
* NAU7802 Telemetry configuration, for saving to flash
*/
message Nau7802Config {
/*
* The offset setting for the NAU7802
*/
int32 zeroOffset = 1;
/*
* The calibration factor for the NAU7802
*/
float calibrationFactor = 2;
}
/*
* SEN5X State, for saving to flash
*/
message SEN5XState {
/*
* Last cleaning time for SEN5X
*/
uint32 last_cleaning_time = 1;
/*
* Last cleaning time for SEN5X - valid flag
*/
bool last_cleaning_valid = 2;
/*
* Config flag for one-shot mode (see admin.proto)
*/
bool one_shot_mode = 3;
/*
* Last VOC state time for SEN55
*/
optional uint32 voc_state_time = 4;
/*
* Last VOC state validity flag for SEN55
*/
optional bool voc_state_valid = 5;
/*
* VOC state array (8x uint8t) for SEN55
*/
optional fixed64 voc_state_array = 6;
}