Compare commits

...
Sign in to create a new pull request.

21 commits

Author SHA1 Message Date
Anton Roslund
eda9a12443 improve docker build time 2025-08-10 20:10:28 +02:00
liamcottle
09a2bcb3ad update announcement 2025-06-15 19:01:13 +12:00
liamcottle
de1cfd4222 update express to v5.0.0 2025-06-15 16:42:21 +12:00
liamcottle
1c1b77b3ea add note about mqtt collector 2025-06-15 16:40:08 +12:00
liamcottle
2a1ef2131a users must provide their own protobuf schema files 2025-06-15 16:35:16 +12:00
liamcottle
8a43c9d3d1 remove protobuf from server 2025-06-15 16:26:33 +12:00
liamcottle
9a18ca1057 add external to .gitignore 2025-06-15 15:28:16 +12:00
liamcottle
ffe1c6c30a remove protobufs 2025-06-15 15:17:20 +12:00
liamcottle
1aa32cfa35 use purple lines between position history markers 2025-04-25 17:36:52 +12:00
liamcottle
825b62c5bb add openssl to dockerfile 2025-04-25 17:29:45 +12:00
Liam Cottle
b87a7b2f27
Merge pull request #92 from sgtwilko/StopGraphFromCuttingOffValues
Change Voltage chart to use suggested min/max (#1)
2025-04-25 17:26:56 +12:00
liamcottle
2ab169b4ff update device image for RP2040_LORA 2025-04-25 17:20:31 +12:00
liamcottle
821d6177c3 add device image for SEEED_XIAO_S3 2025-04-25 17:12:27 +12:00
liamcottle
8acc4696db add device image for STATION_G2 2025-04-25 17:10:25 +12:00
liamcottle
cd6a99a179 remove white background from device images 2025-04-25 17:07:22 +12:00
liamcottle
90dc3ae449 rotate and optimise image 2025-04-25 16:38:00 +12:00
Liam Cottle
07e362745a
Merge pull request #96 from valzzu/master
add image for nrf52 diy nodes
2025-04-25 16:37:11 +12:00
Liam Cottle
f6d14b8f95
Merge pull request #97 from dieseltravis/patch-1
replace \u00BA º (not degrees symbol) with \u00B0 ° (degrees)
2025-04-25 16:29:52 +12:00
Travis Hardiman
54ebb429d1
replace U+00BA º (not degrees) with U+00B0 ° (degrees)
U+00BA º MASCULINE ORDINAL INDICATOR vs. U+00B0 ° DEGREE SIGN (°)
2025-04-25 00:20:39 -04:00
Iris
92a649ad90
Add files via upload 2025-04-03 08:07:22 +03:00
sgtwilko
9ff76345b0
Change Voltage chart to use suggested min/max (#1)
The Voltage/Current chart often either shows lines with so little variation that you cannot see changes, or the values go off the top/bottom.

This change allows the chart to adapt dynamically to the values being returned.
2025-02-26 13:06:57 +00:00
63 changed files with 720 additions and 6856 deletions

View file

@ -1,2 +1,3 @@
.env .env
node_modules node_modules
.git

2
.gitignore vendored
View file

@ -2,3 +2,5 @@
node_modules node_modules
# Keep environment variables out of version control # Keep environment variables out of version control
.env .env
src/external

View file

@ -1,10 +1,16 @@
FROM node:lts-alpine FROM node:lts-alpine
# add project files to /app
ADD ./ /app
WORKDIR /app WORKDIR /app
# install node dependencies # Copy only package files and install deps
RUN npm install # This layer will be cached as long as package*.json don't change
COPY package*.json package-lock.json* ./
RUN npm ci
EXPOSE 8080 # Copy the rest of your source
COPY . .
RUN apk add --no-cache openssl
EXPOSE 8080

View file

@ -122,6 +122,9 @@ You will now need to restart the `index.js` and `mqtt.js` scripts.
## MQTT Collector ## MQTT Collector
> Please note, due to the Meshtastic protobuf schema files being locked under a GPLv3 license, these are not provided in this MIT licensed project.
You will need to obtain these files yourself to be able to use the MQTT Collector.
By default, the [MQTT Collector](./src/mqtt.js) connects to the public Meshtastic MQTT server. By default, the [MQTT Collector](./src/mqtt.js) connects to the public Meshtastic MQTT server.
Alternatively, you may provide the relevant options shown in the help section below to connect to your own MQTT server along with your own decryption keys. Alternatively, you may provide the relevant options shown in the help section below to connect to your own MQTT server along with your own decryption keys.

775
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -13,7 +13,7 @@
"command-line-args": "^5.2.1", "command-line-args": "^5.2.1",
"command-line-usage": "^7.0.1", "command-line-usage": "^7.0.1",
"compression": "^1.7.4", "compression": "^1.7.4",
"express": "^4.18.3", "express": "^5.0.0",
"mqtt": "^5.3.6", "mqtt": "^5.3.6",
"protobufjs": "^7.2.6" "protobufjs": "^7.2.6"
}, },

View file

@ -1,7 +1,7 @@
const fs = require("fs");
const path = require('path'); const path = require('path');
const express = require('express'); const express = require('express');
const compression = require('compression'); const compression = require('compression');
const protobufjs = require("protobufjs");
const commandLineArgs = require("command-line-args"); const commandLineArgs = require("command-line-args");
const commandLineUsage = require("command-line-usage"); const commandLineUsage = require("command-line-usage");
@ -50,24 +50,21 @@ if(options.help){
// get options and fallback to default values // get options and fallback to default values
const port = options["port"] ?? 8080; const port = options["port"] ?? 8080;
// load protobufs // load json
const root = new protobufjs.Root(); const hardwareModels = JSON.parse(fs.readFileSync(path.join(__dirname, "json/hardware_models.json"), "utf-8"));
root.resolvePath = (origin, target) => path.join(__dirname, "protos", target); const roles = JSON.parse(fs.readFileSync(path.join(__dirname, "json/roles.json"), "utf-8"));
root.loadSync('meshtastic/mqtt.proto'); const regionCodes = JSON.parse(fs.readFileSync(path.join(__dirname, "json/region_codes.json"), "utf-8"));
const HardwareModel = root.lookupEnum("HardwareModel"); const modemPresets = JSON.parse(fs.readFileSync(path.join(__dirname, "json/modem_presets.json"), "utf-8"));
const Role = root.lookupEnum("Config.DeviceConfig.Role");
const RegionCode = root.lookupEnum("Config.LoRaConfig.RegionCode");
const ModemPreset = root.lookupEnum("Config.LoRaConfig.ModemPreset");
// appends extra info for node objects returned from api // appends extra info for node objects returned from api
function formatNodeInfo(node) { function formatNodeInfo(node) {
return { return {
...node, ...node,
node_id_hex: "!" + node.node_id.toString(16), node_id_hex: "!" + node.node_id.toString(16),
hardware_model_name: HardwareModel.valuesById[node.hardware_model] ?? null, hardware_model_name: hardwareModels[node.hardware_model] ?? null,
role_name: Role.valuesById[node.role] ?? null, role_name: roles[node.role] ?? null,
region_name: RegionCode.valuesById[node.region] ?? null, region_name: regionCodes[node.region] ?? null,
modem_preset_name: ModemPreset.valuesById[node.modem_preset] ?? null, modem_preset_name: modemPresets[node.modem_preset] ?? null,
}; };
} }
@ -666,7 +663,7 @@ app.get('/api/v1/stats/hardware-models', async (req, res) => {
return { return {
count: result._count.hardware_model, count: result._count.hardware_model,
hardware_model: result.hardware_model, hardware_model: result.hardware_model,
hardware_model_name: HardwareModel.valuesById[result.hardware_model] ?? "UNKNOWN", hardware_model_name: hardwareModels[result.hardware_model] ?? "UNKNOWN",
}; };
}); });

View file

@ -0,0 +1,108 @@
{
"0": "UNSET",
"1": "TLORA_V2",
"2": "TLORA_V1",
"3": "TLORA_V2_1_1P6",
"4": "TBEAM",
"5": "HELTEC_V2_0",
"6": "TBEAM_V0P7",
"7": "T_ECHO",
"8": "TLORA_V1_1P3",
"9": "RAK4631",
"10": "HELTEC_V2_1",
"11": "HELTEC_V1",
"12": "LILYGO_TBEAM_S3_CORE",
"13": "RAK11200",
"14": "NANO_G1",
"15": "TLORA_V2_1_1P8",
"16": "TLORA_T3_S3",
"17": "NANO_G1_EXPLORER",
"18": "NANO_G2_ULTRA",
"19": "LORA_TYPE",
"20": "WIPHONE",
"21": "WIO_WM1110",
"22": "RAK2560",
"23": "HELTEC_HRU_3601",
"24": "HELTEC_WIRELESS_BRIDGE",
"25": "STATION_G1",
"26": "RAK11310",
"27": "SENSELORA_RP2040",
"28": "SENSELORA_S3",
"29": "CANARYONE",
"30": "RP2040_LORA",
"31": "STATION_G2",
"32": "LORA_RELAY_V1",
"33": "NRF52840DK",
"34": "PPR",
"35": "GENIEBLOCKS",
"36": "NRF52_UNKNOWN",
"37": "PORTDUINO",
"38": "ANDROID_SIM",
"39": "DIY_V1",
"40": "NRF52840_PCA10059",
"41": "DR_DEV",
"42": "M5STACK",
"43": "HELTEC_V3",
"44": "HELTEC_WSL_V3",
"45": "BETAFPV_2400_TX",
"46": "BETAFPV_900_NANO_TX",
"47": "RPI_PICO",
"48": "HELTEC_WIRELESS_TRACKER",
"49": "HELTEC_WIRELESS_PAPER",
"50": "T_DECK",
"51": "T_WATCH_S3",
"52": "PICOMPUTER_S3",
"53": "HELTEC_HT62",
"54": "EBYTE_ESP32_S3",
"55": "ESP32_S3_PICO",
"56": "CHATTER_2",
"57": "HELTEC_WIRELESS_PAPER_V1_0",
"58": "HELTEC_WIRELESS_TRACKER_V1_0",
"59": "UNPHONE",
"60": "TD_LORAC",
"61": "CDEBYTE_EORA_S3",
"62": "TWC_MESH_V4",
"63": "NRF52_PROMICRO_DIY",
"64": "RADIOMASTER_900_BANDIT_NANO",
"65": "HELTEC_CAPSULE_SENSOR_V3",
"66": "HELTEC_VISION_MASTER_T190",
"67": "HELTEC_VISION_MASTER_E213",
"68": "HELTEC_VISION_MASTER_E290",
"69": "HELTEC_MESH_NODE_T114",
"70": "SENSECAP_INDICATOR",
"71": "TRACKER_T1000_E",
"72": "RAK3172",
"73": "WIO_E5",
"74": "RADIOMASTER_900_BANDIT",
"75": "ME25LS01_4Y10TD",
"76": "RP2040_FEATHER_RFM95",
"77": "M5STACK_COREBASIC",
"78": "M5STACK_CORE2",
"79": "RPI_PICO2",
"80": "M5STACK_CORES3",
"81": "SEEED_XIAO_S3",
"82": "MS24SF1",
"83": "TLORA_C6",
"84": "WISMESH_TAP",
"85": "ROUTASTIC",
"86": "MESH_TAB",
"87": "MESHLINK",
"88": "XIAO_NRF52_KIT",
"89": "THINKNODE_M1",
"90": "THINKNODE_M2",
"91": "T_ETH_ELITE",
"92": "HELTEC_SENSOR_HUB",
"93": "RESERVED_FRIED_CHICKEN",
"94": "HELTEC_MESH_POCKET",
"95": "SEEED_SOLAR_NODE",
"96": "NOMADSTAR_METEOR_PRO",
"97": "CROWPANEL",
"98": "LINK_32",
"99": "SEEED_WIO_TRACKER_L1",
"100": "SEEED_WIO_TRACKER_L1_EINK",
"101": "QWANTZ_TINY_ARMS",
"102": "T_DECK_PRO",
"103": "T_LORA_PAGER",
"104": "GAT562_MESH_TRIAL_TRACKER",
"255": "PRIVATE_HW"
}

View file

@ -0,0 +1,11 @@
{
"0": "LONG_FAST",
"1": "LONG_SLOW",
"2": "VERY_LONG_SLOW",
"3": "MEDIUM_SLOW",
"4": "MEDIUM_FAST",
"5": "SHORT_SLOW",
"6": "SHORT_FAST",
"7": "LONG_MODERATE",
"8": "SHORT_TURBO"
}

View file

@ -0,0 +1,24 @@
{
"0": "UNSET",
"1": "US",
"2": "EU_433",
"3": "EU_868",
"4": "CN",
"5": "JP",
"6": "ANZ",
"7": "KR",
"8": "TW",
"9": "RU",
"10": "IN",
"11": "NZ_865",
"12": "TH",
"13": "LORA_24",
"14": "UA_433",
"15": "UA_868",
"16": "MY_433",
"17": "MY_919",
"18": "SG_923",
"19": "PH_433",
"20": "PH_868",
"21": "PH_915"
}

14
src/json/roles.json Normal file
View file

@ -0,0 +1,14 @@
{
"0": "CLIENT",
"1": "CLIENT_MUTE",
"2": "ROUTER",
"3": "ROUTER_CLIENT",
"4": "REPEATER",
"5": "TRACKER",
"6": "SENSOR",
"7": "TAK",
"8": "CLIENT_HIDDEN",
"9": "LOST_AND_FOUND",
"10": "TAK_TRACKER",
"11": "ROUTER_LATE"
}

View file

@ -1,3 +1,4 @@
const fs = require("fs");
const crypto = require("crypto"); const crypto = require("crypto");
const path = require("path"); const path = require("path");
const mqtt = require("mqtt"); const mqtt = require("mqtt");
@ -21,6 +22,11 @@ const optionsList = [
type: Boolean, type: Boolean,
description: 'Display this usage guide.' description: 'Display this usage guide.'
}, },
{
name: "protobufs-path",
type: String,
description: "Path to Protobufs (e.g: ../../protobufs)",
},
{ {
name: "mqtt-broker-url", name: "mqtt-broker-url",
type: String, type: String,
@ -206,6 +212,7 @@ if(options.help){
} }
// get options and fallback to default values // get options and fallback to default values
const protobufsPath = options["protobufs-path"] ?? path.join(path.dirname(__filename), "external/protobufs");
const mqttBrokerUrl = options["mqtt-broker-url"] ?? "mqtt://mqtt.meshtastic.org"; const mqttBrokerUrl = options["mqtt-broker-url"] ?? "mqtt://mqtt.meshtastic.org";
const mqttUsername = options["mqtt-username"] ?? "meshdev"; const mqttUsername = options["mqtt-username"] ?? "meshdev";
const mqttPassword = options["mqtt-password"] ?? "large4cats"; const mqttPassword = options["mqtt-password"] ?? "large4cats";
@ -240,6 +247,25 @@ const purgeTextMessagesAfterSeconds = options["purge-text-messages-after-seconds
const purgeTraceroutesAfterSeconds = options["purge-traceroutes-after-seconds"] ?? null; const purgeTraceroutesAfterSeconds = options["purge-traceroutes-after-seconds"] ?? null;
const purgeWaypointsAfterSeconds = options["purge-waypoints-after-seconds"] ?? null; const purgeWaypointsAfterSeconds = options["purge-waypoints-after-seconds"] ?? null;
// ensure protobufs exist
if(!fs.existsSync(path.join(protobufsPath, "meshtastic/mqtt.proto"))){
console.error([
"ERROR: MQTT Collector requires Meshtastic protobufs.",
"",
"This project is licensed under the MIT license to allow end users to do as they wish.",
"Unfortunately, the Meshtastic protobuf schema files are licensed under GPLv3, which means they can not be bundled in this project due to license conflicts.",
"https://github.com/liamcottle/meshtastic-map/issues/102",
"https://github.com/meshtastic/protobufs/issues/695",
"",
"If you clone and install the Meshtastic protobufs as described below, your use of those files will be subject to the GPLv3 license.",
"This does not change the license of this project being MIT. Only the parts you add from the Meshtastic project are covered under GPLv3.",
"",
"To use the MQTT Collector, please clone the Meshtastic protobufs into src/external/protobufs",
"git clone https://github.com/meshtastic/protobufs src/external/protobufs",
].join("\n"));
return;
}
// create mqtt client // create mqtt client
const client = mqtt.connect(mqttBrokerUrl, { const client = mqtt.connect(mqttBrokerUrl, {
username: mqttUsername, username: mqttUsername,
@ -249,7 +275,7 @@ const client = mqtt.connect(mqttBrokerUrl, {
// load protobufs // load protobufs
const root = new protobufjs.Root(); const root = new protobufjs.Root();
root.resolvePath = (origin, target) => path.join(__dirname, "protos", target); root.resolvePath = (origin, target) => path.join(protobufsPath, target);
root.loadSync('meshtastic/mqtt.proto'); root.loadSync('meshtastic/mqtt.proto');
const Data = root.lookupType("Data"); const Data = root.lookupType("Data");
const ServiceEnvelope = root.lookupType("ServiceEnvelope"); const ServiceEnvelope = root.lookupType("ServiceEnvelope");

View file

@ -1,12 +0,0 @@
*AdminMessage.payload_variant anonymous_oneof:true
*AdminMessage.set_canned_message_module_messages max_size:201
*AdminMessage.get_canned_message_module_messages_response max_size:201
*AdminMessage.delete_file_request max_size:201
*AdminMessage.set_ringtone_message max_size:231
*AdminMessage.get_ringtone_response max_size:231
*HamParameters.call_sign max_size:8
*HamParameters.short_name max_size:6
*NodeRemoteHardwarePinsResponse.node_remote_hardware_pins max_count:16

View file

@ -1,364 +0,0 @@
syntax = "proto3";
package meshtastic;
import "meshtastic/channel.proto";
import "meshtastic/config.proto";
import "meshtastic/connection_status.proto";
import "meshtastic/deviceonly.proto";
import "meshtastic/mesh.proto";
import "meshtastic/module_config.proto";
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "AdminProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* This message is handled by the Admin module and is responsible for all settings/channel read/write operations.
* This message is used to do settings operations to both remote AND local nodes.
* (Prior to 1.2 these operations were done via special ToRadio operations)
*/
message AdminMessage {
/*
* TODO: REPLACE
*/
enum ConfigType {
/*
* TODO: REPLACE
*/
DEVICE_CONFIG = 0;
/*
* TODO: REPLACE
*/
POSITION_CONFIG = 1;
/*
* TODO: REPLACE
*/
POWER_CONFIG = 2;
/*
* TODO: REPLACE
*/
NETWORK_CONFIG = 3;
/*
* TODO: REPLACE
*/
DISPLAY_CONFIG = 4;
/*
* TODO: REPLACE
*/
LORA_CONFIG = 5;
/*
* TODO: REPLACE
*/
BLUETOOTH_CONFIG = 6;
}
/*
* TODO: REPLACE
*/
enum ModuleConfigType {
/*
* TODO: REPLACE
*/
MQTT_CONFIG = 0;
/*
* TODO: REPLACE
*/
SERIAL_CONFIG = 1;
/*
* TODO: REPLACE
*/
EXTNOTIF_CONFIG = 2;
/*
* TODO: REPLACE
*/
STOREFORWARD_CONFIG = 3;
/*
* TODO: REPLACE
*/
RANGETEST_CONFIG = 4;
/*
* TODO: REPLACE
*/
TELEMETRY_CONFIG = 5;
/*
* TODO: REPLACE
*/
CANNEDMSG_CONFIG = 6;
/*
* TODO: REPLACE
*/
AUDIO_CONFIG = 7;
/*
* TODO: REPLACE
*/
REMOTEHARDWARE_CONFIG = 8;
/*
* TODO: REPLACE
*/
NEIGHBORINFO_CONFIG = 9;
/*
* TODO: REPLACE
*/
AMBIENTLIGHTING_CONFIG = 10;
/*
* TODO: REPLACE
*/
DETECTIONSENSOR_CONFIG = 11;
/*
* TODO: REPLACE
*/
PAXCOUNTER_CONFIG = 12;
}
/*
* TODO: REPLACE
*/
oneof payload_variant {
/*
* Send the specified channel in the response to this message
* NOTE: This field is sent with the channel index + 1 (to ensure we never try to send 'zero' - which protobufs treats as not present)
*/
uint32 get_channel_request = 1;
/*
* TODO: REPLACE
*/
Channel get_channel_response = 2;
/*
* Send the current owner data in the response to this message.
*/
bool get_owner_request = 3;
/*
* TODO: REPLACE
*/
User get_owner_response = 4;
/*
* Ask for the following config data to be sent
*/
ConfigType get_config_request = 5;
/*
* Send the current Config in the response to this message.
*/
Config get_config_response = 6;
/*
* Ask for the following config data to be sent
*/
ModuleConfigType get_module_config_request = 7;
/*
* Send the current Config in the response to this message.
*/
ModuleConfig get_module_config_response = 8;
/*
* Get the Canned Message Module messages in the response to this message.
*/
bool get_canned_message_module_messages_request = 10;
/*
* Get the Canned Message Module messages in the response to this message.
*/
string get_canned_message_module_messages_response = 11;
/*
* Request the node to send device metadata (firmware, protobuf version, etc)
*/
bool get_device_metadata_request = 12;
/*
* Device metadata response
*/
DeviceMetadata get_device_metadata_response = 13;
/*
* Get the Ringtone in the response to this message.
*/
bool get_ringtone_request = 14;
/*
* Get the Ringtone in the response to this message.
*/
string get_ringtone_response = 15;
/*
* Request the node to send it's connection status
*/
bool get_device_connection_status_request = 16;
/*
* Device connection status response
*/
DeviceConnectionStatus get_device_connection_status_response = 17;
/*
* Setup a node for licensed amateur (ham) radio operation
*/
HamParameters set_ham_mode = 18;
/*
* Get the mesh's nodes with their available gpio pins for RemoteHardware module use
*/
bool get_node_remote_hardware_pins_request = 19;
/*
* Respond with the mesh's nodes with their available gpio pins for RemoteHardware module use
*/
NodeRemoteHardwarePinsResponse get_node_remote_hardware_pins_response = 20;
/*
* Enter (UF2) DFU mode
* Only implemented on NRF52 currently
*/
bool enter_dfu_mode_request = 21;
/*
* Delete the file by the specified path from the device
*/
string delete_file_request = 22;
/*
* Set the owner for this node
*/
User set_owner = 32;
/*
* Set channels (using the new API).
* A special channel is the "primary channel".
* The other records are secondary channels.
* Note: only one channel can be marked as primary.
* If the client sets a particular channel to be primary, the previous channel will be set to SECONDARY automatically.
*/
Channel set_channel = 33;
/*
* Set the current Config
*/
Config set_config = 34;
/*
* Set the current Config
*/
ModuleConfig set_module_config = 35;
/*
* Set the Canned Message Module messages text.
*/
string set_canned_message_module_messages = 36;
/*
* Set the ringtone for ExternalNotification.
*/
string set_ringtone_message = 37;
/*
* Remove the node by the specified node-num from the NodeDB on the device
*/
uint32 remove_by_nodenum = 38;
/*
* Begins an edit transaction for config, module config, owner, and channel settings changes
* This will delay the standard *implicit* save to the file system and subsequent reboot behavior until committed (commit_edit_settings)
*/
bool begin_edit_settings = 64;
/*
* Commits an open transaction for any edits made to config, module config, owner, and channel settings
*/
bool commit_edit_settings = 65;
/*
* Tell the node to reboot into the OTA Firmware in this many seconds (or <0 to cancel reboot)
* Only Implemented for ESP32 Devices. This needs to be issued to send a new main firmware via bluetooth.
*/
int32 reboot_ota_seconds = 95;
/*
* This message is only supported for the simulator Portduino build.
* If received the simulator will exit successfully.
*/
bool exit_simulator = 96;
/*
* Tell the node to reboot in this many seconds (or <0 to cancel reboot)
*/
int32 reboot_seconds = 97;
/*
* Tell the node to shutdown in this many seconds (or <0 to cancel shutdown)
*/
int32 shutdown_seconds = 98;
/*
* Tell the node to factory reset, all device settings will be returned to factory defaults.
*/
int32 factory_reset = 99;
/*
* Tell the node to reset the nodedb.
*/
int32 nodedb_reset = 100;
}
}
/*
* Parameters for setting up Meshtastic for ameteur radio usage
*/
message HamParameters {
/*
* Amateur radio call sign, eg. KD2ABC
*/
string call_sign = 1;
/*
* Transmit power in dBm at the LoRA transceiver, not including any amplification
*/
int32 tx_power = 2;
/*
* The selected frequency of LoRA operation
* Please respect your local laws, regulations, and band plans.
* Ensure your radio is capable of operating of the selected frequency before setting this.
*/
float frequency = 3;
/*
* Optional short name of user
*/
string short_name = 4;
}
/*
* Response envelope for node_remote_hardware_pins
*/
message NodeRemoteHardwarePinsResponse {
/*
* Nodes and their respective remote hardware GPIO pins
*/
repeated NodeRemoteHardwarePin node_remote_hardware_pins = 1;
}

View file

@ -1 +0,0 @@
*ChannelSet.settings max_count:8

View file

@ -1,31 +0,0 @@
syntax = "proto3";
package meshtastic;
import "meshtastic/channel.proto";
import "meshtastic/config.proto";
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "AppOnlyProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* This is the most compact possible representation for a set of channels.
* It includes only one PRIMARY channel (which must be first) and
* any SECONDARY channels.
* No DISABLED channels are included.
* This abstraction is used only on the the 'app side' of the world (ie python, javascript and android etc) to show a group of Channels as a (long) URL
*/
message ChannelSet {
/*
* Channel list with settings
*/
repeated ChannelSettings settings = 1;
/*
* LoRa config
*/
Config.LoRaConfig lora_config = 2;
}

View file

@ -1,6 +0,0 @@
*Contact.callsign max_size:120
*Contact.device_callsign max_size:120
*Status.battery int_size:8
*PLI.course int_size:16
*GeoChat.message max_size:200
*GeoChat.to max_size:120

View file

@ -1,251 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "ATAKProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* Packets for the official ATAK Plugin
*/
message TAKPacket
{
/*
* Are the payloads strings compressed for LoRA transport?
*/
bool is_compressed = 1;
/*
* The contact / callsign for ATAK user
*/
Contact contact = 2;
/*
* The group for ATAK user
*/
Group group = 3;
/*
* The status of the ATAK EUD
*/
Status status = 4;
/*
* The payload of the packet
*/
oneof payload_variant {
/*
* TAK position report
*/
PLI pli = 5;
/*
* ATAK GeoChat message
*/
GeoChat chat = 6;
}
}
/*
* ATAK GeoChat message
*/
message GeoChat {
/*
* The text message
*/
string message = 1;
/*
* Uid recipient of the message
*/
optional string to = 2;
}
/*
* ATAK Group
* <__group role='Team Member' name='Cyan'/>
*/
message Group {
/*
* Role of the group member
*/
MemberRole role = 1;
/*
* Team (color)
* Default Cyan
*/
Team team = 2;
}
enum Team {
/*
* Unspecifed
*/
Unspecifed_Color = 0;
/*
* White
*/
White = 1;
/*
* Yellow
*/
Yellow = 2;
/*
* Orange
*/
Orange = 3;
/*
* Magenta
*/
Magenta = 4;
/*
* Red
*/
Red = 5;
/*
* Maroon
*/
Maroon = 6;
/*
* Purple
*/
Purple = 7;
/*
* Dark Blue
*/
Dark_Blue = 8;
/*
* Blue
*/
Blue = 9;
/*
* Cyan
*/
Cyan = 10;
/*
* Teal
*/
Teal = 11;
/*
* Green
*/
Green = 12;
/*
* Dark Green
*/
Dark_Green = 13;
/*
* Brown
*/
Brown = 14;
}
/*
* Role of the group member
*/
enum MemberRole {
/*
* Unspecifed
*/
Unspecifed = 0;
/*
* Team Member
*/
TeamMember = 1;
/*
* Team Lead
*/
TeamLead = 2;
/*
* Headquarters
*/
HQ = 3;
/*
* Airsoft enthusiast
*/
Sniper = 4;
/*
* Medic
*/
Medic = 5;
/*
* ForwardObserver
*/
ForwardObserver = 6;
/*
* Radio Telephone Operator
*/
RTO = 7;
/*
* Doggo
*/
K9 = 8;
}
/*
* ATAK EUD Status
* <status battery='100' />
*/
message Status {
/*
* Battery level
*/
uint32 battery = 1;
}
/*
* ATAK Contact
* <contact endpoint='0.0.0.0:4242:tcp' phone='+12345678' callsign='FALKE'/>
*/
message Contact {
/*
* Callsign
*/
string callsign = 1;
/*
* Device callsign
*/
string device_callsign = 2;
/*
* IP address of endpoint in integer form (0.0.0.0 default)
*/
// fixed32 enpoint_address = 3;
/*
* Port of endpoint (4242 default)
*/
// uint32 endpoint_port = 4;
/*
* Phone represented as integer
* Terrible practice, but we really need the wire savings
*/
// uint32 phone = 4;
}
/*
* Position Location Information from ATAK
*/
message PLI {
/*
* The new preferred location encoding, multiply by 1e-7 to get degrees
* in floating point
*/
sfixed32 latitude_i = 1;
/*
* The new preferred location encoding, multiply by 1e-7 to get degrees
* in floating point
*/
sfixed32 longitude_i = 2;
/*
* Altitude (ATAK prefers HAE)
*/
int32 altitude = 3;
/*
* Speed
*/
uint32 speed = 4;
/*
* Course in degrees
*/
uint32 course = 5;
}

View file

@ -1 +0,0 @@
*CannedMessageModuleConfig.messages max_size:201

View file

@ -1,19 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "CannedMessageConfigProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* Canned message module configuration.
*/
message CannedMessageModuleConfig {
/*
* Predefined messages for canned message module separated by '|' characters.
*/
string messages = 1;
}

View file

@ -1,5 +0,0 @@
*Channel.index int_size:8
# 256 bit or 128 bit psk key
*ChannelSettings.psk max_size:32
*ChannelSettings.name max_size:12

View file

@ -1,150 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "ChannelProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* This information can be encoded as a QRcode/url so that other users can configure
* their radio to join the same channel.
* A note about how channel names are shown to users: channelname-X
* poundsymbol is a prefix used to indicate this is a channel name (idea from @professr).
* Where X is a letter from A-Z (base 26) representing a hash of the PSK for this
* channel - so that if the user changes anything about the channel (which does
* force a new PSK) this letter will also change. Thus preventing user confusion if
* two friends try to type in a channel name of "BobsChan" and then can't talk
* because their PSKs will be different.
* The PSK is hashed into this letter by "0x41 + [xor all bytes of the psk ] modulo 26"
* This also allows the option of someday if people have the PSK off (zero), the
* users COULD type in a channel name and be able to talk.
* FIXME: Add description of multi-channel support and how primary vs secondary channels are used.
* FIXME: explain how apps use channels for security.
* explain how remote settings and remote gpio are managed as an example
*/
message ChannelSettings {
/*
* Deprecated in favor of LoraConfig.channel_num
*/
uint32 channel_num = 1 [deprecated = true];
/*
* A simple pre-shared key for now for crypto.
* Must be either 0 bytes (no crypto), 16 bytes (AES128), or 32 bytes (AES256).
* A special shorthand is used for 1 byte long psks.
* These psks should be treated as only minimally secure,
* because they are listed in this source code.
* Those bytes are mapped using the following scheme:
* `0` = No crypto
* `1` = The special "default" channel key: {0xd4, 0xf1, 0xbb, 0x3a, 0x20, 0x29, 0x07, 0x59, 0xf0, 0xbc, 0xff, 0xab, 0xcf, 0x4e, 0x69, 0x01}
* `2` through 10 = The default channel key, except with 1 through 9 added to the last byte.
* Shown to user as simple1 through 10
*/
bytes psk = 2;
/*
* A SHORT name that will be packed into the URL.
* Less than 12 bytes.
* Something for end users to call the channel
* If this is the empty string it is assumed that this channel
* is the special (minimally secure) "Default"channel.
* In user interfaces it should be rendered as a local language translation of "X".
* For channel_num hashing empty string will be treated as "X".
* Where "X" is selected based on the English words listed above for ModemPreset
*/
string name = 3;
/*
* Used to construct a globally unique channel ID.
* The full globally unique ID will be: "name.id" where ID is shown as base36.
* Assuming that the number of meshtastic users is below 20K (true for a long time)
* the chance of this 64 bit random number colliding with anyone else is super low.
* And the penalty for collision is low as well, it just means that anyone trying to decrypt channel messages might need to
* try multiple candidate channels.
* Any time a non wire compatible change is made to a channel, this field should be regenerated.
* There are a small number of 'special' globally known (and fairly) insecure standard channels.
* Those channels do not have a numeric id included in the settings, but instead it is pulled from
* a table of well known IDs.
* (see Well Known Channels FIXME)
*/
fixed32 id = 4;
/*
* If true, messages on the mesh will be sent to the *public* internet by any gateway ndoe
*/
bool uplink_enabled = 5;
/*
* If true, messages seen on the internet will be forwarded to the local mesh.
*/
bool downlink_enabled = 6;
/*
* Per-channel module settings.
*/
ModuleSettings module_settings = 7;
}
/*
* This message is specifically for modules to store per-channel configuration data.
*/
message ModuleSettings {
/*
* Bits of precision for the location sent in position packets.
*/
uint32 position_precision = 1;
}
/*
* A pair of a channel number, mode and the (sharable) settings for that channel
*/
message Channel {
/*
* How this channel is being used (or not).
* Note: this field is an enum to give us options for the future.
* In particular, someday we might make a 'SCANNING' option.
* SCANNING channels could have different frequencies and the radio would
* occasionally check that freq to see if anything is being transmitted.
* For devices that have multiple physical radios attached, we could keep multiple PRIMARY/SCANNING channels active at once to allow
* cross band routing as needed.
* If a device has only a single radio (the common case) only one channel can be PRIMARY at a time
* (but any number of SECONDARY channels can't be sent received on that common frequency)
*/
enum Role {
/*
* This channel is not in use right now
*/
DISABLED = 0;
/*
* This channel is used to set the frequency for the radio - all other enabled channels must be SECONDARY
*/
PRIMARY = 1;
/*
* Secondary channels are only used for encryption/decryption/authentication purposes.
* Their radio settings (freq etc) are ignored, only psk is used.
*/
SECONDARY = 2;
}
/*
* The index of this channel in the channel table (from 0 to MAX_NUM_CHANNELS-1)
* (Someday - not currently implemented) An index of -1 could be used to mean "set by name",
* in which case the target node will find and set the channel by settings.name.
*/
int32 index = 1;
/*
* The new settings, or NULL to disable that channel
*/
ChannelSettings settings = 2;
/*
* TODO: REPLACE
*/
Role role = 3;
}

View file

@ -1,2 +0,0 @@
*DeviceProfile.long_name max_size:40
*DeviceProfile.short_name max_size:5

View file

@ -1,50 +0,0 @@
syntax = "proto3";
package meshtastic;
import "meshtastic/localonly.proto";
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "ClientOnlyProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* This abstraction is used to contain any configuration for provisioning a node on any client.
* It is useful for importing and exporting configurations.
*/
message DeviceProfile {
/*
* Long name for the node
*/
optional string long_name = 1;
/*
* Short name of the node
*/
optional string short_name = 2;
/*
* The url of the channels from our node
*/
optional string channel_url = 3;
/*
* The Config of the node
*/
optional LocalConfig config = 4;
/*
* The ModuleConfig of the node
*/
optional LocalModuleConfig module_config = 5;
}
/*
* A heartbeat message is sent by a node to indicate that it is still alive.
* This is currently only needed to keep serial connections alive.
*/
message Heartbeat {
}

View file

@ -1,14 +0,0 @@
*NetworkConfig.wifi_ssid max_size:33
*NetworkConfig.wifi_psk max_size:65
*NetworkConfig.ntp_server max_size:33
*NetworkConfig.rsyslog_server max_size:33
# Max of three ignored nodes for our testing
*LoRaConfig.ignore_incoming max_count:3
*LoRaConfig.tx_power int_size:8
*LoRaConfig.bandwidth int_size:16
*LoRaConfig.coding_rate int_size:8
*LoRaConfig.channel_num int_size:16
*PowerConfig.device_battery_ina_address int_size:8

View file

@ -1,986 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "ConfigProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
message Config {
/*
* Configuration
*/
message DeviceConfig {
/*
* Defines the device's role on the Mesh network
*/
enum Role {
/*
* Description: App connected or stand alone messaging device.
* Technical Details: Default Role
*/
CLIENT = 0;
/*
* Description: Device that does not forward packets from other devices.
*/
CLIENT_MUTE = 1;
/*
* Description: Infrastructure node for extending network coverage by relaying messages. Visible in Nodes list.
* Technical Details: Mesh packets will prefer to be routed over this node. This node will not be used by client apps.
* The wifi radio and the oled screen will be put to sleep.
* This mode may still potentially have higher power usage due to it's preference in message rebroadcasting on the mesh.
*/
ROUTER = 2;
/*
* Description: Combination of both ROUTER and CLIENT. Not for mobile devices.
*/
ROUTER_CLIENT = 3;
/*
* Description: Infrastructure node for extending network coverage by relaying messages with minimal overhead. Not visible in Nodes list.
* Technical Details: Mesh packets will simply be rebroadcasted over this node. Nodes configured with this role will not originate NodeInfo, Position, Telemetry
* or any other packet type. They will simply rebroadcast any mesh packets on the same frequency, channel num, spread factor, and coding rate.
*/
REPEATER = 4;
/*
* Description: Broadcasts GPS position packets as priority.
* Technical Details: Position Mesh packets will be prioritized higher and sent more frequently by default.
* When used in conjunction with power.is_power_saving = true, nodes will wake up,
* send position, and then sleep for position.position_broadcast_secs seconds.
*/
TRACKER = 5;
/*
* Description: Broadcasts telemetry packets as priority.
* Technical Details: Telemetry Mesh packets will be prioritized higher and sent more frequently by default.
* When used in conjunction with power.is_power_saving = true, nodes will wake up,
* send environment telemetry, and then sleep for telemetry.environment_update_interval seconds.
*/
SENSOR = 6;
/*
* Description: Optimized for ATAK system communication and reduces routine broadcasts.
* Technical Details: Used for nodes dedicated for connection to an ATAK EUD.
* Turns off many of the routine broadcasts to favor CoT packet stream
* from the Meshtastic ATAK plugin -> IMeshService -> Node
*/
TAK = 7;
/*
* Description: Device that only broadcasts as needed for stealth or power savings.
* Technical Details: Used for nodes that "only speak when spoken to"
* Turns all of the routine broadcasts but allows for ad-hoc communication
* Still rebroadcasts, but with local only rebroadcast mode (known meshes only)
* Can be used for clandestine operation or to dramatically reduce airtime / power consumption
*/
CLIENT_HIDDEN = 8;
/*
* Description: Broadcasts location as message to default channel regularly for to assist with device recovery.
* Technical Details: Used to automatically send a text message to the mesh
* with the current position of the device on a frequent interval:
* "I'm lost! Position: lat / long"
*/
LOST_AND_FOUND = 9;
/*
* Description: Enables automatic TAK PLI broadcasts and reduces routine broadcasts.
* Technical Details: Turns off many of the routine broadcasts to favor ATAK CoT packet stream
* and automatic TAK PLI (position location information) broadcasts.
* Uses position module configuration to determine TAK PLI broadcast interval.
*/
TAK_TRACKER = 10;
/*
* Description: Will always rebroadcast packets, but will do so after all other modes.
* Technical Details: Used for router nodes that are intended to provide additional coverage
* in areas not already covered by other routers, or to bridge around problematic terrain,
* but should not be given priority over other routers in order to avoid unnecessaraily
* consuming hops.
*/
ROUTER_LATE = 11;
}
/*
* Defines the device's behavior for how messages are rebroadcast
*/
enum RebroadcastMode {
/*
* Default behavior.
* Rebroadcast any observed message, if it was on our private channel or from another mesh with the same lora params.
*/
ALL = 0;
/*
* Same as behavior as ALL but skips packet decoding and simply rebroadcasts them.
* Only available in Repeater role. Setting this on any other roles will result in ALL behavior.
*/
ALL_SKIP_DECODING = 1;
/*
* Ignores observed messages from foreign meshes that are open or those which it cannot decrypt.
* Only rebroadcasts message on the nodes local primary / secondary channels.
*/
LOCAL_ONLY = 2;
/*
* Ignores observed messages from foreign meshes like LOCAL_ONLY,
* but takes it step further by also ignoring messages from nodenums not in the node's known list (NodeDB)
*/
KNOWN_ONLY = 3;
}
/*
* Sets the role of node
*/
Role role = 1;
/*
* Disabling this will disable the SerialConsole by not initilizing the StreamAPI
*/
bool serial_enabled = 2;
/*
* By default we turn off logging as soon as an API client connects (to keep shared serial link quiet).
* Set this to true to leave the debug log outputting even when API is active.
*/
bool debug_log_enabled = 3;
/*
* For boards without a hard wired button, this is the pin number that will be used
* Boards that have more than one button can swap the function with this one. defaults to BUTTON_PIN if defined.
*/
uint32 button_gpio = 4;
/*
* For boards without a PWM buzzer, this is the pin number that will be used
* Defaults to PIN_BUZZER if defined.
*/
uint32 buzzer_gpio = 5;
/*
* Sets the role of node
*/
RebroadcastMode rebroadcast_mode = 6;
/*
* Send our nodeinfo this often
* Defaults to 900 Seconds (15 minutes)
*/
uint32 node_info_broadcast_secs = 7;
/*
* Treat double tap interrupt on supported accelerometers as a button press if set to true
*/
bool double_tap_as_button_press = 8;
/*
* If true, device is considered to be "managed" by a mesh administrator
* Clients should then limit available configuration and administrative options inside the user interface
*/
bool is_managed = 9;
/*
* Disables the triple-press of user button to enable or disable GPS
*/
bool disable_triple_click = 10;
}
/*
* Position Config
*/
message PositionConfig {
/*
* Bit field of boolean configuration options, indicating which optional
* fields to include when assembling POSITION messages.
* Longitude, latitude, altitude, speed, heading, and DOP
* are always included (also time if GPS-synced)
* NOTE: the more fields are included, the larger the message will be -
* leading to longer airtime and a higher risk of packet loss
*/
enum PositionFlags {
/*
* Required for compilation
*/
UNSET = 0x0000;
/*
* Include an altitude value (if available)
*/
ALTITUDE = 0x0001;
/*
* Altitude value is MSL
*/
ALTITUDE_MSL = 0x0002;
/*
* Include geoidal separation
*/
GEOIDAL_SEPARATION = 0x0004;
/*
* Include the DOP value ; PDOP used by default, see below
*/
DOP = 0x0008;
/*
* If POS_DOP set, send separate HDOP / VDOP values instead of PDOP
*/
HVDOP = 0x0010;
/*
* Include number of "satellites in view"
*/
SATINVIEW = 0x0020;
/*
* Include a sequence number incremented per packet
*/
SEQ_NO = 0x0040;
/*
* Include positional timestamp (from GPS solution)
*/
TIMESTAMP = 0x0080;
/*
* Include positional heading
* Intended for use with vehicle not walking speeds
* walking speeds are likely to be error prone like the compass
*/
HEADING = 0x0100;
/*
* Include positional speed
* Intended for use with vehicle not walking speeds
* walking speeds are likely to be error prone like the compass
*/
SPEED = 0x0200;
}
enum GpsMode {
/*
* GPS is present but disabled
*/
DISABLED = 0;
/*
* GPS is present and enabled
*/
ENABLED = 1;
/*
* GPS is not present on the device
*/
NOT_PRESENT = 2;
}
/*
* We should send our position this often (but only if it has changed significantly)
* Defaults to 15 minutes
*/
uint32 position_broadcast_secs = 1;
/*
* Adaptive position braoadcast, which is now the default.
*/
bool position_broadcast_smart_enabled = 2;
/*
* If set, this node is at a fixed position.
* We will generate GPS position updates at the regular interval, but use whatever the last lat/lon/alt we have for the node.
* The lat/lon/alt can be set by an internal GPS or with the help of the app.
*/
bool fixed_position = 3;
/*
* Is GPS enabled for this node?
*/
bool gps_enabled = 4[deprecated = true];
/*
* How often should we try to get GPS position (in seconds)
* or zero for the default of once every 30 seconds
* or a very large value (maxint) to update only once at boot.
*/
uint32 gps_update_interval = 5;
/*
* Deprecated in favor of using smart / regular broadcast intervals as implicit attempt time
*/
uint32 gps_attempt_time = 6 [deprecated = true];
/*
* Bit field of boolean configuration options for POSITION messages
* (bitwise OR of PositionFlags)
*/
uint32 position_flags = 7;
/*
* (Re)define GPS_RX_PIN for your board.
*/
uint32 rx_gpio = 8;
/*
* (Re)define GPS_TX_PIN for your board.
*/
uint32 tx_gpio = 9;
/*
* The minimum distance in meters traveled (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled
*/
uint32 broadcast_smart_minimum_distance = 10;
/*
* The minimum number of seconds (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled
*/
uint32 broadcast_smart_minimum_interval_secs = 11;
/*
* (Re)define PIN_GPS_EN for your board.
*/
uint32 gps_en_gpio = 12;
/*
* Set where GPS is enabled, disabled, or not present
*/
GpsMode gps_mode = 13;
}
/*
* Power Config\
* See [Power Config](/docs/settings/config/power) for additional power config details.
*/
message PowerConfig {
/*
* If set, we are powered from a low-current source (i.e. solar), so even if it looks like we have power flowing in
* we should try to minimize power consumption as much as possible.
* YOU DO NOT NEED TO SET THIS IF YOU'VE set is_router (it is implied in that case).
* Advanced Option
*/
bool is_power_saving = 1;
/*
* If non-zero, the device will fully power off this many seconds after external power is removed.
*/
uint32 on_battery_shutdown_after_secs = 2;
/*
* Ratio of voltage divider for battery pin eg. 3.20 (R1=100k, R2=220k)
* Overrides the ADC_MULTIPLIER defined in variant for battery voltage calculation.
* Should be set to floating point value between 2 and 4
* Fixes issues on Heltec v2
*/
float adc_multiplier_override = 3;
/*
* Wait Bluetooth Seconds
* The number of seconds for to wait before turning off BLE in No Bluetooth states
* 0 for default of 1 minute
*/
uint32 wait_bluetooth_secs = 4;
/*
* Super Deep Sleep Seconds
* While in Light Sleep if mesh_sds_timeout_secs is exceeded we will lower into super deep sleep
* for this value (default 1 year) or a button press
* 0 for default of one year
*/
uint32 sds_secs = 6;
/*
* Light Sleep Seconds
* In light sleep the CPU is suspended, LoRa radio is on, BLE is off an GPS is on
* ESP32 Only
* 0 for default of 300
*/
uint32 ls_secs = 7;
/*
* Minimum Wake Seconds
* While in light sleep when we receive packets on the LoRa radio we will wake and handle them and stay awake in no BLE mode for this value
* 0 for default of 10 seconds
*/
uint32 min_wake_secs = 8;
/*
* I2C address of INA_2XX to use for reading device battery voltage
*/
uint32 device_battery_ina_address = 9;
}
/*
* Network Config
*/
message NetworkConfig {
enum AddressMode {
/*
* obtain ip address via DHCP
*/
DHCP = 0;
/*
* use static ip address
*/
STATIC = 1;
}
message IpV4Config {
/*
* Static IP address
*/
fixed32 ip = 1;
/*
* Static gateway address
*/
fixed32 gateway = 2;
/*
* Static subnet mask
*/
fixed32 subnet = 3;
/*
* Static DNS server address
*/
fixed32 dns = 4;
}
/*
* Enable WiFi (disables Bluetooth)
*/
bool wifi_enabled = 1;
/*
* If set, this node will try to join the specified wifi network and
* acquire an address via DHCP
*/
string wifi_ssid = 3;
/*
* If set, will be use to authenticate to the named wifi
*/
string wifi_psk = 4;
/*
* NTP server to use if WiFi is conneced, defaults to `0.pool.ntp.org`
*/
string ntp_server = 5;
/*
* Enable Ethernet
*/
bool eth_enabled = 6;
/*
* acquire an address via DHCP or assign static
*/
AddressMode address_mode = 7;
/*
* struct to keep static address
*/
IpV4Config ipv4_config = 8;
/*
* rsyslog Server and Port
*/
string rsyslog_server = 9;
}
/*
* Display Config
*/
message DisplayConfig {
/*
* How the GPS coordinates are displayed on the OLED screen.
*/
enum GpsCoordinateFormat {
/*
* GPS coordinates are displayed in the normal decimal degrees format:
* DD.DDDDDD DDD.DDDDDD
*/
DEC = 0;
/*
* GPS coordinates are displayed in the degrees minutes seconds format:
* DD°MM'SS"C DDD°MM'SS"C, where C is the compass point representing the locations quadrant
*/
DMS = 1;
/*
* Universal Transverse Mercator format:
* ZZB EEEEEE NNNNNNN, where Z is zone, B is band, E is easting, N is northing
*/
UTM = 2;
/*
* Military Grid Reference System format:
* ZZB CD EEEEE NNNNN, where Z is zone, B is band, C is the east 100k square, D is the north 100k square,
* E is easting, N is northing
*/
MGRS = 3;
/*
* Open Location Code (aka Plus Codes).
*/
OLC = 4;
/*
* Ordnance Survey Grid Reference (the National Grid System of the UK).
* Format: AB EEEEE NNNNN, where A is the east 100k square, B is the north 100k square,
* E is the easting, N is the northing
*/
OSGR = 5;
}
/*
* Unit display preference
*/
enum DisplayUnits {
/*
* Metric (Default)
*/
METRIC = 0;
/*
* Imperial
*/
IMPERIAL = 1;
}
/*
* Override OLED outo detect with this if it fails.
*/
enum OledType {
/*
* Default / Auto
*/
OLED_AUTO = 0;
/*
* Default / Auto
*/
OLED_SSD1306 = 1;
/*
* Default / Auto
*/
OLED_SH1106 = 2;
/*
* Can not be auto detected but set by proto. Used for 128x128 screens
*/
OLED_SH1107 = 3;
}
/*
* Number of seconds the screen stays on after pressing the user button or receiving a message
* 0 for default of one minute MAXUINT for always on
*/
uint32 screen_on_secs = 1;
/*
* How the GPS coordinates are formatted on the OLED screen.
*/
GpsCoordinateFormat gps_format = 2;
/*
* Automatically toggles to the next page on the screen like a carousel, based the specified interval in seconds.
* Potentially useful for devices without user buttons.
*/
uint32 auto_screen_carousel_secs = 3;
/*
* If this is set, the displayed compass will always point north. if unset, the old behaviour
* (top of display is heading direction) is used.
*/
bool compass_north_top = 4;
/*
* Flip screen vertically, for cases that mount the screen upside down
*/
bool flip_screen = 5;
/*
* Perferred display units
*/
DisplayUnits units = 6;
/*
* Override auto-detect in screen
*/
OledType oled = 7;
enum DisplayMode {
/*
* Default. The old style for the 128x64 OLED screen
*/
DEFAULT = 0;
/*
* Rearrange display elements to cater for bicolor OLED displays
*/
TWOCOLOR = 1;
/*
* Same as TwoColor, but with inverted top bar. Not so good for Epaper displays
*/
INVERTED = 2;
/*
* TFT Full Color Displays (not implemented yet)
*/
COLOR = 3;
}
/*
* Display Mode
*/
DisplayMode displaymode = 8;
/*
* Print first line in pseudo-bold? FALSE is original style, TRUE is bold
*/
bool heading_bold = 9;
/*
* Should we wake the screen up on accelerometer detected motion or tap
*/
bool wake_on_tap_or_motion = 10;
}
/*
* Lora Config
*/
message LoRaConfig {
enum RegionCode {
/*
* Region is not set
*/
UNSET = 0;
/*
* United States
*/
US = 1;
/*
* European Union 433mhz
*/
EU_433 = 2;
/*
* European Union 868mhz
*/
EU_868 = 3;
/*
* China
*/
CN = 4;
/*
* Japan
*/
JP = 5;
/*
* Australia / New Zealand
*/
ANZ = 6;
/*
* Korea
*/
KR = 7;
/*
* Taiwan
*/
TW = 8;
/*
* Russia
*/
RU = 9;
/*
* India
*/
IN = 10;
/*
* New Zealand 865mhz
*/
NZ_865 = 11;
/*
* Thailand
*/
TH = 12;
/*
* WLAN Band
*/
LORA_24 = 13;
/*
* Ukraine 433mhz
*/
UA_433 = 14;
/*
* Ukraine 868mhz
*/
UA_868 = 15;
/*
* Malaysia 433mhz
*/
MY_433 = 16;
/*
* Malaysia 919mhz
*/
MY_919 = 17;
/*
* Singapore 923mhz
*/
SG_923 = 18;
/*
* Philippines 433mhz
*/
PH_433 = 19;
/*
* Philippines 868mhz
*/
PH_868 = 20;
/*
* Philippines 915mhz
*/
PH_915 = 21;
}
/*
* Standard predefined channel settings
* Note: these mappings must match ModemPreset Choice in the device code.
*/
enum ModemPreset {
/*
* Long Range - Fast
*/
LONG_FAST = 0;
/*
* Long Range - Slow
*/
LONG_SLOW = 1;
/*
* Very Long Range - Slow
*/
VERY_LONG_SLOW = 2;
/*
* Medium Range - Slow
*/
MEDIUM_SLOW = 3;
/*
* Medium Range - Fast
*/
MEDIUM_FAST = 4;
/*
* Short Range - Slow
*/
SHORT_SLOW = 5;
/*
* Short Range - Fast
*/
SHORT_FAST = 6;
/*
* Long Range - Moderately Fast
*/
LONG_MODERATE = 7;
/*
* Short Range - Turbo
* This is the fastest preset and the only one with 500kHz bandwidth.
* It is not legal to use in all regions due to this wider bandwidth.
*/
SHORT_TURBO = 8;
}
/*
* When enabled, the `modem_preset` fields will be adhered to, else the `bandwidth`/`spread_factor`/`coding_rate`
* will be taked from their respective manually defined fields
*/
bool use_preset = 1;
/*
* Either modem_config or bandwidth/spreading/coding will be specified - NOT BOTH.
* As a heuristic: If bandwidth is specified, do not use modem_config.
* Because protobufs take ZERO space when the value is zero this works out nicely.
* This value is replaced by bandwidth/spread_factor/coding_rate.
* If you'd like to experiment with other options add them to MeshRadio.cpp in the device code.
*/
ModemPreset modem_preset = 2;
/*
* Bandwidth in MHz
* Certain bandwidth numbers are 'special' and will be converted to the
* appropriate floating point value: 31 -> 31.25MHz
*/
uint32 bandwidth = 3;
/*
* A number from 7 to 12.
* Indicates number of chirps per symbol as 1<<spread_factor.
*/
uint32 spread_factor = 4;
/*
* The denominator of the coding rate.
* ie for 4/5, the value is 5. 4/8 the value is 8.
*/
uint32 coding_rate = 5;
/*
* This parameter is for advanced users with advanced test equipment, we do not recommend most users use it.
* A frequency offset that is added to to the calculated band center frequency.
* Used to correct for crystal calibration errors.
*/
float frequency_offset = 6;
/*
* The region code for the radio (US, CN, EU433, etc...)
*/
RegionCode region = 7;
/*
* Maximum number of hops. This can't be greater than 7.
* Default of 3
* Attempting to set a value > 7 results in the default
*/
uint32 hop_limit = 8;
/*
* Disable TX from the LoRa radio. Useful for hot-swapping antennas and other tests.
* Defaults to false
*/
bool tx_enabled = 9;
/*
* If zero, then use default max legal continuous power (ie. something that won't
* burn out the radio hardware)
* In most cases you should use zero here.
* Units are in dBm.
*/
int32 tx_power = 10;
/*
* This controls the actual hardware frequency the radio transmits on.
* Most users should never need to be exposed to this field/concept.
* A channel number between 1 and NUM_CHANNELS (whatever the max is in the current region).
* If ZERO then the rule is "use the old channel name hash based
* algorithm to derive the channel number")
* If using the hash algorithm the channel number will be: hash(channel_name) %
* NUM_CHANNELS (Where num channels depends on the regulatory region).
*/
uint32 channel_num = 11;
/*
* If true, duty cycle limits will be exceeded and thus you're possibly not following
* the local regulations if you're not a HAM.
* Has no effect if the duty cycle of the used region is 100%.
*/
bool override_duty_cycle = 12;
/*
* If true, sets RX boosted gain mode on SX126X based radios
*/
bool sx126x_rx_boosted_gain = 13;
/*
* This parameter is for advanced users and licensed HAM radio operators.
* Ignore Channel Calculation and use this frequency instead. The frequency_offset
* will still be applied. This will allow you to use out-of-band frequencies.
* Please respect your local laws and regulations. If you are a HAM, make sure you
* enable HAM mode and turn off encryption.
*/
float override_frequency = 14;
/*
* For testing it is useful sometimes to force a node to never listen to
* particular other nodes (simulating radio out of range). All nodenums listed
* in ignore_incoming will have packets they send dropped on receive (by router.cpp)
*/
repeated uint32 ignore_incoming = 103;
/*
* If true, the device will not process any packets received via LoRa that passed via MQTT anywhere on the path towards it.
*/
bool ignore_mqtt = 104;
}
message BluetoothConfig {
enum PairingMode {
/*
* Device generates a random PIN that will be shown on the screen of the device for pairing
*/
RANDOM_PIN = 0;
/*
* Device requires a specified fixed PIN for pairing
*/
FIXED_PIN = 1;
/*
* Device requires no PIN for pairing
*/
NO_PIN = 2;
}
/*
* Enable Bluetooth on the device
*/
bool enabled = 1;
/*
* Determines the pairing strategy for the device
*/
PairingMode mode = 2;
/*
* Specified PIN for PairingMode.FixedPin
*/
uint32 fixed_pin = 3;
}
/*
* Payload Variant
*/
oneof payload_variant {
DeviceConfig device = 1;
PositionConfig position = 2;
PowerConfig power = 3;
NetworkConfig network = 4;
DisplayConfig display = 5;
LoRaConfig lora = 6;
BluetoothConfig bluetooth = 7;
}
}

View file

@ -1 +0,0 @@
*WifiConnectionStatus.ssid max_size:33

View file

@ -1,120 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "ConnStatusProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
message DeviceConnectionStatus {
/*
* WiFi Status
*/
optional WifiConnectionStatus wifi = 1;
/*
* WiFi Status
*/
optional EthernetConnectionStatus ethernet = 2;
/*
* Bluetooth Status
*/
optional BluetoothConnectionStatus bluetooth = 3;
/*
* Serial Status
*/
optional SerialConnectionStatus serial = 4;
}
/*
* WiFi connection status
*/
message WifiConnectionStatus {
/*
* Connection status
*/
NetworkConnectionStatus status = 1;
/*
* WiFi access point SSID
*/
string ssid = 2;
/*
* RSSI of wireless connection
*/
int32 rssi = 3;
}
/*
* Ethernet connection status
*/
message EthernetConnectionStatus {
/*
* Connection status
*/
NetworkConnectionStatus status = 1;
}
/*
* Ethernet or WiFi connection status
*/
message NetworkConnectionStatus {
/*
* IP address of device
*/
fixed32 ip_address = 1;
/*
* Whether the device has an active connection or not
*/
bool is_connected = 2;
/*
* Whether the device has an active connection to an MQTT broker or not
*/
bool is_mqtt_connected = 3;
/*
* Whether the device is actively remote syslogging or not
*/
bool is_syslog_connected = 4;
}
/*
* Bluetooth connection status
*/
message BluetoothConnectionStatus {
/*
* The pairing PIN for bluetooth
*/
uint32 pin = 1;
/*
* RSSI of bluetooth connection
*/
int32 rssi = 2;
/*
* Whether the device has an active connection or not
*/
bool is_connected = 3;
}
/*
* Serial connection status
*/
message SerialConnectionStatus {
/*
* Serial baud rate
*/
uint32 baud = 1;
/*
* Whether the device has an active connection or not
*/
bool is_connected = 2;
}

View file

@ -1,19 +0,0 @@
# options for nanopb
# https://jpa.kapsi.fi/nanopb/docs/reference.html#proto-file-options
# FIXME pick a higher number someday? or do dynamic alloc in nanopb?
*DeviceState.node_db_lite max_count:100
# FIXME - max_count is actually 32 but we save/load this as one long string of preencoded MeshPacket bytes - not a big array in RAM
*DeviceState.receive_queue max_count:1
*ChannelFile.channels max_count:8
*OEMStore.oem_text max_size:40
*OEMStore.oem_icon_bits max_size:2048
*OEMStore.oem_aes_key max_size:32
*DeviceState.node_remote_hardware_pins max_count:12
*NodeInfoLite.channel int_size:8
*NodeInfoLite.hops_away int_size:8

View file

@ -1,262 +0,0 @@
syntax = "proto3";
package meshtastic;
import "meshtastic/channel.proto";
import "meshtastic/localonly.proto";
import "meshtastic/mesh.proto";
import "meshtastic/telemetry.proto";
import "meshtastic/module_config.proto";
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "DeviceOnly";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* This message is never sent over the wire, but it is used for serializing DB
* state to flash in the device code
* FIXME, since we write this each time we enter deep sleep (and have infinite
* flash) it would be better to use some sort of append only data structure for
* the receive queue and use the preferences store for the other stuff
*/
message DeviceState {
/*
* Read only settings/info about this node
*/
MyNodeInfo my_node = 2;
/*
* My owner info
*/
User owner = 3;
/*
* Received packets saved for delivery to the phone
*/
repeated MeshPacket receive_queue = 5;
/*
* A version integer used to invalidate old save files when we make
* incompatible changes This integer is set at build time and is private to
* NodeDB.cpp in the device code.
*/
uint32 version = 8;
/*
* We keep the last received text message (only) stored in the device flash,
* so we can show it on the screen.
* Might be null
*/
MeshPacket rx_text_message = 7;
/*
* Used only during development.
* Indicates developer is testing and changes should never be saved to flash.
*/
bool no_save = 9;
/*
* Some GPS receivers seem to have bogus settings from the factory, so we always do one factory reset.
*/
bool did_gps_reset = 11;
/*
* We keep the last received waypoint stored in the device flash,
* so we can show it on the screen.
* Might be null
*/
MeshPacket rx_waypoint = 12;
/*
* The mesh's nodes with their available gpio pins for RemoteHardware module
*/
repeated NodeRemoteHardwarePin node_remote_hardware_pins = 13;
/*
* New lite version of NodeDB to decrease memory footprint
*/
repeated NodeInfoLite node_db_lite = 14;
}
message NodeInfoLite {
/*
* The node number
*/
uint32 num = 1;
/*
* The user info for this node
*/
User user = 2;
/*
* This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true.
* Position.time now indicates the last time we received a POSITION from that node.
*/
PositionLite position = 3;
/*
* Returns the Signal-to-noise ratio (SNR) of the last received message,
* as measured by the receiver. Return SNR of the last received message in dB
*/
float snr = 4;
/*
* Set to indicate the last time we received a packet from this node
*/
fixed32 last_heard = 5;
/*
* The latest device metrics for the node.
*/
DeviceMetrics device_metrics = 6;
/*
* local channel index we heard that node on. Only populated if its not the default channel.
*/
uint32 channel = 7;
/*
* True if we witnessed the node over MQTT instead of LoRA transport
*/
bool via_mqtt = 8;
/*
* Number of hops away from us this node is (0 if adjacent)
*/
uint32 hops_away = 9;
}
/*
* Position with static location information only for NodeDBLite
*/
message PositionLite {
/*
* The new preferred location encoding, multiply by 1e-7 to get degrees
* in floating point
*/
sfixed32 latitude_i = 1;
/*
* TODO: REPLACE
*/
sfixed32 longitude_i = 2;
/*
* In meters above MSL (but see issue #359)
*/
int32 altitude = 3;
/*
* This is usually not sent over the mesh (to save space), but it is sent
* from the phone so that the local device can set its RTC If it is sent over
* the mesh (because there are devices on the mesh without GPS), it will only
* be sent by devices which has a hardware GPS clock.
* seconds since 1970
*/
fixed32 time = 4;
/*
* TODO: REPLACE
*/
Position.LocSource location_source = 5;
}
/*
* The on-disk saved channels
*/
message ChannelFile {
/*
* The channels our node knows about
*/
repeated Channel channels = 1;
/*
* A version integer used to invalidate old save files when we make
* incompatible changes This integer is set at build time and is private to
* NodeDB.cpp in the device code.
*/
uint32 version = 2;
}
/*
* TODO: REPLACE
*/
enum ScreenFonts {
/*
* TODO: REPLACE
*/
FONT_SMALL = 0;
/*
* TODO: REPLACE
*/
FONT_MEDIUM = 1;
/*
* TODO: REPLACE
*/
FONT_LARGE = 2;
}
/*
* This can be used for customizing the firmware distribution. If populated,
* show a secondary bootup screen with custom logo and text for 2.5 seconds.
*/
message OEMStore {
/*
* The Logo width in Px
*/
uint32 oem_icon_width = 1;
/*
* The Logo height in Px
*/
uint32 oem_icon_height = 2;
/*
* The Logo in XBM bytechar format
*/
bytes oem_icon_bits = 3;
/*
* Use this font for the OEM text.
*/
ScreenFonts oem_font = 4;
/*
* Use this font for the OEM text.
*/
string oem_text = 5;
/*
* The default device encryption key, 16 or 32 byte
*/
bytes oem_aes_key = 6;
/*
* A Preset LocalConfig to apply during factory reset
*/
LocalConfig oem_local_config = 7;
/*
* A Preset LocalModuleConfig to apply during factory reset
*/
LocalModuleConfig oem_local_module_config = 8;
}
/*
* RemoteHardwarePins associated with a node
*/
message NodeRemoteHardwarePin {
/*
* The node_num exposing the available gpio pin
*/
uint32 node_num = 1;
/*
* The the available gpio pin for usage with RemoteHardware module
*/
RemoteHardwarePin pin = 2;
}

View file

@ -1,135 +0,0 @@
syntax = "proto3";
package meshtastic;
import "meshtastic/config.proto";
import "meshtastic/module_config.proto";
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "LocalOnlyProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* Protobuf structures common to apponly.proto and deviceonly.proto
* This is never sent over the wire, only for local use
*/
message LocalConfig {
/*
* The part of the config that is specific to the Device
*/
Config.DeviceConfig device = 1;
/*
* The part of the config that is specific to the GPS Position
*/
Config.PositionConfig position = 2;
/*
* The part of the config that is specific to the Power settings
*/
Config.PowerConfig power = 3;
/*
* The part of the config that is specific to the Wifi Settings
*/
Config.NetworkConfig network = 4;
/*
* The part of the config that is specific to the Display
*/
Config.DisplayConfig display = 5;
/*
* The part of the config that is specific to the Lora Radio
*/
Config.LoRaConfig lora = 6;
/*
* The part of the config that is specific to the Bluetooth settings
*/
Config.BluetoothConfig bluetooth = 7;
/*
* A version integer used to invalidate old save files when we make
* incompatible changes This integer is set at build time and is private to
* NodeDB.cpp in the device code.
*/
uint32 version = 8;
}
message LocalModuleConfig {
/*
* The part of the config that is specific to the MQTT module
*/
ModuleConfig.MQTTConfig mqtt = 1;
/*
* The part of the config that is specific to the Serial module
*/
ModuleConfig.SerialConfig serial = 2;
/*
* The part of the config that is specific to the ExternalNotification module
*/
ModuleConfig.ExternalNotificationConfig external_notification = 3;
/*
* The part of the config that is specific to the Store & Forward module
*/
ModuleConfig.StoreForwardConfig store_forward = 4;
/*
* The part of the config that is specific to the RangeTest module
*/
ModuleConfig.RangeTestConfig range_test = 5;
/*
* The part of the config that is specific to the Telemetry module
*/
ModuleConfig.TelemetryConfig telemetry = 6;
/*
* The part of the config that is specific to the Canned Message module
*/
ModuleConfig.CannedMessageConfig canned_message = 7;
/*
* The part of the config that is specific to the Audio module
*/
ModuleConfig.AudioConfig audio = 9;
/*
* The part of the config that is specific to the Remote Hardware module
*/
ModuleConfig.RemoteHardwareConfig remote_hardware = 10;
/*
* The part of the config that is specific to the Neighbor Info module
*/
ModuleConfig.NeighborInfoConfig neighbor_info = 11;
/*
* The part of the config that is specific to the Ambient Lighting module
*/
ModuleConfig.AmbientLightingConfig ambient_lighting = 12;
/*
* The part of the config that is specific to the Detection Sensor module
*/
ModuleConfig.DetectionSensorConfig detection_sensor = 13;
/*
* Paxcounter Config
*/
ModuleConfig.PaxcounterConfig paxcounter = 14;
/*
* A version integer used to invalidate old save files when we make
* incompatible changes This integer is set at build time and is private to
* NodeDB.cpp in the device code.
*/
uint32 version = 8;
}

View file

@ -1,61 +0,0 @@
# options for nanopb
# https://jpa.kapsi.fi/nanopb/docs/reference.html#proto-file-options
*macaddr max_size:6 fixed_length:true # macaddrs
*id max_size:16 # node id strings
*User.long_name max_size:40
*User.short_name max_size:5
*RouteDiscovery.route max_count:8
# note: this payload length is ONLY the bytes that are sent inside of the Data protobuf (excluding protobuf overhead). The 16 byte header is
# outside of this envelope
*Data.payload max_size:237
*NodeInfo.channel int_size:8
*NodeInfo.hops_away int_size:8
# Big enough for 1.2.28.568032c-d
*MyNodeInfo.firmware_version max_size:18
*MyNodeInfo.air_period_tx max_count:8
*MyNodeInfo.air_period_rx max_count:8
# Note: the actual limit (because of header bytes) on the size of encrypted payloads is 251 bytes, but I use 256
# here because we might need to fill with zeros for padding to encryption block size (16 bytes per block)
*MeshPacket.encrypted max_size:256
*MeshPacket.payload_variant anonymous_oneof:true
*MeshPacket.hop_limit int_size:8
*MeshPacket.hop_start int_size:8
*MeshPacket.channel int_size:8
*QueueStatus.res int_size:8
*QueueStatus.free int_size:8
*QueueStatus.maxlen int_size:8
*ToRadio.payload_variant anonymous_oneof:true
*FromRadio.payload_variant anonymous_oneof:true
*Routing.variant anonymous_oneof:true
*LogRecord.message max_size:64
*LogRecord.source max_size:8
# MyMessage.name max_size:40
# or fixed_length or fixed_count, or max_count
#This value may want to be a few bytes smaller to compensate for the parent fields.
*Compressed.data max_size:237
*Waypoint.name max_size:30
*Waypoint.description max_size:100
*NeighborInfo.neighbors max_count:10
*DeviceMetadata.firmware_version max_size:18
*MqttClientProxyMessage.topic max_size:60
*MqttClientProxyMessage.data max_size:435
*MqttClientProxyMessage.text max_size:435

File diff suppressed because it is too large Load diff

View file

@ -1,28 +0,0 @@
*CannedMessageConfig.allow_input_source max_size:16
*MQTTConfig.address max_size:64
*MQTTConfig.username max_size:64
*MQTTConfig.password max_size:64
*MQTTConfig.root max_size:16
*AudioConfig.ptt_pin int_size:8
*AudioConfig.i2s_ws int_size:8
*AudioConfig.i2s_sd int_size:8
*AudioConfig.i2s_din int_size:8
*AudioConfig.i2s_sck int_size:8
*ExternalNotificationConfig.output_vibra int_size:8
*ExternalNotificationConfig.output_buzzer int_size:8
*ExternalNotificationConfig.nag_timeout int_size:16
*RemoteHardwareConfig.available_pins max_count:4
*RemoteHardwarePin.name max_size:15
*RemoteHardwarePin.gpio_pin int_size:8
*AmbientLightingConfig.current int_size:8
*AmbientLightingConfig.red int_size:8
*AmbientLightingConfig.green int_size:8
*AmbientLightingConfig.blue int_size:8
*DetectionSensorConfig.monitor_pin int_size:8
*DetectionSensorConfig.name max_size:20

View file

@ -1,801 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "ModuleConfigProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* Module Config
*/
message ModuleConfig {
/*
* MQTT Client Config
*/
message MQTTConfig {
/*
* If a meshtastic node is able to reach the internet it will normally attempt to gateway any channels that are marked as
* is_uplink_enabled or is_downlink_enabled.
*/
bool enabled = 1;
/*
* The server to use for our MQTT global message gateway feature.
* If not set, the default server will be used
*/
string address = 2;
/*
* MQTT username to use (most useful for a custom MQTT server).
* If using a custom server, this will be honoured even if empty.
* If using the default server, this will only be honoured if set, otherwise the device will use the default username
*/
string username = 3;
/*
* MQTT password to use (most useful for a custom MQTT server).
* If using a custom server, this will be honoured even if empty.
* If using the default server, this will only be honoured if set, otherwise the device will use the default password
*/
string password = 4;
/*
* Whether to send encrypted or decrypted packets to MQTT.
* This parameter is only honoured if you also set server
* (the default official mqtt.meshtastic.org server can handle encrypted packets)
* Decrypted packets may be useful for external systems that want to consume meshtastic packets
*/
bool encryption_enabled = 5;
/*
* Whether to send / consume json packets on MQTT
*/
bool json_enabled = 6;
/*
* If true, we attempt to establish a secure connection using TLS
*/
bool tls_enabled = 7;
/*
* The root topic to use for MQTT messages. Default is "msh".
* This is useful if you want to use a single MQTT server for multiple meshtastic networks and separate them via ACLs
*/
string root = 8;
/*
* If true, we can use the connected phone / client to proxy messages to MQTT instead of a direct connection
*/
bool proxy_to_client_enabled = 9;
/*
* If true, we will periodically report unencrypted information about our node to a map via MQTT
*/
bool map_reporting_enabled = 10;
/*
* Settings for reporting information about our node to a map via MQTT
*/
MapReportSettings map_report_settings = 11;
}
/*
* Settings for reporting unencrypted information about our node to a map via MQTT
*/
message MapReportSettings {
/*
* How often we should report our info to the map (in seconds)
*/
uint32 publish_interval_secs = 1;
/*
* Bits of precision for the location sent (default of 32 is full precision).
*/
uint32 position_precision = 2;
}
/*
* RemoteHardwareModule Config
*/
message RemoteHardwareConfig {
/*
* Whether the Module is enabled
*/
bool enabled = 1;
/*
* Whether the Module allows consumers to read / write to pins not defined in available_pins
*/
bool allow_undefined_pin_access = 2;
/*
* Exposes the available pins to the mesh for reading and writing
*/
repeated RemoteHardwarePin available_pins = 3;
}
/*
* NeighborInfoModule Config
*/
message NeighborInfoConfig {
/*
* Whether the Module is enabled
*/
bool enabled = 1;
/*
* Interval in seconds of how often we should try to send our
* Neighbor Info to the mesh
*/
uint32 update_interval = 2;
}
/*
* Detection Sensor Module Config
*/
message DetectionSensorConfig {
/*
* Whether the Module is enabled
*/
bool enabled = 1;
/*
* Interval in seconds of how often we can send a message to the mesh when a state change is detected
*/
uint32 minimum_broadcast_secs = 2;
/*
* Interval in seconds of how often we should send a message to the mesh with the current state regardless of changes
* When set to 0, only state changes will be broadcasted
* Works as a sort of status heartbeat for peace of mind
*/
uint32 state_broadcast_secs = 3;
/*
* Send ASCII bell with alert message
* Useful for triggering ext. notification on bell
*/
bool send_bell = 4;
/*
* Friendly name used to format message sent to mesh
* Example: A name "Motion" would result in a message "Motion detected"
* Maximum length of 20 characters
*/
string name = 5;
/*
* GPIO pin to monitor for state changes
*/
uint32 monitor_pin = 6;
/*
* Whether or not the GPIO pin state detection is triggered on HIGH (1)
* Otherwise LOW (0)
*/
bool detection_triggered_high = 7;
/*
* Whether or not use INPUT_PULLUP mode for GPIO pin
* Only applicable if the board uses pull-up resistors on the pin
*/
bool use_pullup = 8;
}
/*
* Audio Config for codec2 voice
*/
message AudioConfig {
/*
* Baudrate for codec2 voice
*/
enum Audio_Baud {
CODEC2_DEFAULT = 0;
CODEC2_3200 = 1;
CODEC2_2400 = 2;
CODEC2_1600 = 3;
CODEC2_1400 = 4;
CODEC2_1300 = 5;
CODEC2_1200 = 6;
CODEC2_700 = 7;
CODEC2_700B = 8;
}
/*
* Whether Audio is enabled
*/
bool codec2_enabled = 1;
/*
* PTT Pin
*/
uint32 ptt_pin = 2;
/*
* The audio sample rate to use for codec2
*/
Audio_Baud bitrate = 3;
/*
* I2S Word Select
*/
uint32 i2s_ws = 4;
/*
* I2S Data IN
*/
uint32 i2s_sd = 5;
/*
* I2S Data OUT
*/
uint32 i2s_din = 6;
/*
* I2S Clock
*/
uint32 i2s_sck = 7;
}
/*
* Config for the Paxcounter Module
*/
message PaxcounterConfig {
/*
* Enable the Paxcounter Module
*/
bool enabled = 1;
/*
* Interval in seconds of how often we should try to send our
* metrics to the mesh
*/
uint32 paxcounter_update_interval = 2;
}
/*
* Serial Config
*/
message SerialConfig {
/*
* TODO: REPLACE
*/
enum Serial_Baud {
BAUD_DEFAULT = 0;
BAUD_110 = 1;
BAUD_300 = 2;
BAUD_600 = 3;
BAUD_1200 = 4;
BAUD_2400 = 5;
BAUD_4800 = 6;
BAUD_9600 = 7;
BAUD_19200 = 8;
BAUD_38400 = 9;
BAUD_57600 = 10;
BAUD_115200 = 11;
BAUD_230400 = 12;
BAUD_460800 = 13;
BAUD_576000 = 14;
BAUD_921600 = 15;
}
/*
* TODO: REPLACE
*/
enum Serial_Mode {
DEFAULT = 0;
SIMPLE = 1;
PROTO = 2;
TEXTMSG = 3;
NMEA = 4;
// NMEA messages specifically tailored for CalTopo
CALTOPO = 5;
}
/*
* Preferences for the SerialModule
*/
bool enabled = 1;
/*
* TODO: REPLACE
*/
bool echo = 2;
/*
* RX pin (should match Arduino gpio pin number)
*/
uint32 rxd = 3;
/*
* TX pin (should match Arduino gpio pin number)
*/
uint32 txd = 4;
/*
* Serial baud rate
*/
Serial_Baud baud = 5;
/*
* TODO: REPLACE
*/
uint32 timeout = 6;
/*
* Mode for serial module operation
*/
Serial_Mode mode = 7;
/*
* Overrides the platform's defacto Serial port instance to use with Serial module config settings
* This is currently only usable in output modes like NMEA / CalTopo and may behave strangely or not work at all in other modes
* Existing logging over the Serial Console will still be present
*/
bool override_console_serial_port = 8;
}
/*
* External Notifications Config
*/
message ExternalNotificationConfig {
/*
* Enable the ExternalNotificationModule
*/
bool enabled = 1;
/*
* When using in On/Off mode, keep the output on for this many
* milliseconds. Default 1000ms (1 second).
*/
uint32 output_ms = 2;
/*
* Define the output pin GPIO setting Defaults to
* EXT_NOTIFY_OUT if set for the board.
* In standalone devices this pin should drive the LED to match the UI.
*/
uint32 output = 3;
/*
* Optional: Define a secondary output pin for a vibra motor
* This is used in standalone devices to match the UI.
*/
uint32 output_vibra = 8;
/*
* Optional: Define a tertiary output pin for an active buzzer
* This is used in standalone devices to to match the UI.
*/
uint32 output_buzzer = 9;
/*
* IF this is true, the 'output' Pin will be pulled active high, false
* means active low.
*/
bool active = 4;
/*
* True: Alert when a text message arrives (output)
*/
bool alert_message = 5;
/*
* True: Alert when a text message arrives (output_vibra)
*/
bool alert_message_vibra = 10;
/*
* True: Alert when a text message arrives (output_buzzer)
*/
bool alert_message_buzzer = 11;
/*
* True: Alert when the bell character is received (output)
*/
bool alert_bell = 6;
/*
* True: Alert when the bell character is received (output_vibra)
*/
bool alert_bell_vibra = 12;
/*
* True: Alert when the bell character is received (output_buzzer)
*/
bool alert_bell_buzzer = 13;
/*
* use a PWM output instead of a simple on/off output. This will ignore
* the 'output', 'output_ms' and 'active' settings and use the
* device.buzzer_gpio instead.
*/
bool use_pwm = 7;
/*
* The notification will toggle with 'output_ms' for this time of seconds.
* Default is 0 which means don't repeat at all. 60 would mean blink
* and/or beep for 60 seconds
*/
uint32 nag_timeout = 14;
/*
* When true, enables devices with native I2S audio output to use the RTTTL over speaker like a buzzer
* T-Watch S3 and T-Deck for example have this capability
*/
bool use_i2s_as_buzzer = 15;
}
/*
* Store and Forward Module Config
*/
message StoreForwardConfig {
/*
* Enable the Store and Forward Module
*/
bool enabled = 1;
/*
* TODO: REPLACE
*/
bool heartbeat = 2;
/*
* TODO: REPLACE
*/
uint32 records = 3;
/*
* TODO: REPLACE
*/
uint32 history_return_max = 4;
/*
* TODO: REPLACE
*/
uint32 history_return_window = 5;
}
/*
* Preferences for the RangeTestModule
*/
message RangeTestConfig {
/*
* Enable the Range Test Module
*/
bool enabled = 1;
/*
* Send out range test messages from this node
*/
uint32 sender = 2;
/*
* Bool value indicating that this node should save a RangeTest.csv file.
* ESP32 Only
*/
bool save = 3;
}
/*
* Configuration for both device and environment metrics
*/
message TelemetryConfig {
/*
* Interval in seconds of how often we should try to send our
* device metrics to the mesh
*/
uint32 device_update_interval = 1;
/*
* Interval in seconds of how often we should try to send our
* environment measurements to the mesh
*/
uint32 environment_update_interval = 2;
/*
* Preferences for the Telemetry Module (Environment)
* Enable/Disable the telemetry measurement module measurement collection
*/
bool environment_measurement_enabled = 3;
/*
* Enable/Disable the telemetry measurement module on-device display
*/
bool environment_screen_enabled = 4;
/*
* We'll always read the sensor in Celsius, but sometimes we might want to
* display the results in Fahrenheit as a "user preference".
*/
bool environment_display_fahrenheit = 5;
/*
* Enable/Disable the air quality metrics
*/
bool air_quality_enabled = 6;
/*
* Interval in seconds of how often we should try to send our
* air quality metrics to the mesh
*/
uint32 air_quality_interval = 7;
/*
* Interval in seconds of how often we should try to send our
* air quality metrics to the mesh
*/
bool power_measurement_enabled = 8;
/*
* Interval in seconds of how often we should try to send our
* air quality metrics to the mesh
*/
uint32 power_update_interval = 9;
/*
* Interval in seconds of how often we should try to send our
* air quality metrics to the mesh
*/
bool power_screen_enabled = 10;
}
/*
* TODO: REPLACE
*/
message CannedMessageConfig {
/*
* TODO: REPLACE
*/
enum InputEventChar {
/*
* TODO: REPLACE
*/
NONE = 0;
/*
* TODO: REPLACE
*/
UP = 17;
/*
* TODO: REPLACE
*/
DOWN = 18;
/*
* TODO: REPLACE
*/
LEFT = 19;
/*
* TODO: REPLACE
*/
RIGHT = 20;
/*
* '\n'
*/
SELECT = 10;
/*
* TODO: REPLACE
*/
BACK = 27;
/*
* TODO: REPLACE
*/
CANCEL = 24;
}
/*
* Enable the rotary encoder #1. This is a 'dumb' encoder sending pulses on both A and B pins while rotating.
*/
bool rotary1_enabled = 1;
/*
* GPIO pin for rotary encoder A port.
*/
uint32 inputbroker_pin_a = 2;
/*
* GPIO pin for rotary encoder B port.
*/
uint32 inputbroker_pin_b = 3;
/*
* GPIO pin for rotary encoder Press port.
*/
uint32 inputbroker_pin_press = 4;
/*
* Generate input event on CW of this kind.
*/
InputEventChar inputbroker_event_cw = 5;
/*
* Generate input event on CCW of this kind.
*/
InputEventChar inputbroker_event_ccw = 6;
/*
* Generate input event on Press of this kind.
*/
InputEventChar inputbroker_event_press = 7;
/*
* Enable the Up/Down/Select input device. Can be RAK rotary encoder or 3 buttons. Uses the a/b/press definitions from inputbroker.
*/
bool updown1_enabled = 8;
/*
* Enable/disable CannedMessageModule.
*/
bool enabled = 9;
/*
* Input event origin accepted by the canned message module.
* Can be e.g. "rotEnc1", "upDownEnc1" or keyword "_any"
*/
string allow_input_source = 10;
/*
* CannedMessageModule also sends a bell character with the messages.
* ExternalNotificationModule can benefit from this feature.
*/
bool send_bell = 11;
}
/*
Ambient Lighting Module - Settings for control of onboard LEDs to allow users to adjust the brightness levels and respective color levels.
Initially created for the RAK14001 RGB LED module.
*/
message AmbientLightingConfig {
/*
* Sets LED to on or off.
*/
bool led_state = 1;
/*
* Sets the current for the LED output. Default is 10.
*/
uint32 current = 2;
/*
* Sets the red LED level. Values are 0-255.
*/
uint32 red = 3;
/*
* Sets the green LED level. Values are 0-255.
*/
uint32 green = 4;
/*
* Sets the blue LED level. Values are 0-255.
*/
uint32 blue = 5;
}
/*
* TODO: REPLACE
*/
oneof payload_variant {
/*
* TODO: REPLACE
*/
MQTTConfig mqtt = 1;
/*
* TODO: REPLACE
*/
SerialConfig serial = 2;
/*
* TODO: REPLACE
*/
ExternalNotificationConfig external_notification = 3;
/*
* TODO: REPLACE
*/
StoreForwardConfig store_forward = 4;
/*
* TODO: REPLACE
*/
RangeTestConfig range_test = 5;
/*
* TODO: REPLACE
*/
TelemetryConfig telemetry = 6;
/*
* TODO: REPLACE
*/
CannedMessageConfig canned_message = 7;
/*
* TODO: REPLACE
*/
AudioConfig audio = 8;
/*
* TODO: REPLACE
*/
RemoteHardwareConfig remote_hardware = 9;
/*
* TODO: REPLACE
*/
NeighborInfoConfig neighbor_info = 10;
/*
* TODO: REPLACE
*/
AmbientLightingConfig ambient_lighting = 11;
/*
* TODO: REPLACE
*/
DetectionSensorConfig detection_sensor = 12;
/*
* TODO: REPLACE
*/
PaxcounterConfig paxcounter = 13;
}
}
/*
* A GPIO pin definition for remote hardware module
*/
message RemoteHardwarePin {
/*
* GPIO Pin number (must match Arduino)
*/
uint32 gpio_pin = 1;
/*
* Name for the GPIO pin (i.e. Front gate, mailbox, etc)
*/
string name = 2;
/*
* Type of GPIO access available to consumers on the mesh
*/
RemoteHardwarePinType type = 3;
}
enum RemoteHardwarePinType {
/*
* Unset/unused
*/
UNKNOWN = 0;
/*
* GPIO pin can be read (if it is high / low)
*/
DIGITAL_READ = 1;
/*
* GPIO pin can be written to (high / low)
*/
DIGITAL_WRITE = 2;
}

View file

@ -1,8 +0,0 @@
*ServiceEnvelope.packet type:FT_POINTER
*ServiceEnvelope.channel_id type:FT_POINTER
*ServiceEnvelope.gateway_id type:FT_POINTER
*MapReport.long_name max_size:40
*MapReport.short_name max_size:5
*MapReport.firmware_version max_size:18
*MapReport.num_online_local_nodes int_size:16

View file

@ -1,106 +0,0 @@
syntax = "proto3";
package meshtastic;
import "meshtastic/mesh.proto";
import "meshtastic/config.proto";
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "MQTTProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* This message wraps a MeshPacket with extra metadata about the sender and how it arrived.
*/
message ServiceEnvelope {
/*
* The (probably encrypted) packet
*/
MeshPacket packet = 1;
/*
* The global channel ID it was sent on
*/
string channel_id = 2;
/*
* The sending gateway node ID. Can we use this to authenticate/prevent fake
* nodeid impersonation for senders? - i.e. use gateway/mesh id (which is authenticated) + local node id as
* the globally trusted nodenum
*/
string gateway_id = 3;
}
/*
* Information about a node intended to be reported unencrypted to a map using MQTT.
*/
message MapReport {
/*
* A full name for this user, i.e. "Kevin Hester"
*/
string long_name = 1;
/*
* A VERY short name, ideally two characters.
* Suitable for a tiny OLED screen
*/
string short_name = 2;
/*
* Role of the node that applies specific settings for a particular use-case
*/
Config.DeviceConfig.Role role = 3;
/*
* Hardware model of the node, i.e. T-Beam, Heltec V3, etc...
*/
HardwareModel hw_model = 4;
/*
* Device firmware version string
*/
string firmware_version = 5;
/*
* The region code for the radio (US, CN, EU433, etc...)
*/
Config.LoRaConfig.RegionCode region = 6;
/*
* Modem preset used by the radio (LongFast, MediumSlow, etc...)
*/
Config.LoRaConfig.ModemPreset modem_preset = 7;
/*
* Whether the node has a channel with default PSK and name (LongFast, MediumSlow, etc...)
* and it uses the default frequency slot given the region and modem preset.
*/
bool has_default_channel = 8;
/*
* Latitude: multiply by 1e-7 to get degrees in floating point
*/
sfixed32 latitude_i = 9;
/*
* Longitude: multiply by 1e-7 to get degrees in floating point
*/
sfixed32 longitude_i = 10;
/*
* Altitude in meters above MSL
*/
int32 altitude = 11;
/*
* Indicates the bits of precision for latitude and longitude set by the sending node
*/
uint32 position_precision = 12;
/*
* Number of online nodes (heard in the last 2 hours) this node has in its list that were received locally (not via MQTT)
*/
uint32 num_online_local_nodes = 13;
}

View file

@ -1,29 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "PaxcountProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* TODO: REPLACE
*/
message Paxcount {
/*
* seen Wifi devices
*/
uint32 wifi = 1;
/*
* Seen BLE devices
*/
uint32 ble = 2;
/*
* Uptime in seconds
*/
uint32 uptime = 3;
}

View file

@ -1,216 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "Portnums";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* For any new 'apps' that run on the device or via sister apps on phones/PCs they should pick and use a
* unique 'portnum' for their application.
* If you are making a new app using meshtastic, please send in a pull request to add your 'portnum' to this
* master table.
* PortNums should be assigned in the following range:
* 0-63 Core Meshtastic use, do not use for third party apps
* 64-127 Registered 3rd party apps, send in a pull request that adds a new entry to portnums.proto to register your application
* 256-511 Use one of these portnums for your private applications that you don't want to register publically
* All other values are reserved.
* Note: This was formerly a Type enum named 'typ' with the same id #
* We have change to this 'portnum' based scheme for specifying app handlers for particular payloads.
* This change is backwards compatible by treating the legacy OPAQUE/CLEAR_TEXT values identically.
*/
enum PortNum {
/*
* Deprecated: do not use in new code (formerly called OPAQUE)
* A message sent from a device outside of the mesh, in a form the mesh does not understand
* NOTE: This must be 0, because it is documented in IMeshService.aidl to be so
* ENCODING: binary undefined
*/
UNKNOWN_APP = 0;
/*
* A simple UTF-8 text message, which even the little micros in the mesh
* can understand and show on their screen eventually in some circumstances
* even signal might send messages in this form (see below)
* ENCODING: UTF-8 Plaintext (?)
*/
TEXT_MESSAGE_APP = 1;
/*
* Reserved for built-in GPIO/example app.
* See remote_hardware.proto/HardwareMessage for details on the message sent/received to this port number
* ENCODING: Protobuf
*/
REMOTE_HARDWARE_APP = 2;
/*
* The built-in position messaging app.
* Payload is a Position message.
* ENCODING: Protobuf
*/
POSITION_APP = 3;
/*
* The built-in user info app.
* Payload is a User message.
* ENCODING: Protobuf
*/
NODEINFO_APP = 4;
/*
* Protocol control packets for mesh protocol use.
* Payload is a Routing message.
* ENCODING: Protobuf
*/
ROUTING_APP = 5;
/*
* Admin control packets.
* Payload is a AdminMessage message.
* ENCODING: Protobuf
*/
ADMIN_APP = 6;
/*
* Compressed TEXT_MESSAGE payloads.
* ENCODING: UTF-8 Plaintext (?) with Unishox2 Compression
* NOTE: The Device Firmware converts a TEXT_MESSAGE_APP to TEXT_MESSAGE_COMPRESSED_APP if the compressed
* payload is shorter. There's no need for app developers to do this themselves. Also the firmware will decompress
* any incoming TEXT_MESSAGE_COMPRESSED_APP payload and convert to TEXT_MESSAGE_APP.
*/
TEXT_MESSAGE_COMPRESSED_APP = 7;
/*
* Waypoint payloads.
* Payload is a Waypoint message.
* ENCODING: Protobuf
*/
WAYPOINT_APP = 8;
/*
* Audio Payloads.
* Encapsulated codec2 packets. On 2.4 GHZ Bandwidths only for now
* ENCODING: codec2 audio frames
* NOTE: audio frames contain a 3 byte header (0xc0 0xde 0xc2) and a one byte marker for the decompressed bitrate.
* This marker comes from the 'moduleConfig.audio.bitrate' enum minus one.
*/
AUDIO_APP = 9;
/*
* Same as Text Message but originating from Detection Sensor Module.
* NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9
*/
DETECTION_SENSOR_APP = 10;
/*
* Provides a 'ping' service that replies to any packet it receives.
* Also serves as a small example module.
* ENCODING: ASCII Plaintext
*/
REPLY_APP = 32;
/*
* Used for the python IP tunnel feature
* ENCODING: IP Packet. Handled by the python API, firmware ignores this one and pases on.
*/
IP_TUNNEL_APP = 33;
/*
* Paxcounter lib included in the firmware
* ENCODING: protobuf
*/
PAXCOUNTER_APP = 34;
/*
* Provides a hardware serial interface to send and receive from the Meshtastic network.
* Connect to the RX/TX pins of a device with 38400 8N1. Packets received from the Meshtastic
* network is forwarded to the RX pin while sending a packet to TX will go out to the Mesh network.
* Maximum packet size of 240 bytes.
* Module is disabled by default can be turned on by setting SERIAL_MODULE_ENABLED = 1 in SerialPlugh.cpp.
* ENCODING: binary undefined
*/
SERIAL_APP = 64;
/*
* STORE_FORWARD_APP (Work in Progress)
* Maintained by Jm Casler (MC Hamster) : jm@casler.org
* ENCODING: Protobuf
*/
STORE_FORWARD_APP = 65;
/*
* Optional port for messages for the range test module.
* ENCODING: ASCII Plaintext
* NOTE: This portnum traffic is not sent to the public MQTT starting at firmware version 2.2.9
*/
RANGE_TEST_APP = 66;
/*
* Provides a format to send and receive telemetry data from the Meshtastic network.
* Maintained by Charles Crossan (crossan007) : crossan007@gmail.com
* ENCODING: Protobuf
*/
TELEMETRY_APP = 67;
/*
* Experimental tools for estimating node position without a GPS
* Maintained by Github user a-f-G-U-C (a Meshtastic contributor)
* Project files at https://github.com/a-f-G-U-C/Meshtastic-ZPS
* ENCODING: arrays of int64 fields
*/
ZPS_APP = 68;
/*
* Used to let multiple instances of Linux native applications communicate
* as if they did using their LoRa chip.
* Maintained by GitHub user GUVWAF.
* Project files at https://github.com/GUVWAF/Meshtasticator
* ENCODING: Protobuf (?)
*/
SIMULATOR_APP = 69;
/*
* Provides a traceroute functionality to show the route a packet towards
* a certain destination would take on the mesh.
* ENCODING: Protobuf
*/
TRACEROUTE_APP = 70;
/*
* Aggregates edge info for the network by sending out a list of each node's neighbors
* ENCODING: Protobuf
*/
NEIGHBORINFO_APP = 71;
/*
* ATAK Plugin
* Portnum for payloads from the official Meshtastic ATAK plugin
*/
ATAK_PLUGIN = 72;
/*
* Provides unencrypted information about a node for consumption by a map via MQTT
*/
MAP_REPORT_APP = 73;
/*
* Private applications should use portnums >= 256.
* To simplify initial development and testing you can use "PRIVATE_APP"
* in your code without needing to rebuild protobuf files (via [regen-protos.sh](https://github.com/meshtastic/firmware/blob/master/bin/regen-protos.sh))
*/
PRIVATE_APP = 256;
/*
* ATAK Forwarder Module https://github.com/paulmandal/atak-forwarder
* ENCODING: libcotshrink
*/
ATAK_FORWARDER = 257;
/*
* Currently we limit port nums to no higher than this value
*/
MAX = 511;
}

View file

@ -1,75 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "RemoteHardware";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* An example app to show off the module system. This message is used for
* REMOTE_HARDWARE_APP PortNums.
* Also provides easy remote access to any GPIO.
* In the future other remote hardware operations can be added based on user interest
* (i.e. serial output, spi/i2c input/output).
* FIXME - currently this feature is turned on by default which is dangerous
* because no security yet (beyond the channel mechanism).
* It should be off by default and then protected based on some TBD mechanism
* (a special channel once multichannel support is included?)
*/
message HardwareMessage {
/*
* TODO: REPLACE
*/
enum Type {
/*
* Unset/unused
*/
UNSET = 0;
/*
* Set gpio gpios based on gpio_mask/gpio_value
*/
WRITE_GPIOS = 1;
/*
* We are now interested in watching the gpio_mask gpios.
* If the selected gpios change, please broadcast GPIOS_CHANGED.
* Will implicitly change the gpios requested to be INPUT gpios.
*/
WATCH_GPIOS = 2;
/*
* The gpios listed in gpio_mask have changed, the new values are listed in gpio_value
*/
GPIOS_CHANGED = 3;
/*
* Read the gpios specified in gpio_mask, send back a READ_GPIOS_REPLY reply with gpio_value populated
*/
READ_GPIOS = 4;
/*
* A reply to READ_GPIOS. gpio_mask and gpio_value will be populated
*/
READ_GPIOS_REPLY = 5;
}
/*
* What type of HardwareMessage is this?
*/
Type type = 1;
/*
* What gpios are we changing. Not used for all MessageTypes, see MessageType for details
*/
uint64 gpio_mask = 2;
/*
* For gpios that were listed in gpio_mask as valid, what are the signal levels for those gpios.
* Not used for all MessageTypes, see MessageType for details
*/
uint64 gpio_value = 3;
}

View file

@ -1 +0,0 @@
*RTTTLConfig.ringtone max_size:230

View file

@ -1,19 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "RTTTLConfigProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* Canned message module configuration.
*/
message RTTTLConfig {
/*
* Ringtone for PWM Buzzer in RTTTL Format.
*/
string ringtone = 1;
}

View file

@ -1 +0,0 @@
*StoreAndForward.text max_size:237

View file

@ -1,218 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "StoreAndForwardProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
/*
* TODO: REPLACE
*/
message StoreAndForward {
/*
* 001 - 063 = From Router
* 064 - 127 = From Client
*/
enum RequestResponse {
/*
* Unset/unused
*/
UNSET = 0;
/*
* Router is an in error state.
*/
ROUTER_ERROR = 1;
/*
* Router heartbeat
*/
ROUTER_HEARTBEAT = 2;
/*
* Router has requested the client respond. This can work as a
* "are you there" message.
*/
ROUTER_PING = 3;
/*
* The response to a "Ping"
*/
ROUTER_PONG = 4;
/*
* Router is currently busy. Please try again later.
*/
ROUTER_BUSY = 5;
/*
* Router is responding to a request for history.
*/
ROUTER_HISTORY = 6;
/*
* Router is responding to a request for stats.
*/
ROUTER_STATS = 7;
/*
* Router sends a text message from its history that was a direct message.
*/
ROUTER_TEXT_DIRECT = 8;
/*
* Router sends a text message from its history that was a broadcast.
*/
ROUTER_TEXT_BROADCAST = 9;
/*
* Client is an in error state.
*/
CLIENT_ERROR = 64;
/*
* Client has requested a replay from the router.
*/
CLIENT_HISTORY = 65;
/*
* Client has requested stats from the router.
*/
CLIENT_STATS = 66;
/*
* Client has requested the router respond. This can work as a
* "are you there" message.
*/
CLIENT_PING = 67;
/*
* The response to a "Ping"
*/
CLIENT_PONG = 68;
/*
* Client has requested that the router abort processing the client's request
*/
CLIENT_ABORT = 106;
}
/*
* TODO: REPLACE
*/
message Statistics {
/*
* Number of messages we have ever seen
*/
uint32 messages_total = 1;
/*
* Number of messages we have currently saved our history.
*/
uint32 messages_saved = 2;
/*
* Maximum number of messages we will save
*/
uint32 messages_max = 3;
/*
* Router uptime in seconds
*/
uint32 up_time = 4;
/*
* Number of times any client sent a request to the S&F.
*/
uint32 requests = 5;
/*
* Number of times the history was requested.
*/
uint32 requests_history = 6;
/*
* Is the heartbeat enabled on the server?
*/
bool heartbeat = 7;
/*
* Maximum number of messages the server will return.
*/
uint32 return_max = 8;
/*
* Maximum history window in minutes the server will return messages from.
*/
uint32 return_window = 9;
}
/*
* TODO: REPLACE
*/
message History {
/*
* Number of that will be sent to the client
*/
uint32 history_messages = 1;
/*
* The window of messages that was used to filter the history client requested
*/
uint32 window = 2;
/*
* Index in the packet history of the last message sent in a previous request to the server.
* Will be sent to the client before sending the history and can be set in a subsequent request to avoid getting packets the server already sent to the client.
*/
uint32 last_request = 3;
}
/*
* TODO: REPLACE
*/
message Heartbeat {
/*
* Period in seconds that the heartbeat is sent out that will be sent to the client
*/
uint32 period = 1;
/*
* If set, this is not the primary Store & Forward router on the mesh
*/
uint32 secondary = 2;
}
/*
* TODO: REPLACE
*/
RequestResponse rr = 1;
/*
* TODO: REPLACE
*/
oneof variant {
/*
* TODO: REPLACE
*/
Statistics stats = 2;
/*
* TODO: REPLACE
*/
History history = 3;
/*
* TODO: REPLACE
*/
Heartbeat heartbeat = 4;
/*
* Text from history message.
*/
bytes text = 5;
}
}

View file

@ -1,4 +0,0 @@
# options for nanopb
# https://jpa.kapsi.fi/nanopb/docs/reference.html#proto-file-options
*EnvironmentMetrics.iaq int_size:16

View file

@ -1,560 +0,0 @@
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 = "com.geeksville.mesh";
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;
}
/*
* 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;
}
/*
* Air quality metrics
*/
message AirQualityMetrics {
/*
* Concentration Units Standard PM1.0
*/
optional uint32 pm10_standard = 1;
/*
* Concentration Units Standard PM2.5
*/
optional uint32 pm25_standard = 2;
/*
* Concentration Units Standard PM10.0
*/
optional uint32 pm100_standard = 3;
/*
* Concentration Units Environmental PM1.0
*/
optional uint32 pm10_environmental = 4;
/*
* Concentration Units Environmental PM2.5
*/
optional uint32 pm25_environmental = 5;
/*
* Concentration Units Environmental PM10.0
*/
optional uint32 pm100_environmental = 6;
/*
* 0.3um Particle Count
*/
optional uint32 particles_03um = 7;
/*
* 0.5um Particle Count
*/
optional uint32 particles_05um = 8;
/*
* 1.0um Particle Count
*/
optional uint32 particles_10um = 9;
/*
* 2.5um Particle Count
*/
optional uint32 particles_25um = 10;
/*
* 5.0um Particle Count
*/
optional uint32 particles_50um = 11;
/*
* 10.0um Particle Count
*/
optional uint32 particles_100um = 12;
/*
* 10.0um Particle Count
*/
optional uint32 co2 = 13;
}
/*
* 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;
}
/*
* 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;
}
/*
* 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;
}
}
/*
* 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;
/*
* 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;
/*
* 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;
/*
* 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;
}
/*
* 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;
}

View file

@ -1,6 +0,0 @@
# options for nanopb
# https://jpa.kapsi.fi/nanopb/docs/reference.html#proto-file-options
*XModem.buffer max_size:128
*XModem.seq int_size:16
*XModem.crc16 int_size:16

View file

@ -1,27 +0,0 @@
syntax = "proto3";
package meshtastic;
option csharp_namespace = "Meshtastic.Protobufs";
option go_package = "github.com/meshtastic/go/generated";
option java_outer_classname = "XmodemProtos";
option java_package = "com.geeksville.mesh";
option swift_prefix = "";
message XModem {
enum Control {
NUL = 0;
SOH = 1;
STX = 2;
EOT = 4;
ACK = 6;
NAK = 21;
CAN = 24;
CTRLZ = 26;
}
Control control = 1;
uint32 seq = 2;
uint32 crc16 = 3;
bytes buffer = 4;
}

BIN
src/public/images/devices/HELTEC_V2_0.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Before After
Before After

BIN
src/public/images/devices/HELTEC_V2_1.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Before After
Before After

BIN
src/public/images/devices/HELTEC_V3.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Before After
Before After

BIN
src/public/images/devices/LILYGO_TBEAM_S3_CORE.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 70 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
src/public/images/devices/RP2040_LORA.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Before After
Before After

BIN
src/public/images/devices/RPI_PICO.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

BIN
src/public/images/devices/TBEAM.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Before After
Before After

BIN
src/public/images/devices/TLORA_V2_1_1P6.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Before After
Before After

BIN
src/public/images/devices/T_DECK.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 90 KiB

Before After
Before After

BIN
src/public/images/devices/T_ECHO.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Before After
Before After

View file

@ -146,20 +146,20 @@
<div class="flex flex-col h-full"> <div class="flex flex-col h-full">
<!-- announcement --> <!-- announcement -->
<div v-if="isShowingAnnouncement" class="flex bg-yellow-300 p-2 border-gray-300 border-b"> <div v-if="isShowingAnnouncement" class="flex bg-gray-900 text-white p-2 border-gray-300 border-b">
<!-- info --> <!-- info -->
<div class="my-auto leading-tight"> <div class="my-auto leading-tight">
<div class="font-bold">Service Announcement</div> <div class="font-bold">Introducing MeshCore</div>
<div class="text-sm"> <div class="text-sm">
<span>Changes were made to mqtt.meshtastic.org. Uplink your nodes to <button @click="isShowingInfoModal = true" type="button" class="link">our MQTT server</button> to continue showing on this map.</span> <span>Looking for a new mesh project to tinker with? Check out <a target="_blank" href="https://meshcore.nz" class="underline">MeshCore</a></span>
</div> </div>
</div> </div>
<!-- action buttons --> <!-- action buttons -->
<div class="flex my-auto ml-auto mr-0 sm:mr-2"> <div class="flex my-auto ml-auto mr-0 sm:mr-2">
<a @click="dismissAnnouncement" href="javascript:void(0)" class="rounded-full"> <a @click="dismissAnnouncement" href="javascript:void(0)" class="rounded-full">
<div class="bg-white hover:bg-gray-100 p-2 rounded-full"> <div class="bg-white text-black hover:bg-gray-100 p-2 rounded-full">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6">
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" /> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" />
</svg> </svg>
@ -1490,8 +1490,8 @@
<label class="block text-sm font-medium text-gray-900">Temperature Format</label> <label class="block text-sm font-medium text-gray-900">Temperature Format</label>
<div class="text-xs text-gray-600 mb-2">Metrics will be shown in the selected format.</div> <div class="text-xs text-gray-600 mb-2">Metrics will be shown in the selected format.</div>
<select v-model="configTemperatureFormat" class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5"> <select v-model="configTemperatureFormat" class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5">
<option value="celsius">Celsius (ºC)</option> <option value="celsius">Celsius (°C)</option>
<option value="fahrenheit">Fahrenheit (ºF)</option> <option value="fahrenheit">Fahrenheit (°F)</option>
</select> </select>
</div> </div>
@ -1892,7 +1892,7 @@
methods: { methods: {
getAnnouncementId: function() { getAnnouncementId: function() {
// change this when making a new announcement // change this when making a new announcement
return "1"; return "2";
}, },
shouldShowAnnouncement: function() { shouldShowAnnouncement: function() {
const lastSeenAnnouncementId = window.localStorage.getItem("last-seen-announcement-id"); const lastSeenAnnouncementId = window.localStorage.getItem("last-seen-announcement-id");
@ -2217,7 +2217,7 @@
datasets: [ datasets: [
{ {
label: 'Temperature', label: 'Temperature',
suffix: 'ºC', suffix: '°C',
borderColor: '#3b82f6', borderColor: '#3b82f6',
backgroundColor: '#3b82f6', backgroundColor: '#3b82f6',
pointStyle: false, // no points pointStyle: false, // no points
@ -2433,14 +2433,14 @@
}, },
y: { y: {
min: 0, min: 0,
max: 30, suggestedMax: 6,
ticks: { ticks: {
callback: (label) => `${label}V`, callback: (label) => `${label}V`,
}, },
}, },
y1: { y1: {
min: -500, suggestedMin: -50,
max: 500, suggestedMax: 50,
ticks: { ticks: {
stepSize: 50, stepSize: 50,
callback: (label) => `${label}mA`, callback: (label) => `${label}mA`,
@ -2597,11 +2597,11 @@
formatTemperature: function(celsius) { formatTemperature: function(celsius) {
switch(this.configTemperatureFormat){ switch(this.configTemperatureFormat){
case "celsius": { case "celsius": {
return `${Number(celsius).toFixed(0)}ºC`; return `${Number(celsius).toFixed(0)}°C`;
} }
case "fahrenheit": { case "fahrenheit": {
const fahrenheit = this.celsiusToFahrenheit(celsius); const fahrenheit = this.celsiusToFahrenheit(celsius);
return `${fahrenheit.toFixed(0)}ºF`; return `${fahrenheit.toFixed(0)}°F`;
} }
} }
}, },
@ -2617,8 +2617,8 @@
}, },
getTemperatureUnit: function() { getTemperatureUnit: function() {
switch(this.configTemperatureFormat){ switch(this.configTemperatureFormat){
case "celsius": return "ºC"; case "celsius": return "°C";
case "fahrenheit": return "ºF"; case "fahrenheit": return "°F";
} }
}, },
celsiusToFahrenheit: function(celsius) { celsiusToFahrenheit: function(celsius) {
@ -3765,7 +3765,10 @@
} }
// show lines between position history markers // show lines between position history markers
L.polyline(positionHistoryLinesCords).addTo(nodePositionHistoryLayerGroup); L.polyline(positionHistoryLinesCords, {
color: "#a855f7",
opacity: 1,
}).addTo(nodePositionHistoryLayerGroup);
} }