diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 17e4ba91..d8267aab 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -34,16 +34,19 @@ jobs:
which meshtastic
meshtastic --version
- name: Run pylint
- run: pylint meshtastic examples/ --ignore-patterns ".*_pb2.py$"
+ run: pylint meshtastic examples/ --ignore-patterns ".*_pb2.pyi?$"
+ - name: Check types with mypy
+ run: mypy meshtastic/
- name: Run tests with pytest
run: pytest --cov=meshtastic
- name: Generate coverage report
run: |
pytest --cov=meshtastic --cov-report=xml
- name: Upload coverage to Codecov
- uses: codecov/codecov-action@v2
+ uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
+ env_vars: OS, PYTHON
files: ./coverage.xml
flags: unittests
name: codecov-umbrella
diff --git a/bin/regen-protobufs.sh b/bin/regen-protobufs.sh
index dd490075..1f2f23c0 100755
--- a/bin/regen-protobufs.sh
+++ b/bin/regen-protobufs.sh
@@ -4,8 +4,8 @@
#gsed -i 's/import "\//import ".\//g' ./protobufs/meshtastic/*
#gsed -i 's/package meshtastic;//g' ./protobufs/meshtastic/*
-./nanopb-0.4.7/generator-bin/protoc -I=protobufs --python_out ./ ./protobufs/meshtastic/*.proto
-./nanopb-0.4.7/generator-bin/protoc -I=protobufs --python_out ./meshtastic/ ./protobufs/nanopb.proto
+./nanopb-0.4.7/generator-bin/protoc -I=protobufs --python_out ./ --mypy_out ./ ./protobufs/meshtastic/*.proto
+./nanopb-0.4.7/generator-bin/protoc -I=protobufs --python_out ./meshtastic/ --mypy_out ./meshtastic/ ./protobufs/nanopb.proto
# workaround for import bug in protoc https://github.com/protocolbuffers/protobuf/issues/1491#issuecomment-690618628
diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py
index 87342329..0f0ffd74 100644
--- a/meshtastic/__main__.py
+++ b/meshtastic/__main__.py
@@ -9,16 +9,15 @@
import sys
import time
-import pyqrcode
+import pyqrcode # type: ignore[import-untyped]
import yaml
from google.protobuf.json_format import MessageToDict
-from pubsub import pub
+from pubsub import pub # type: ignore[import-untyped]
import meshtastic.test
import meshtastic.util
-from meshtastic import channel_pb2, config_pb2, portnums_pb2, remote_hardware
+from meshtastic import channel_pb2, config_pb2, portnums_pb2, remote_hardware, BROADCAST_ADDR
from meshtastic.version import get_active_version
-from meshtastic.__init__ import BROADCAST_ADDR
from meshtastic.ble_interface import BLEInterface
from meshtastic.globals import Globals
@@ -147,7 +146,7 @@ def setPref(config, comp_name, valStr) -> bool:
objDesc = config.DESCRIPTOR
config_type = objDesc.fields_by_name.get(name[0])
- pref = False
+ pref = None
if config_type and config_type.message_type is not None:
pref = config_type.message_type.fields_by_name.get(snake_name)
# Others like ChannelSettings are standalone
diff --git a/meshtastic/admin_pb2.py b/meshtastic/admin_pb2.py
index eb4c33eb..e98de3e2 100644
--- a/meshtastic/admin_pb2.py
+++ b/meshtastic/admin_pb2.py
@@ -18,7 +18,7 @@
from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/admin.proto\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\"meshtastic/connection_status.proto\x1a\x15meshtastic/mesh.proto\x1a\x1emeshtastic/module_config.proto\"\xa9\x10\n\x0c\x41\x64minMessage\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12(\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x08.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12#\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x05.UserH\x00\x12\x36\n\x12get_config_request\x18\x05 \x01(\x0e\x32\x18.AdminMessage.ConfigTypeH\x00\x12&\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x07.ConfigH\x00\x12\x43\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32\x1e.AdminMessage.ModuleConfigTypeH\x00\x12\x33\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32\r.ModuleConfigH\x00\x12\x34\n*get_canned_message_module_messages_request\x18\n \x01(\x08H\x00\x12\x35\n+get_canned_message_module_messages_response\x18\x0b \x01(\tH\x00\x12%\n\x1bget_device_metadata_request\x18\x0c \x01(\x08H\x00\x12\x37\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32\x0f.DeviceMetadataH\x00\x12\x1e\n\x14get_ringtone_request\x18\x0e \x01(\x08H\x00\x12\x1f\n\x15get_ringtone_response\x18\x0f \x01(\tH\x00\x12.\n$get_device_connection_status_request\x18\x10 \x01(\x08H\x00\x12H\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32\x17.DeviceConnectionStatusH\x00\x12&\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\x0e.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12Q\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32\x1f.NodeRemoteHardwarePinsResponseH\x00\x12 \n\x16\x65nter_dfu_mode_request\x18\x15 \x01(\x08H\x00\x12\x1d\n\x13\x64\x65lete_file_request\x18\x16 \x01(\tH\x00\x12\x1a\n\tset_owner\x18 \x01(\x0b\x32\x05.UserH\x00\x12\x1f\n\x0bset_channel\x18! \x01(\x0b\x32\x08.ChannelH\x00\x12\x1d\n\nset_config\x18\" \x01(\x0b\x32\x07.ConfigH\x00\x12*\n\x11set_module_config\x18# \x01(\x0b\x32\r.ModuleConfigH\x00\x12,\n\"set_canned_message_module_messages\x18$ \x01(\tH\x00\x12\x1e\n\x14set_ringtone_message\x18% \x01(\tH\x00\x12\x1b\n\x11remove_by_nodenum\x18& \x01(\rH\x00\x12\x1b\n\x11set_favorite_node\x18\' \x01(\rH\x00\x12\x1e\n\x14remove_favorite_node\x18( \x01(\rH\x00\x12\'\n\x12set_fixed_position\x18) \x01(\x0b\x32\t.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18* \x01(\x08H\x00\x12\x1d\n\x13\x62\x65gin_edit_settings\x18@ \x01(\x08H\x00\x12\x1e\n\x14\x63ommit_edit_settings\x18\x41 \x01(\x08H\x00\x12\x1c\n\x12reboot_ota_seconds\x18_ \x01(\x05H\x00\x12\x18\n\x0e\x65xit_simulator\x18` \x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18\x61 \x01(\x05H\x00\x12\x1a\n\x10shutdown_seconds\x18\x62 \x01(\x05H\x00\x12\x17\n\rfactory_reset\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x05H\x00\"\x95\x01\n\nConfigType\x12\x11\n\rDEVICE_CONFIG\x10\x00\x12\x13\n\x0fPOSITION_CONFIG\x10\x01\x12\x10\n\x0cPOWER_CONFIG\x10\x02\x12\x12\n\x0eNETWORK_CONFIG\x10\x03\x12\x12\n\x0e\x44ISPLAY_CONFIG\x10\x04\x12\x0f\n\x0bLORA_CONFIG\x10\x05\x12\x14\n\x10\x42LUETOOTH_CONFIG\x10\x06\"\xbb\x02\n\x10ModuleConfigType\x12\x0f\n\x0bMQTT_CONFIG\x10\x00\x12\x11\n\rSERIAL_CONFIG\x10\x01\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x02\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x03\x12\x14\n\x10RANGETEST_CONFIG\x10\x04\x12\x14\n\x10TELEMETRY_CONFIG\x10\x05\x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10\x06\x12\x10\n\x0c\x41UDIO_CONFIG\x10\x07\x12\x19\n\x15REMOTEHARDWARE_CONFIG\x10\x08\x12\x17\n\x13NEIGHBORINFO_CONFIG\x10\t\x12\x1a\n\x16\x41MBIENTLIGHTING_CONFIG\x10\n\x12\x1a\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x0b\x12\x15\n\x11PAXCOUNTER_CONFIG\x10\x0c\x42\x11\n\x0fpayload_variant\"[\n\rHamParameters\x12\x11\n\tcall_sign\x18\x01 \x01(\t\x12\x10\n\x08tx_power\x18\x02 \x01(\x05\x12\x11\n\tfrequency\x18\x03 \x01(\x02\x12\x12\n\nshort_name\x18\x04 \x01(\t\"[\n\x1eNodeRemoteHardwarePinsResponse\x12\x39\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32\x16.NodeRemoteHardwarePinB`\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/admin.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\"meshtastic/connection_status.proto\x1a\x15meshtastic/mesh.proto\x1a\x1emeshtastic/module_config.proto\"\xce\x11\n\x0c\x41\x64minMessage\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12\x33\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x13.meshtastic.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12.\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x10.meshtastic.UserH\x00\x12\x41\n\x12get_config_request\x18\x05 \x01(\x0e\x32#.meshtastic.AdminMessage.ConfigTypeH\x00\x12\x31\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x12.meshtastic.ConfigH\x00\x12N\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32).meshtastic.AdminMessage.ModuleConfigTypeH\x00\x12>\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32\x18.meshtastic.ModuleConfigH\x00\x12\x34\n*get_canned_message_module_messages_request\x18\n \x01(\x08H\x00\x12\x35\n+get_canned_message_module_messages_response\x18\x0b \x01(\tH\x00\x12%\n\x1bget_device_metadata_request\x18\x0c \x01(\x08H\x00\x12\x42\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32\x1a.meshtastic.DeviceMetadataH\x00\x12\x1e\n\x14get_ringtone_request\x18\x0e \x01(\x08H\x00\x12\x1f\n\x15get_ringtone_response\x18\x0f \x01(\tH\x00\x12.\n$get_device_connection_status_request\x18\x10 \x01(\x08H\x00\x12S\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32\".meshtastic.DeviceConnectionStatusH\x00\x12\x31\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\x19.meshtastic.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12\\\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32*.meshtastic.NodeRemoteHardwarePinsResponseH\x00\x12 \n\x16\x65nter_dfu_mode_request\x18\x15 \x01(\x08H\x00\x12\x1d\n\x13\x64\x65lete_file_request\x18\x16 \x01(\tH\x00\x12%\n\tset_owner\x18 \x01(\x0b\x32\x10.meshtastic.UserH\x00\x12*\n\x0bset_channel\x18! \x01(\x0b\x32\x13.meshtastic.ChannelH\x00\x12(\n\nset_config\x18\" \x01(\x0b\x32\x12.meshtastic.ConfigH\x00\x12\x35\n\x11set_module_config\x18# \x01(\x0b\x32\x18.meshtastic.ModuleConfigH\x00\x12,\n\"set_canned_message_module_messages\x18$ \x01(\tH\x00\x12\x1e\n\x14set_ringtone_message\x18% \x01(\tH\x00\x12\x1b\n\x11remove_by_nodenum\x18& \x01(\rH\x00\x12\x1b\n\x11set_favorite_node\x18\' \x01(\rH\x00\x12\x1e\n\x14remove_favorite_node\x18( \x01(\rH\x00\x12\x32\n\x12set_fixed_position\x18) \x01(\x0b\x32\x14.meshtastic.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18* \x01(\x08H\x00\x12\x1d\n\x13\x62\x65gin_edit_settings\x18@ \x01(\x08H\x00\x12\x1e\n\x14\x63ommit_edit_settings\x18\x41 \x01(\x08H\x00\x12\x1c\n\x12reboot_ota_seconds\x18_ \x01(\x05H\x00\x12\x18\n\x0e\x65xit_simulator\x18` \x01(\x08H\x00\x12\x18\n\x0ereboot_seconds\x18\x61 \x01(\x05H\x00\x12\x1a\n\x10shutdown_seconds\x18\x62 \x01(\x05H\x00\x12\x17\n\rfactory_reset\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x05H\x00\"\x95\x01\n\nConfigType\x12\x11\n\rDEVICE_CONFIG\x10\x00\x12\x13\n\x0fPOSITION_CONFIG\x10\x01\x12\x10\n\x0cPOWER_CONFIG\x10\x02\x12\x12\n\x0eNETWORK_CONFIG\x10\x03\x12\x12\n\x0e\x44ISPLAY_CONFIG\x10\x04\x12\x0f\n\x0bLORA_CONFIG\x10\x05\x12\x14\n\x10\x42LUETOOTH_CONFIG\x10\x06\"\xbb\x02\n\x10ModuleConfigType\x12\x0f\n\x0bMQTT_CONFIG\x10\x00\x12\x11\n\rSERIAL_CONFIG\x10\x01\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x02\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x03\x12\x14\n\x10RANGETEST_CONFIG\x10\x04\x12\x14\n\x10TELEMETRY_CONFIG\x10\x05\x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10\x06\x12\x10\n\x0c\x41UDIO_CONFIG\x10\x07\x12\x19\n\x15REMOTEHARDWARE_CONFIG\x10\x08\x12\x17\n\x13NEIGHBORINFO_CONFIG\x10\t\x12\x1a\n\x16\x41MBIENTLIGHTING_CONFIG\x10\n\x12\x1a\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x0b\x12\x15\n\x11PAXCOUNTER_CONFIG\x10\x0c\x42\x11\n\x0fpayload_variant\"[\n\rHamParameters\x12\x11\n\tcall_sign\x18\x01 \x01(\t\x12\x10\n\x08tx_power\x18\x02 \x01(\x05\x12\x11\n\tfrequency\x18\x03 \x01(\x02\x12\x12\n\nshort_name\x18\x04 \x01(\t\"f\n\x1eNodeRemoteHardwarePinsResponse\x12\x44\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32!.meshtastic.NodeRemoteHardwarePinB`\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.admin_pb2', globals())
@@ -26,14 +26,14 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _ADMINMESSAGE._serialized_start=169
- _ADMINMESSAGE._serialized_end=2258
- _ADMINMESSAGE_CONFIGTYPE._serialized_start=1772
- _ADMINMESSAGE_CONFIGTYPE._serialized_end=1921
- _ADMINMESSAGE_MODULECONFIGTYPE._serialized_start=1924
- _ADMINMESSAGE_MODULECONFIGTYPE._serialized_end=2239
- _HAMPARAMETERS._serialized_start=2260
- _HAMPARAMETERS._serialized_end=2351
- _NODEREMOTEHARDWAREPINSRESPONSE._serialized_start=2353
- _NODEREMOTEHARDWAREPINSRESPONSE._serialized_end=2444
+ _ADMINMESSAGE._serialized_start=181
+ _ADMINMESSAGE._serialized_end=2435
+ _ADMINMESSAGE_CONFIGTYPE._serialized_start=1949
+ _ADMINMESSAGE_CONFIGTYPE._serialized_end=2098
+ _ADMINMESSAGE_MODULECONFIGTYPE._serialized_start=2101
+ _ADMINMESSAGE_MODULECONFIGTYPE._serialized_end=2416
+ _HAMPARAMETERS._serialized_start=2437
+ _HAMPARAMETERS._serialized_end=2528
+ _NODEREMOTEHARDWAREPINSRESPONSE._serialized_start=2530
+ _NODEREMOTEHARDWAREPINSRESPONSE._serialized_end=2632
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/admin_pb2.pyi b/meshtastic/admin_pb2.pyi
new file mode 100644
index 00000000..8488f5b1
--- /dev/null
+++ b/meshtastic/admin_pb2.pyi
@@ -0,0 +1,557 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import collections.abc
+import google.protobuf.descriptor
+import google.protobuf.internal.containers
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import meshtastic.channel_pb2
+import meshtastic.config_pb2
+import meshtastic.connection_status_pb2
+import meshtastic.mesh_pb2
+import meshtastic.module_config_pb2
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class AdminMessage(google.protobuf.message.Message):
+ """
+ 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)
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _ConfigType:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _ConfigTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[AdminMessage._ConfigType.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ DEVICE_CONFIG: AdminMessage._ConfigType.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ POSITION_CONFIG: AdminMessage._ConfigType.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ POWER_CONFIG: AdminMessage._ConfigType.ValueType # 2
+ """
+ TODO: REPLACE
+ """
+ NETWORK_CONFIG: AdminMessage._ConfigType.ValueType # 3
+ """
+ TODO: REPLACE
+ """
+ DISPLAY_CONFIG: AdminMessage._ConfigType.ValueType # 4
+ """
+ TODO: REPLACE
+ """
+ LORA_CONFIG: AdminMessage._ConfigType.ValueType # 5
+ """
+ TODO: REPLACE
+ """
+ BLUETOOTH_CONFIG: AdminMessage._ConfigType.ValueType # 6
+ """
+ TODO: REPLACE
+ """
+
+ class ConfigType(_ConfigType, metaclass=_ConfigTypeEnumTypeWrapper):
+ """
+ TODO: REPLACE
+ """
+
+ DEVICE_CONFIG: AdminMessage.ConfigType.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ POSITION_CONFIG: AdminMessage.ConfigType.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ POWER_CONFIG: AdminMessage.ConfigType.ValueType # 2
+ """
+ TODO: REPLACE
+ """
+ NETWORK_CONFIG: AdminMessage.ConfigType.ValueType # 3
+ """
+ TODO: REPLACE
+ """
+ DISPLAY_CONFIG: AdminMessage.ConfigType.ValueType # 4
+ """
+ TODO: REPLACE
+ """
+ LORA_CONFIG: AdminMessage.ConfigType.ValueType # 5
+ """
+ TODO: REPLACE
+ """
+ BLUETOOTH_CONFIG: AdminMessage.ConfigType.ValueType # 6
+ """
+ TODO: REPLACE
+ """
+
+ class _ModuleConfigType:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _ModuleConfigTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[AdminMessage._ModuleConfigType.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ MQTT_CONFIG: AdminMessage._ModuleConfigType.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ SERIAL_CONFIG: AdminMessage._ModuleConfigType.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ EXTNOTIF_CONFIG: AdminMessage._ModuleConfigType.ValueType # 2
+ """
+ TODO: REPLACE
+ """
+ STOREFORWARD_CONFIG: AdminMessage._ModuleConfigType.ValueType # 3
+ """
+ TODO: REPLACE
+ """
+ RANGETEST_CONFIG: AdminMessage._ModuleConfigType.ValueType # 4
+ """
+ TODO: REPLACE
+ """
+ TELEMETRY_CONFIG: AdminMessage._ModuleConfigType.ValueType # 5
+ """
+ TODO: REPLACE
+ """
+ CANNEDMSG_CONFIG: AdminMessage._ModuleConfigType.ValueType # 6
+ """
+ TODO: REPLACE
+ """
+ AUDIO_CONFIG: AdminMessage._ModuleConfigType.ValueType # 7
+ """
+ TODO: REPLACE
+ """
+ REMOTEHARDWARE_CONFIG: AdminMessage._ModuleConfigType.ValueType # 8
+ """
+ TODO: REPLACE
+ """
+ NEIGHBORINFO_CONFIG: AdminMessage._ModuleConfigType.ValueType # 9
+ """
+ TODO: REPLACE
+ """
+ AMBIENTLIGHTING_CONFIG: AdminMessage._ModuleConfigType.ValueType # 10
+ """
+ TODO: REPLACE
+ """
+ DETECTIONSENSOR_CONFIG: AdminMessage._ModuleConfigType.ValueType # 11
+ """
+ TODO: REPLACE
+ """
+ PAXCOUNTER_CONFIG: AdminMessage._ModuleConfigType.ValueType # 12
+ """
+ TODO: REPLACE
+ """
+
+ class ModuleConfigType(_ModuleConfigType, metaclass=_ModuleConfigTypeEnumTypeWrapper):
+ """
+ TODO: REPLACE
+ """
+
+ MQTT_CONFIG: AdminMessage.ModuleConfigType.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ SERIAL_CONFIG: AdminMessage.ModuleConfigType.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ EXTNOTIF_CONFIG: AdminMessage.ModuleConfigType.ValueType # 2
+ """
+ TODO: REPLACE
+ """
+ STOREFORWARD_CONFIG: AdminMessage.ModuleConfigType.ValueType # 3
+ """
+ TODO: REPLACE
+ """
+ RANGETEST_CONFIG: AdminMessage.ModuleConfigType.ValueType # 4
+ """
+ TODO: REPLACE
+ """
+ TELEMETRY_CONFIG: AdminMessage.ModuleConfigType.ValueType # 5
+ """
+ TODO: REPLACE
+ """
+ CANNEDMSG_CONFIG: AdminMessage.ModuleConfigType.ValueType # 6
+ """
+ TODO: REPLACE
+ """
+ AUDIO_CONFIG: AdminMessage.ModuleConfigType.ValueType # 7
+ """
+ TODO: REPLACE
+ """
+ REMOTEHARDWARE_CONFIG: AdminMessage.ModuleConfigType.ValueType # 8
+ """
+ TODO: REPLACE
+ """
+ NEIGHBORINFO_CONFIG: AdminMessage.ModuleConfigType.ValueType # 9
+ """
+ TODO: REPLACE
+ """
+ AMBIENTLIGHTING_CONFIG: AdminMessage.ModuleConfigType.ValueType # 10
+ """
+ TODO: REPLACE
+ """
+ DETECTIONSENSOR_CONFIG: AdminMessage.ModuleConfigType.ValueType # 11
+ """
+ TODO: REPLACE
+ """
+ PAXCOUNTER_CONFIG: AdminMessage.ModuleConfigType.ValueType # 12
+ """
+ TODO: REPLACE
+ """
+
+ GET_CHANNEL_REQUEST_FIELD_NUMBER: builtins.int
+ GET_CHANNEL_RESPONSE_FIELD_NUMBER: builtins.int
+ GET_OWNER_REQUEST_FIELD_NUMBER: builtins.int
+ GET_OWNER_RESPONSE_FIELD_NUMBER: builtins.int
+ GET_CONFIG_REQUEST_FIELD_NUMBER: builtins.int
+ GET_CONFIG_RESPONSE_FIELD_NUMBER: builtins.int
+ GET_MODULE_CONFIG_REQUEST_FIELD_NUMBER: builtins.int
+ GET_MODULE_CONFIG_RESPONSE_FIELD_NUMBER: builtins.int
+ GET_CANNED_MESSAGE_MODULE_MESSAGES_REQUEST_FIELD_NUMBER: builtins.int
+ GET_CANNED_MESSAGE_MODULE_MESSAGES_RESPONSE_FIELD_NUMBER: builtins.int
+ GET_DEVICE_METADATA_REQUEST_FIELD_NUMBER: builtins.int
+ GET_DEVICE_METADATA_RESPONSE_FIELD_NUMBER: builtins.int
+ GET_RINGTONE_REQUEST_FIELD_NUMBER: builtins.int
+ GET_RINGTONE_RESPONSE_FIELD_NUMBER: builtins.int
+ GET_DEVICE_CONNECTION_STATUS_REQUEST_FIELD_NUMBER: builtins.int
+ GET_DEVICE_CONNECTION_STATUS_RESPONSE_FIELD_NUMBER: builtins.int
+ SET_HAM_MODE_FIELD_NUMBER: builtins.int
+ GET_NODE_REMOTE_HARDWARE_PINS_REQUEST_FIELD_NUMBER: builtins.int
+ GET_NODE_REMOTE_HARDWARE_PINS_RESPONSE_FIELD_NUMBER: builtins.int
+ ENTER_DFU_MODE_REQUEST_FIELD_NUMBER: builtins.int
+ DELETE_FILE_REQUEST_FIELD_NUMBER: builtins.int
+ SET_OWNER_FIELD_NUMBER: builtins.int
+ SET_CHANNEL_FIELD_NUMBER: builtins.int
+ SET_CONFIG_FIELD_NUMBER: builtins.int
+ SET_MODULE_CONFIG_FIELD_NUMBER: builtins.int
+ SET_CANNED_MESSAGE_MODULE_MESSAGES_FIELD_NUMBER: builtins.int
+ SET_RINGTONE_MESSAGE_FIELD_NUMBER: builtins.int
+ REMOVE_BY_NODENUM_FIELD_NUMBER: builtins.int
+ SET_FAVORITE_NODE_FIELD_NUMBER: builtins.int
+ REMOVE_FAVORITE_NODE_FIELD_NUMBER: builtins.int
+ SET_FIXED_POSITION_FIELD_NUMBER: builtins.int
+ REMOVE_FIXED_POSITION_FIELD_NUMBER: builtins.int
+ BEGIN_EDIT_SETTINGS_FIELD_NUMBER: builtins.int
+ COMMIT_EDIT_SETTINGS_FIELD_NUMBER: builtins.int
+ REBOOT_OTA_SECONDS_FIELD_NUMBER: builtins.int
+ EXIT_SIMULATOR_FIELD_NUMBER: builtins.int
+ REBOOT_SECONDS_FIELD_NUMBER: builtins.int
+ SHUTDOWN_SECONDS_FIELD_NUMBER: builtins.int
+ FACTORY_RESET_FIELD_NUMBER: builtins.int
+ NODEDB_RESET_FIELD_NUMBER: builtins.int
+ get_channel_request: builtins.int
+ """
+ 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)
+ """
+ @property
+ def get_channel_response(self) -> meshtastic.channel_pb2.Channel:
+ """
+ TODO: REPLACE
+ """
+ get_owner_request: builtins.bool
+ """
+ Send the current owner data in the response to this message.
+ """
+ @property
+ def get_owner_response(self) -> meshtastic.mesh_pb2.User:
+ """
+ TODO: REPLACE
+ """
+ get_config_request: global___AdminMessage.ConfigType.ValueType
+ """
+ Ask for the following config data to be sent
+ """
+ @property
+ def get_config_response(self) -> meshtastic.config_pb2.Config:
+ """
+ Send the current Config in the response to this message.
+ """
+ get_module_config_request: global___AdminMessage.ModuleConfigType.ValueType
+ """
+ Ask for the following config data to be sent
+ """
+ @property
+ def get_module_config_response(self) -> meshtastic.module_config_pb2.ModuleConfig:
+ """
+ Send the current Config in the response to this message.
+ """
+ get_canned_message_module_messages_request: builtins.bool
+ """
+ Get the Canned Message Module messages in the response to this message.
+ """
+ get_canned_message_module_messages_response: builtins.str
+ """
+ Get the Canned Message Module messages in the response to this message.
+ """
+ get_device_metadata_request: builtins.bool
+ """
+ Request the node to send device metadata (firmware, protobuf version, etc)
+ """
+ @property
+ def get_device_metadata_response(self) -> meshtastic.mesh_pb2.DeviceMetadata:
+ """
+ Device metadata response
+ """
+ get_ringtone_request: builtins.bool
+ """
+ Get the Ringtone in the response to this message.
+ """
+ get_ringtone_response: builtins.str
+ """
+ Get the Ringtone in the response to this message.
+ """
+ get_device_connection_status_request: builtins.bool
+ """
+ Request the node to send it's connection status
+ """
+ @property
+ def get_device_connection_status_response(self) -> meshtastic.connection_status_pb2.DeviceConnectionStatus:
+ """
+ Device connection status response
+ """
+ @property
+ def set_ham_mode(self) -> global___HamParameters:
+ """
+ Setup a node for licensed amateur (ham) radio operation
+ """
+ get_node_remote_hardware_pins_request: builtins.bool
+ """
+ Get the mesh's nodes with their available gpio pins for RemoteHardware module use
+ """
+ @property
+ def get_node_remote_hardware_pins_response(self) -> global___NodeRemoteHardwarePinsResponse:
+ """
+ Respond with the mesh's nodes with their available gpio pins for RemoteHardware module use
+ """
+ enter_dfu_mode_request: builtins.bool
+ """
+ Enter (UF2) DFU mode
+ Only implemented on NRF52 currently
+ """
+ delete_file_request: builtins.str
+ """
+ Delete the file by the specified path from the device
+ """
+ @property
+ def set_owner(self) -> meshtastic.mesh_pb2.User:
+ """
+ Set the owner for this node
+ """
+ @property
+ def set_channel(self) -> meshtastic.channel_pb2.Channel:
+ """
+ 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.
+ """
+ @property
+ def set_config(self) -> meshtastic.config_pb2.Config:
+ """
+ Set the current Config
+ """
+ @property
+ def set_module_config(self) -> meshtastic.module_config_pb2.ModuleConfig:
+ """
+ Set the current Config
+ """
+ set_canned_message_module_messages: builtins.str
+ """
+ Set the Canned Message Module messages text.
+ """
+ set_ringtone_message: builtins.str
+ """
+ Set the ringtone for ExternalNotification.
+ """
+ remove_by_nodenum: builtins.int
+ """
+ Remove the node by the specified node-num from the NodeDB on the device
+ """
+ set_favorite_node: builtins.int
+ """
+ Set specified node-num to be favorited on the NodeDB on the device
+ """
+ remove_favorite_node: builtins.int
+ """
+ Set specified node-num to be un-favorited on the NodeDB on the device
+ """
+ @property
+ def set_fixed_position(self) -> meshtastic.mesh_pb2.Position:
+ """
+ Set fixed position data on the node and then set the position.fixed_position = true
+ """
+ remove_fixed_position: builtins.bool
+ """
+ Clear fixed position coordinates and then set position.fixed_position = false
+ """
+ begin_edit_settings: builtins.bool
+ """
+ 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)
+ """
+ commit_edit_settings: builtins.bool
+ """
+ Commits an open transaction for any edits made to config, module config, owner, and channel settings
+ """
+ reboot_ota_seconds: builtins.int
+ """
+ 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.
+ """
+ exit_simulator: builtins.bool
+ """
+ This message is only supported for the simulator Portduino build.
+ If received the simulator will exit successfully.
+ """
+ reboot_seconds: builtins.int
+ """
+ Tell the node to reboot in this many seconds (or <0 to cancel reboot)
+ """
+ shutdown_seconds: builtins.int
+ """
+ Tell the node to shutdown in this many seconds (or <0 to cancel shutdown)
+ """
+ factory_reset: builtins.int
+ """
+ Tell the node to factory reset, all device settings will be returned to factory defaults.
+ """
+ nodedb_reset: builtins.int
+ """
+ Tell the node to reset the nodedb.
+ """
+ def __init__(
+ self,
+ *,
+ get_channel_request: builtins.int = ...,
+ get_channel_response: meshtastic.channel_pb2.Channel | None = ...,
+ get_owner_request: builtins.bool = ...,
+ get_owner_response: meshtastic.mesh_pb2.User | None = ...,
+ get_config_request: global___AdminMessage.ConfigType.ValueType = ...,
+ get_config_response: meshtastic.config_pb2.Config | None = ...,
+ get_module_config_request: global___AdminMessage.ModuleConfigType.ValueType = ...,
+ get_module_config_response: meshtastic.module_config_pb2.ModuleConfig | None = ...,
+ get_canned_message_module_messages_request: builtins.bool = ...,
+ get_canned_message_module_messages_response: builtins.str = ...,
+ get_device_metadata_request: builtins.bool = ...,
+ get_device_metadata_response: meshtastic.mesh_pb2.DeviceMetadata | None = ...,
+ get_ringtone_request: builtins.bool = ...,
+ get_ringtone_response: builtins.str = ...,
+ get_device_connection_status_request: builtins.bool = ...,
+ get_device_connection_status_response: meshtastic.connection_status_pb2.DeviceConnectionStatus | None = ...,
+ set_ham_mode: global___HamParameters | None = ...,
+ get_node_remote_hardware_pins_request: builtins.bool = ...,
+ get_node_remote_hardware_pins_response: global___NodeRemoteHardwarePinsResponse | None = ...,
+ enter_dfu_mode_request: builtins.bool = ...,
+ delete_file_request: builtins.str = ...,
+ set_owner: meshtastic.mesh_pb2.User | None = ...,
+ set_channel: meshtastic.channel_pb2.Channel | None = ...,
+ set_config: meshtastic.config_pb2.Config | None = ...,
+ set_module_config: meshtastic.module_config_pb2.ModuleConfig | None = ...,
+ set_canned_message_module_messages: builtins.str = ...,
+ set_ringtone_message: builtins.str = ...,
+ remove_by_nodenum: builtins.int = ...,
+ set_favorite_node: builtins.int = ...,
+ remove_favorite_node: builtins.int = ...,
+ set_fixed_position: meshtastic.mesh_pb2.Position | None = ...,
+ remove_fixed_position: builtins.bool = ...,
+ begin_edit_settings: builtins.bool = ...,
+ commit_edit_settings: builtins.bool = ...,
+ reboot_ota_seconds: builtins.int = ...,
+ exit_simulator: builtins.bool = ...,
+ reboot_seconds: builtins.int = ...,
+ shutdown_seconds: builtins.int = ...,
+ factory_reset: builtins.int = ...,
+ nodedb_reset: builtins.int = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", b"commit_edit_settings", "delete_file_request", b"delete_file_request", "enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", b"exit_simulator", "factory_reset", b"factory_reset", "get_canned_message_module_messages_request", b"get_canned_message_module_messages_request", "get_canned_message_module_messages_response", b"get_canned_message_module_messages_response", "get_channel_request", b"get_channel_request", "get_channel_response", b"get_channel_response", "get_config_request", b"get_config_request", "get_config_response", b"get_config_response", "get_device_connection_status_request", b"get_device_connection_status_request", "get_device_connection_status_response", b"get_device_connection_status_response", "get_device_metadata_request", b"get_device_metadata_request", "get_device_metadata_response", b"get_device_metadata_response", "get_module_config_request", b"get_module_config_request", "get_module_config_response", b"get_module_config_response", "get_node_remote_hardware_pins_request", b"get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", b"get_node_remote_hardware_pins_response", "get_owner_request", b"get_owner_request", "get_owner_response", b"get_owner_response", "get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", b"get_ringtone_response", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "set_canned_message_module_messages", b"set_canned_message_module_messages", "set_channel", b"set_channel", "set_config", b"set_config", "set_favorite_node", b"set_favorite_node", "set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "shutdown_seconds", b"shutdown_seconds"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["begin_edit_settings", b"begin_edit_settings", "commit_edit_settings", b"commit_edit_settings", "delete_file_request", b"delete_file_request", "enter_dfu_mode_request", b"enter_dfu_mode_request", "exit_simulator", b"exit_simulator", "factory_reset", b"factory_reset", "get_canned_message_module_messages_request", b"get_canned_message_module_messages_request", "get_canned_message_module_messages_response", b"get_canned_message_module_messages_response", "get_channel_request", b"get_channel_request", "get_channel_response", b"get_channel_response", "get_config_request", b"get_config_request", "get_config_response", b"get_config_response", "get_device_connection_status_request", b"get_device_connection_status_request", "get_device_connection_status_response", b"get_device_connection_status_response", "get_device_metadata_request", b"get_device_metadata_request", "get_device_metadata_response", b"get_device_metadata_response", "get_module_config_request", b"get_module_config_request", "get_module_config_response", b"get_module_config_response", "get_node_remote_hardware_pins_request", b"get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", b"get_node_remote_hardware_pins_response", "get_owner_request", b"get_owner_request", "get_owner_response", b"get_owner_response", "get_ringtone_request", b"get_ringtone_request", "get_ringtone_response", b"get_ringtone_response", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "set_canned_message_module_messages", b"set_canned_message_module_messages", "set_channel", b"set_channel", "set_config", b"set_config", "set_favorite_node", b"set_favorite_node", "set_fixed_position", b"set_fixed_position", "set_ham_mode", b"set_ham_mode", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "shutdown_seconds", b"shutdown_seconds"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["get_channel_request", "get_channel_response", "get_owner_request", "get_owner_response", "get_config_request", "get_config_response", "get_module_config_request", "get_module_config_response", "get_canned_message_module_messages_request", "get_canned_message_module_messages_response", "get_device_metadata_request", "get_device_metadata_response", "get_ringtone_request", "get_ringtone_response", "get_device_connection_status_request", "get_device_connection_status_response", "set_ham_mode", "get_node_remote_hardware_pins_request", "get_node_remote_hardware_pins_response", "enter_dfu_mode_request", "delete_file_request", "set_owner", "set_channel", "set_config", "set_module_config", "set_canned_message_module_messages", "set_ringtone_message", "remove_by_nodenum", "set_favorite_node", "remove_favorite_node", "set_fixed_position", "remove_fixed_position", "begin_edit_settings", "commit_edit_settings", "reboot_ota_seconds", "exit_simulator", "reboot_seconds", "shutdown_seconds", "factory_reset", "nodedb_reset"] | None: ...
+
+global___AdminMessage = AdminMessage
+
+@typing_extensions.final
+class HamParameters(google.protobuf.message.Message):
+ """
+ Parameters for setting up Meshtastic for ameteur radio usage
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ CALL_SIGN_FIELD_NUMBER: builtins.int
+ TX_POWER_FIELD_NUMBER: builtins.int
+ FREQUENCY_FIELD_NUMBER: builtins.int
+ SHORT_NAME_FIELD_NUMBER: builtins.int
+ call_sign: builtins.str
+ """
+ Amateur radio call sign, eg. KD2ABC
+ """
+ tx_power: builtins.int
+ """
+ Transmit power in dBm at the LoRA transceiver, not including any amplification
+ """
+ frequency: builtins.float
+ """
+ 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.
+ """
+ short_name: builtins.str
+ """
+ Optional short name of user
+ """
+ def __init__(
+ self,
+ *,
+ call_sign: builtins.str = ...,
+ tx_power: builtins.int = ...,
+ frequency: builtins.float = ...,
+ short_name: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["call_sign", b"call_sign", "frequency", b"frequency", "short_name", b"short_name", "tx_power", b"tx_power"]) -> None: ...
+
+global___HamParameters = HamParameters
+
+@typing_extensions.final
+class NodeRemoteHardwarePinsResponse(google.protobuf.message.Message):
+ """
+ Response envelope for node_remote_hardware_pins
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: builtins.int
+ @property
+ def node_remote_hardware_pins(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.mesh_pb2.NodeRemoteHardwarePin]:
+ """
+ Nodes and their respective remote hardware GPIO pins
+ """
+ def __init__(
+ self,
+ *,
+ node_remote_hardware_pins: collections.abc.Iterable[meshtastic.mesh_pb2.NodeRemoteHardwarePin] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["node_remote_hardware_pins", b"node_remote_hardware_pins"]) -> None: ...
+
+global___NodeRemoteHardwarePinsResponse = NodeRemoteHardwarePinsResponse
diff --git a/meshtastic/apponly_pb2.py b/meshtastic/apponly_pb2.py
index 656bda1c..46d9931c 100644
--- a/meshtastic/apponly_pb2.py
+++ b/meshtastic/apponly_pb2.py
@@ -15,7 +15,7 @@
from meshtastic import config_pb2 as meshtastic_dot_config__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/apponly.proto\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\"Y\n\nChannelSet\x12\"\n\x08settings\x18\x01 \x03(\x0b\x32\x10.ChannelSettings\x12\'\n\x0blora_config\x18\x02 \x01(\x0b\x32\x12.Config.LoRaConfigBb\n\x13\x63om.geeksville.meshB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/apponly.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\"o\n\nChannelSet\x12-\n\x08settings\x18\x01 \x03(\x0b\x32\x1b.meshtastic.ChannelSettings\x12\x32\n\x0blora_config\x18\x02 \x01(\x0b\x32\x1d.meshtastic.Config.LoRaConfigBb\n\x13\x63om.geeksville.meshB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.apponly_pb2', globals())
@@ -23,6 +23,6 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\rAppOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _CHANNELSET._serialized_start=79
- _CHANNELSET._serialized_end=168
+ _CHANNELSET._serialized_start=91
+ _CHANNELSET._serialized_end=202
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/apponly_pb2.pyi b/meshtastic/apponly_pb2.pyi
new file mode 100644
index 00000000..0d84ed65
--- /dev/null
+++ b/meshtastic/apponly_pb2.pyi
@@ -0,0 +1,54 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import collections.abc
+import google.protobuf.descriptor
+import google.protobuf.internal.containers
+import google.protobuf.message
+import meshtastic.channel_pb2
+import meshtastic.config_pb2
+import sys
+
+if sys.version_info >= (3, 8):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class ChannelSet(google.protobuf.message.Message):
+ """
+ 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
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ SETTINGS_FIELD_NUMBER: builtins.int
+ LORA_CONFIG_FIELD_NUMBER: builtins.int
+ @property
+ def settings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.channel_pb2.ChannelSettings]:
+ """
+ Channel list with settings
+ """
+ @property
+ def lora_config(self) -> meshtastic.config_pb2.Config.LoRaConfig:
+ """
+ LoRa config
+ """
+ def __init__(
+ self,
+ *,
+ settings: collections.abc.Iterable[meshtastic.channel_pb2.ChannelSettings] | None = ...,
+ lora_config: meshtastic.config_pb2.Config.LoRaConfig | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["lora_config", b"lora_config"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["lora_config", b"lora_config", "settings", b"settings"]) -> None: ...
+
+global___ChannelSet = ChannelSet
diff --git a/meshtastic/atak_pb2.py b/meshtastic/atak_pb2.py
index af483ea2..f1900f2a 100644
--- a/meshtastic/atak_pb2.py
+++ b/meshtastic/atak_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/atak.proto\"\xaf\x01\n\tTAKPacket\x12\x15\n\ris_compressed\x18\x01 \x01(\x08\x12\x19\n\x07\x63ontact\x18\x02 \x01(\x0b\x32\x08.Contact\x12\x15\n\x05group\x18\x03 \x01(\x0b\x32\x06.Group\x12\x17\n\x06status\x18\x04 \x01(\x0b\x32\x07.Status\x12\x13\n\x03pli\x18\x05 \x01(\x0b\x32\x04.PLIH\x00\x12\x18\n\x04\x63hat\x18\x06 \x01(\x0b\x32\x08.GeoChatH\x00\x42\x11\n\x0fpayload_variant\"2\n\x07GeoChat\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x02to\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x05\n\x03_to\"7\n\x05Group\x12\x19\n\x04role\x18\x01 \x01(\x0e\x32\x0b.MemberRole\x12\x13\n\x04team\x18\x02 \x01(\x0e\x32\x05.Team\"\x19\n\x06Status\x12\x0f\n\x07\x62\x61ttery\x18\x01 \x01(\r\"4\n\x07\x43ontact\x12\x10\n\x08\x63\x61llsign\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65vice_callsign\x18\x02 \x01(\t\"_\n\x03PLI\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\r\n\x05speed\x18\x04 \x01(\r\x12\x0e\n\x06\x63ourse\x18\x05 \x01(\r*\xc0\x01\n\x04Team\x12\x14\n\x10Unspecifed_Color\x10\x00\x12\t\n\x05White\x10\x01\x12\n\n\x06Yellow\x10\x02\x12\n\n\x06Orange\x10\x03\x12\x0b\n\x07Magenta\x10\x04\x12\x07\n\x03Red\x10\x05\x12\n\n\x06Maroon\x10\x06\x12\n\n\x06Purple\x10\x07\x12\r\n\tDark_Blue\x10\x08\x12\x08\n\x04\x42lue\x10\t\x12\x08\n\x04\x43yan\x10\n\x12\x08\n\x04Teal\x10\x0b\x12\t\n\x05Green\x10\x0c\x12\x0e\n\nDark_Green\x10\r\x12\t\n\x05\x42rown\x10\x0e*\x7f\n\nMemberRole\x12\x0e\n\nUnspecifed\x10\x00\x12\x0e\n\nTeamMember\x10\x01\x12\x0c\n\x08TeamLead\x10\x02\x12\x06\n\x02HQ\x10\x03\x12\n\n\x06Sniper\x10\x04\x12\t\n\x05Medic\x10\x05\x12\x13\n\x0f\x46orwardObserver\x10\x06\x12\x07\n\x03RTO\x10\x07\x12\x06\n\x02K9\x10\x08\x42_\n\x13\x63om.geeksville.meshB\nATAKProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/atak.proto\x12\nmeshtastic\"\xe6\x01\n\tTAKPacket\x12\x15\n\ris_compressed\x18\x01 \x01(\x08\x12$\n\x07\x63ontact\x18\x02 \x01(\x0b\x32\x13.meshtastic.Contact\x12 \n\x05group\x18\x03 \x01(\x0b\x32\x11.meshtastic.Group\x12\"\n\x06status\x18\x04 \x01(\x0b\x32\x12.meshtastic.Status\x12\x1e\n\x03pli\x18\x05 \x01(\x0b\x32\x0f.meshtastic.PLIH\x00\x12#\n\x04\x63hat\x18\x06 \x01(\x0b\x32\x13.meshtastic.GeoChatH\x00\x42\x11\n\x0fpayload_variant\"2\n\x07GeoChat\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0f\n\x02to\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x05\n\x03_to\"M\n\x05Group\x12$\n\x04role\x18\x01 \x01(\x0e\x32\x16.meshtastic.MemberRole\x12\x1e\n\x04team\x18\x02 \x01(\x0e\x32\x10.meshtastic.Team\"\x19\n\x06Status\x12\x0f\n\x07\x62\x61ttery\x18\x01 \x01(\r\"4\n\x07\x43ontact\x12\x10\n\x08\x63\x61llsign\x18\x01 \x01(\t\x12\x17\n\x0f\x64\x65vice_callsign\x18\x02 \x01(\t\"_\n\x03PLI\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\r\n\x05speed\x18\x04 \x01(\r\x12\x0e\n\x06\x63ourse\x18\x05 \x01(\r*\xc0\x01\n\x04Team\x12\x14\n\x10Unspecifed_Color\x10\x00\x12\t\n\x05White\x10\x01\x12\n\n\x06Yellow\x10\x02\x12\n\n\x06Orange\x10\x03\x12\x0b\n\x07Magenta\x10\x04\x12\x07\n\x03Red\x10\x05\x12\n\n\x06Maroon\x10\x06\x12\n\n\x06Purple\x10\x07\x12\r\n\tDark_Blue\x10\x08\x12\x08\n\x04\x42lue\x10\t\x12\x08\n\x04\x43yan\x10\n\x12\x08\n\x04Teal\x10\x0b\x12\t\n\x05Green\x10\x0c\x12\x0e\n\nDark_Green\x10\r\x12\t\n\x05\x42rown\x10\x0e*\x7f\n\nMemberRole\x12\x0e\n\nUnspecifed\x10\x00\x12\x0e\n\nTeamMember\x10\x01\x12\x0c\n\x08TeamLead\x10\x02\x12\x06\n\x02HQ\x10\x03\x12\n\n\x06Sniper\x10\x04\x12\t\n\x05Medic\x10\x05\x12\x13\n\x0f\x46orwardObserver\x10\x06\x12\x07\n\x03RTO\x10\x07\x12\x06\n\x02K9\x10\x08\x42_\n\x13\x63om.geeksville.meshB\nATAKProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.atak_pb2', globals())
@@ -21,20 +21,20 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nATAKProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _TEAM._serialized_start=491
- _TEAM._serialized_end=683
- _MEMBERROLE._serialized_start=685
- _MEMBERROLE._serialized_end=812
- _TAKPACKET._serialized_start=26
- _TAKPACKET._serialized_end=201
- _GEOCHAT._serialized_start=203
- _GEOCHAT._serialized_end=253
- _GROUP._serialized_start=255
- _GROUP._serialized_end=310
- _STATUS._serialized_start=312
- _STATUS._serialized_end=337
- _CONTACT._serialized_start=339
- _CONTACT._serialized_end=391
- _PLI._serialized_start=393
- _PLI._serialized_end=488
+ _TEAM._serialized_start=580
+ _TEAM._serialized_end=772
+ _MEMBERROLE._serialized_start=774
+ _MEMBERROLE._serialized_end=901
+ _TAKPACKET._serialized_start=38
+ _TAKPACKET._serialized_end=268
+ _GEOCHAT._serialized_start=270
+ _GEOCHAT._serialized_end=320
+ _GROUP._serialized_start=322
+ _GROUP._serialized_end=399
+ _STATUS._serialized_start=401
+ _STATUS._serialized_end=426
+ _CONTACT._serialized_start=428
+ _CONTACT._serialized_end=480
+ _PLI._serialized_start=482
+ _PLI._serialized_end=577
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/atak_pb2.pyi b/meshtastic/atak_pb2.pyi
new file mode 100644
index 00000000..65757b90
--- /dev/null
+++ b/meshtastic/atak_pb2.pyi
@@ -0,0 +1,455 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class _Team:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _TeamEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_Team.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ Unspecifed_Color: _Team.ValueType # 0
+ """
+ Unspecifed
+ """
+ White: _Team.ValueType # 1
+ """
+ White
+ """
+ Yellow: _Team.ValueType # 2
+ """
+ Yellow
+ """
+ Orange: _Team.ValueType # 3
+ """
+ Orange
+ """
+ Magenta: _Team.ValueType # 4
+ """
+ Magenta
+ """
+ Red: _Team.ValueType # 5
+ """
+ Red
+ """
+ Maroon: _Team.ValueType # 6
+ """
+ Maroon
+ """
+ Purple: _Team.ValueType # 7
+ """
+ Purple
+ """
+ Dark_Blue: _Team.ValueType # 8
+ """
+ Dark Blue
+ """
+ Blue: _Team.ValueType # 9
+ """
+ Blue
+ """
+ Cyan: _Team.ValueType # 10
+ """
+ Cyan
+ """
+ Teal: _Team.ValueType # 11
+ """
+ Teal
+ """
+ Green: _Team.ValueType # 12
+ """
+ Green
+ """
+ Dark_Green: _Team.ValueType # 13
+ """
+ Dark Green
+ """
+ Brown: _Team.ValueType # 14
+ """
+ Brown
+ """
+
+class Team(_Team, metaclass=_TeamEnumTypeWrapper): ...
+
+Unspecifed_Color: Team.ValueType # 0
+"""
+Unspecifed
+"""
+White: Team.ValueType # 1
+"""
+White
+"""
+Yellow: Team.ValueType # 2
+"""
+Yellow
+"""
+Orange: Team.ValueType # 3
+"""
+Orange
+"""
+Magenta: Team.ValueType # 4
+"""
+Magenta
+"""
+Red: Team.ValueType # 5
+"""
+Red
+"""
+Maroon: Team.ValueType # 6
+"""
+Maroon
+"""
+Purple: Team.ValueType # 7
+"""
+Purple
+"""
+Dark_Blue: Team.ValueType # 8
+"""
+Dark Blue
+"""
+Blue: Team.ValueType # 9
+"""
+Blue
+"""
+Cyan: Team.ValueType # 10
+"""
+Cyan
+"""
+Teal: Team.ValueType # 11
+"""
+Teal
+"""
+Green: Team.ValueType # 12
+"""
+Green
+"""
+Dark_Green: Team.ValueType # 13
+"""
+Dark Green
+"""
+Brown: Team.ValueType # 14
+"""
+Brown
+"""
+global___Team = Team
+
+class _MemberRole:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _MemberRoleEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_MemberRole.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ Unspecifed: _MemberRole.ValueType # 0
+ """
+ Unspecifed
+ """
+ TeamMember: _MemberRole.ValueType # 1
+ """
+ Team Member
+ """
+ TeamLead: _MemberRole.ValueType # 2
+ """
+ Team Lead
+ """
+ HQ: _MemberRole.ValueType # 3
+ """
+ Headquarters
+ """
+ Sniper: _MemberRole.ValueType # 4
+ """
+ Airsoft enthusiast
+ """
+ Medic: _MemberRole.ValueType # 5
+ """
+ Medic
+ """
+ ForwardObserver: _MemberRole.ValueType # 6
+ """
+ ForwardObserver
+ """
+ RTO: _MemberRole.ValueType # 7
+ """
+ Radio Telephone Operator
+ """
+ K9: _MemberRole.ValueType # 8
+ """
+ Doggo
+ """
+
+class MemberRole(_MemberRole, metaclass=_MemberRoleEnumTypeWrapper):
+ """
+ Role of the group member
+ """
+
+Unspecifed: MemberRole.ValueType # 0
+"""
+Unspecifed
+"""
+TeamMember: MemberRole.ValueType # 1
+"""
+Team Member
+"""
+TeamLead: MemberRole.ValueType # 2
+"""
+Team Lead
+"""
+HQ: MemberRole.ValueType # 3
+"""
+Headquarters
+"""
+Sniper: MemberRole.ValueType # 4
+"""
+Airsoft enthusiast
+"""
+Medic: MemberRole.ValueType # 5
+"""
+Medic
+"""
+ForwardObserver: MemberRole.ValueType # 6
+"""
+ForwardObserver
+"""
+RTO: MemberRole.ValueType # 7
+"""
+Radio Telephone Operator
+"""
+K9: MemberRole.ValueType # 8
+"""
+Doggo
+"""
+global___MemberRole = MemberRole
+
+@typing_extensions.final
+class TAKPacket(google.protobuf.message.Message):
+ """
+ Packets for the official ATAK Plugin
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ IS_COMPRESSED_FIELD_NUMBER: builtins.int
+ CONTACT_FIELD_NUMBER: builtins.int
+ GROUP_FIELD_NUMBER: builtins.int
+ STATUS_FIELD_NUMBER: builtins.int
+ PLI_FIELD_NUMBER: builtins.int
+ CHAT_FIELD_NUMBER: builtins.int
+ is_compressed: builtins.bool
+ """
+ Are the payloads strings compressed for LoRA transport?
+ """
+ @property
+ def contact(self) -> global___Contact:
+ """
+ The contact / callsign for ATAK user
+ """
+ @property
+ def group(self) -> global___Group:
+ """
+ The group for ATAK user
+ """
+ @property
+ def status(self) -> global___Status:
+ """
+ The status of the ATAK EUD
+ """
+ @property
+ def pli(self) -> global___PLI:
+ """
+ TAK position report
+ """
+ @property
+ def chat(self) -> global___GeoChat:
+ """
+ ATAK GeoChat message
+ """
+ def __init__(
+ self,
+ *,
+ is_compressed: builtins.bool = ...,
+ contact: global___Contact | None = ...,
+ group: global___Group | None = ...,
+ status: global___Status | None = ...,
+ pli: global___PLI | None = ...,
+ chat: global___GeoChat | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["chat", b"chat", "contact", b"contact", "group", b"group", "payload_variant", b"payload_variant", "pli", b"pli", "status", b"status"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["chat", b"chat", "contact", b"contact", "group", b"group", "is_compressed", b"is_compressed", "payload_variant", b"payload_variant", "pli", b"pli", "status", b"status"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["pli", "chat"] | None: ...
+
+global___TAKPacket = TAKPacket
+
+@typing_extensions.final
+class GeoChat(google.protobuf.message.Message):
+ """
+ ATAK GeoChat message
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ MESSAGE_FIELD_NUMBER: builtins.int
+ TO_FIELD_NUMBER: builtins.int
+ message: builtins.str
+ """
+ The text message
+ """
+ to: builtins.str
+ """
+ Uid recipient of the message
+ """
+ def __init__(
+ self,
+ *,
+ message: builtins.str = ...,
+ to: builtins.str | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["_to", b"_to", "to", b"to"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["_to", b"_to", "message", b"message", "to", b"to"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_to", b"_to"]) -> typing_extensions.Literal["to"] | None: ...
+
+global___GeoChat = GeoChat
+
+@typing_extensions.final
+class Group(google.protobuf.message.Message):
+ """
+ ATAK Group
+ <__group role='Team Member' name='Cyan'/>
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ROLE_FIELD_NUMBER: builtins.int
+ TEAM_FIELD_NUMBER: builtins.int
+ role: global___MemberRole.ValueType
+ """
+ Role of the group member
+ """
+ team: global___Team.ValueType
+ """
+ Team (color)
+ Default Cyan
+ """
+ def __init__(
+ self,
+ *,
+ role: global___MemberRole.ValueType = ...,
+ team: global___Team.ValueType = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["role", b"role", "team", b"team"]) -> None: ...
+
+global___Group = Group
+
+@typing_extensions.final
+class Status(google.protobuf.message.Message):
+ """
+ ATAK EUD Status
+
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ BATTERY_FIELD_NUMBER: builtins.int
+ battery: builtins.int
+ """
+ Battery level
+ """
+ def __init__(
+ self,
+ *,
+ battery: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["battery", b"battery"]) -> None: ...
+
+global___Status = Status
+
+@typing_extensions.final
+class Contact(google.protobuf.message.Message):
+ """
+ ATAK Contact
+
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ CALLSIGN_FIELD_NUMBER: builtins.int
+ DEVICE_CALLSIGN_FIELD_NUMBER: builtins.int
+ callsign: builtins.str
+ """
+ Callsign
+ """
+ device_callsign: builtins.str
+ """
+ Device callsign
+
+ IP address of endpoint in integer form (0.0.0.0 default)
+ """
+ def __init__(
+ self,
+ *,
+ callsign: builtins.str = ...,
+ device_callsign: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["callsign", b"callsign", "device_callsign", b"device_callsign"]) -> None: ...
+
+global___Contact = Contact
+
+@typing_extensions.final
+class PLI(google.protobuf.message.Message):
+ """
+ Position Location Information from ATAK
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ LATITUDE_I_FIELD_NUMBER: builtins.int
+ LONGITUDE_I_FIELD_NUMBER: builtins.int
+ ALTITUDE_FIELD_NUMBER: builtins.int
+ SPEED_FIELD_NUMBER: builtins.int
+ COURSE_FIELD_NUMBER: builtins.int
+ latitude_i: builtins.int
+ """
+ The new preferred location encoding, multiply by 1e-7 to get degrees
+ in floating point
+ """
+ longitude_i: builtins.int
+ """
+ The new preferred location encoding, multiply by 1e-7 to get degrees
+ in floating point
+ """
+ altitude: builtins.int
+ """
+ Altitude (ATAK prefers HAE)
+ """
+ speed: builtins.int
+ """
+ Speed
+ """
+ course: builtins.int
+ """
+ Course in degrees
+ """
+ def __init__(
+ self,
+ *,
+ latitude_i: builtins.int = ...,
+ longitude_i: builtins.int = ...,
+ altitude: builtins.int = ...,
+ speed: builtins.int = ...,
+ course: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["altitude", b"altitude", "course", b"course", "latitude_i", b"latitude_i", "longitude_i", b"longitude_i", "speed", b"speed"]) -> None: ...
+
+global___PLI = PLI
diff --git a/meshtastic/cannedmessages_pb2.py b/meshtastic/cannedmessages_pb2.py
index a7410407..058f3cfc 100644
--- a/meshtastic/cannedmessages_pb2.py
+++ b/meshtastic/cannedmessages_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/cannedmessages.proto\"-\n\x19\x43\x61nnedMessageModuleConfig\x12\x10\n\x08messages\x18\x01 \x01(\tBn\n\x13\x63om.geeksville.meshB\x19\x43\x61nnedMessageConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/cannedmessages.proto\x12\nmeshtastic\"-\n\x19\x43\x61nnedMessageModuleConfig\x12\x10\n\x08messages\x18\x01 \x01(\tBn\n\x13\x63om.geeksville.meshB\x19\x43\x61nnedMessageConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.cannedmessages_pb2', globals())
@@ -21,6 +21,6 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\031CannedMessageConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _CANNEDMESSAGEMODULECONFIG._serialized_start=35
- _CANNEDMESSAGEMODULECONFIG._serialized_end=80
+ _CANNEDMESSAGEMODULECONFIG._serialized_start=47
+ _CANNEDMESSAGEMODULECONFIG._serialized_end=92
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/cannedmessages_pb2.pyi b/meshtastic/cannedmessages_pb2.pyi
new file mode 100644
index 00000000..9ee96bd8
--- /dev/null
+++ b/meshtastic/cannedmessages_pb2.pyi
@@ -0,0 +1,37 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import sys
+
+if sys.version_info >= (3, 8):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class CannedMessageModuleConfig(google.protobuf.message.Message):
+ """
+ Canned message module configuration.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ MESSAGES_FIELD_NUMBER: builtins.int
+ messages: builtins.str
+ """
+ Predefined messages for canned message module separated by '|' characters.
+ """
+ def __init__(
+ self,
+ *,
+ messages: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["messages", b"messages"]) -> None: ...
+
+global___CannedMessageModuleConfig = CannedMessageModuleConfig
diff --git a/meshtastic/channel_pb2.py b/meshtastic/channel_pb2.py
index e5c9aba0..4ce52029 100644
--- a/meshtastic/channel_pb2.py
+++ b/meshtastic/channel_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/channel.proto\"\xad\x01\n\x0f\x43hannelSettings\x12\x17\n\x0b\x63hannel_num\x18\x01 \x01(\rB\x02\x18\x01\x12\x0b\n\x03psk\x18\x02 \x01(\x0c\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\n\n\x02id\x18\x04 \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x05 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x06 \x01(\x08\x12(\n\x0fmodule_settings\x18\x07 \x01(\x0b\x32\x0f.ModuleSettings\",\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\"\x8b\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12\"\n\x08settings\x18\x02 \x01(\x0b\x32\x10.ChannelSettings\x12\x1b\n\x04role\x18\x03 \x01(\x0e\x32\r.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42\x62\n\x13\x63om.geeksville.meshB\rChannelProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x18meshtastic/channel.proto\x12\nmeshtastic\"\xb8\x01\n\x0f\x43hannelSettings\x12\x17\n\x0b\x63hannel_num\x18\x01 \x01(\rB\x02\x18\x01\x12\x0b\n\x03psk\x18\x02 \x01(\x0c\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\n\n\x02id\x18\x04 \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x05 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x06 \x01(\x08\x12\x33\n\x0fmodule_settings\x18\x07 \x01(\x0b\x32\x1a.meshtastic.ModuleSettings\",\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\"\xa1\x01\n\x07\x43hannel\x12\r\n\x05index\x18\x01 \x01(\x05\x12-\n\x08settings\x18\x02 \x01(\x0b\x32\x1b.meshtastic.ChannelSettings\x12&\n\x04role\x18\x03 \x01(\x0e\x32\x18.meshtastic.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42\x62\n\x13\x63om.geeksville.meshB\rChannelProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.channel_pb2', globals())
@@ -23,12 +23,12 @@
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\rChannelProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
_CHANNELSETTINGS.fields_by_name['channel_num']._options = None
_CHANNELSETTINGS.fields_by_name['channel_num']._serialized_options = b'\030\001'
- _CHANNELSETTINGS._serialized_start=29
- _CHANNELSETTINGS._serialized_end=202
- _MODULESETTINGS._serialized_start=204
- _MODULESETTINGS._serialized_end=248
- _CHANNEL._serialized_start=251
- _CHANNEL._serialized_end=390
- _CHANNEL_ROLE._serialized_start=342
- _CHANNEL_ROLE._serialized_end=390
+ _CHANNELSETTINGS._serialized_start=41
+ _CHANNELSETTINGS._serialized_end=225
+ _MODULESETTINGS._serialized_start=227
+ _MODULESETTINGS._serialized_end=271
+ _CHANNEL._serialized_start=274
+ _CHANNEL._serialized_end=435
+ _CHANNEL_ROLE._serialized_start=387
+ _CHANNEL_ROLE._serialized_end=435
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/channel_pb2.pyi b/meshtastic/channel_pb2.pyi
new file mode 100644
index 00000000..d4a8a056
--- /dev/null
+++ b/meshtastic/channel_pb2.pyi
@@ -0,0 +1,224 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class ChannelSettings(google.protobuf.message.Message):
+ """
+ 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
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ CHANNEL_NUM_FIELD_NUMBER: builtins.int
+ PSK_FIELD_NUMBER: builtins.int
+ NAME_FIELD_NUMBER: builtins.int
+ ID_FIELD_NUMBER: builtins.int
+ UPLINK_ENABLED_FIELD_NUMBER: builtins.int
+ DOWNLINK_ENABLED_FIELD_NUMBER: builtins.int
+ MODULE_SETTINGS_FIELD_NUMBER: builtins.int
+ channel_num: builtins.int
+ """
+ Deprecated in favor of LoraConfig.channel_num
+ """
+ psk: builtins.bytes
+ """
+ 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
+ """
+ name: builtins.str
+ """
+ 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
+ """
+ id: builtins.int
+ """
+ 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)
+ """
+ uplink_enabled: builtins.bool
+ """
+ If true, messages on the mesh will be sent to the *public* internet by any gateway ndoe
+ """
+ downlink_enabled: builtins.bool
+ """
+ If true, messages seen on the internet will be forwarded to the local mesh.
+ """
+ @property
+ def module_settings(self) -> global___ModuleSettings:
+ """
+ Per-channel module settings.
+ """
+ def __init__(
+ self,
+ *,
+ channel_num: builtins.int = ...,
+ psk: builtins.bytes = ...,
+ name: builtins.str = ...,
+ id: builtins.int = ...,
+ uplink_enabled: builtins.bool = ...,
+ downlink_enabled: builtins.bool = ...,
+ module_settings: global___ModuleSettings | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["module_settings", b"module_settings"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["channel_num", b"channel_num", "downlink_enabled", b"downlink_enabled", "id", b"id", "module_settings", b"module_settings", "name", b"name", "psk", b"psk", "uplink_enabled", b"uplink_enabled"]) -> None: ...
+
+global___ChannelSettings = ChannelSettings
+
+@typing_extensions.final
+class ModuleSettings(google.protobuf.message.Message):
+ """
+ This message is specifically for modules to store per-channel configuration data.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ POSITION_PRECISION_FIELD_NUMBER: builtins.int
+ position_precision: builtins.int
+ """
+ Bits of precision for the location sent in position packets.
+ """
+ def __init__(
+ self,
+ *,
+ position_precision: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["position_precision", b"position_precision"]) -> None: ...
+
+global___ModuleSettings = ModuleSettings
+
+@typing_extensions.final
+class Channel(google.protobuf.message.Message):
+ """
+ A pair of a channel number, mode and the (sharable) settings for that channel
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _Role:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _RoleEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Channel._Role.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ DISABLED: Channel._Role.ValueType # 0
+ """
+ This channel is not in use right now
+ """
+ PRIMARY: Channel._Role.ValueType # 1
+ """
+ This channel is used to set the frequency for the radio - all other enabled channels must be SECONDARY
+ """
+ SECONDARY: Channel._Role.ValueType # 2
+ """
+ Secondary channels are only used for encryption/decryption/authentication purposes.
+ Their radio settings (freq etc) are ignored, only psk is used.
+ """
+
+ class Role(_Role, metaclass=_RoleEnumTypeWrapper):
+ """
+ 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)
+ """
+
+ DISABLED: Channel.Role.ValueType # 0
+ """
+ This channel is not in use right now
+ """
+ PRIMARY: Channel.Role.ValueType # 1
+ """
+ This channel is used to set the frequency for the radio - all other enabled channels must be SECONDARY
+ """
+ SECONDARY: Channel.Role.ValueType # 2
+ """
+ Secondary channels are only used for encryption/decryption/authentication purposes.
+ Their radio settings (freq etc) are ignored, only psk is used.
+ """
+
+ INDEX_FIELD_NUMBER: builtins.int
+ SETTINGS_FIELD_NUMBER: builtins.int
+ ROLE_FIELD_NUMBER: builtins.int
+ index: builtins.int
+ """
+ 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.
+ """
+ @property
+ def settings(self) -> global___ChannelSettings:
+ """
+ The new settings, or NULL to disable that channel
+ """
+ role: global___Channel.Role.ValueType
+ """
+ TODO: REPLACE
+ """
+ def __init__(
+ self,
+ *,
+ index: builtins.int = ...,
+ settings: global___ChannelSettings | None = ...,
+ role: global___Channel.Role.ValueType = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["settings", b"settings"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["index", b"index", "role", b"role", "settings", b"settings"]) -> None: ...
+
+global___Channel = Channel
diff --git a/meshtastic/clientonly_pb2.py b/meshtastic/clientonly_pb2.py
index ebb51111..91e7b0d9 100644
--- a/meshtastic/clientonly_pb2.py
+++ b/meshtastic/clientonly_pb2.py
@@ -14,7 +14,7 @@
from meshtastic import localonly_pb2 as meshtastic_dot_localonly__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bmeshtastic/clientonly.proto\x1a\x1ameshtastic/localonly.proto\"\xf7\x01\n\rDeviceProfile\x12\x16\n\tlong_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nshort_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x63hannel_url\x18\x03 \x01(\tH\x02\x88\x01\x01\x12!\n\x06\x63onfig\x18\x04 \x01(\x0b\x32\x0c.LocalConfigH\x03\x88\x01\x01\x12.\n\rmodule_config\x18\x05 \x01(\x0b\x32\x12.LocalModuleConfigH\x04\x88\x01\x01\x42\x0c\n\n_long_nameB\r\n\x0b_short_nameB\x0e\n\x0c_channel_urlB\t\n\x07_configB\x10\n\x0e_module_configBe\n\x13\x63om.geeksville.meshB\x10\x43lientOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bmeshtastic/clientonly.proto\x12\nmeshtastic\x1a\x1ameshtastic/localonly.proto\"\x8d\x02\n\rDeviceProfile\x12\x16\n\tlong_name\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x17\n\nshort_name\x18\x02 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x63hannel_url\x18\x03 \x01(\tH\x02\x88\x01\x01\x12,\n\x06\x63onfig\x18\x04 \x01(\x0b\x32\x17.meshtastic.LocalConfigH\x03\x88\x01\x01\x12\x39\n\rmodule_config\x18\x05 \x01(\x0b\x32\x1d.meshtastic.LocalModuleConfigH\x04\x88\x01\x01\x42\x0c\n\n_long_nameB\r\n\x0b_short_nameB\x0e\n\x0c_channel_urlB\t\n\x07_configB\x10\n\x0e_module_configBe\n\x13\x63om.geeksville.meshB\x10\x43lientOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.clientonly_pb2', globals())
@@ -22,6 +22,6 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\020ClientOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _DEVICEPROFILE._serialized_start=60
- _DEVICEPROFILE._serialized_end=307
+ _DEVICEPROFILE._serialized_start=72
+ _DEVICEPROFILE._serialized_end=341
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/clientonly_pb2.pyi b/meshtastic/clientonly_pb2.pyi
new file mode 100644
index 00000000..10820e79
--- /dev/null
+++ b/meshtastic/clientonly_pb2.pyi
@@ -0,0 +1,77 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import meshtastic.localonly_pb2
+import sys
+import typing
+
+if sys.version_info >= (3, 8):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class DeviceProfile(google.protobuf.message.Message):
+ """
+ This abstraction is used to contain any configuration for provisioning a node on any client.
+ It is useful for importing and exporting configurations.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ LONG_NAME_FIELD_NUMBER: builtins.int
+ SHORT_NAME_FIELD_NUMBER: builtins.int
+ CHANNEL_URL_FIELD_NUMBER: builtins.int
+ CONFIG_FIELD_NUMBER: builtins.int
+ MODULE_CONFIG_FIELD_NUMBER: builtins.int
+ long_name: builtins.str
+ """
+ Long name for the node
+ """
+ short_name: builtins.str
+ """
+ Short name of the node
+ """
+ channel_url: builtins.str
+ """
+ The url of the channels from our node
+ """
+ @property
+ def config(self) -> meshtastic.localonly_pb2.LocalConfig:
+ """
+ The Config of the node
+ """
+ @property
+ def module_config(self) -> meshtastic.localonly_pb2.LocalModuleConfig:
+ """
+ The ModuleConfig of the node
+ """
+ def __init__(
+ self,
+ *,
+ long_name: builtins.str | None = ...,
+ short_name: builtins.str | None = ...,
+ channel_url: builtins.str | None = ...,
+ config: meshtastic.localonly_pb2.LocalConfig | None = ...,
+ module_config: meshtastic.localonly_pb2.LocalModuleConfig | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["_channel_url", b"_channel_url", "_config", b"_config", "_long_name", b"_long_name", "_module_config", b"_module_config", "_short_name", b"_short_name", "channel_url", b"channel_url", "config", b"config", "long_name", b"long_name", "module_config", b"module_config", "short_name", b"short_name"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["_channel_url", b"_channel_url", "_config", b"_config", "_long_name", b"_long_name", "_module_config", b"_module_config", "_short_name", b"_short_name", "channel_url", b"channel_url", "config", b"config", "long_name", b"long_name", "module_config", b"module_config", "short_name", b"short_name"]) -> None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_channel_url", b"_channel_url"]) -> typing_extensions.Literal["channel_url"] | None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_config", b"_config"]) -> typing_extensions.Literal["config"] | None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_long_name", b"_long_name"]) -> typing_extensions.Literal["long_name"] | None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_module_config", b"_module_config"]) -> typing_extensions.Literal["module_config"] | None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_short_name", b"_short_name"]) -> typing_extensions.Literal["short_name"] | None: ...
+
+global___DeviceProfile = DeviceProfile
diff --git a/meshtastic/config_pb2.py b/meshtastic/config_pb2.py
index d39cc8ef..79becdfd 100644
--- a/meshtastic/config_pb2.py
+++ b/meshtastic/config_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17meshtastic/config.proto\"\xc2\x1d\n\x06\x43onfig\x12&\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x14.Config.DeviceConfigH\x00\x12*\n\x08position\x18\x02 \x01(\x0b\x32\x16.Config.PositionConfigH\x00\x12$\n\x05power\x18\x03 \x01(\x0b\x32\x13.Config.PowerConfigH\x00\x12(\n\x07network\x18\x04 \x01(\x0b\x32\x15.Config.NetworkConfigH\x00\x12(\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\x15.Config.DisplayConfigH\x00\x12\"\n\x04lora\x18\x06 \x01(\x0b\x32\x12.Config.LoRaConfigH\x00\x12,\n\tbluetooth\x18\x07 \x01(\x0b\x32\x17.Config.BluetoothConfigH\x00\x1a\xcc\x04\n\x0c\x44\x65viceConfig\x12\'\n\x04role\x18\x01 \x01(\x0e\x32\x19.Config.DeviceConfig.Role\x12\x16\n\x0eserial_enabled\x18\x02 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x03 \x01(\x08\x12\x13\n\x0b\x62utton_gpio\x18\x04 \x01(\r\x12\x13\n\x0b\x62uzzer_gpio\x18\x05 \x01(\r\x12>\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32$.Config.DeviceConfig.RebroadcastMode\x12 \n\x18node_info_broadcast_secs\x18\x07 \x01(\r\x12\"\n\x1a\x64ouble_tap_as_button_press\x18\x08 \x01(\x08\x12\x12\n\nis_managed\x18\t \x01(\x08\x12\x1c\n\x14\x64isable_triple_click\x18\n \x01(\x08\"\xaa\x01\n\x04Role\x12\n\n\x06\x43LIENT\x10\x00\x12\x0f\n\x0b\x43LIENT_MUTE\x10\x01\x12\n\n\x06ROUTER\x10\x02\x12\x11\n\rROUTER_CLIENT\x10\x03\x12\x0c\n\x08REPEATER\x10\x04\x12\x0b\n\x07TRACKER\x10\x05\x12\n\n\x06SENSOR\x10\x06\x12\x07\n\x03TAK\x10\x07\x12\x11\n\rCLIENT_HIDDEN\x10\x08\x12\x12\n\x0eLOST_AND_FOUND\x10\t\x12\x0f\n\x0bTAK_TRACKER\x10\n\"Q\n\x0fRebroadcastMode\x12\x07\n\x03\x41LL\x10\x00\x12\x15\n\x11\x41LL_SKIP_DECODING\x10\x01\x12\x0e\n\nLOCAL_ONLY\x10\x02\x12\x0e\n\nKNOWN_ONLY\x10\x03\x1a\x86\x05\n\x0ePositionConfig\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12(\n position_broadcast_smart_enabled\x18\x02 \x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\x03 \x01(\x08\x12\x17\n\x0bgps_enabled\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x1b\n\x13gps_update_interval\x18\x05 \x01(\r\x12\x1c\n\x10gps_attempt_time\x18\x06 \x01(\rB\x02\x18\x01\x12\x16\n\x0eposition_flags\x18\x07 \x01(\r\x12\x0f\n\x07rx_gpio\x18\x08 \x01(\r\x12\x0f\n\x07tx_gpio\x18\t \x01(\r\x12(\n broadcast_smart_minimum_distance\x18\n \x01(\r\x12-\n%broadcast_smart_minimum_interval_secs\x18\x0b \x01(\r\x12\x13\n\x0bgps_en_gpio\x18\x0c \x01(\r\x12\x30\n\x08gps_mode\x18\r \x01(\x0e\x32\x1e.Config.PositionConfig.GpsMode\"\xab\x01\n\rPositionFlags\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x41LTITUDE\x10\x01\x12\x10\n\x0c\x41LTITUDE_MSL\x10\x02\x12\x16\n\x12GEOIDAL_SEPARATION\x10\x04\x12\x07\n\x03\x44OP\x10\x08\x12\t\n\x05HVDOP\x10\x10\x12\r\n\tSATINVIEW\x10 \x12\n\n\x06SEQ_NO\x10@\x12\x0e\n\tTIMESTAMP\x10\x80\x01\x12\x0c\n\x07HEADING\x10\x80\x02\x12\n\n\x05SPEED\x10\x80\x04\"5\n\x07GpsMode\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07\x45NABLED\x10\x01\x12\x0f\n\x0bNOT_PRESENT\x10\x02\x1a\xea\x01\n\x0bPowerConfig\x12\x17\n\x0fis_power_saving\x18\x01 \x01(\x08\x12&\n\x1eon_battery_shutdown_after_secs\x18\x02 \x01(\r\x12\x1f\n\x17\x61\x64\x63_multiplier_override\x18\x03 \x01(\x02\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x10\n\x08sds_secs\x18\x06 \x01(\r\x12\x0f\n\x07ls_secs\x18\x07 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x08 \x01(\r\x12\"\n\x1a\x64\x65vice_battery_ina_address\x18\t \x01(\r\x1a\xe8\x02\n\rNetworkConfig\x12\x14\n\x0cwifi_enabled\x18\x01 \x01(\x08\x12\x11\n\twifi_ssid\x18\x03 \x01(\t\x12\x10\n\x08wifi_psk\x18\x04 \x01(\t\x12\x12\n\nntp_server\x18\x05 \x01(\t\x12\x13\n\x0b\x65th_enabled\x18\x06 \x01(\x08\x12\x37\n\x0c\x61\x64\x64ress_mode\x18\x07 \x01(\x0e\x32!.Config.NetworkConfig.AddressMode\x12\x35\n\x0bipv4_config\x18\x08 \x01(\x0b\x32 .Config.NetworkConfig.IpV4Config\x12\x16\n\x0ersyslog_server\x18\t \x01(\t\x1a\x46\n\nIpV4Config\x12\n\n\x02ip\x18\x01 \x01(\x07\x12\x0f\n\x07gateway\x18\x02 \x01(\x07\x12\x0e\n\x06subnet\x18\x03 \x01(\x07\x12\x0b\n\x03\x64ns\x18\x04 \x01(\x07\"#\n\x0b\x41\x64\x64ressMode\x12\x08\n\x04\x44HCP\x10\x00\x12\n\n\x06STATIC\x10\x01\x1a\x92\x05\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01 \x01(\r\x12=\n\ngps_format\x18\x02 \x01(\x0e\x32).Config.DisplayConfig.GpsCoordinateFormat\x12!\n\x19\x61uto_screen_carousel_secs\x18\x03 \x01(\r\x12\x19\n\x11\x63ompass_north_top\x18\x04 \x01(\x08\x12\x13\n\x0b\x66lip_screen\x18\x05 \x01(\x08\x12\x31\n\x05units\x18\x06 \x01(\x0e\x32\".Config.DisplayConfig.DisplayUnits\x12,\n\x04oled\x18\x07 \x01(\x0e\x32\x1e.Config.DisplayConfig.OledType\x12\x36\n\x0b\x64isplaymode\x18\x08 \x01(\x0e\x32!.Config.DisplayConfig.DisplayMode\x12\x14\n\x0cheading_bold\x18\t \x01(\x08\x12\x1d\n\x15wake_on_tap_or_motion\x18\n \x01(\x08\"M\n\x13GpsCoordinateFormat\x12\x07\n\x03\x44\x45\x43\x10\x00\x12\x07\n\x03\x44MS\x10\x01\x12\x07\n\x03UTM\x10\x02\x12\x08\n\x04MGRS\x10\x03\x12\x07\n\x03OLC\x10\x04\x12\x08\n\x04OSGR\x10\x05\"(\n\x0c\x44isplayUnits\x12\n\n\x06METRIC\x10\x00\x12\x0c\n\x08IMPERIAL\x10\x01\"M\n\x08OledType\x12\r\n\tOLED_AUTO\x10\x00\x12\x10\n\x0cOLED_SSD1306\x10\x01\x12\x0f\n\x0bOLED_SH1106\x10\x02\x12\x0f\n\x0bOLED_SH1107\x10\x03\"A\n\x0b\x44isplayMode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x0c\n\x08TWOCOLOR\x10\x01\x12\x0c\n\x08INVERTED\x10\x02\x12\t\n\x05\x43OLOR\x10\x03\x1a\x9a\x06\n\nLoRaConfig\x12\x12\n\nuse_preset\x18\x01 \x01(\x08\x12\x34\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32\x1e.Config.LoRaConfig.ModemPreset\x12\x11\n\tbandwidth\x18\x03 \x01(\r\x12\x15\n\rspread_factor\x18\x04 \x01(\r\x12\x13\n\x0b\x63oding_rate\x18\x05 \x01(\r\x12\x18\n\x10\x66requency_offset\x18\x06 \x01(\x02\x12-\n\x06region\x18\x07 \x01(\x0e\x32\x1d.Config.LoRaConfig.RegionCode\x12\x11\n\thop_limit\x18\x08 \x01(\r\x12\x12\n\ntx_enabled\x18\t \x01(\x08\x12\x10\n\x08tx_power\x18\n \x01(\x05\x12\x13\n\x0b\x63hannel_num\x18\x0b \x01(\r\x12\x1b\n\x13override_duty_cycle\x18\x0c \x01(\x08\x12\x1e\n\x16sx126x_rx_boosted_gain\x18\r \x01(\x08\x12\x1a\n\x12override_frequency\x18\x0e \x01(\x02\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x13\n\x0bignore_mqtt\x18h \x01(\x08\"\xcd\x01\n\nRegionCode\x12\t\n\x05UNSET\x10\x00\x12\x06\n\x02US\x10\x01\x12\n\n\x06\x45U_433\x10\x02\x12\n\n\x06\x45U_868\x10\x03\x12\x06\n\x02\x43N\x10\x04\x12\x06\n\x02JP\x10\x05\x12\x07\n\x03\x41NZ\x10\x06\x12\x06\n\x02KR\x10\x07\x12\x06\n\x02TW\x10\x08\x12\x06\n\x02RU\x10\t\x12\x06\n\x02IN\x10\n\x12\n\n\x06NZ_865\x10\x0b\x12\x06\n\x02TH\x10\x0c\x12\x0b\n\x07LORA_24\x10\r\x12\n\n\x06UA_433\x10\x0e\x12\n\n\x06UA_868\x10\x0f\x12\n\n\x06MY_433\x10\x10\x12\n\n\x06MY_919\x10\x11\x12\n\n\x06SG_923\x10\x12\"\x94\x01\n\x0bModemPreset\x12\r\n\tLONG_FAST\x10\x00\x12\r\n\tLONG_SLOW\x10\x01\x12\x12\n\x0eVERY_LONG_SLOW\x10\x02\x12\x0f\n\x0bMEDIUM_SLOW\x10\x03\x12\x0f\n\x0bMEDIUM_FAST\x10\x04\x12\x0e\n\nSHORT_SLOW\x10\x05\x12\x0e\n\nSHORT_FAST\x10\x06\x12\x11\n\rLONG_MODERATE\x10\x07\x1a\xa2\x01\n\x0f\x42luetoothConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x31\n\x04mode\x18\x02 \x01(\x0e\x32#.Config.BluetoothConfig.PairingMode\x12\x11\n\tfixed_pin\x18\x03 \x01(\r\"8\n\x0bPairingMode\x12\x0e\n\nRANDOM_PIN\x10\x00\x12\r\n\tFIXED_PIN\x10\x01\x12\n\n\x06NO_PIN\x10\x02\x42\x11\n\x0fpayload_variantBa\n\x13\x63om.geeksville.meshB\x0c\x43onfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17meshtastic/config.proto\x12\nmeshtastic\"\x93\x1f\n\x06\x43onfig\x12\x31\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x1f.meshtastic.Config.DeviceConfigH\x00\x12\x35\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.Config.PositionConfigH\x00\x12/\n\x05power\x18\x03 \x01(\x0b\x32\x1e.meshtastic.Config.PowerConfigH\x00\x12\x33\n\x07network\x18\x04 \x01(\x0b\x32 .meshtastic.Config.NetworkConfigH\x00\x12\x33\n\x07\x64isplay\x18\x05 \x01(\x0b\x32 .meshtastic.Config.DisplayConfigH\x00\x12-\n\x04lora\x18\x06 \x01(\x0b\x32\x1d.meshtastic.Config.LoRaConfigH\x00\x12\x37\n\tbluetooth\x18\x07 \x01(\x0b\x32\".meshtastic.Config.BluetoothConfigH\x00\x1a\xe2\x04\n\x0c\x44\x65viceConfig\x12\x32\n\x04role\x18\x01 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12\x16\n\x0eserial_enabled\x18\x02 \x01(\x08\x12\x19\n\x11\x64\x65\x62ug_log_enabled\x18\x03 \x01(\x08\x12\x13\n\x0b\x62utton_gpio\x18\x04 \x01(\r\x12\x13\n\x0b\x62uzzer_gpio\x18\x05 \x01(\r\x12I\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32/.meshtastic.Config.DeviceConfig.RebroadcastMode\x12 \n\x18node_info_broadcast_secs\x18\x07 \x01(\r\x12\"\n\x1a\x64ouble_tap_as_button_press\x18\x08 \x01(\x08\x12\x12\n\nis_managed\x18\t \x01(\x08\x12\x1c\n\x14\x64isable_triple_click\x18\n \x01(\x08\"\xaa\x01\n\x04Role\x12\n\n\x06\x43LIENT\x10\x00\x12\x0f\n\x0b\x43LIENT_MUTE\x10\x01\x12\n\n\x06ROUTER\x10\x02\x12\x11\n\rROUTER_CLIENT\x10\x03\x12\x0c\n\x08REPEATER\x10\x04\x12\x0b\n\x07TRACKER\x10\x05\x12\n\n\x06SENSOR\x10\x06\x12\x07\n\x03TAK\x10\x07\x12\x11\n\rCLIENT_HIDDEN\x10\x08\x12\x12\n\x0eLOST_AND_FOUND\x10\t\x12\x0f\n\x0bTAK_TRACKER\x10\n\"Q\n\x0fRebroadcastMode\x12\x07\n\x03\x41LL\x10\x00\x12\x15\n\x11\x41LL_SKIP_DECODING\x10\x01\x12\x0e\n\nLOCAL_ONLY\x10\x02\x12\x0e\n\nKNOWN_ONLY\x10\x03\x1a\x91\x05\n\x0ePositionConfig\x12\x1f\n\x17position_broadcast_secs\x18\x01 \x01(\r\x12(\n position_broadcast_smart_enabled\x18\x02 \x01(\x08\x12\x16\n\x0e\x66ixed_position\x18\x03 \x01(\x08\x12\x17\n\x0bgps_enabled\x18\x04 \x01(\x08\x42\x02\x18\x01\x12\x1b\n\x13gps_update_interval\x18\x05 \x01(\r\x12\x1c\n\x10gps_attempt_time\x18\x06 \x01(\rB\x02\x18\x01\x12\x16\n\x0eposition_flags\x18\x07 \x01(\r\x12\x0f\n\x07rx_gpio\x18\x08 \x01(\r\x12\x0f\n\x07tx_gpio\x18\t \x01(\r\x12(\n broadcast_smart_minimum_distance\x18\n \x01(\r\x12-\n%broadcast_smart_minimum_interval_secs\x18\x0b \x01(\r\x12\x13\n\x0bgps_en_gpio\x18\x0c \x01(\r\x12;\n\x08gps_mode\x18\r \x01(\x0e\x32).meshtastic.Config.PositionConfig.GpsMode\"\xab\x01\n\rPositionFlags\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x41LTITUDE\x10\x01\x12\x10\n\x0c\x41LTITUDE_MSL\x10\x02\x12\x16\n\x12GEOIDAL_SEPARATION\x10\x04\x12\x07\n\x03\x44OP\x10\x08\x12\t\n\x05HVDOP\x10\x10\x12\r\n\tSATINVIEW\x10 \x12\n\n\x06SEQ_NO\x10@\x12\x0e\n\tTIMESTAMP\x10\x80\x01\x12\x0c\n\x07HEADING\x10\x80\x02\x12\n\n\x05SPEED\x10\x80\x04\"5\n\x07GpsMode\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07\x45NABLED\x10\x01\x12\x0f\n\x0bNOT_PRESENT\x10\x02\x1a\xea\x01\n\x0bPowerConfig\x12\x17\n\x0fis_power_saving\x18\x01 \x01(\x08\x12&\n\x1eon_battery_shutdown_after_secs\x18\x02 \x01(\r\x12\x1f\n\x17\x61\x64\x63_multiplier_override\x18\x03 \x01(\x02\x12\x1b\n\x13wait_bluetooth_secs\x18\x04 \x01(\r\x12\x10\n\x08sds_secs\x18\x06 \x01(\r\x12\x0f\n\x07ls_secs\x18\x07 \x01(\r\x12\x15\n\rmin_wake_secs\x18\x08 \x01(\r\x12\"\n\x1a\x64\x65vice_battery_ina_address\x18\t \x01(\r\x1a\xfe\x02\n\rNetworkConfig\x12\x14\n\x0cwifi_enabled\x18\x01 \x01(\x08\x12\x11\n\twifi_ssid\x18\x03 \x01(\t\x12\x10\n\x08wifi_psk\x18\x04 \x01(\t\x12\x12\n\nntp_server\x18\x05 \x01(\t\x12\x13\n\x0b\x65th_enabled\x18\x06 \x01(\x08\x12\x42\n\x0c\x61\x64\x64ress_mode\x18\x07 \x01(\x0e\x32,.meshtastic.Config.NetworkConfig.AddressMode\x12@\n\x0bipv4_config\x18\x08 \x01(\x0b\x32+.meshtastic.Config.NetworkConfig.IpV4Config\x12\x16\n\x0ersyslog_server\x18\t \x01(\t\x1a\x46\n\nIpV4Config\x12\n\n\x02ip\x18\x01 \x01(\x07\x12\x0f\n\x07gateway\x18\x02 \x01(\x07\x12\x0e\n\x06subnet\x18\x03 \x01(\x07\x12\x0b\n\x03\x64ns\x18\x04 \x01(\x07\"#\n\x0b\x41\x64\x64ressMode\x12\x08\n\x04\x44HCP\x10\x00\x12\n\n\x06STATIC\x10\x01\x1a\xbe\x05\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01 \x01(\r\x12H\n\ngps_format\x18\x02 \x01(\x0e\x32\x34.meshtastic.Config.DisplayConfig.GpsCoordinateFormat\x12!\n\x19\x61uto_screen_carousel_secs\x18\x03 \x01(\r\x12\x19\n\x11\x63ompass_north_top\x18\x04 \x01(\x08\x12\x13\n\x0b\x66lip_screen\x18\x05 \x01(\x08\x12<\n\x05units\x18\x06 \x01(\x0e\x32-.meshtastic.Config.DisplayConfig.DisplayUnits\x12\x37\n\x04oled\x18\x07 \x01(\x0e\x32).meshtastic.Config.DisplayConfig.OledType\x12\x41\n\x0b\x64isplaymode\x18\x08 \x01(\x0e\x32,.meshtastic.Config.DisplayConfig.DisplayMode\x12\x14\n\x0cheading_bold\x18\t \x01(\x08\x12\x1d\n\x15wake_on_tap_or_motion\x18\n \x01(\x08\"M\n\x13GpsCoordinateFormat\x12\x07\n\x03\x44\x45\x43\x10\x00\x12\x07\n\x03\x44MS\x10\x01\x12\x07\n\x03UTM\x10\x02\x12\x08\n\x04MGRS\x10\x03\x12\x07\n\x03OLC\x10\x04\x12\x08\n\x04OSGR\x10\x05\"(\n\x0c\x44isplayUnits\x12\n\n\x06METRIC\x10\x00\x12\x0c\n\x08IMPERIAL\x10\x01\"M\n\x08OledType\x12\r\n\tOLED_AUTO\x10\x00\x12\x10\n\x0cOLED_SSD1306\x10\x01\x12\x0f\n\x0bOLED_SH1106\x10\x02\x12\x0f\n\x0bOLED_SH1107\x10\x03\"A\n\x0b\x44isplayMode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\x0c\n\x08TWOCOLOR\x10\x01\x12\x0c\n\x08INVERTED\x10\x02\x12\t\n\x05\x43OLOR\x10\x03\x1a\xb0\x06\n\nLoRaConfig\x12\x12\n\nuse_preset\x18\x01 \x01(\x08\x12?\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPreset\x12\x11\n\tbandwidth\x18\x03 \x01(\r\x12\x15\n\rspread_factor\x18\x04 \x01(\r\x12\x13\n\x0b\x63oding_rate\x18\x05 \x01(\r\x12\x18\n\x10\x66requency_offset\x18\x06 \x01(\x02\x12\x38\n\x06region\x18\x07 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12\x11\n\thop_limit\x18\x08 \x01(\r\x12\x12\n\ntx_enabled\x18\t \x01(\x08\x12\x10\n\x08tx_power\x18\n \x01(\x05\x12\x13\n\x0b\x63hannel_num\x18\x0b \x01(\r\x12\x1b\n\x13override_duty_cycle\x18\x0c \x01(\x08\x12\x1e\n\x16sx126x_rx_boosted_gain\x18\r \x01(\x08\x12\x1a\n\x12override_frequency\x18\x0e \x01(\x02\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x13\n\x0bignore_mqtt\x18h \x01(\x08\"\xcd\x01\n\nRegionCode\x12\t\n\x05UNSET\x10\x00\x12\x06\n\x02US\x10\x01\x12\n\n\x06\x45U_433\x10\x02\x12\n\n\x06\x45U_868\x10\x03\x12\x06\n\x02\x43N\x10\x04\x12\x06\n\x02JP\x10\x05\x12\x07\n\x03\x41NZ\x10\x06\x12\x06\n\x02KR\x10\x07\x12\x06\n\x02TW\x10\x08\x12\x06\n\x02RU\x10\t\x12\x06\n\x02IN\x10\n\x12\n\n\x06NZ_865\x10\x0b\x12\x06\n\x02TH\x10\x0c\x12\x0b\n\x07LORA_24\x10\r\x12\n\n\x06UA_433\x10\x0e\x12\n\n\x06UA_868\x10\x0f\x12\n\n\x06MY_433\x10\x10\x12\n\n\x06MY_919\x10\x11\x12\n\n\x06SG_923\x10\x12\"\x94\x01\n\x0bModemPreset\x12\r\n\tLONG_FAST\x10\x00\x12\r\n\tLONG_SLOW\x10\x01\x12\x12\n\x0eVERY_LONG_SLOW\x10\x02\x12\x0f\n\x0bMEDIUM_SLOW\x10\x03\x12\x0f\n\x0bMEDIUM_FAST\x10\x04\x12\x0e\n\nSHORT_SLOW\x10\x05\x12\x0e\n\nSHORT_FAST\x10\x06\x12\x11\n\rLONG_MODERATE\x10\x07\x1a\xad\x01\n\x0f\x42luetoothConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12<\n\x04mode\x18\x02 \x01(\x0e\x32..meshtastic.Config.BluetoothConfig.PairingMode\x12\x11\n\tfixed_pin\x18\x03 \x01(\r\"8\n\x0bPairingMode\x12\x0e\n\nRANDOM_PIN\x10\x00\x12\r\n\tFIXED_PIN\x10\x01\x12\n\n\x06NO_PIN\x10\x02\x42\x11\n\x0fpayload_variantBa\n\x13\x63om.geeksville.meshB\x0c\x43onfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.config_pb2', globals())
@@ -25,46 +25,46 @@
_CONFIG_POSITIONCONFIG.fields_by_name['gps_enabled']._serialized_options = b'\030\001'
_CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._options = None
_CONFIG_POSITIONCONFIG.fields_by_name['gps_attempt_time']._serialized_options = b'\030\001'
- _CONFIG._serialized_start=28
- _CONFIG._serialized_end=3806
- _CONFIG_DEVICECONFIG._serialized_start=327
- _CONFIG_DEVICECONFIG._serialized_end=915
- _CONFIG_DEVICECONFIG_ROLE._serialized_start=662
- _CONFIG_DEVICECONFIG_ROLE._serialized_end=832
- _CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_start=834
- _CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_end=915
- _CONFIG_POSITIONCONFIG._serialized_start=918
- _CONFIG_POSITIONCONFIG._serialized_end=1564
- _CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_start=1338
- _CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_end=1509
- _CONFIG_POSITIONCONFIG_GPSMODE._serialized_start=1511
- _CONFIG_POSITIONCONFIG_GPSMODE._serialized_end=1564
- _CONFIG_POWERCONFIG._serialized_start=1567
- _CONFIG_POWERCONFIG._serialized_end=1801
- _CONFIG_NETWORKCONFIG._serialized_start=1804
- _CONFIG_NETWORKCONFIG._serialized_end=2164
- _CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_start=2057
- _CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_end=2127
- _CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_start=2129
- _CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_end=2164
- _CONFIG_DISPLAYCONFIG._serialized_start=2167
- _CONFIG_DISPLAYCONFIG._serialized_end=2825
- _CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT._serialized_start=2560
- _CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT._serialized_end=2637
- _CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_start=2639
- _CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_end=2679
- _CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_start=2681
- _CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_end=2758
- _CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_start=2760
- _CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_end=2825
- _CONFIG_LORACONFIG._serialized_start=2828
- _CONFIG_LORACONFIG._serialized_end=3622
- _CONFIG_LORACONFIG_REGIONCODE._serialized_start=3266
- _CONFIG_LORACONFIG_REGIONCODE._serialized_end=3471
- _CONFIG_LORACONFIG_MODEMPRESET._serialized_start=3474
- _CONFIG_LORACONFIG_MODEMPRESET._serialized_end=3622
- _CONFIG_BLUETOOTHCONFIG._serialized_start=3625
- _CONFIG_BLUETOOTHCONFIG._serialized_end=3787
- _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_start=3731
- _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_end=3787
+ _CONFIG._serialized_start=40
+ _CONFIG._serialized_end=4027
+ _CONFIG_DEVICECONFIG._serialized_start=416
+ _CONFIG_DEVICECONFIG._serialized_end=1026
+ _CONFIG_DEVICECONFIG_ROLE._serialized_start=773
+ _CONFIG_DEVICECONFIG_ROLE._serialized_end=943
+ _CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_start=945
+ _CONFIG_DEVICECONFIG_REBROADCASTMODE._serialized_end=1026
+ _CONFIG_POSITIONCONFIG._serialized_start=1029
+ _CONFIG_POSITIONCONFIG._serialized_end=1686
+ _CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_start=1460
+ _CONFIG_POSITIONCONFIG_POSITIONFLAGS._serialized_end=1631
+ _CONFIG_POSITIONCONFIG_GPSMODE._serialized_start=1633
+ _CONFIG_POSITIONCONFIG_GPSMODE._serialized_end=1686
+ _CONFIG_POWERCONFIG._serialized_start=1689
+ _CONFIG_POWERCONFIG._serialized_end=1923
+ _CONFIG_NETWORKCONFIG._serialized_start=1926
+ _CONFIG_NETWORKCONFIG._serialized_end=2308
+ _CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_start=2201
+ _CONFIG_NETWORKCONFIG_IPV4CONFIG._serialized_end=2271
+ _CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_start=2273
+ _CONFIG_NETWORKCONFIG_ADDRESSMODE._serialized_end=2308
+ _CONFIG_DISPLAYCONFIG._serialized_start=2311
+ _CONFIG_DISPLAYCONFIG._serialized_end=3013
+ _CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT._serialized_start=2748
+ _CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT._serialized_end=2825
+ _CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_start=2827
+ _CONFIG_DISPLAYCONFIG_DISPLAYUNITS._serialized_end=2867
+ _CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_start=2869
+ _CONFIG_DISPLAYCONFIG_OLEDTYPE._serialized_end=2946
+ _CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_start=2948
+ _CONFIG_DISPLAYCONFIG_DISPLAYMODE._serialized_end=3013
+ _CONFIG_LORACONFIG._serialized_start=3016
+ _CONFIG_LORACONFIG._serialized_end=3832
+ _CONFIG_LORACONFIG_REGIONCODE._serialized_start=3476
+ _CONFIG_LORACONFIG_REGIONCODE._serialized_end=3681
+ _CONFIG_LORACONFIG_MODEMPRESET._serialized_start=3684
+ _CONFIG_LORACONFIG_MODEMPRESET._serialized_end=3832
+ _CONFIG_BLUETOOTHCONFIG._serialized_start=3835
+ _CONFIG_BLUETOOTHCONFIG._serialized_end=4008
+ _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_start=3952
+ _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE._serialized_end=4008
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/config_pb2.pyi b/meshtastic/config_pb2.pyi
new file mode 100644
index 00000000..1673f77f
--- /dev/null
+++ b/meshtastic/config_pb2.pyi
@@ -0,0 +1,1501 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import collections.abc
+import google.protobuf.descriptor
+import google.protobuf.internal.containers
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class Config(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class DeviceConfig(google.protobuf.message.Message):
+ """
+ Configuration
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _Role:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _RoleEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DeviceConfig._Role.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ CLIENT: Config.DeviceConfig._Role.ValueType # 0
+ """
+ Description: App connected or stand alone messaging device.
+ Technical Details: Default Role
+ """
+ CLIENT_MUTE: Config.DeviceConfig._Role.ValueType # 1
+ """
+ Description: Device that does not forward packets from other devices.
+ """
+ ROUTER: Config.DeviceConfig._Role.ValueType # 2
+ """
+ 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_CLIENT: Config.DeviceConfig._Role.ValueType # 3
+ """
+ Description: Combination of both ROUTER and CLIENT. Not for mobile devices.
+ """
+ REPEATER: Config.DeviceConfig._Role.ValueType # 4
+ """
+ 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.
+ """
+ TRACKER: Config.DeviceConfig._Role.ValueType # 5
+ """
+ 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.
+ """
+ SENSOR: Config.DeviceConfig._Role.ValueType # 6
+ """
+ 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.
+ """
+ TAK: Config.DeviceConfig._Role.ValueType # 7
+ """
+ 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
+ """
+ CLIENT_HIDDEN: Config.DeviceConfig._Role.ValueType # 8
+ """
+ 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
+ """
+ LOST_AND_FOUND: Config.DeviceConfig._Role.ValueType # 9
+ """
+ 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"
+ """
+ TAK_TRACKER: Config.DeviceConfig._Role.ValueType # 10
+ """
+ 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.
+ """
+
+ class Role(_Role, metaclass=_RoleEnumTypeWrapper):
+ """
+ Defines the device's role on the Mesh network
+ """
+
+ CLIENT: Config.DeviceConfig.Role.ValueType # 0
+ """
+ Description: App connected or stand alone messaging device.
+ Technical Details: Default Role
+ """
+ CLIENT_MUTE: Config.DeviceConfig.Role.ValueType # 1
+ """
+ Description: Device that does not forward packets from other devices.
+ """
+ ROUTER: Config.DeviceConfig.Role.ValueType # 2
+ """
+ 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_CLIENT: Config.DeviceConfig.Role.ValueType # 3
+ """
+ Description: Combination of both ROUTER and CLIENT. Not for mobile devices.
+ """
+ REPEATER: Config.DeviceConfig.Role.ValueType # 4
+ """
+ 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.
+ """
+ TRACKER: Config.DeviceConfig.Role.ValueType # 5
+ """
+ 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.
+ """
+ SENSOR: Config.DeviceConfig.Role.ValueType # 6
+ """
+ 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.
+ """
+ TAK: Config.DeviceConfig.Role.ValueType # 7
+ """
+ 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
+ """
+ CLIENT_HIDDEN: Config.DeviceConfig.Role.ValueType # 8
+ """
+ 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
+ """
+ LOST_AND_FOUND: Config.DeviceConfig.Role.ValueType # 9
+ """
+ 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"
+ """
+ TAK_TRACKER: Config.DeviceConfig.Role.ValueType # 10
+ """
+ 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.
+ """
+
+ class _RebroadcastMode:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _RebroadcastModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DeviceConfig._RebroadcastMode.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ ALL: Config.DeviceConfig._RebroadcastMode.ValueType # 0
+ """
+ Default behavior.
+ Rebroadcast any observed message, if it was on our private channel or from another mesh with the same lora params.
+ """
+ ALL_SKIP_DECODING: Config.DeviceConfig._RebroadcastMode.ValueType # 1
+ """
+ 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.
+ """
+ LOCAL_ONLY: Config.DeviceConfig._RebroadcastMode.ValueType # 2
+ """
+ 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.
+ """
+ KNOWN_ONLY: Config.DeviceConfig._RebroadcastMode.ValueType # 3
+ """
+ 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)
+ """
+
+ class RebroadcastMode(_RebroadcastMode, metaclass=_RebroadcastModeEnumTypeWrapper):
+ """
+ Defines the device's behavior for how messages are rebroadcast
+ """
+
+ ALL: Config.DeviceConfig.RebroadcastMode.ValueType # 0
+ """
+ Default behavior.
+ Rebroadcast any observed message, if it was on our private channel or from another mesh with the same lora params.
+ """
+ ALL_SKIP_DECODING: Config.DeviceConfig.RebroadcastMode.ValueType # 1
+ """
+ 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.
+ """
+ LOCAL_ONLY: Config.DeviceConfig.RebroadcastMode.ValueType # 2
+ """
+ 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.
+ """
+ KNOWN_ONLY: Config.DeviceConfig.RebroadcastMode.ValueType # 3
+ """
+ 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)
+ """
+
+ ROLE_FIELD_NUMBER: builtins.int
+ SERIAL_ENABLED_FIELD_NUMBER: builtins.int
+ DEBUG_LOG_ENABLED_FIELD_NUMBER: builtins.int
+ BUTTON_GPIO_FIELD_NUMBER: builtins.int
+ BUZZER_GPIO_FIELD_NUMBER: builtins.int
+ REBROADCAST_MODE_FIELD_NUMBER: builtins.int
+ NODE_INFO_BROADCAST_SECS_FIELD_NUMBER: builtins.int
+ DOUBLE_TAP_AS_BUTTON_PRESS_FIELD_NUMBER: builtins.int
+ IS_MANAGED_FIELD_NUMBER: builtins.int
+ DISABLE_TRIPLE_CLICK_FIELD_NUMBER: builtins.int
+ role: global___Config.DeviceConfig.Role.ValueType
+ """
+ Sets the role of node
+ """
+ serial_enabled: builtins.bool
+ """
+ Disabling this will disable the SerialConsole by not initilizing the StreamAPI
+ """
+ debug_log_enabled: builtins.bool
+ """
+ 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.
+ """
+ button_gpio: builtins.int
+ """
+ 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.
+ """
+ buzzer_gpio: builtins.int
+ """
+ For boards without a PWM buzzer, this is the pin number that will be used
+ Defaults to PIN_BUZZER if defined.
+ """
+ rebroadcast_mode: global___Config.DeviceConfig.RebroadcastMode.ValueType
+ """
+ Sets the role of node
+ """
+ node_info_broadcast_secs: builtins.int
+ """
+ Send our nodeinfo this often
+ Defaults to 900 Seconds (15 minutes)
+ """
+ double_tap_as_button_press: builtins.bool
+ """
+ Treat double tap interrupt on supported accelerometers as a button press if set to true
+ """
+ is_managed: builtins.bool
+ """
+ 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
+ """
+ disable_triple_click: builtins.bool
+ """
+ Disables the triple-press of user button to enable or disable GPS
+ """
+ def __init__(
+ self,
+ *,
+ role: global___Config.DeviceConfig.Role.ValueType = ...,
+ serial_enabled: builtins.bool = ...,
+ debug_log_enabled: builtins.bool = ...,
+ button_gpio: builtins.int = ...,
+ buzzer_gpio: builtins.int = ...,
+ rebroadcast_mode: global___Config.DeviceConfig.RebroadcastMode.ValueType = ...,
+ node_info_broadcast_secs: builtins.int = ...,
+ double_tap_as_button_press: builtins.bool = ...,
+ is_managed: builtins.bool = ...,
+ disable_triple_click: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["button_gpio", b"button_gpio", "buzzer_gpio", b"buzzer_gpio", "debug_log_enabled", b"debug_log_enabled", "disable_triple_click", b"disable_triple_click", "double_tap_as_button_press", b"double_tap_as_button_press", "is_managed", b"is_managed", "node_info_broadcast_secs", b"node_info_broadcast_secs", "rebroadcast_mode", b"rebroadcast_mode", "role", b"role", "serial_enabled", b"serial_enabled"]) -> None: ...
+
+ @typing_extensions.final
+ class PositionConfig(google.protobuf.message.Message):
+ """
+ Position Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _PositionFlags:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _PositionFlagsEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.PositionConfig._PositionFlags.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ UNSET: Config.PositionConfig._PositionFlags.ValueType # 0
+ """
+ Required for compilation
+ """
+ ALTITUDE: Config.PositionConfig._PositionFlags.ValueType # 1
+ """
+ Include an altitude value (if available)
+ """
+ ALTITUDE_MSL: Config.PositionConfig._PositionFlags.ValueType # 2
+ """
+ Altitude value is MSL
+ """
+ GEOIDAL_SEPARATION: Config.PositionConfig._PositionFlags.ValueType # 4
+ """
+ Include geoidal separation
+ """
+ DOP: Config.PositionConfig._PositionFlags.ValueType # 8
+ """
+ Include the DOP value ; PDOP used by default, see below
+ """
+ HVDOP: Config.PositionConfig._PositionFlags.ValueType # 16
+ """
+ If POS_DOP set, send separate HDOP / VDOP values instead of PDOP
+ """
+ SATINVIEW: Config.PositionConfig._PositionFlags.ValueType # 32
+ """
+ Include number of "satellites in view"
+ """
+ SEQ_NO: Config.PositionConfig._PositionFlags.ValueType # 64
+ """
+ Include a sequence number incremented per packet
+ """
+ TIMESTAMP: Config.PositionConfig._PositionFlags.ValueType # 128
+ """
+ Include positional timestamp (from GPS solution)
+ """
+ HEADING: Config.PositionConfig._PositionFlags.ValueType # 256
+ """
+ Include positional heading
+ Intended for use with vehicle not walking speeds
+ walking speeds are likely to be error prone like the compass
+ """
+ SPEED: Config.PositionConfig._PositionFlags.ValueType # 512
+ """
+ Include positional speed
+ Intended for use with vehicle not walking speeds
+ walking speeds are likely to be error prone like the compass
+ """
+
+ class PositionFlags(_PositionFlags, metaclass=_PositionFlagsEnumTypeWrapper):
+ """
+ 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
+ """
+
+ UNSET: Config.PositionConfig.PositionFlags.ValueType # 0
+ """
+ Required for compilation
+ """
+ ALTITUDE: Config.PositionConfig.PositionFlags.ValueType # 1
+ """
+ Include an altitude value (if available)
+ """
+ ALTITUDE_MSL: Config.PositionConfig.PositionFlags.ValueType # 2
+ """
+ Altitude value is MSL
+ """
+ GEOIDAL_SEPARATION: Config.PositionConfig.PositionFlags.ValueType # 4
+ """
+ Include geoidal separation
+ """
+ DOP: Config.PositionConfig.PositionFlags.ValueType # 8
+ """
+ Include the DOP value ; PDOP used by default, see below
+ """
+ HVDOP: Config.PositionConfig.PositionFlags.ValueType # 16
+ """
+ If POS_DOP set, send separate HDOP / VDOP values instead of PDOP
+ """
+ SATINVIEW: Config.PositionConfig.PositionFlags.ValueType # 32
+ """
+ Include number of "satellites in view"
+ """
+ SEQ_NO: Config.PositionConfig.PositionFlags.ValueType # 64
+ """
+ Include a sequence number incremented per packet
+ """
+ TIMESTAMP: Config.PositionConfig.PositionFlags.ValueType # 128
+ """
+ Include positional timestamp (from GPS solution)
+ """
+ HEADING: Config.PositionConfig.PositionFlags.ValueType # 256
+ """
+ Include positional heading
+ Intended for use with vehicle not walking speeds
+ walking speeds are likely to be error prone like the compass
+ """
+ SPEED: Config.PositionConfig.PositionFlags.ValueType # 512
+ """
+ Include positional speed
+ Intended for use with vehicle not walking speeds
+ walking speeds are likely to be error prone like the compass
+ """
+
+ class _GpsMode:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _GpsModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.PositionConfig._GpsMode.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ DISABLED: Config.PositionConfig._GpsMode.ValueType # 0
+ """
+ GPS is present but disabled
+ """
+ ENABLED: Config.PositionConfig._GpsMode.ValueType # 1
+ """
+ GPS is present and enabled
+ """
+ NOT_PRESENT: Config.PositionConfig._GpsMode.ValueType # 2
+ """
+ GPS is not present on the device
+ """
+
+ class GpsMode(_GpsMode, metaclass=_GpsModeEnumTypeWrapper): ...
+ DISABLED: Config.PositionConfig.GpsMode.ValueType # 0
+ """
+ GPS is present but disabled
+ """
+ ENABLED: Config.PositionConfig.GpsMode.ValueType # 1
+ """
+ GPS is present and enabled
+ """
+ NOT_PRESENT: Config.PositionConfig.GpsMode.ValueType # 2
+ """
+ GPS is not present on the device
+ """
+
+ POSITION_BROADCAST_SECS_FIELD_NUMBER: builtins.int
+ POSITION_BROADCAST_SMART_ENABLED_FIELD_NUMBER: builtins.int
+ FIXED_POSITION_FIELD_NUMBER: builtins.int
+ GPS_ENABLED_FIELD_NUMBER: builtins.int
+ GPS_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int
+ GPS_ATTEMPT_TIME_FIELD_NUMBER: builtins.int
+ POSITION_FLAGS_FIELD_NUMBER: builtins.int
+ RX_GPIO_FIELD_NUMBER: builtins.int
+ TX_GPIO_FIELD_NUMBER: builtins.int
+ BROADCAST_SMART_MINIMUM_DISTANCE_FIELD_NUMBER: builtins.int
+ BROADCAST_SMART_MINIMUM_INTERVAL_SECS_FIELD_NUMBER: builtins.int
+ GPS_EN_GPIO_FIELD_NUMBER: builtins.int
+ GPS_MODE_FIELD_NUMBER: builtins.int
+ position_broadcast_secs: builtins.int
+ """
+ We should send our position this often (but only if it has changed significantly)
+ Defaults to 15 minutes
+ """
+ position_broadcast_smart_enabled: builtins.bool
+ """
+ Adaptive position braoadcast, which is now the default.
+ """
+ fixed_position: builtins.bool
+ """
+ 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.
+ """
+ gps_enabled: builtins.bool
+ """
+ Is GPS enabled for this node?
+ """
+ gps_update_interval: builtins.int
+ """
+ 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.
+ """
+ gps_attempt_time: builtins.int
+ """
+ Deprecated in favor of using smart / regular broadcast intervals as implicit attempt time
+ """
+ position_flags: builtins.int
+ """
+ Bit field of boolean configuration options for POSITION messages
+ (bitwise OR of PositionFlags)
+ """
+ rx_gpio: builtins.int
+ """
+ (Re)define GPS_RX_PIN for your board.
+ """
+ tx_gpio: builtins.int
+ """
+ (Re)define GPS_TX_PIN for your board.
+ """
+ broadcast_smart_minimum_distance: builtins.int
+ """
+ The minimum distance in meters traveled (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled
+ """
+ broadcast_smart_minimum_interval_secs: builtins.int
+ """
+ The minimum number of seconds (since the last send) before we can send a position to the mesh if position_broadcast_smart_enabled
+ """
+ gps_en_gpio: builtins.int
+ """
+ (Re)define PIN_GPS_EN for your board.
+ """
+ gps_mode: global___Config.PositionConfig.GpsMode.ValueType
+ """
+ Set where GPS is enabled, disabled, or not present
+ """
+ def __init__(
+ self,
+ *,
+ position_broadcast_secs: builtins.int = ...,
+ position_broadcast_smart_enabled: builtins.bool = ...,
+ fixed_position: builtins.bool = ...,
+ gps_enabled: builtins.bool = ...,
+ gps_update_interval: builtins.int = ...,
+ gps_attempt_time: builtins.int = ...,
+ position_flags: builtins.int = ...,
+ rx_gpio: builtins.int = ...,
+ tx_gpio: builtins.int = ...,
+ broadcast_smart_minimum_distance: builtins.int = ...,
+ broadcast_smart_minimum_interval_secs: builtins.int = ...,
+ gps_en_gpio: builtins.int = ...,
+ gps_mode: global___Config.PositionConfig.GpsMode.ValueType = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["broadcast_smart_minimum_distance", b"broadcast_smart_minimum_distance", "broadcast_smart_minimum_interval_secs", b"broadcast_smart_minimum_interval_secs", "fixed_position", b"fixed_position", "gps_attempt_time", b"gps_attempt_time", "gps_en_gpio", b"gps_en_gpio", "gps_enabled", b"gps_enabled", "gps_mode", b"gps_mode", "gps_update_interval", b"gps_update_interval", "position_broadcast_secs", b"position_broadcast_secs", "position_broadcast_smart_enabled", b"position_broadcast_smart_enabled", "position_flags", b"position_flags", "rx_gpio", b"rx_gpio", "tx_gpio", b"tx_gpio"]) -> None: ...
+
+ @typing_extensions.final
+ class PowerConfig(google.protobuf.message.Message):
+ """
+ Power Config\\
+ See [Power Config](/docs/settings/config/power) for additional power config details.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ IS_POWER_SAVING_FIELD_NUMBER: builtins.int
+ ON_BATTERY_SHUTDOWN_AFTER_SECS_FIELD_NUMBER: builtins.int
+ ADC_MULTIPLIER_OVERRIDE_FIELD_NUMBER: builtins.int
+ WAIT_BLUETOOTH_SECS_FIELD_NUMBER: builtins.int
+ SDS_SECS_FIELD_NUMBER: builtins.int
+ LS_SECS_FIELD_NUMBER: builtins.int
+ MIN_WAKE_SECS_FIELD_NUMBER: builtins.int
+ DEVICE_BATTERY_INA_ADDRESS_FIELD_NUMBER: builtins.int
+ is_power_saving: builtins.bool
+ """
+ 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
+ """
+ on_battery_shutdown_after_secs: builtins.int
+ """
+ If non-zero, the device will fully power off this many seconds after external power is removed.
+ """
+ adc_multiplier_override: builtins.float
+ """
+ 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
+ """
+ wait_bluetooth_secs: builtins.int
+ """
+ Wait Bluetooth Seconds
+ The number of seconds for to wait before turning off BLE in No Bluetooth states
+ 0 for default of 1 minute
+ """
+ sds_secs: builtins.int
+ """
+ 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
+ """
+ ls_secs: builtins.int
+ """
+ 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
+ """
+ min_wake_secs: builtins.int
+ """
+ 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
+ """
+ device_battery_ina_address: builtins.int
+ """
+ I2C address of INA_2XX to use for reading device battery voltage
+ """
+ def __init__(
+ self,
+ *,
+ is_power_saving: builtins.bool = ...,
+ on_battery_shutdown_after_secs: builtins.int = ...,
+ adc_multiplier_override: builtins.float = ...,
+ wait_bluetooth_secs: builtins.int = ...,
+ sds_secs: builtins.int = ...,
+ ls_secs: builtins.int = ...,
+ min_wake_secs: builtins.int = ...,
+ device_battery_ina_address: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["adc_multiplier_override", b"adc_multiplier_override", "device_battery_ina_address", b"device_battery_ina_address", "is_power_saving", b"is_power_saving", "ls_secs", b"ls_secs", "min_wake_secs", b"min_wake_secs", "on_battery_shutdown_after_secs", b"on_battery_shutdown_after_secs", "sds_secs", b"sds_secs", "wait_bluetooth_secs", b"wait_bluetooth_secs"]) -> None: ...
+
+ @typing_extensions.final
+ class NetworkConfig(google.protobuf.message.Message):
+ """
+ Network Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _AddressMode:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _AddressModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.NetworkConfig._AddressMode.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ DHCP: Config.NetworkConfig._AddressMode.ValueType # 0
+ """
+ obtain ip address via DHCP
+ """
+ STATIC: Config.NetworkConfig._AddressMode.ValueType # 1
+ """
+ use static ip address
+ """
+
+ class AddressMode(_AddressMode, metaclass=_AddressModeEnumTypeWrapper): ...
+ DHCP: Config.NetworkConfig.AddressMode.ValueType # 0
+ """
+ obtain ip address via DHCP
+ """
+ STATIC: Config.NetworkConfig.AddressMode.ValueType # 1
+ """
+ use static ip address
+ """
+
+ @typing_extensions.final
+ class IpV4Config(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ IP_FIELD_NUMBER: builtins.int
+ GATEWAY_FIELD_NUMBER: builtins.int
+ SUBNET_FIELD_NUMBER: builtins.int
+ DNS_FIELD_NUMBER: builtins.int
+ ip: builtins.int
+ """
+ Static IP address
+ """
+ gateway: builtins.int
+ """
+ Static gateway address
+ """
+ subnet: builtins.int
+ """
+ Static subnet mask
+ """
+ dns: builtins.int
+ """
+ Static DNS server address
+ """
+ def __init__(
+ self,
+ *,
+ ip: builtins.int = ...,
+ gateway: builtins.int = ...,
+ subnet: builtins.int = ...,
+ dns: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["dns", b"dns", "gateway", b"gateway", "ip", b"ip", "subnet", b"subnet"]) -> None: ...
+
+ WIFI_ENABLED_FIELD_NUMBER: builtins.int
+ WIFI_SSID_FIELD_NUMBER: builtins.int
+ WIFI_PSK_FIELD_NUMBER: builtins.int
+ NTP_SERVER_FIELD_NUMBER: builtins.int
+ ETH_ENABLED_FIELD_NUMBER: builtins.int
+ ADDRESS_MODE_FIELD_NUMBER: builtins.int
+ IPV4_CONFIG_FIELD_NUMBER: builtins.int
+ RSYSLOG_SERVER_FIELD_NUMBER: builtins.int
+ wifi_enabled: builtins.bool
+ """
+ Enable WiFi (disables Bluetooth)
+ """
+ wifi_ssid: builtins.str
+ """
+ If set, this node will try to join the specified wifi network and
+ acquire an address via DHCP
+ """
+ wifi_psk: builtins.str
+ """
+ If set, will be use to authenticate to the named wifi
+ """
+ ntp_server: builtins.str
+ """
+ NTP server to use if WiFi is conneced, defaults to `0.pool.ntp.org`
+ """
+ eth_enabled: builtins.bool
+ """
+ Enable Ethernet
+ """
+ address_mode: global___Config.NetworkConfig.AddressMode.ValueType
+ """
+ acquire an address via DHCP or assign static
+ """
+ @property
+ def ipv4_config(self) -> global___Config.NetworkConfig.IpV4Config:
+ """
+ struct to keep static address
+ """
+ rsyslog_server: builtins.str
+ """
+ rsyslog Server and Port
+ """
+ def __init__(
+ self,
+ *,
+ wifi_enabled: builtins.bool = ...,
+ wifi_ssid: builtins.str = ...,
+ wifi_psk: builtins.str = ...,
+ ntp_server: builtins.str = ...,
+ eth_enabled: builtins.bool = ...,
+ address_mode: global___Config.NetworkConfig.AddressMode.ValueType = ...,
+ ipv4_config: global___Config.NetworkConfig.IpV4Config | None = ...,
+ rsyslog_server: builtins.str = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["ipv4_config", b"ipv4_config"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["address_mode", b"address_mode", "eth_enabled", b"eth_enabled", "ipv4_config", b"ipv4_config", "ntp_server", b"ntp_server", "rsyslog_server", b"rsyslog_server", "wifi_enabled", b"wifi_enabled", "wifi_psk", b"wifi_psk", "wifi_ssid", b"wifi_ssid"]) -> None: ...
+
+ @typing_extensions.final
+ class DisplayConfig(google.protobuf.message.Message):
+ """
+ Display Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _GpsCoordinateFormat:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _GpsCoordinateFormatEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DisplayConfig._GpsCoordinateFormat.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ DEC: Config.DisplayConfig._GpsCoordinateFormat.ValueType # 0
+ """
+ GPS coordinates are displayed in the normal decimal degrees format:
+ DD.DDDDDD DDD.DDDDDD
+ """
+ DMS: Config.DisplayConfig._GpsCoordinateFormat.ValueType # 1
+ """
+ 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
+ """
+ UTM: Config.DisplayConfig._GpsCoordinateFormat.ValueType # 2
+ """
+ Universal Transverse Mercator format:
+ ZZB EEEEEE NNNNNNN, where Z is zone, B is band, E is easting, N is northing
+ """
+ MGRS: Config.DisplayConfig._GpsCoordinateFormat.ValueType # 3
+ """
+ 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
+ """
+ OLC: Config.DisplayConfig._GpsCoordinateFormat.ValueType # 4
+ """
+ Open Location Code (aka Plus Codes).
+ """
+ OSGR: Config.DisplayConfig._GpsCoordinateFormat.ValueType # 5
+ """
+ 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
+ """
+
+ class GpsCoordinateFormat(_GpsCoordinateFormat, metaclass=_GpsCoordinateFormatEnumTypeWrapper):
+ """
+ How the GPS coordinates are displayed on the OLED screen.
+ """
+
+ DEC: Config.DisplayConfig.GpsCoordinateFormat.ValueType # 0
+ """
+ GPS coordinates are displayed in the normal decimal degrees format:
+ DD.DDDDDD DDD.DDDDDD
+ """
+ DMS: Config.DisplayConfig.GpsCoordinateFormat.ValueType # 1
+ """
+ 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
+ """
+ UTM: Config.DisplayConfig.GpsCoordinateFormat.ValueType # 2
+ """
+ Universal Transverse Mercator format:
+ ZZB EEEEEE NNNNNNN, where Z is zone, B is band, E is easting, N is northing
+ """
+ MGRS: Config.DisplayConfig.GpsCoordinateFormat.ValueType # 3
+ """
+ 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
+ """
+ OLC: Config.DisplayConfig.GpsCoordinateFormat.ValueType # 4
+ """
+ Open Location Code (aka Plus Codes).
+ """
+ OSGR: Config.DisplayConfig.GpsCoordinateFormat.ValueType # 5
+ """
+ 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
+ """
+
+ class _DisplayUnits:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _DisplayUnitsEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DisplayConfig._DisplayUnits.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ METRIC: Config.DisplayConfig._DisplayUnits.ValueType # 0
+ """
+ Metric (Default)
+ """
+ IMPERIAL: Config.DisplayConfig._DisplayUnits.ValueType # 1
+ """
+ Imperial
+ """
+
+ class DisplayUnits(_DisplayUnits, metaclass=_DisplayUnitsEnumTypeWrapper):
+ """
+ Unit display preference
+ """
+
+ METRIC: Config.DisplayConfig.DisplayUnits.ValueType # 0
+ """
+ Metric (Default)
+ """
+ IMPERIAL: Config.DisplayConfig.DisplayUnits.ValueType # 1
+ """
+ Imperial
+ """
+
+ class _OledType:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _OledTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DisplayConfig._OledType.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ OLED_AUTO: Config.DisplayConfig._OledType.ValueType # 0
+ """
+ Default / Auto
+ """
+ OLED_SSD1306: Config.DisplayConfig._OledType.ValueType # 1
+ """
+ Default / Auto
+ """
+ OLED_SH1106: Config.DisplayConfig._OledType.ValueType # 2
+ """
+ Default / Auto
+ """
+ OLED_SH1107: Config.DisplayConfig._OledType.ValueType # 3
+ """
+ Can not be auto detected but set by proto. Used for 128x128 screens
+ """
+
+ class OledType(_OledType, metaclass=_OledTypeEnumTypeWrapper):
+ """
+ Override OLED outo detect with this if it fails.
+ """
+
+ OLED_AUTO: Config.DisplayConfig.OledType.ValueType # 0
+ """
+ Default / Auto
+ """
+ OLED_SSD1306: Config.DisplayConfig.OledType.ValueType # 1
+ """
+ Default / Auto
+ """
+ OLED_SH1106: Config.DisplayConfig.OledType.ValueType # 2
+ """
+ Default / Auto
+ """
+ OLED_SH1107: Config.DisplayConfig.OledType.ValueType # 3
+ """
+ Can not be auto detected but set by proto. Used for 128x128 screens
+ """
+
+ class _DisplayMode:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _DisplayModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DisplayConfig._DisplayMode.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ DEFAULT: Config.DisplayConfig._DisplayMode.ValueType # 0
+ """
+ Default. The old style for the 128x64 OLED screen
+ """
+ TWOCOLOR: Config.DisplayConfig._DisplayMode.ValueType # 1
+ """
+ Rearrange display elements to cater for bicolor OLED displays
+ """
+ INVERTED: Config.DisplayConfig._DisplayMode.ValueType # 2
+ """
+ Same as TwoColor, but with inverted top bar. Not so good for Epaper displays
+ """
+ COLOR: Config.DisplayConfig._DisplayMode.ValueType # 3
+ """
+ TFT Full Color Displays (not implemented yet)
+ """
+
+ class DisplayMode(_DisplayMode, metaclass=_DisplayModeEnumTypeWrapper): ...
+ DEFAULT: Config.DisplayConfig.DisplayMode.ValueType # 0
+ """
+ Default. The old style for the 128x64 OLED screen
+ """
+ TWOCOLOR: Config.DisplayConfig.DisplayMode.ValueType # 1
+ """
+ Rearrange display elements to cater for bicolor OLED displays
+ """
+ INVERTED: Config.DisplayConfig.DisplayMode.ValueType # 2
+ """
+ Same as TwoColor, but with inverted top bar. Not so good for Epaper displays
+ """
+ COLOR: Config.DisplayConfig.DisplayMode.ValueType # 3
+ """
+ TFT Full Color Displays (not implemented yet)
+ """
+
+ SCREEN_ON_SECS_FIELD_NUMBER: builtins.int
+ GPS_FORMAT_FIELD_NUMBER: builtins.int
+ AUTO_SCREEN_CAROUSEL_SECS_FIELD_NUMBER: builtins.int
+ COMPASS_NORTH_TOP_FIELD_NUMBER: builtins.int
+ FLIP_SCREEN_FIELD_NUMBER: builtins.int
+ UNITS_FIELD_NUMBER: builtins.int
+ OLED_FIELD_NUMBER: builtins.int
+ DISPLAYMODE_FIELD_NUMBER: builtins.int
+ HEADING_BOLD_FIELD_NUMBER: builtins.int
+ WAKE_ON_TAP_OR_MOTION_FIELD_NUMBER: builtins.int
+ screen_on_secs: builtins.int
+ """
+ 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
+ """
+ gps_format: global___Config.DisplayConfig.GpsCoordinateFormat.ValueType
+ """
+ How the GPS coordinates are formatted on the OLED screen.
+ """
+ auto_screen_carousel_secs: builtins.int
+ """
+ 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.
+ """
+ compass_north_top: builtins.bool
+ """
+ If this is set, the displayed compass will always point north. if unset, the old behaviour
+ (top of display is heading direction) is used.
+ """
+ flip_screen: builtins.bool
+ """
+ Flip screen vertically, for cases that mount the screen upside down
+ """
+ units: global___Config.DisplayConfig.DisplayUnits.ValueType
+ """
+ Perferred display units
+ """
+ oled: global___Config.DisplayConfig.OledType.ValueType
+ """
+ Override auto-detect in screen
+ """
+ displaymode: global___Config.DisplayConfig.DisplayMode.ValueType
+ """
+ Display Mode
+ """
+ heading_bold: builtins.bool
+ """
+ Print first line in pseudo-bold? FALSE is original style, TRUE is bold
+ """
+ wake_on_tap_or_motion: builtins.bool
+ """
+ Should we wake the screen up on accelerometer detected motion or tap
+ """
+ def __init__(
+ self,
+ *,
+ screen_on_secs: builtins.int = ...,
+ gps_format: global___Config.DisplayConfig.GpsCoordinateFormat.ValueType = ...,
+ auto_screen_carousel_secs: builtins.int = ...,
+ compass_north_top: builtins.bool = ...,
+ flip_screen: builtins.bool = ...,
+ units: global___Config.DisplayConfig.DisplayUnits.ValueType = ...,
+ oled: global___Config.DisplayConfig.OledType.ValueType = ...,
+ displaymode: global___Config.DisplayConfig.DisplayMode.ValueType = ...,
+ heading_bold: builtins.bool = ...,
+ wake_on_tap_or_motion: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["auto_screen_carousel_secs", b"auto_screen_carousel_secs", "compass_north_top", b"compass_north_top", "displaymode", b"displaymode", "flip_screen", b"flip_screen", "gps_format", b"gps_format", "heading_bold", b"heading_bold", "oled", b"oled", "screen_on_secs", b"screen_on_secs", "units", b"units", "wake_on_tap_or_motion", b"wake_on_tap_or_motion"]) -> None: ...
+
+ @typing_extensions.final
+ class LoRaConfig(google.protobuf.message.Message):
+ """
+ Lora Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _RegionCode:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _RegionCodeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.LoRaConfig._RegionCode.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ UNSET: Config.LoRaConfig._RegionCode.ValueType # 0
+ """
+ Region is not set
+ """
+ US: Config.LoRaConfig._RegionCode.ValueType # 1
+ """
+ United States
+ """
+ EU_433: Config.LoRaConfig._RegionCode.ValueType # 2
+ """
+ European Union 433mhz
+ """
+ EU_868: Config.LoRaConfig._RegionCode.ValueType # 3
+ """
+ European Union 868mhz
+ """
+ CN: Config.LoRaConfig._RegionCode.ValueType # 4
+ """
+ China
+ """
+ JP: Config.LoRaConfig._RegionCode.ValueType # 5
+ """
+ Japan
+ """
+ ANZ: Config.LoRaConfig._RegionCode.ValueType # 6
+ """
+ Australia / New Zealand
+ """
+ KR: Config.LoRaConfig._RegionCode.ValueType # 7
+ """
+ Korea
+ """
+ TW: Config.LoRaConfig._RegionCode.ValueType # 8
+ """
+ Taiwan
+ """
+ RU: Config.LoRaConfig._RegionCode.ValueType # 9
+ """
+ Russia
+ """
+ IN: Config.LoRaConfig._RegionCode.ValueType # 10
+ """
+ India
+ """
+ NZ_865: Config.LoRaConfig._RegionCode.ValueType # 11
+ """
+ New Zealand 865mhz
+ """
+ TH: Config.LoRaConfig._RegionCode.ValueType # 12
+ """
+ Thailand
+ """
+ LORA_24: Config.LoRaConfig._RegionCode.ValueType # 13
+ """
+ WLAN Band
+ """
+ UA_433: Config.LoRaConfig._RegionCode.ValueType # 14
+ """
+ Ukraine 433mhz
+ """
+ UA_868: Config.LoRaConfig._RegionCode.ValueType # 15
+ """
+ Ukraine 868mhz
+ """
+ MY_433: Config.LoRaConfig._RegionCode.ValueType # 16
+ """
+ Malaysia 433mhz
+ """
+ MY_919: Config.LoRaConfig._RegionCode.ValueType # 17
+ """
+ Malaysia 919mhz
+ """
+ SG_923: Config.LoRaConfig._RegionCode.ValueType # 18
+ """
+ Singapore 923mhz
+ """
+
+ class RegionCode(_RegionCode, metaclass=_RegionCodeEnumTypeWrapper): ...
+ UNSET: Config.LoRaConfig.RegionCode.ValueType # 0
+ """
+ Region is not set
+ """
+ US: Config.LoRaConfig.RegionCode.ValueType # 1
+ """
+ United States
+ """
+ EU_433: Config.LoRaConfig.RegionCode.ValueType # 2
+ """
+ European Union 433mhz
+ """
+ EU_868: Config.LoRaConfig.RegionCode.ValueType # 3
+ """
+ European Union 868mhz
+ """
+ CN: Config.LoRaConfig.RegionCode.ValueType # 4
+ """
+ China
+ """
+ JP: Config.LoRaConfig.RegionCode.ValueType # 5
+ """
+ Japan
+ """
+ ANZ: Config.LoRaConfig.RegionCode.ValueType # 6
+ """
+ Australia / New Zealand
+ """
+ KR: Config.LoRaConfig.RegionCode.ValueType # 7
+ """
+ Korea
+ """
+ TW: Config.LoRaConfig.RegionCode.ValueType # 8
+ """
+ Taiwan
+ """
+ RU: Config.LoRaConfig.RegionCode.ValueType # 9
+ """
+ Russia
+ """
+ IN: Config.LoRaConfig.RegionCode.ValueType # 10
+ """
+ India
+ """
+ NZ_865: Config.LoRaConfig.RegionCode.ValueType # 11
+ """
+ New Zealand 865mhz
+ """
+ TH: Config.LoRaConfig.RegionCode.ValueType # 12
+ """
+ Thailand
+ """
+ LORA_24: Config.LoRaConfig.RegionCode.ValueType # 13
+ """
+ WLAN Band
+ """
+ UA_433: Config.LoRaConfig.RegionCode.ValueType # 14
+ """
+ Ukraine 433mhz
+ """
+ UA_868: Config.LoRaConfig.RegionCode.ValueType # 15
+ """
+ Ukraine 868mhz
+ """
+ MY_433: Config.LoRaConfig.RegionCode.ValueType # 16
+ """
+ Malaysia 433mhz
+ """
+ MY_919: Config.LoRaConfig.RegionCode.ValueType # 17
+ """
+ Malaysia 919mhz
+ """
+ SG_923: Config.LoRaConfig.RegionCode.ValueType # 18
+ """
+ Singapore 923mhz
+ """
+
+ class _ModemPreset:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _ModemPresetEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.LoRaConfig._ModemPreset.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ LONG_FAST: Config.LoRaConfig._ModemPreset.ValueType # 0
+ """
+ Long Range - Fast
+ """
+ LONG_SLOW: Config.LoRaConfig._ModemPreset.ValueType # 1
+ """
+ Long Range - Slow
+ """
+ VERY_LONG_SLOW: Config.LoRaConfig._ModemPreset.ValueType # 2
+ """
+ Very Long Range - Slow
+ """
+ MEDIUM_SLOW: Config.LoRaConfig._ModemPreset.ValueType # 3
+ """
+ Medium Range - Slow
+ """
+ MEDIUM_FAST: Config.LoRaConfig._ModemPreset.ValueType # 4
+ """
+ Medium Range - Fast
+ """
+ SHORT_SLOW: Config.LoRaConfig._ModemPreset.ValueType # 5
+ """
+ Short Range - Slow
+ """
+ SHORT_FAST: Config.LoRaConfig._ModemPreset.ValueType # 6
+ """
+ Short Range - Fast
+ """
+ LONG_MODERATE: Config.LoRaConfig._ModemPreset.ValueType # 7
+ """
+ Long Range - Moderately Fast
+ """
+
+ class ModemPreset(_ModemPreset, metaclass=_ModemPresetEnumTypeWrapper):
+ """
+ Standard predefined channel settings
+ Note: these mappings must match ModemPreset Choice in the device code.
+ """
+
+ LONG_FAST: Config.LoRaConfig.ModemPreset.ValueType # 0
+ """
+ Long Range - Fast
+ """
+ LONG_SLOW: Config.LoRaConfig.ModemPreset.ValueType # 1
+ """
+ Long Range - Slow
+ """
+ VERY_LONG_SLOW: Config.LoRaConfig.ModemPreset.ValueType # 2
+ """
+ Very Long Range - Slow
+ """
+ MEDIUM_SLOW: Config.LoRaConfig.ModemPreset.ValueType # 3
+ """
+ Medium Range - Slow
+ """
+ MEDIUM_FAST: Config.LoRaConfig.ModemPreset.ValueType # 4
+ """
+ Medium Range - Fast
+ """
+ SHORT_SLOW: Config.LoRaConfig.ModemPreset.ValueType # 5
+ """
+ Short Range - Slow
+ """
+ SHORT_FAST: Config.LoRaConfig.ModemPreset.ValueType # 6
+ """
+ Short Range - Fast
+ """
+ LONG_MODERATE: Config.LoRaConfig.ModemPreset.ValueType # 7
+ """
+ Long Range - Moderately Fast
+ """
+
+ USE_PRESET_FIELD_NUMBER: builtins.int
+ MODEM_PRESET_FIELD_NUMBER: builtins.int
+ BANDWIDTH_FIELD_NUMBER: builtins.int
+ SPREAD_FACTOR_FIELD_NUMBER: builtins.int
+ CODING_RATE_FIELD_NUMBER: builtins.int
+ FREQUENCY_OFFSET_FIELD_NUMBER: builtins.int
+ REGION_FIELD_NUMBER: builtins.int
+ HOP_LIMIT_FIELD_NUMBER: builtins.int
+ TX_ENABLED_FIELD_NUMBER: builtins.int
+ TX_POWER_FIELD_NUMBER: builtins.int
+ CHANNEL_NUM_FIELD_NUMBER: builtins.int
+ OVERRIDE_DUTY_CYCLE_FIELD_NUMBER: builtins.int
+ SX126X_RX_BOOSTED_GAIN_FIELD_NUMBER: builtins.int
+ OVERRIDE_FREQUENCY_FIELD_NUMBER: builtins.int
+ IGNORE_INCOMING_FIELD_NUMBER: builtins.int
+ IGNORE_MQTT_FIELD_NUMBER: builtins.int
+ use_preset: builtins.bool
+ """
+ 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
+ """
+ modem_preset: global___Config.LoRaConfig.ModemPreset.ValueType
+ """
+ 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.
+ """
+ bandwidth: builtins.int
+ """
+ Bandwidth in MHz
+ Certain bandwidth numbers are 'special' and will be converted to the
+ appropriate floating point value: 31 -> 31.25MHz
+ """
+ spread_factor: builtins.int
+ """
+ A number from 7 to 12.
+ Indicates number of chirps per symbol as 1< 7 results in the default
+ """
+ tx_enabled: builtins.bool
+ """
+ Disable TX from the LoRa radio. Useful for hot-swapping antennas and other tests.
+ Defaults to false
+ """
+ tx_power: builtins.int
+ """
+ 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.
+ """
+ channel_num: builtins.int
+ """
+ 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).
+ """
+ override_duty_cycle: builtins.bool
+ """
+ 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%.
+ """
+ sx126x_rx_boosted_gain: builtins.bool
+ """
+ If true, sets RX boosted gain mode on SX126X based radios
+ """
+ override_frequency: builtins.float
+ """
+ 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.
+ """
+ @property
+ def ignore_incoming(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]:
+ """
+ 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)
+ """
+ ignore_mqtt: builtins.bool
+ """
+ If true, the device will not process any packets received via LoRa that passed via MQTT anywhere on the path towards it.
+ """
+ def __init__(
+ self,
+ *,
+ use_preset: builtins.bool = ...,
+ modem_preset: global___Config.LoRaConfig.ModemPreset.ValueType = ...,
+ bandwidth: builtins.int = ...,
+ spread_factor: builtins.int = ...,
+ coding_rate: builtins.int = ...,
+ frequency_offset: builtins.float = ...,
+ region: global___Config.LoRaConfig.RegionCode.ValueType = ...,
+ hop_limit: builtins.int = ...,
+ tx_enabled: builtins.bool = ...,
+ tx_power: builtins.int = ...,
+ channel_num: builtins.int = ...,
+ override_duty_cycle: builtins.bool = ...,
+ sx126x_rx_boosted_gain: builtins.bool = ...,
+ override_frequency: builtins.float = ...,
+ ignore_incoming: collections.abc.Iterable[builtins.int] | None = ...,
+ ignore_mqtt: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["bandwidth", b"bandwidth", "channel_num", b"channel_num", "coding_rate", b"coding_rate", "frequency_offset", b"frequency_offset", "hop_limit", b"hop_limit", "ignore_incoming", b"ignore_incoming", "ignore_mqtt", b"ignore_mqtt", "modem_preset", b"modem_preset", "override_duty_cycle", b"override_duty_cycle", "override_frequency", b"override_frequency", "region", b"region", "spread_factor", b"spread_factor", "sx126x_rx_boosted_gain", b"sx126x_rx_boosted_gain", "tx_enabled", b"tx_enabled", "tx_power", b"tx_power", "use_preset", b"use_preset"]) -> None: ...
+
+ @typing_extensions.final
+ class BluetoothConfig(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _PairingMode:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _PairingModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.BluetoothConfig._PairingMode.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ RANDOM_PIN: Config.BluetoothConfig._PairingMode.ValueType # 0
+ """
+ Device generates a random PIN that will be shown on the screen of the device for pairing
+ """
+ FIXED_PIN: Config.BluetoothConfig._PairingMode.ValueType # 1
+ """
+ Device requires a specified fixed PIN for pairing
+ """
+ NO_PIN: Config.BluetoothConfig._PairingMode.ValueType # 2
+ """
+ Device requires no PIN for pairing
+ """
+
+ class PairingMode(_PairingMode, metaclass=_PairingModeEnumTypeWrapper): ...
+ RANDOM_PIN: Config.BluetoothConfig.PairingMode.ValueType # 0
+ """
+ Device generates a random PIN that will be shown on the screen of the device for pairing
+ """
+ FIXED_PIN: Config.BluetoothConfig.PairingMode.ValueType # 1
+ """
+ Device requires a specified fixed PIN for pairing
+ """
+ NO_PIN: Config.BluetoothConfig.PairingMode.ValueType # 2
+ """
+ Device requires no PIN for pairing
+ """
+
+ ENABLED_FIELD_NUMBER: builtins.int
+ MODE_FIELD_NUMBER: builtins.int
+ FIXED_PIN_FIELD_NUMBER: builtins.int
+ enabled: builtins.bool
+ """
+ Enable Bluetooth on the device
+ """
+ mode: global___Config.BluetoothConfig.PairingMode.ValueType
+ """
+ Determines the pairing strategy for the device
+ """
+ fixed_pin: builtins.int
+ """
+ Specified PIN for PairingMode.FixedPin
+ """
+ def __init__(
+ self,
+ *,
+ enabled: builtins.bool = ...,
+ mode: global___Config.BluetoothConfig.PairingMode.ValueType = ...,
+ fixed_pin: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["enabled", b"enabled", "fixed_pin", b"fixed_pin", "mode", b"mode"]) -> None: ...
+
+ DEVICE_FIELD_NUMBER: builtins.int
+ POSITION_FIELD_NUMBER: builtins.int
+ POWER_FIELD_NUMBER: builtins.int
+ NETWORK_FIELD_NUMBER: builtins.int
+ DISPLAY_FIELD_NUMBER: builtins.int
+ LORA_FIELD_NUMBER: builtins.int
+ BLUETOOTH_FIELD_NUMBER: builtins.int
+ @property
+ def device(self) -> global___Config.DeviceConfig: ...
+ @property
+ def position(self) -> global___Config.PositionConfig: ...
+ @property
+ def power(self) -> global___Config.PowerConfig: ...
+ @property
+ def network(self) -> global___Config.NetworkConfig: ...
+ @property
+ def display(self) -> global___Config.DisplayConfig: ...
+ @property
+ def lora(self) -> global___Config.LoRaConfig: ...
+ @property
+ def bluetooth(self) -> global___Config.BluetoothConfig: ...
+ def __init__(
+ self,
+ *,
+ device: global___Config.DeviceConfig | None = ...,
+ position: global___Config.PositionConfig | None = ...,
+ power: global___Config.PowerConfig | None = ...,
+ network: global___Config.NetworkConfig | None = ...,
+ display: global___Config.DisplayConfig | None = ...,
+ lora: global___Config.LoRaConfig | None = ...,
+ bluetooth: global___Config.BluetoothConfig | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "payload_variant", b"payload_variant", "position", b"position", "power", b"power"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "payload_variant", b"payload_variant", "position", b"position", "power", b"power"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["device", "position", "power", "network", "display", "lora", "bluetooth"] | None: ...
+
+global___Config = Config
diff --git a/meshtastic/connection_status_pb2.py b/meshtastic/connection_status_pb2.py
index 773ee353..1d371892 100644
--- a/meshtastic/connection_status_pb2.py
+++ b/meshtastic/connection_status_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/connection_status.proto\"\x85\x02\n\x16\x44\x65viceConnectionStatus\x12(\n\x04wifi\x18\x01 \x01(\x0b\x32\x15.WifiConnectionStatusH\x00\x88\x01\x01\x12\x30\n\x08\x65thernet\x18\x02 \x01(\x0b\x32\x19.EthernetConnectionStatusH\x01\x88\x01\x01\x12\x32\n\tbluetooth\x18\x03 \x01(\x0b\x32\x1a.BluetoothConnectionStatusH\x02\x88\x01\x01\x12,\n\x06serial\x18\x04 \x01(\x0b\x32\x17.SerialConnectionStatusH\x03\x88\x01\x01\x42\x07\n\x05_wifiB\x0b\n\t_ethernetB\x0c\n\n_bluetoothB\t\n\x07_serial\"\\\n\x14WifiConnectionStatus\x12(\n\x06status\x18\x01 \x01(\x0b\x32\x18.NetworkConnectionStatus\x12\x0c\n\x04ssid\x18\x02 \x01(\t\x12\x0c\n\x04rssi\x18\x03 \x01(\x05\"D\n\x18\x45thernetConnectionStatus\x12(\n\x06status\x18\x01 \x01(\x0b\x32\x18.NetworkConnectionStatus\"{\n\x17NetworkConnectionStatus\x12\x12\n\nip_address\x18\x01 \x01(\x07\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x12\x19\n\x11is_mqtt_connected\x18\x03 \x01(\x08\x12\x1b\n\x13is_syslog_connected\x18\x04 \x01(\x08\"L\n\x19\x42luetoothConnectionStatus\x12\x0b\n\x03pin\x18\x01 \x01(\r\x12\x0c\n\x04rssi\x18\x02 \x01(\x05\x12\x14\n\x0cis_connected\x18\x03 \x01(\x08\"<\n\x16SerialConnectionStatus\x12\x0c\n\x04\x62\x61ud\x18\x01 \x01(\r\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x42\x65\n\x13\x63om.geeksville.meshB\x10\x43onnStatusProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/connection_status.proto\x12\nmeshtastic\"\xb1\x02\n\x16\x44\x65viceConnectionStatus\x12\x33\n\x04wifi\x18\x01 \x01(\x0b\x32 .meshtastic.WifiConnectionStatusH\x00\x88\x01\x01\x12;\n\x08\x65thernet\x18\x02 \x01(\x0b\x32$.meshtastic.EthernetConnectionStatusH\x01\x88\x01\x01\x12=\n\tbluetooth\x18\x03 \x01(\x0b\x32%.meshtastic.BluetoothConnectionStatusH\x02\x88\x01\x01\x12\x37\n\x06serial\x18\x04 \x01(\x0b\x32\".meshtastic.SerialConnectionStatusH\x03\x88\x01\x01\x42\x07\n\x05_wifiB\x0b\n\t_ethernetB\x0c\n\n_bluetoothB\t\n\x07_serial\"g\n\x14WifiConnectionStatus\x12\x33\n\x06status\x18\x01 \x01(\x0b\x32#.meshtastic.NetworkConnectionStatus\x12\x0c\n\x04ssid\x18\x02 \x01(\t\x12\x0c\n\x04rssi\x18\x03 \x01(\x05\"O\n\x18\x45thernetConnectionStatus\x12\x33\n\x06status\x18\x01 \x01(\x0b\x32#.meshtastic.NetworkConnectionStatus\"{\n\x17NetworkConnectionStatus\x12\x12\n\nip_address\x18\x01 \x01(\x07\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x12\x19\n\x11is_mqtt_connected\x18\x03 \x01(\x08\x12\x1b\n\x13is_syslog_connected\x18\x04 \x01(\x08\"L\n\x19\x42luetoothConnectionStatus\x12\x0b\n\x03pin\x18\x01 \x01(\r\x12\x0c\n\x04rssi\x18\x02 \x01(\x05\x12\x14\n\x0cis_connected\x18\x03 \x01(\x08\"<\n\x16SerialConnectionStatus\x12\x0c\n\x04\x62\x61ud\x18\x01 \x01(\r\x12\x14\n\x0cis_connected\x18\x02 \x01(\x08\x42\x65\n\x13\x63om.geeksville.meshB\x10\x43onnStatusProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.connection_status_pb2', globals())
@@ -21,16 +21,16 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\020ConnStatusProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _DEVICECONNECTIONSTATUS._serialized_start=39
- _DEVICECONNECTIONSTATUS._serialized_end=300
- _WIFICONNECTIONSTATUS._serialized_start=302
- _WIFICONNECTIONSTATUS._serialized_end=394
- _ETHERNETCONNECTIONSTATUS._serialized_start=396
- _ETHERNETCONNECTIONSTATUS._serialized_end=464
- _NETWORKCONNECTIONSTATUS._serialized_start=466
- _NETWORKCONNECTIONSTATUS._serialized_end=589
- _BLUETOOTHCONNECTIONSTATUS._serialized_start=591
- _BLUETOOTHCONNECTIONSTATUS._serialized_end=667
- _SERIALCONNECTIONSTATUS._serialized_start=669
- _SERIALCONNECTIONSTATUS._serialized_end=729
+ _DEVICECONNECTIONSTATUS._serialized_start=51
+ _DEVICECONNECTIONSTATUS._serialized_end=356
+ _WIFICONNECTIONSTATUS._serialized_start=358
+ _WIFICONNECTIONSTATUS._serialized_end=461
+ _ETHERNETCONNECTIONSTATUS._serialized_start=463
+ _ETHERNETCONNECTIONSTATUS._serialized_end=542
+ _NETWORKCONNECTIONSTATUS._serialized_start=544
+ _NETWORKCONNECTIONSTATUS._serialized_end=667
+ _BLUETOOTHCONNECTIONSTATUS._serialized_start=669
+ _BLUETOOTHCONNECTIONSTATUS._serialized_end=745
+ _SERIALCONNECTIONSTATUS._serialized_start=747
+ _SERIALCONNECTIONSTATUS._serialized_end=807
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/connection_status_pb2.pyi b/meshtastic/connection_status_pb2.pyi
new file mode 100644
index 00000000..1e56ba37
--- /dev/null
+++ b/meshtastic/connection_status_pb2.pyi
@@ -0,0 +1,227 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import sys
+import typing
+
+if sys.version_info >= (3, 8):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class DeviceConnectionStatus(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ WIFI_FIELD_NUMBER: builtins.int
+ ETHERNET_FIELD_NUMBER: builtins.int
+ BLUETOOTH_FIELD_NUMBER: builtins.int
+ SERIAL_FIELD_NUMBER: builtins.int
+ @property
+ def wifi(self) -> global___WifiConnectionStatus:
+ """
+ WiFi Status
+ """
+ @property
+ def ethernet(self) -> global___EthernetConnectionStatus:
+ """
+ WiFi Status
+ """
+ @property
+ def bluetooth(self) -> global___BluetoothConnectionStatus:
+ """
+ Bluetooth Status
+ """
+ @property
+ def serial(self) -> global___SerialConnectionStatus:
+ """
+ Serial Status
+ """
+ def __init__(
+ self,
+ *,
+ wifi: global___WifiConnectionStatus | None = ...,
+ ethernet: global___EthernetConnectionStatus | None = ...,
+ bluetooth: global___BluetoothConnectionStatus | None = ...,
+ serial: global___SerialConnectionStatus | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["_bluetooth", b"_bluetooth", "_ethernet", b"_ethernet", "_serial", b"_serial", "_wifi", b"_wifi", "bluetooth", b"bluetooth", "ethernet", b"ethernet", "serial", b"serial", "wifi", b"wifi"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["_bluetooth", b"_bluetooth", "_ethernet", b"_ethernet", "_serial", b"_serial", "_wifi", b"_wifi", "bluetooth", b"bluetooth", "ethernet", b"ethernet", "serial", b"serial", "wifi", b"wifi"]) -> None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_bluetooth", b"_bluetooth"]) -> typing_extensions.Literal["bluetooth"] | None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_ethernet", b"_ethernet"]) -> typing_extensions.Literal["ethernet"] | None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_serial", b"_serial"]) -> typing_extensions.Literal["serial"] | None: ...
+ @typing.overload
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["_wifi", b"_wifi"]) -> typing_extensions.Literal["wifi"] | None: ...
+
+global___DeviceConnectionStatus = DeviceConnectionStatus
+
+@typing_extensions.final
+class WifiConnectionStatus(google.protobuf.message.Message):
+ """
+ WiFi connection status
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ STATUS_FIELD_NUMBER: builtins.int
+ SSID_FIELD_NUMBER: builtins.int
+ RSSI_FIELD_NUMBER: builtins.int
+ @property
+ def status(self) -> global___NetworkConnectionStatus:
+ """
+ Connection status
+ """
+ ssid: builtins.str
+ """
+ WiFi access point SSID
+ """
+ rssi: builtins.int
+ """
+ RSSI of wireless connection
+ """
+ def __init__(
+ self,
+ *,
+ status: global___NetworkConnectionStatus | None = ...,
+ ssid: builtins.str = ...,
+ rssi: builtins.int = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["status", b"status"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["rssi", b"rssi", "ssid", b"ssid", "status", b"status"]) -> None: ...
+
+global___WifiConnectionStatus = WifiConnectionStatus
+
+@typing_extensions.final
+class EthernetConnectionStatus(google.protobuf.message.Message):
+ """
+ Ethernet connection status
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ STATUS_FIELD_NUMBER: builtins.int
+ @property
+ def status(self) -> global___NetworkConnectionStatus:
+ """
+ Connection status
+ """
+ def __init__(
+ self,
+ *,
+ status: global___NetworkConnectionStatus | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["status", b"status"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["status", b"status"]) -> None: ...
+
+global___EthernetConnectionStatus = EthernetConnectionStatus
+
+@typing_extensions.final
+class NetworkConnectionStatus(google.protobuf.message.Message):
+ """
+ Ethernet or WiFi connection status
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ IP_ADDRESS_FIELD_NUMBER: builtins.int
+ IS_CONNECTED_FIELD_NUMBER: builtins.int
+ IS_MQTT_CONNECTED_FIELD_NUMBER: builtins.int
+ IS_SYSLOG_CONNECTED_FIELD_NUMBER: builtins.int
+ ip_address: builtins.int
+ """
+ IP address of device
+ """
+ is_connected: builtins.bool
+ """
+ Whether the device has an active connection or not
+ """
+ is_mqtt_connected: builtins.bool
+ """
+ Whether the device has an active connection to an MQTT broker or not
+ """
+ is_syslog_connected: builtins.bool
+ """
+ Whether the device is actively remote syslogging or not
+ """
+ def __init__(
+ self,
+ *,
+ ip_address: builtins.int = ...,
+ is_connected: builtins.bool = ...,
+ is_mqtt_connected: builtins.bool = ...,
+ is_syslog_connected: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["ip_address", b"ip_address", "is_connected", b"is_connected", "is_mqtt_connected", b"is_mqtt_connected", "is_syslog_connected", b"is_syslog_connected"]) -> None: ...
+
+global___NetworkConnectionStatus = NetworkConnectionStatus
+
+@typing_extensions.final
+class BluetoothConnectionStatus(google.protobuf.message.Message):
+ """
+ Bluetooth connection status
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ PIN_FIELD_NUMBER: builtins.int
+ RSSI_FIELD_NUMBER: builtins.int
+ IS_CONNECTED_FIELD_NUMBER: builtins.int
+ pin: builtins.int
+ """
+ The pairing PIN for bluetooth
+ """
+ rssi: builtins.int
+ """
+ RSSI of bluetooth connection
+ """
+ is_connected: builtins.bool
+ """
+ Whether the device has an active connection or not
+ """
+ def __init__(
+ self,
+ *,
+ pin: builtins.int = ...,
+ rssi: builtins.int = ...,
+ is_connected: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["is_connected", b"is_connected", "pin", b"pin", "rssi", b"rssi"]) -> None: ...
+
+global___BluetoothConnectionStatus = BluetoothConnectionStatus
+
+@typing_extensions.final
+class SerialConnectionStatus(google.protobuf.message.Message):
+ """
+ Serial connection status
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ BAUD_FIELD_NUMBER: builtins.int
+ IS_CONNECTED_FIELD_NUMBER: builtins.int
+ baud: builtins.int
+ """
+ Serial baud rate
+ """
+ is_connected: builtins.bool
+ """
+ Whether the device has an active connection or not
+ """
+ def __init__(
+ self,
+ *,
+ baud: builtins.int = ...,
+ is_connected: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["baud", b"baud", "is_connected", b"is_connected"]) -> None: ...
+
+global___SerialConnectionStatus = SerialConnectionStatus
diff --git a/meshtastic/deviceonly_pb2.py b/meshtastic/deviceonly_pb2.py
index 5b13ef95..83ef477f 100644
--- a/meshtastic/deviceonly_pb2.py
+++ b/meshtastic/deviceonly_pb2.py
@@ -19,7 +19,7 @@
from . import nanopb_pb2 as nanopb__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bmeshtastic/deviceonly.proto\x1a\x18meshtastic/channel.proto\x1a\x1ameshtastic/localonly.proto\x1a\x15meshtastic/mesh.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x1emeshtastic/module_config.proto\x1a\x0cnanopb.proto\"\xf6\x02\n\x0b\x44\x65viceState\x12\x1c\n\x07my_node\x18\x02 \x01(\x0b\x32\x0b.MyNodeInfo\x12\x14\n\x05owner\x18\x03 \x01(\x0b\x32\x05.User\x12\"\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x0b.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12$\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x0b.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x15\n\rdid_gps_reset\x18\x0b \x01(\x08\x12 \n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x0b.MeshPacket\x12\x39\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32\x16.NodeRemoteHardwarePin\x12O\n\x0cnode_db_lite\x18\x0e \x03(\x0b\x32\r.NodeInfoLiteB*\x92?\'\x92\x01$std::vector\"\xe5\x01\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x13\n\x04user\x18\x02 \x01(\x0b\x32\x05.User\x12\x1f\n\x08position\x18\x03 \x01(\x0b\x32\r.PositionLite\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12&\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\x0e.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x11\n\thops_away\x18\t \x01(\r\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\"\x85\x01\n\x0cPositionLite\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12,\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x13.Position.LocSource\":\n\x0b\x43hannelFile\x12\x1a\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x08.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\xf6\x01\n\x08OEMStore\x12\x16\n\x0eoem_icon_width\x18\x01 \x01(\r\x12\x17\n\x0foem_icon_height\x18\x02 \x01(\r\x12\x15\n\roem_icon_bits\x18\x03 \x01(\x0c\x12\x1e\n\x08oem_font\x18\x04 \x01(\x0e\x32\x0c.ScreenFonts\x12\x10\n\x08oem_text\x18\x05 \x01(\t\x12\x13\n\x0boem_aes_key\x18\x06 \x01(\x0c\x12&\n\x10oem_local_config\x18\x07 \x01(\x0b\x32\x0c.LocalConfig\x12\x33\n\x17oem_local_module_config\x18\x08 \x01(\x0b\x32\x12.LocalModuleConfig*>\n\x0bScreenFonts\x12\x0e\n\nFONT_SMALL\x10\x00\x12\x0f\n\x0b\x46ONT_MEDIUM\x10\x01\x12\x0e\n\nFONT_LARGE\x10\x02\x42m\n\x13\x63om.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bmeshtastic/deviceonly.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x1ameshtastic/localonly.proto\x1a\x15meshtastic/mesh.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x1emeshtastic/module_config.proto\x1a\x0cnanopb.proto\"\xc3\x03\n\x0b\x44\x65viceState\x12\'\n\x07my_node\x18\x02 \x01(\x0b\x32\x16.meshtastic.MyNodeInfo\x12\x1f\n\x05owner\x18\x03 \x01(\x0b\x32\x10.meshtastic.User\x12-\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x16.meshtastic.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12/\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x16.meshtastic.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x15\n\rdid_gps_reset\x18\x0b \x01(\x08\x12+\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x16.meshtastic.MeshPacket\x12\x44\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32!.meshtastic.NodeRemoteHardwarePin\x12Z\n\x0cnode_db_lite\x18\x0e \x03(\x0b\x32\x18.meshtastic.NodeInfoLiteB*\x92?\'\x92\x01$std::vector\"\x86\x02\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1e\n\x04user\x18\x02 \x01(\x0b\x32\x10.meshtastic.User\x12*\n\x08position\x18\x03 \x01(\x0b\x32\x18.meshtastic.PositionLite\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x31\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\x19.meshtastic.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x11\n\thops_away\x18\t \x01(\r\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\"\x90\x01\n\x0cPositionLite\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12\x37\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x1e.meshtastic.Position.LocSource\"E\n\x0b\x43hannelFile\x12%\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x13.meshtastic.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\x97\x02\n\x08OEMStore\x12\x16\n\x0eoem_icon_width\x18\x01 \x01(\r\x12\x17\n\x0foem_icon_height\x18\x02 \x01(\r\x12\x15\n\roem_icon_bits\x18\x03 \x01(\x0c\x12)\n\x08oem_font\x18\x04 \x01(\x0e\x32\x17.meshtastic.ScreenFonts\x12\x10\n\x08oem_text\x18\x05 \x01(\t\x12\x13\n\x0boem_aes_key\x18\x06 \x01(\x0c\x12\x31\n\x10oem_local_config\x18\x07 \x01(\x0b\x32\x17.meshtastic.LocalConfig\x12>\n\x17oem_local_module_config\x18\x08 \x01(\x0b\x32\x1d.meshtastic.LocalModuleConfig*>\n\x0bScreenFonts\x12\x0e\n\nFONT_SMALL\x10\x00\x12\x0f\n\x0b\x46ONT_MEDIUM\x10\x01\x12\x0e\n\nFONT_LARGE\x10\x02\x42m\n\x13\x63om.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08b\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.deviceonly_pb2', globals())
@@ -31,16 +31,16 @@
_DEVICESTATE.fields_by_name['no_save']._serialized_options = b'\030\001'
_DEVICESTATE.fields_by_name['node_db_lite']._options = None
_DEVICESTATE.fields_by_name['node_db_lite']._serialized_options = b'\222?\'\222\001$std::vector'
- _SCREENFONTS._serialized_start=1236
- _SCREENFONTS._serialized_end=1298
- _DEVICESTATE._serialized_start=183
- _DEVICESTATE._serialized_end=557
- _NODEINFOLITE._serialized_start=560
- _NODEINFOLITE._serialized_end=789
- _POSITIONLITE._serialized_start=792
- _POSITIONLITE._serialized_end=925
- _CHANNELFILE._serialized_start=927
- _CHANNELFILE._serialized_end=985
- _OEMSTORE._serialized_start=988
- _OEMSTORE._serialized_end=1234
+ _SCREENFONTS._serialized_start=1413
+ _SCREENFONTS._serialized_end=1475
+ _DEVICESTATE._serialized_start=195
+ _DEVICESTATE._serialized_end=646
+ _NODEINFOLITE._serialized_start=649
+ _NODEINFOLITE._serialized_end=911
+ _POSITIONLITE._serialized_start=914
+ _POSITIONLITE._serialized_end=1058
+ _CHANNELFILE._serialized_start=1060
+ _CHANNELFILE._serialized_end=1129
+ _OEMSTORE._serialized_start=1132
+ _OEMSTORE._serialized_end=1411
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/deviceonly_pb2.pyi b/meshtastic/deviceonly_pb2.pyi
new file mode 100644
index 00000000..f0d9959a
--- /dev/null
+++ b/meshtastic/deviceonly_pb2.pyi
@@ -0,0 +1,386 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import collections.abc
+import google.protobuf.descriptor
+import google.protobuf.internal.containers
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import meshtastic.channel_pb2
+import meshtastic.localonly_pb2
+import meshtastic.mesh_pb2
+import meshtastic.telemetry_pb2
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class _ScreenFonts:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _ScreenFontsEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_ScreenFonts.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ FONT_SMALL: _ScreenFonts.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ FONT_MEDIUM: _ScreenFonts.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ FONT_LARGE: _ScreenFonts.ValueType # 2
+ """
+ TODO: REPLACE
+ """
+
+class ScreenFonts(_ScreenFonts, metaclass=_ScreenFontsEnumTypeWrapper):
+ """
+ TODO: REPLACE
+ """
+
+FONT_SMALL: ScreenFonts.ValueType # 0
+"""
+TODO: REPLACE
+"""
+FONT_MEDIUM: ScreenFonts.ValueType # 1
+"""
+TODO: REPLACE
+"""
+FONT_LARGE: ScreenFonts.ValueType # 2
+"""
+TODO: REPLACE
+"""
+global___ScreenFonts = ScreenFonts
+
+@typing_extensions.final
+class DeviceState(google.protobuf.message.Message):
+ """
+ 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
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ MY_NODE_FIELD_NUMBER: builtins.int
+ OWNER_FIELD_NUMBER: builtins.int
+ RECEIVE_QUEUE_FIELD_NUMBER: builtins.int
+ VERSION_FIELD_NUMBER: builtins.int
+ RX_TEXT_MESSAGE_FIELD_NUMBER: builtins.int
+ NO_SAVE_FIELD_NUMBER: builtins.int
+ DID_GPS_RESET_FIELD_NUMBER: builtins.int
+ RX_WAYPOINT_FIELD_NUMBER: builtins.int
+ NODE_REMOTE_HARDWARE_PINS_FIELD_NUMBER: builtins.int
+ NODE_DB_LITE_FIELD_NUMBER: builtins.int
+ @property
+ def my_node(self) -> meshtastic.mesh_pb2.MyNodeInfo:
+ """
+ Read only settings/info about this node
+ """
+ @property
+ def owner(self) -> meshtastic.mesh_pb2.User:
+ """
+ My owner info
+ """
+ @property
+ def receive_queue(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.mesh_pb2.MeshPacket]:
+ """
+ Received packets saved for delivery to the phone
+ """
+ version: builtins.int
+ """
+ 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.
+ """
+ @property
+ def rx_text_message(self) -> meshtastic.mesh_pb2.MeshPacket:
+ """
+ We keep the last received text message (only) stored in the device flash,
+ so we can show it on the screen.
+ Might be null
+ """
+ no_save: builtins.bool
+ """
+ Used only during development.
+ Indicates developer is testing and changes should never be saved to flash.
+ Deprecated in 2.3.1
+ """
+ did_gps_reset: builtins.bool
+ """
+ Some GPS receivers seem to have bogus settings from the factory, so we always do one factory reset.
+ """
+ @property
+ def rx_waypoint(self) -> meshtastic.mesh_pb2.MeshPacket:
+ """
+ We keep the last received waypoint stored in the device flash,
+ so we can show it on the screen.
+ Might be null
+ """
+ @property
+ def node_remote_hardware_pins(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.mesh_pb2.NodeRemoteHardwarePin]:
+ """
+ The mesh's nodes with their available gpio pins for RemoteHardware module
+ """
+ @property
+ def node_db_lite(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NodeInfoLite]:
+ """
+ New lite version of NodeDB to decrease memory footprint
+ """
+ def __init__(
+ self,
+ *,
+ my_node: meshtastic.mesh_pb2.MyNodeInfo | None = ...,
+ owner: meshtastic.mesh_pb2.User | None = ...,
+ receive_queue: collections.abc.Iterable[meshtastic.mesh_pb2.MeshPacket] | None = ...,
+ version: builtins.int = ...,
+ rx_text_message: meshtastic.mesh_pb2.MeshPacket | None = ...,
+ no_save: builtins.bool = ...,
+ did_gps_reset: builtins.bool = ...,
+ rx_waypoint: meshtastic.mesh_pb2.MeshPacket | None = ...,
+ node_remote_hardware_pins: collections.abc.Iterable[meshtastic.mesh_pb2.NodeRemoteHardwarePin] | None = ...,
+ node_db_lite: collections.abc.Iterable[global___NodeInfoLite] | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["my_node", b"my_node", "owner", b"owner", "rx_text_message", b"rx_text_message", "rx_waypoint", b"rx_waypoint"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["did_gps_reset", b"did_gps_reset", "my_node", b"my_node", "no_save", b"no_save", "node_db_lite", b"node_db_lite", "node_remote_hardware_pins", b"node_remote_hardware_pins", "owner", b"owner", "receive_queue", b"receive_queue", "rx_text_message", b"rx_text_message", "rx_waypoint", b"rx_waypoint", "version", b"version"]) -> None: ...
+
+global___DeviceState = DeviceState
+
+@typing_extensions.final
+class NodeInfoLite(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NUM_FIELD_NUMBER: builtins.int
+ USER_FIELD_NUMBER: builtins.int
+ POSITION_FIELD_NUMBER: builtins.int
+ SNR_FIELD_NUMBER: builtins.int
+ LAST_HEARD_FIELD_NUMBER: builtins.int
+ DEVICE_METRICS_FIELD_NUMBER: builtins.int
+ CHANNEL_FIELD_NUMBER: builtins.int
+ VIA_MQTT_FIELD_NUMBER: builtins.int
+ HOPS_AWAY_FIELD_NUMBER: builtins.int
+ IS_FAVORITE_FIELD_NUMBER: builtins.int
+ num: builtins.int
+ """
+ The node number
+ """
+ @property
+ def user(self) -> meshtastic.mesh_pb2.User:
+ """
+ The user info for this node
+ """
+ @property
+ def position(self) -> global___PositionLite:
+ """
+ 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.
+ """
+ snr: builtins.float
+ """
+ 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
+ """
+ last_heard: builtins.int
+ """
+ Set to indicate the last time we received a packet from this node
+ """
+ @property
+ def device_metrics(self) -> meshtastic.telemetry_pb2.DeviceMetrics:
+ """
+ The latest device metrics for the node.
+ """
+ channel: builtins.int
+ """
+ local channel index we heard that node on. Only populated if its not the default channel.
+ """
+ via_mqtt: builtins.bool
+ """
+ True if we witnessed the node over MQTT instead of LoRA transport
+ """
+ hops_away: builtins.int
+ """
+ Number of hops away from us this node is (0 if adjacent)
+ """
+ is_favorite: builtins.bool
+ """
+ True if node is in our favorites list
+ Persists between NodeDB internal clean ups
+ """
+ def __init__(
+ self,
+ *,
+ num: builtins.int = ...,
+ user: meshtastic.mesh_pb2.User | None = ...,
+ position: global___PositionLite | None = ...,
+ snr: builtins.float = ...,
+ last_heard: builtins.int = ...,
+ device_metrics: meshtastic.telemetry_pb2.DeviceMetrics | None = ...,
+ channel: builtins.int = ...,
+ via_mqtt: builtins.bool = ...,
+ hops_away: builtins.int = ...,
+ is_favorite: builtins.bool = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["device_metrics", b"device_metrics", "position", b"position", "user", b"user"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["channel", b"channel", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "is_favorite", b"is_favorite", "last_heard", b"last_heard", "num", b"num", "position", b"position", "snr", b"snr", "user", b"user", "via_mqtt", b"via_mqtt"]) -> None: ...
+
+global___NodeInfoLite = NodeInfoLite
+
+@typing_extensions.final
+class PositionLite(google.protobuf.message.Message):
+ """
+ Position with static location information only for NodeDBLite
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ LATITUDE_I_FIELD_NUMBER: builtins.int
+ LONGITUDE_I_FIELD_NUMBER: builtins.int
+ ALTITUDE_FIELD_NUMBER: builtins.int
+ TIME_FIELD_NUMBER: builtins.int
+ LOCATION_SOURCE_FIELD_NUMBER: builtins.int
+ latitude_i: builtins.int
+ """
+ The new preferred location encoding, multiply by 1e-7 to get degrees
+ in floating point
+ """
+ longitude_i: builtins.int
+ """
+ TODO: REPLACE
+ """
+ altitude: builtins.int
+ """
+ In meters above MSL (but see issue #359)
+ """
+ time: builtins.int
+ """
+ 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
+ """
+ location_source: meshtastic.mesh_pb2.Position.LocSource.ValueType
+ """
+ TODO: REPLACE
+ """
+ def __init__(
+ self,
+ *,
+ latitude_i: builtins.int = ...,
+ longitude_i: builtins.int = ...,
+ altitude: builtins.int = ...,
+ time: builtins.int = ...,
+ location_source: meshtastic.mesh_pb2.Position.LocSource.ValueType = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["altitude", b"altitude", "latitude_i", b"latitude_i", "location_source", b"location_source", "longitude_i", b"longitude_i", "time", b"time"]) -> None: ...
+
+global___PositionLite = PositionLite
+
+@typing_extensions.final
+class ChannelFile(google.protobuf.message.Message):
+ """
+ The on-disk saved channels
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ CHANNELS_FIELD_NUMBER: builtins.int
+ VERSION_FIELD_NUMBER: builtins.int
+ @property
+ def channels(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[meshtastic.channel_pb2.Channel]:
+ """
+ The channels our node knows about
+ """
+ version: builtins.int
+ """
+ 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.
+ """
+ def __init__(
+ self,
+ *,
+ channels: collections.abc.Iterable[meshtastic.channel_pb2.Channel] | None = ...,
+ version: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["channels", b"channels", "version", b"version"]) -> None: ...
+
+global___ChannelFile = ChannelFile
+
+@typing_extensions.final
+class OEMStore(google.protobuf.message.Message):
+ """
+ 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.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ OEM_ICON_WIDTH_FIELD_NUMBER: builtins.int
+ OEM_ICON_HEIGHT_FIELD_NUMBER: builtins.int
+ OEM_ICON_BITS_FIELD_NUMBER: builtins.int
+ OEM_FONT_FIELD_NUMBER: builtins.int
+ OEM_TEXT_FIELD_NUMBER: builtins.int
+ OEM_AES_KEY_FIELD_NUMBER: builtins.int
+ OEM_LOCAL_CONFIG_FIELD_NUMBER: builtins.int
+ OEM_LOCAL_MODULE_CONFIG_FIELD_NUMBER: builtins.int
+ oem_icon_width: builtins.int
+ """
+ The Logo width in Px
+ """
+ oem_icon_height: builtins.int
+ """
+ The Logo height in Px
+ """
+ oem_icon_bits: builtins.bytes
+ """
+ The Logo in XBM bytechar format
+ """
+ oem_font: global___ScreenFonts.ValueType
+ """
+ Use this font for the OEM text.
+ """
+ oem_text: builtins.str
+ """
+ Use this font for the OEM text.
+ """
+ oem_aes_key: builtins.bytes
+ """
+ The default device encryption key, 16 or 32 byte
+ """
+ @property
+ def oem_local_config(self) -> meshtastic.localonly_pb2.LocalConfig:
+ """
+ A Preset LocalConfig to apply during factory reset
+ """
+ @property
+ def oem_local_module_config(self) -> meshtastic.localonly_pb2.LocalModuleConfig:
+ """
+ A Preset LocalModuleConfig to apply during factory reset
+ """
+ def __init__(
+ self,
+ *,
+ oem_icon_width: builtins.int = ...,
+ oem_icon_height: builtins.int = ...,
+ oem_icon_bits: builtins.bytes = ...,
+ oem_font: global___ScreenFonts.ValueType = ...,
+ oem_text: builtins.str = ...,
+ oem_aes_key: builtins.bytes = ...,
+ oem_local_config: meshtastic.localonly_pb2.LocalConfig | None = ...,
+ oem_local_module_config: meshtastic.localonly_pb2.LocalModuleConfig | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["oem_local_config", b"oem_local_config", "oem_local_module_config", b"oem_local_module_config"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["oem_aes_key", b"oem_aes_key", "oem_font", b"oem_font", "oem_icon_bits", b"oem_icon_bits", "oem_icon_height", b"oem_icon_height", "oem_icon_width", b"oem_icon_width", "oem_local_config", b"oem_local_config", "oem_local_module_config", b"oem_local_module_config", "oem_text", b"oem_text"]) -> None: ...
+
+global___OEMStore = OEMStore
diff --git a/meshtastic/localonly_pb2.py b/meshtastic/localonly_pb2.py
index f168c43b..324aaad0 100644
--- a/meshtastic/localonly_pb2.py
+++ b/meshtastic/localonly_pb2.py
@@ -15,7 +15,7 @@
from meshtastic import module_config_pb2 as meshtastic_dot_module__config__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1ameshtastic/localonly.proto\x1a\x17meshtastic/config.proto\x1a\x1emeshtastic/module_config.proto\"\xb0\x02\n\x0bLocalConfig\x12$\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x14.Config.DeviceConfig\x12(\n\x08position\x18\x02 \x01(\x0b\x32\x16.Config.PositionConfig\x12\"\n\x05power\x18\x03 \x01(\x0b\x32\x13.Config.PowerConfig\x12&\n\x07network\x18\x04 \x01(\x0b\x32\x15.Config.NetworkConfig\x12&\n\x07\x64isplay\x18\x05 \x01(\x0b\x32\x15.Config.DisplayConfig\x12 \n\x04lora\x18\x06 \x01(\x0b\x32\x12.Config.LoRaConfig\x12*\n\tbluetooth\x18\x07 \x01(\x0b\x32\x17.Config.BluetoothConfig\x12\x0f\n\x07version\x18\x08 \x01(\r\"\xec\x05\n\x11LocalModuleConfig\x12&\n\x04mqtt\x18\x01 \x01(\x0b\x32\x18.ModuleConfig.MQTTConfig\x12*\n\x06serial\x18\x02 \x01(\x0b\x32\x1a.ModuleConfig.SerialConfig\x12G\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32(.ModuleConfig.ExternalNotificationConfig\x12\x37\n\rstore_forward\x18\x04 \x01(\x0b\x32 .ModuleConfig.StoreForwardConfig\x12\x31\n\nrange_test\x18\x05 \x01(\x0b\x32\x1d.ModuleConfig.RangeTestConfig\x12\x30\n\ttelemetry\x18\x06 \x01(\x0b\x32\x1d.ModuleConfig.TelemetryConfig\x12\x39\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32!.ModuleConfig.CannedMessageConfig\x12(\n\x05\x61udio\x18\t \x01(\x0b\x32\x19.ModuleConfig.AudioConfig\x12;\n\x0fremote_hardware\x18\n \x01(\x0b\x32\".ModuleConfig.RemoteHardwareConfig\x12\x37\n\rneighbor_info\x18\x0b \x01(\x0b\x32 .ModuleConfig.NeighborInfoConfig\x12=\n\x10\x61mbient_lighting\x18\x0c \x01(\x0b\x32#.ModuleConfig.AmbientLightingConfig\x12=\n\x10\x64\x65tection_sensor\x18\r \x01(\x0b\x32#.ModuleConfig.DetectionSensorConfig\x12\x32\n\npaxcounter\x18\x0e \x01(\x0b\x32\x1e.ModuleConfig.PaxcounterConfig\x12\x0f\n\x07version\x18\x08 \x01(\rBd\n\x13\x63om.geeksville.meshB\x0fLocalOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1ameshtastic/localonly.proto\x12\nmeshtastic\x1a\x17meshtastic/config.proto\x1a\x1emeshtastic/module_config.proto\"\xfd\x02\n\x0bLocalConfig\x12/\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32\x1f.meshtastic.Config.DeviceConfig\x12\x33\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.Config.PositionConfig\x12-\n\x05power\x18\x03 \x01(\x0b\x32\x1e.meshtastic.Config.PowerConfig\x12\x31\n\x07network\x18\x04 \x01(\x0b\x32 .meshtastic.Config.NetworkConfig\x12\x31\n\x07\x64isplay\x18\x05 \x01(\x0b\x32 .meshtastic.Config.DisplayConfig\x12+\n\x04lora\x18\x06 \x01(\x0b\x32\x1d.meshtastic.Config.LoRaConfig\x12\x35\n\tbluetooth\x18\x07 \x01(\x0b\x32\".meshtastic.Config.BluetoothConfig\x12\x0f\n\x07version\x18\x08 \x01(\r\"\xfb\x06\n\x11LocalModuleConfig\x12\x31\n\x04mqtt\x18\x01 \x01(\x0b\x32#.meshtastic.ModuleConfig.MQTTConfig\x12\x35\n\x06serial\x18\x02 \x01(\x0b\x32%.meshtastic.ModuleConfig.SerialConfig\x12R\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32\x33.meshtastic.ModuleConfig.ExternalNotificationConfig\x12\x42\n\rstore_forward\x18\x04 \x01(\x0b\x32+.meshtastic.ModuleConfig.StoreForwardConfig\x12<\n\nrange_test\x18\x05 \x01(\x0b\x32(.meshtastic.ModuleConfig.RangeTestConfig\x12;\n\ttelemetry\x18\x06 \x01(\x0b\x32(.meshtastic.ModuleConfig.TelemetryConfig\x12\x44\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32,.meshtastic.ModuleConfig.CannedMessageConfig\x12\x33\n\x05\x61udio\x18\t \x01(\x0b\x32$.meshtastic.ModuleConfig.AudioConfig\x12\x46\n\x0fremote_hardware\x18\n \x01(\x0b\x32-.meshtastic.ModuleConfig.RemoteHardwareConfig\x12\x42\n\rneighbor_info\x18\x0b \x01(\x0b\x32+.meshtastic.ModuleConfig.NeighborInfoConfig\x12H\n\x10\x61mbient_lighting\x18\x0c \x01(\x0b\x32..meshtastic.ModuleConfig.AmbientLightingConfig\x12H\n\x10\x64\x65tection_sensor\x18\r \x01(\x0b\x32..meshtastic.ModuleConfig.DetectionSensorConfig\x12=\n\npaxcounter\x18\x0e \x01(\x0b\x32).meshtastic.ModuleConfig.PaxcounterConfig\x12\x0f\n\x07version\x18\x08 \x01(\rBd\n\x13\x63om.geeksville.meshB\x0fLocalOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.localonly_pb2', globals())
@@ -23,8 +23,8 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\017LocalOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _LOCALCONFIG._serialized_start=88
- _LOCALCONFIG._serialized_end=392
- _LOCALMODULECONFIG._serialized_start=395
- _LOCALMODULECONFIG._serialized_end=1143
+ _LOCALCONFIG._serialized_start=100
+ _LOCALCONFIG._serialized_end=481
+ _LOCALMODULECONFIG._serialized_start=484
+ _LOCALMODULECONFIG._serialized_end=1375
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/localonly_pb2.pyi b/meshtastic/localonly_pb2.pyi
new file mode 100644
index 00000000..19cdc020
--- /dev/null
+++ b/meshtastic/localonly_pb2.pyi
@@ -0,0 +1,204 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import meshtastic.config_pb2
+import meshtastic.module_config_pb2
+import sys
+
+if sys.version_info >= (3, 8):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class LocalConfig(google.protobuf.message.Message):
+ """
+ Protobuf structures common to apponly.proto and deviceonly.proto
+ This is never sent over the wire, only for local use
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ DEVICE_FIELD_NUMBER: builtins.int
+ POSITION_FIELD_NUMBER: builtins.int
+ POWER_FIELD_NUMBER: builtins.int
+ NETWORK_FIELD_NUMBER: builtins.int
+ DISPLAY_FIELD_NUMBER: builtins.int
+ LORA_FIELD_NUMBER: builtins.int
+ BLUETOOTH_FIELD_NUMBER: builtins.int
+ VERSION_FIELD_NUMBER: builtins.int
+ @property
+ def device(self) -> meshtastic.config_pb2.Config.DeviceConfig:
+ """
+ The part of the config that is specific to the Device
+ """
+ @property
+ def position(self) -> meshtastic.config_pb2.Config.PositionConfig:
+ """
+ The part of the config that is specific to the GPS Position
+ """
+ @property
+ def power(self) -> meshtastic.config_pb2.Config.PowerConfig:
+ """
+ The part of the config that is specific to the Power settings
+ """
+ @property
+ def network(self) -> meshtastic.config_pb2.Config.NetworkConfig:
+ """
+ The part of the config that is specific to the Wifi Settings
+ """
+ @property
+ def display(self) -> meshtastic.config_pb2.Config.DisplayConfig:
+ """
+ The part of the config that is specific to the Display
+ """
+ @property
+ def lora(self) -> meshtastic.config_pb2.Config.LoRaConfig:
+ """
+ The part of the config that is specific to the Lora Radio
+ """
+ @property
+ def bluetooth(self) -> meshtastic.config_pb2.Config.BluetoothConfig:
+ """
+ The part of the config that is specific to the Bluetooth settings
+ """
+ version: builtins.int
+ """
+ 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.
+ """
+ def __init__(
+ self,
+ *,
+ device: meshtastic.config_pb2.Config.DeviceConfig | None = ...,
+ position: meshtastic.config_pb2.Config.PositionConfig | None = ...,
+ power: meshtastic.config_pb2.Config.PowerConfig | None = ...,
+ network: meshtastic.config_pb2.Config.NetworkConfig | None = ...,
+ display: meshtastic.config_pb2.Config.DisplayConfig | None = ...,
+ lora: meshtastic.config_pb2.Config.LoRaConfig | None = ...,
+ bluetooth: meshtastic.config_pb2.Config.BluetoothConfig | None = ...,
+ version: builtins.int = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "position", b"position", "power", b"power"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["bluetooth", b"bluetooth", "device", b"device", "display", b"display", "lora", b"lora", "network", b"network", "position", b"position", "power", b"power", "version", b"version"]) -> None: ...
+
+global___LocalConfig = LocalConfig
+
+@typing_extensions.final
+class LocalModuleConfig(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ MQTT_FIELD_NUMBER: builtins.int
+ SERIAL_FIELD_NUMBER: builtins.int
+ EXTERNAL_NOTIFICATION_FIELD_NUMBER: builtins.int
+ STORE_FORWARD_FIELD_NUMBER: builtins.int
+ RANGE_TEST_FIELD_NUMBER: builtins.int
+ TELEMETRY_FIELD_NUMBER: builtins.int
+ CANNED_MESSAGE_FIELD_NUMBER: builtins.int
+ AUDIO_FIELD_NUMBER: builtins.int
+ REMOTE_HARDWARE_FIELD_NUMBER: builtins.int
+ NEIGHBOR_INFO_FIELD_NUMBER: builtins.int
+ AMBIENT_LIGHTING_FIELD_NUMBER: builtins.int
+ DETECTION_SENSOR_FIELD_NUMBER: builtins.int
+ PAXCOUNTER_FIELD_NUMBER: builtins.int
+ VERSION_FIELD_NUMBER: builtins.int
+ @property
+ def mqtt(self) -> meshtastic.module_config_pb2.ModuleConfig.MQTTConfig:
+ """
+ The part of the config that is specific to the MQTT module
+ """
+ @property
+ def serial(self) -> meshtastic.module_config_pb2.ModuleConfig.SerialConfig:
+ """
+ The part of the config that is specific to the Serial module
+ """
+ @property
+ def external_notification(self) -> meshtastic.module_config_pb2.ModuleConfig.ExternalNotificationConfig:
+ """
+ The part of the config that is specific to the ExternalNotification module
+ """
+ @property
+ def store_forward(self) -> meshtastic.module_config_pb2.ModuleConfig.StoreForwardConfig:
+ """
+ The part of the config that is specific to the Store & Forward module
+ """
+ @property
+ def range_test(self) -> meshtastic.module_config_pb2.ModuleConfig.RangeTestConfig:
+ """
+ The part of the config that is specific to the RangeTest module
+ """
+ @property
+ def telemetry(self) -> meshtastic.module_config_pb2.ModuleConfig.TelemetryConfig:
+ """
+ The part of the config that is specific to the Telemetry module
+ """
+ @property
+ def canned_message(self) -> meshtastic.module_config_pb2.ModuleConfig.CannedMessageConfig:
+ """
+ The part of the config that is specific to the Canned Message module
+ """
+ @property
+ def audio(self) -> meshtastic.module_config_pb2.ModuleConfig.AudioConfig:
+ """
+ The part of the config that is specific to the Audio module
+ """
+ @property
+ def remote_hardware(self) -> meshtastic.module_config_pb2.ModuleConfig.RemoteHardwareConfig:
+ """
+ The part of the config that is specific to the Remote Hardware module
+ """
+ @property
+ def neighbor_info(self) -> meshtastic.module_config_pb2.ModuleConfig.NeighborInfoConfig:
+ """
+ The part of the config that is specific to the Neighbor Info module
+ """
+ @property
+ def ambient_lighting(self) -> meshtastic.module_config_pb2.ModuleConfig.AmbientLightingConfig:
+ """
+ The part of the config that is specific to the Ambient Lighting module
+ """
+ @property
+ def detection_sensor(self) -> meshtastic.module_config_pb2.ModuleConfig.DetectionSensorConfig:
+ """
+ The part of the config that is specific to the Detection Sensor module
+ """
+ @property
+ def paxcounter(self) -> meshtastic.module_config_pb2.ModuleConfig.PaxcounterConfig:
+ """
+ Paxcounter Config
+ """
+ version: builtins.int
+ """
+ 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.
+ """
+ def __init__(
+ self,
+ *,
+ mqtt: meshtastic.module_config_pb2.ModuleConfig.MQTTConfig | None = ...,
+ serial: meshtastic.module_config_pb2.ModuleConfig.SerialConfig | None = ...,
+ external_notification: meshtastic.module_config_pb2.ModuleConfig.ExternalNotificationConfig | None = ...,
+ store_forward: meshtastic.module_config_pb2.ModuleConfig.StoreForwardConfig | None = ...,
+ range_test: meshtastic.module_config_pb2.ModuleConfig.RangeTestConfig | None = ...,
+ telemetry: meshtastic.module_config_pb2.ModuleConfig.TelemetryConfig | None = ...,
+ canned_message: meshtastic.module_config_pb2.ModuleConfig.CannedMessageConfig | None = ...,
+ audio: meshtastic.module_config_pb2.ModuleConfig.AudioConfig | None = ...,
+ remote_hardware: meshtastic.module_config_pb2.ModuleConfig.RemoteHardwareConfig | None = ...,
+ neighbor_info: meshtastic.module_config_pb2.ModuleConfig.NeighborInfoConfig | None = ...,
+ ambient_lighting: meshtastic.module_config_pb2.ModuleConfig.AmbientLightingConfig | None = ...,
+ detection_sensor: meshtastic.module_config_pb2.ModuleConfig.DetectionSensorConfig | None = ...,
+ paxcounter: meshtastic.module_config_pb2.ModuleConfig.PaxcounterConfig | None = ...,
+ version: builtins.int = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry", "version", b"version"]) -> None: ...
+
+global___LocalModuleConfig = LocalModuleConfig
diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py
index f0c0c80c..6e290be1 100644
--- a/meshtastic/mesh_interface.py
+++ b/meshtastic/mesh_interface.py
@@ -9,17 +9,18 @@
import threading
import time
from datetime import datetime
-from typing import AnyStr
import google.protobuf.json_format
-import timeago
+import timeago # type: ignore[import-untyped]
from google.protobuf.json_format import MessageToJson
-from pubsub import pub
+from pubsub import pub # type: ignore[import-untyped]
from tabulate import tabulate
import meshtastic.node
-from meshtastic import mesh_pb2, portnums_pb2, telemetry_pb2
-from meshtastic.__init__ import (
+from meshtastic import (
+ mesh_pb2,
+ portnums_pb2,
+ telemetry_pb2,
BROADCAST_ADDR,
BROADCAST_NUM,
LOCAL_ADDR,
@@ -239,7 +240,7 @@ def getNode(self, nodeId, requestChannels=True):
def sendText(
self,
- text: AnyStr,
+ text: str,
destinationId=BROADCAST_ADDR,
wantAck=False,
wantResponse=False,
diff --git a/meshtastic/mesh_pb2.py b/meshtastic/mesh_pb2.py
index 5df0e53d..4c6273ad 100644
--- a/meshtastic/mesh_pb2.py
+++ b/meshtastic/mesh_pb2.py
@@ -19,7 +19,7 @@
from meshtastic import xmodem_pb2 as meshtastic_dot_xmodem__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/mesh.proto\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\x1emeshtastic/module_config.proto\x1a\x19meshtastic/portnums.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x17meshtastic/xmodem.proto\"\xcf\x05\n\x08Position\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12,\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x13.Position.LocSource\x12,\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\x13.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x14\n\x0c\x61ltitude_hae\x18\t \x01(\x11\x12#\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11\x12\x0c\n\x04PDOP\x18\x0b \x01(\r\x12\x0c\n\x04HDOP\x18\x0c \x01(\r\x12\x0c\n\x04VDOP\x18\r \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x0e \x01(\r\x12\x14\n\x0cground_speed\x18\x0f \x01(\r\x12\x14\n\x0cground_track\x18\x10 \x01(\r\x12\x13\n\x0b\x66ix_quality\x18\x11 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x12 \x01(\r\x12\x14\n\x0csats_in_view\x18\x13 \x01(\r\x12\x11\n\tsensor_id\x18\x14 \x01(\r\x12\x13\n\x0bnext_update\x18\x15 \x01(\r\x12\x12\n\nseq_number\x18\x16 \x01(\r\x12\x16\n\x0eprecision_bits\x18\x17 \x01(\r\"N\n\tLocSource\x12\r\n\tLOC_UNSET\x10\x00\x12\x0e\n\nLOC_MANUAL\x10\x01\x12\x10\n\x0cLOC_INTERNAL\x10\x02\x12\x10\n\x0cLOC_EXTERNAL\x10\x03\"b\n\tAltSource\x12\r\n\tALT_UNSET\x10\x00\x12\x0e\n\nALT_MANUAL\x10\x01\x12\x10\n\x0c\x41LT_INTERNAL\x10\x02\x12\x10\n\x0c\x41LT_EXTERNAL\x10\x03\x12\x12\n\x0e\x41LT_BAROMETRIC\x10\x04\"\xae\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x13\n\x07macaddr\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12 \n\x08hw_model\x18\x05 \x01(\x0e\x32\x0e.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12\'\n\x04role\x18\x07 \x01(\x0e\x32\x19.Config.DeviceConfig.Role\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\"\xdb\x02\n\x07Routing\x12(\n\rroute_request\x18\x01 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x0f.RouteDiscoveryH\x00\x12&\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x0e.Routing.ErrorH\x00\"\xca\x01\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x14\n\x10\x44UTY_CYCLE_LIMIT\x10\t\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!B\t\n\x07variant\"\x9c\x01\n\x04\x44\x61ta\x12\x19\n\x07portnum\x18\x01 \x01(\x0e\x32\x08.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\x12\x10\n\x08reply_id\x18\x07 \x01(\x07\x12\r\n\x05\x65moji\x18\x08 \x01(\x07\"\x93\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x12\n\nlatitude_i\x18\x02 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x03 \x01(\x0f\x12\x0e\n\x06\x65xpire\x18\x04 \x01(\r\x12\x11\n\tlocked_to\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x0c\n\x04icon\x18\x08 \x01(\x07\"l\n\x16MqttClientProxyMessage\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x0e\n\x04\x64\x61ta\x18\x02 \x01(\x0cH\x00\x12\x0e\n\x04text\x18\x03 \x01(\tH\x00\x12\x10\n\x08retained\x18\x04 \x01(\x08\x42\x11\n\x0fpayload_variant\"\xf4\x03\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12\x18\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x05.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\t \x01(\r\x12\x10\n\x08want_ack\x18\n \x01(\x08\x12&\n\x08priority\x18\x0b \x01(\x0e\x32\x14.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c \x01(\x05\x12(\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\x13.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\"[\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\"B\n\x07\x44\x65layed\x12\x0c\n\x08NO_DELAY\x10\x00\x12\x15\n\x11\x44\x45LAYED_BROADCAST\x10\x01\x12\x12\n\x0e\x44\x45LAYED_DIRECT\x10\x02\x42\x11\n\x0fpayload_variant\"\xdd\x01\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x13\n\x04user\x18\x02 \x01(\x0b\x32\x05.User\x12\x1b\n\x08position\x18\x03 \x01(\x0b\x32\t.Position\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12&\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\x0e.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x11\n\thops_away\x18\t \x01(\r\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\"P\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x14\n\x0creboot_count\x18\x08 \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0b \x01(\r\"\xb5\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x1f\n\x05level\x18\x04 \x01(\x0e\x32\x10.LogRecord.Level\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"P\n\x0bQueueStatus\x12\x0b\n\x03res\x18\x01 \x01(\x05\x12\x0c\n\x04\x66ree\x18\x02 \x01(\r\x12\x0e\n\x06maxlen\x18\x03 \x01(\r\x12\x16\n\x0emesh_packet_id\x18\x04 \x01(\r\"\xe2\x03\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12\x1d\n\x06packet\x18\x02 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x1e\n\x07my_info\x18\x03 \x01(\x0b\x32\x0b.MyNodeInfoH\x00\x12\x1e\n\tnode_info\x18\x04 \x01(\x0b\x32\t.NodeInfoH\x00\x12\x19\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x07.ConfigH\x00\x12 \n\nlog_record\x18\x06 \x01(\x0b\x32\n.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 \x01(\x08H\x00\x12%\n\x0cmoduleConfig\x18\t \x01(\x0b\x32\r.ModuleConfigH\x00\x12\x1b\n\x07\x63hannel\x18\n \x01(\x0b\x32\x08.ChannelH\x00\x12#\n\x0bqueueStatus\x18\x0b \x01(\x0b\x32\x0c.QueueStatusH\x00\x12\x1f\n\x0cxmodemPacket\x18\x0c \x01(\x0b\x32\x07.XModemH\x00\x12#\n\x08metadata\x18\r \x01(\x0b\x32\x0f.DeviceMetadataH\x00\x12\x39\n\x16mqttClientProxyMessage\x18\x0e \x01(\x0b\x32\x17.MqttClientProxyMessageH\x00\x42\x11\n\x0fpayload_variant\"\xe8\x01\n\x07ToRadio\x12\x1d\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 \x01(\x08H\x00\x12\x1f\n\x0cxmodemPacket\x18\x05 \x01(\x0b\x32\x07.XModemH\x00\x12\x39\n\x16mqttClientProxyMessage\x18\x06 \x01(\x0b\x32\x17.MqttClientProxyMessageH\x00\x12\x1f\n\theartbeat\x18\x07 \x01(\x0b\x32\n.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"5\n\nCompressed\x12\x19\n\x07portnum\x18\x01 \x01(\x0e\x32\x08.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"|\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\r\x12\x17\n\x0flast_sent_by_id\x18\x02 \x01(\r\x12$\n\x1cnode_broadcast_interval_secs\x18\x03 \x01(\r\x12\x1c\n\tneighbors\x18\x04 \x03(\x0b\x32\t.Neighbor\"d\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01 \x01(\r\x12\x0b\n\x03snr\x18\x02 \x01(\x02\x12\x14\n\x0clast_rx_time\x18\x03 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x04 \x01(\r\"\x97\x02\n\x0e\x44\x65viceMetadata\x12\x18\n\x10\x66irmware_version\x18\x01 \x01(\t\x12\x1c\n\x14\x64\x65vice_state_version\x18\x02 \x01(\r\x12\x13\n\x0b\x63\x61nShutdown\x18\x03 \x01(\x08\x12\x0f\n\x07hasWifi\x18\x04 \x01(\x08\x12\x14\n\x0chasBluetooth\x18\x05 \x01(\x08\x12\x13\n\x0bhasEthernet\x18\x06 \x01(\x08\x12\'\n\x04role\x18\x07 \x01(\x0e\x32\x19.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12 \n\x08hw_model\x18\t \x01(\x0e\x32\x0e.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n \x01(\x08\"\x0b\n\tHeartbeat\"J\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\x1f\n\x03pin\x18\x02 \x01(\x0b\x32\x12.RemoteHardwarePin*\xd4\x07\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1P6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0e\n\nTBEAM_V0P7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\x0cTLORA_V1_1P3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\r\n\tHELTEC_V1\x10\x0b\x12\x18\n\x14LILYGO_TBEAM_S3_CORE\x10\x0c\x12\x0c\n\x08RAK11200\x10\r\x12\x0b\n\x07NANO_G1\x10\x0e\x12\x12\n\x0eTLORA_V2_1_1P8\x10\x0f\x12\x0f\n\x0bTLORA_T3_S3\x10\x10\x12\x14\n\x10NANO_G1_EXPLORER\x10\x11\x12\x11\n\rNANO_G2_ULTRA\x10\x12\x12\r\n\tLORA_TYPE\x10\x13\x12\x0e\n\nSTATION_G1\x10\x19\x12\x0c\n\x08RAK11310\x10\x1a\x12\x14\n\x10SENSELORA_RP2040\x10\x1b\x12\x10\n\x0cSENSELORA_S3\x10\x1c\x12\r\n\tCANARYONE\x10\x1d\x12\x0f\n\x0bRP2040_LORA\x10\x1e\x12\x0e\n\nSTATION_G2\x10\x1f\x12\x11\n\rLORA_RELAY_V1\x10 \x12\x0e\n\nNRF52840DK\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&\x12\n\n\x06\x44IY_V1\x10\'\x12\x15\n\x11NRF52840_PCA10059\x10(\x12\n\n\x06\x44R_DEV\x10)\x12\x0b\n\x07M5STACK\x10*\x12\r\n\tHELTEC_V3\x10+\x12\x11\n\rHELTEC_WSL_V3\x10,\x12\x13\n\x0f\x42\x45TAFPV_2400_TX\x10-\x12\x17\n\x13\x42\x45TAFPV_900_NANO_TX\x10.\x12\x0c\n\x08RPI_PICO\x10/\x12\x1b\n\x17HELTEC_WIRELESS_TRACKER\x10\x30\x12\x19\n\x15HELTEC_WIRELESS_PAPER\x10\x31\x12\n\n\x06T_DECK\x10\x32\x12\x0e\n\nT_WATCH_S3\x10\x33\x12\x11\n\rPICOMPUTER_S3\x10\x34\x12\x0f\n\x0bHELTEC_HT62\x10\x35\x12\x12\n\x0e\x45\x42YTE_ESP32_S3\x10\x36\x12\x11\n\rESP32_S3_PICO\x10\x37\x12\r\n\tCHATTER_2\x10\x38\x12\x1e\n\x1aHELTEC_WIRELESS_PAPER_V1_0\x10\x39\x12 \n\x1cHELTEC_WIRELESS_TRACKER_V1_0\x10:\x12\x0f\n\nPRIVATE_HW\x10\xff\x01*,\n\tConstants\x12\x08\n\x04ZERO\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xed\x01*\xee\x01\n\x11\x43riticalErrorCode\x12\x08\n\x04NONE\x10\x00\x12\x0f\n\x0bTX_WATCHDOG\x10\x01\x12\x14\n\x10SLEEP_ENTER_WAIT\x10\x02\x12\x0c\n\x08NO_RADIO\x10\x03\x12\x0f\n\x0bUNSPECIFIED\x10\x04\x12\x15\n\x11UBLOX_UNIT_FAILED\x10\x05\x12\r\n\tNO_AXP192\x10\x06\x12\x19\n\x15INVALID_RADIO_SETTING\x10\x07\x12\x13\n\x0fTRANSMIT_FAILED\x10\x08\x12\x0c\n\x08\x42ROWNOUT\x10\t\x12\x12\n\x0eSX1262_FAILURE\x10\n\x12\x11\n\rRADIO_SPI_BUG\x10\x0b\x42_\n\x13\x63om.geeksville.meshB\nMeshProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/mesh.proto\x12\nmeshtastic\x1a\x18meshtastic/channel.proto\x1a\x17meshtastic/config.proto\x1a\x1emeshtastic/module_config.proto\x1a\x19meshtastic/portnums.proto\x1a\x1ameshtastic/telemetry.proto\x1a\x17meshtastic/xmodem.proto\"\xe5\x05\n\x08Position\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12\x37\n\x0flocation_source\x18\x05 \x01(\x0e\x32\x1e.meshtastic.Position.LocSource\x12\x37\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\x1e.meshtastic.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x14\n\x0c\x61ltitude_hae\x18\t \x01(\x11\x12#\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11\x12\x0c\n\x04PDOP\x18\x0b \x01(\r\x12\x0c\n\x04HDOP\x18\x0c \x01(\r\x12\x0c\n\x04VDOP\x18\r \x01(\r\x12\x14\n\x0cgps_accuracy\x18\x0e \x01(\r\x12\x14\n\x0cground_speed\x18\x0f \x01(\r\x12\x14\n\x0cground_track\x18\x10 \x01(\r\x12\x13\n\x0b\x66ix_quality\x18\x11 \x01(\r\x12\x10\n\x08\x66ix_type\x18\x12 \x01(\r\x12\x14\n\x0csats_in_view\x18\x13 \x01(\r\x12\x11\n\tsensor_id\x18\x14 \x01(\r\x12\x13\n\x0bnext_update\x18\x15 \x01(\r\x12\x12\n\nseq_number\x18\x16 \x01(\r\x12\x16\n\x0eprecision_bits\x18\x17 \x01(\r\"N\n\tLocSource\x12\r\n\tLOC_UNSET\x10\x00\x12\x0e\n\nLOC_MANUAL\x10\x01\x12\x10\n\x0cLOC_INTERNAL\x10\x02\x12\x10\n\x0cLOC_EXTERNAL\x10\x03\"b\n\tAltSource\x12\r\n\tALT_UNSET\x10\x00\x12\x0e\n\nALT_MANUAL\x10\x01\x12\x10\n\x0c\x41LT_INTERNAL\x10\x02\x12\x10\n\x0c\x41LT_EXTERNAL\x10\x03\x12\x12\n\x0e\x41LT_BAROMETRIC\x10\x04\"\xc4\x01\n\x04User\x12\n\n\x02id\x18\x01 \x01(\t\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x13\n\x07macaddr\x18\x04 \x01(\x0c\x42\x02\x18\x01\x12+\n\x08hw_model\x18\x05 \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12\x32\n\x04role\x18\x07 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\"\x1f\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\"\xfc\x02\n\x07Routing\x12\x33\n\rroute_request\x18\x01 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0broute_reply\x18\x02 \x01(\x0b\x32\x1a.meshtastic.RouteDiscoveryH\x00\x12\x31\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\x19.meshtastic.Routing.ErrorH\x00\"\xca\x01\n\x05\x45rror\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08NO_ROUTE\x10\x01\x12\x0b\n\x07GOT_NAK\x10\x02\x12\x0b\n\x07TIMEOUT\x10\x03\x12\x10\n\x0cNO_INTERFACE\x10\x04\x12\x12\n\x0eMAX_RETRANSMIT\x10\x05\x12\x0e\n\nNO_CHANNEL\x10\x06\x12\r\n\tTOO_LARGE\x10\x07\x12\x0f\n\x0bNO_RESPONSE\x10\x08\x12\x14\n\x10\x44UTY_CYCLE_LIMIT\x10\t\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10 \x12\x12\n\x0eNOT_AUTHORIZED\x10!B\t\n\x07variant\"\xa7\x01\n\x04\x44\x61ta\x12$\n\x07portnum\x18\x01 \x01(\x0e\x32\x13.meshtastic.PortNum\x12\x0f\n\x07payload\x18\x02 \x01(\x0c\x12\x15\n\rwant_response\x18\x03 \x01(\x08\x12\x0c\n\x04\x64\x65st\x18\x04 \x01(\x07\x12\x0e\n\x06source\x18\x05 \x01(\x07\x12\x12\n\nrequest_id\x18\x06 \x01(\x07\x12\x10\n\x08reply_id\x18\x07 \x01(\x07\x12\r\n\x05\x65moji\x18\x08 \x01(\x07\"\x93\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x12\n\nlatitude_i\x18\x02 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x03 \x01(\x0f\x12\x0e\n\x06\x65xpire\x18\x04 \x01(\r\x12\x11\n\tlocked_to\x18\x05 \x01(\r\x12\x0c\n\x04name\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x0c\n\x04icon\x18\x08 \x01(\x07\"l\n\x16MqttClientProxyMessage\x12\r\n\x05topic\x18\x01 \x01(\t\x12\x0e\n\x04\x64\x61ta\x18\x02 \x01(\x0cH\x00\x12\x0e\n\x04text\x18\x03 \x01(\tH\x00\x12\x10\n\x08retained\x18\x04 \x01(\x08\x42\x11\n\x0fpayload_variant\"\x95\x04\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x0f\n\x07\x63hannel\x18\x03 \x01(\r\x12#\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x10.meshtastic.DataH\x00\x12\x13\n\tencrypted\x18\x05 \x01(\x0cH\x00\x12\n\n\x02id\x18\x06 \x01(\x07\x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x11\n\thop_limit\x18\t \x01(\r\x12\x10\n\x08want_ack\x18\n \x01(\x08\x12\x31\n\x08priority\x18\x0b \x01(\x0e\x32\x1f.meshtastic.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c \x01(\x05\x12\x33\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\x1e.meshtastic.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\"[\n\x08Priority\x12\t\n\x05UNSET\x10\x00\x12\x07\n\x03MIN\x10\x01\x12\x0e\n\nBACKGROUND\x10\n\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10@\x12\x0c\n\x08RELIABLE\x10\x46\x12\x07\n\x03\x41\x43K\x10x\x12\x07\n\x03MAX\x10\x7f\"B\n\x07\x44\x65layed\x12\x0c\n\x08NO_DELAY\x10\x00\x12\x15\n\x11\x44\x45LAYED_BROADCAST\x10\x01\x12\x12\n\x0e\x44\x45LAYED_DIRECT\x10\x02\x42\x11\n\x0fpayload_variant\"\xfe\x01\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x1e\n\x04user\x18\x02 \x01(\x0b\x32\x10.meshtastic.User\x12&\n\x08position\x18\x03 \x01(\x0b\x32\x14.meshtastic.Position\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x31\n\x0e\x64\x65vice_metrics\x18\x06 \x01(\x0b\x32\x19.meshtastic.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x11\n\thops_away\x18\t \x01(\r\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\"P\n\nMyNodeInfo\x12\x13\n\x0bmy_node_num\x18\x01 \x01(\r\x12\x14\n\x0creboot_count\x18\x08 \x01(\r\x12\x17\n\x0fmin_app_version\x18\x0b \x01(\r\"\xc0\x01\n\tLogRecord\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x0e\n\x06source\x18\x03 \x01(\t\x12*\n\x05level\x18\x04 \x01(\x0e\x32\x1b.meshtastic.LogRecord.Level\"X\n\x05Level\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08\x43RITICAL\x10\x32\x12\t\n\x05\x45RROR\x10(\x12\x0b\n\x07WARNING\x10\x1e\x12\x08\n\x04INFO\x10\x14\x12\t\n\x05\x44\x45\x42UG\x10\n\x12\t\n\x05TRACE\x10\x05\"P\n\x0bQueueStatus\x12\x0b\n\x03res\x18\x01 \x01(\x05\x12\x0c\n\x04\x66ree\x18\x02 \x01(\r\x12\x0e\n\x06maxlen\x18\x03 \x01(\r\x12\x16\n\x0emesh_packet_id\x18\x04 \x01(\r\"\xdb\x04\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12(\n\x06packet\x18\x02 \x01(\x0b\x32\x16.meshtastic.MeshPacketH\x00\x12)\n\x07my_info\x18\x03 \x01(\x0b\x32\x16.meshtastic.MyNodeInfoH\x00\x12)\n\tnode_info\x18\x04 \x01(\x0b\x32\x14.meshtastic.NodeInfoH\x00\x12$\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x12.meshtastic.ConfigH\x00\x12+\n\nlog_record\x18\x06 \x01(\x0b\x32\x15.meshtastic.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 \x01(\x08H\x00\x12\x30\n\x0cmoduleConfig\x18\t \x01(\x0b\x32\x18.meshtastic.ModuleConfigH\x00\x12&\n\x07\x63hannel\x18\n \x01(\x0b\x32\x13.meshtastic.ChannelH\x00\x12.\n\x0bqueueStatus\x18\x0b \x01(\x0b\x32\x17.meshtastic.QueueStatusH\x00\x12*\n\x0cxmodemPacket\x18\x0c \x01(\x0b\x32\x12.meshtastic.XModemH\x00\x12.\n\x08metadata\x18\r \x01(\x0b\x32\x1a.meshtastic.DeviceMetadataH\x00\x12\x44\n\x16mqttClientProxyMessage\x18\x0e \x01(\x0b\x32\".meshtastic.MqttClientProxyMessageH\x00\x42\x11\n\x0fpayload_variant\"\x94\x02\n\x07ToRadio\x12(\n\x06packet\x18\x01 \x01(\x0b\x32\x16.meshtastic.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 \x01(\x08H\x00\x12*\n\x0cxmodemPacket\x18\x05 \x01(\x0b\x32\x12.meshtastic.XModemH\x00\x12\x44\n\x16mqttClientProxyMessage\x18\x06 \x01(\x0b\x32\".meshtastic.MqttClientProxyMessageH\x00\x12*\n\theartbeat\x18\x07 \x01(\x0b\x32\x15.meshtastic.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"@\n\nCompressed\x12$\n\x07portnum\x18\x01 \x01(\x0e\x32\x13.meshtastic.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x87\x01\n\x0cNeighborInfo\x12\x0f\n\x07node_id\x18\x01 \x01(\r\x12\x17\n\x0flast_sent_by_id\x18\x02 \x01(\r\x12$\n\x1cnode_broadcast_interval_secs\x18\x03 \x01(\r\x12\'\n\tneighbors\x18\x04 \x03(\x0b\x32\x14.meshtastic.Neighbor\"d\n\x08Neighbor\x12\x0f\n\x07node_id\x18\x01 \x01(\r\x12\x0b\n\x03snr\x18\x02 \x01(\x02\x12\x14\n\x0clast_rx_time\x18\x03 \x01(\x07\x12$\n\x1cnode_broadcast_interval_secs\x18\x04 \x01(\r\"\xad\x02\n\x0e\x44\x65viceMetadata\x12\x18\n\x10\x66irmware_version\x18\x01 \x01(\t\x12\x1c\n\x14\x64\x65vice_state_version\x18\x02 \x01(\r\x12\x13\n\x0b\x63\x61nShutdown\x18\x03 \x01(\x08\x12\x0f\n\x07hasWifi\x18\x04 \x01(\x08\x12\x14\n\x0chasBluetooth\x18\x05 \x01(\x08\x12\x13\n\x0bhasEthernet\x18\x06 \x01(\x08\x12\x32\n\x04role\x18\x07 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12+\n\x08hw_model\x18\t \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n \x01(\x08\"\x0b\n\tHeartbeat\"U\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12*\n\x03pin\x18\x02 \x01(\x0b\x32\x1d.meshtastic.RemoteHardwarePin*\xd4\x07\n\rHardwareModel\x12\t\n\x05UNSET\x10\x00\x12\x0c\n\x08TLORA_V2\x10\x01\x12\x0c\n\x08TLORA_V1\x10\x02\x12\x12\n\x0eTLORA_V2_1_1P6\x10\x03\x12\t\n\x05TBEAM\x10\x04\x12\x0f\n\x0bHELTEC_V2_0\x10\x05\x12\x0e\n\nTBEAM_V0P7\x10\x06\x12\n\n\x06T_ECHO\x10\x07\x12\x10\n\x0cTLORA_V1_1P3\x10\x08\x12\x0b\n\x07RAK4631\x10\t\x12\x0f\n\x0bHELTEC_V2_1\x10\n\x12\r\n\tHELTEC_V1\x10\x0b\x12\x18\n\x14LILYGO_TBEAM_S3_CORE\x10\x0c\x12\x0c\n\x08RAK11200\x10\r\x12\x0b\n\x07NANO_G1\x10\x0e\x12\x12\n\x0eTLORA_V2_1_1P8\x10\x0f\x12\x0f\n\x0bTLORA_T3_S3\x10\x10\x12\x14\n\x10NANO_G1_EXPLORER\x10\x11\x12\x11\n\rNANO_G2_ULTRA\x10\x12\x12\r\n\tLORA_TYPE\x10\x13\x12\x0e\n\nSTATION_G1\x10\x19\x12\x0c\n\x08RAK11310\x10\x1a\x12\x14\n\x10SENSELORA_RP2040\x10\x1b\x12\x10\n\x0cSENSELORA_S3\x10\x1c\x12\r\n\tCANARYONE\x10\x1d\x12\x0f\n\x0bRP2040_LORA\x10\x1e\x12\x0e\n\nSTATION_G2\x10\x1f\x12\x11\n\rLORA_RELAY_V1\x10 \x12\x0e\n\nNRF52840DK\x10!\x12\x07\n\x03PPR\x10\"\x12\x0f\n\x0bGENIEBLOCKS\x10#\x12\x11\n\rNRF52_UNKNOWN\x10$\x12\r\n\tPORTDUINO\x10%\x12\x0f\n\x0b\x41NDROID_SIM\x10&\x12\n\n\x06\x44IY_V1\x10\'\x12\x15\n\x11NRF52840_PCA10059\x10(\x12\n\n\x06\x44R_DEV\x10)\x12\x0b\n\x07M5STACK\x10*\x12\r\n\tHELTEC_V3\x10+\x12\x11\n\rHELTEC_WSL_V3\x10,\x12\x13\n\x0f\x42\x45TAFPV_2400_TX\x10-\x12\x17\n\x13\x42\x45TAFPV_900_NANO_TX\x10.\x12\x0c\n\x08RPI_PICO\x10/\x12\x1b\n\x17HELTEC_WIRELESS_TRACKER\x10\x30\x12\x19\n\x15HELTEC_WIRELESS_PAPER\x10\x31\x12\n\n\x06T_DECK\x10\x32\x12\x0e\n\nT_WATCH_S3\x10\x33\x12\x11\n\rPICOMPUTER_S3\x10\x34\x12\x0f\n\x0bHELTEC_HT62\x10\x35\x12\x12\n\x0e\x45\x42YTE_ESP32_S3\x10\x36\x12\x11\n\rESP32_S3_PICO\x10\x37\x12\r\n\tCHATTER_2\x10\x38\x12\x1e\n\x1aHELTEC_WIRELESS_PAPER_V1_0\x10\x39\x12 \n\x1cHELTEC_WIRELESS_TRACKER_V1_0\x10:\x12\x0f\n\nPRIVATE_HW\x10\xff\x01*,\n\tConstants\x12\x08\n\x04ZERO\x10\x00\x12\x15\n\x10\x44\x41TA_PAYLOAD_LEN\x10\xed\x01*\xee\x01\n\x11\x43riticalErrorCode\x12\x08\n\x04NONE\x10\x00\x12\x0f\n\x0bTX_WATCHDOG\x10\x01\x12\x14\n\x10SLEEP_ENTER_WAIT\x10\x02\x12\x0c\n\x08NO_RADIO\x10\x03\x12\x0f\n\x0bUNSPECIFIED\x10\x04\x12\x15\n\x11UBLOX_UNIT_FAILED\x10\x05\x12\r\n\tNO_AXP192\x10\x06\x12\x19\n\x15INVALID_RADIO_SETTING\x10\x07\x12\x13\n\x0fTRANSMIT_FAILED\x10\x08\x12\x0c\n\x08\x42ROWNOUT\x10\t\x12\x12\n\x0eSX1262_FAILURE\x10\n\x12\x11\n\rRADIO_SPI_BUG\x10\x0b\x42_\n\x13\x63om.geeksville.meshB\nMeshProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.mesh_pb2', globals())
@@ -31,62 +31,62 @@
_USER.fields_by_name['macaddr']._serialized_options = b'\030\001'
_MESHPACKET.fields_by_name['delayed']._options = None
_MESHPACKET.fields_by_name['delayed']._serialized_options = b'\030\001'
- _HARDWAREMODEL._serialized_start=4339
- _HARDWAREMODEL._serialized_end=5319
- _CONSTANTS._serialized_start=5321
- _CONSTANTS._serialized_end=5365
- _CRITICALERRORCODE._serialized_start=5368
- _CRITICALERRORCODE._serialized_end=5606
- _POSITION._serialized_start=189
- _POSITION._serialized_end=908
- _POSITION_LOCSOURCE._serialized_start=730
- _POSITION_LOCSOURCE._serialized_end=808
- _POSITION_ALTSOURCE._serialized_start=810
- _POSITION_ALTSOURCE._serialized_end=908
- _USER._serialized_start=911
- _USER._serialized_end=1085
- _ROUTEDISCOVERY._serialized_start=1087
- _ROUTEDISCOVERY._serialized_end=1118
- _ROUTING._serialized_start=1121
- _ROUTING._serialized_end=1468
- _ROUTING_ERROR._serialized_start=1255
- _ROUTING_ERROR._serialized_end=1457
- _DATA._serialized_start=1471
- _DATA._serialized_end=1627
- _WAYPOINT._serialized_start=1630
- _WAYPOINT._serialized_end=1777
- _MQTTCLIENTPROXYMESSAGE._serialized_start=1779
- _MQTTCLIENTPROXYMESSAGE._serialized_end=1887
- _MESHPACKET._serialized_start=1890
- _MESHPACKET._serialized_end=2390
- _MESHPACKET_PRIORITY._serialized_start=2212
- _MESHPACKET_PRIORITY._serialized_end=2303
- _MESHPACKET_DELAYED._serialized_start=2305
- _MESHPACKET_DELAYED._serialized_end=2371
- _NODEINFO._serialized_start=2393
- _NODEINFO._serialized_end=2614
- _MYNODEINFO._serialized_start=2616
- _MYNODEINFO._serialized_end=2696
- _LOGRECORD._serialized_start=2699
- _LOGRECORD._serialized_end=2880
- _LOGRECORD_LEVEL._serialized_start=2792
- _LOGRECORD_LEVEL._serialized_end=2880
- _QUEUESTATUS._serialized_start=2882
- _QUEUESTATUS._serialized_end=2962
- _FROMRADIO._serialized_start=2965
- _FROMRADIO._serialized_end=3447
- _TORADIO._serialized_start=3450
- _TORADIO._serialized_end=3682
- _COMPRESSED._serialized_start=3684
- _COMPRESSED._serialized_end=3737
- _NEIGHBORINFO._serialized_start=3739
- _NEIGHBORINFO._serialized_end=3863
- _NEIGHBOR._serialized_start=3865
- _NEIGHBOR._serialized_end=3965
- _DEVICEMETADATA._serialized_start=3968
- _DEVICEMETADATA._serialized_end=4247
- _HEARTBEAT._serialized_start=4249
- _HEARTBEAT._serialized_end=4260
- _NODEREMOTEHARDWAREPIN._serialized_start=4262
- _NODEREMOTEHARDWAREPIN._serialized_end=4336
+ _HARDWAREMODEL._serialized_start=4737
+ _HARDWAREMODEL._serialized_end=5717
+ _CONSTANTS._serialized_start=5719
+ _CONSTANTS._serialized_end=5763
+ _CRITICALERRORCODE._serialized_start=5766
+ _CRITICALERRORCODE._serialized_end=6004
+ _POSITION._serialized_start=201
+ _POSITION._serialized_end=942
+ _POSITION_LOCSOURCE._serialized_start=764
+ _POSITION_LOCSOURCE._serialized_end=842
+ _POSITION_ALTSOURCE._serialized_start=844
+ _POSITION_ALTSOURCE._serialized_end=942
+ _USER._serialized_start=945
+ _USER._serialized_end=1141
+ _ROUTEDISCOVERY._serialized_start=1143
+ _ROUTEDISCOVERY._serialized_end=1174
+ _ROUTING._serialized_start=1177
+ _ROUTING._serialized_end=1557
+ _ROUTING_ERROR._serialized_start=1344
+ _ROUTING_ERROR._serialized_end=1546
+ _DATA._serialized_start=1560
+ _DATA._serialized_end=1727
+ _WAYPOINT._serialized_start=1730
+ _WAYPOINT._serialized_end=1877
+ _MQTTCLIENTPROXYMESSAGE._serialized_start=1879
+ _MQTTCLIENTPROXYMESSAGE._serialized_end=1987
+ _MESHPACKET._serialized_start=1990
+ _MESHPACKET._serialized_end=2523
+ _MESHPACKET_PRIORITY._serialized_start=2345
+ _MESHPACKET_PRIORITY._serialized_end=2436
+ _MESHPACKET_DELAYED._serialized_start=2438
+ _MESHPACKET_DELAYED._serialized_end=2504
+ _NODEINFO._serialized_start=2526
+ _NODEINFO._serialized_end=2780
+ _MYNODEINFO._serialized_start=2782
+ _MYNODEINFO._serialized_end=2862
+ _LOGRECORD._serialized_start=2865
+ _LOGRECORD._serialized_end=3057
+ _LOGRECORD_LEVEL._serialized_start=2969
+ _LOGRECORD_LEVEL._serialized_end=3057
+ _QUEUESTATUS._serialized_start=3059
+ _QUEUESTATUS._serialized_end=3139
+ _FROMRADIO._serialized_start=3142
+ _FROMRADIO._serialized_end=3745
+ _TORADIO._serialized_start=3748
+ _TORADIO._serialized_end=4024
+ _COMPRESSED._serialized_start=4026
+ _COMPRESSED._serialized_end=4090
+ _NEIGHBORINFO._serialized_start=4093
+ _NEIGHBORINFO._serialized_end=4228
+ _NEIGHBOR._serialized_start=4230
+ _NEIGHBOR._serialized_end=4330
+ _DEVICEMETADATA._serialized_start=4333
+ _DEVICEMETADATA._serialized_end=4634
+ _HEARTBEAT._serialized_start=4636
+ _HEARTBEAT._serialized_end=4647
+ _NODEREMOTEHARDWAREPIN._serialized_start=4649
+ _NODEREMOTEHARDWAREPIN._serialized_end=4734
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/mesh_pb2.pyi b/meshtastic/mesh_pb2.pyi
new file mode 100644
index 00000000..e98808ef
--- /dev/null
+++ b/meshtastic/mesh_pb2.pyi
@@ -0,0 +1,2355 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import collections.abc
+import google.protobuf.descriptor
+import google.protobuf.internal.containers
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import meshtastic.channel_pb2
+import meshtastic.config_pb2
+import meshtastic.module_config_pb2
+import meshtastic.portnums_pb2
+import meshtastic.telemetry_pb2
+import meshtastic.xmodem_pb2
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class _HardwareModel:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_HardwareModel.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ UNSET: _HardwareModel.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ TLORA_V2: _HardwareModel.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ TLORA_V1: _HardwareModel.ValueType # 2
+ """
+ TODO: REPLACE
+ """
+ TLORA_V2_1_1P6: _HardwareModel.ValueType # 3
+ """
+ TODO: REPLACE
+ """
+ TBEAM: _HardwareModel.ValueType # 4
+ """
+ TODO: REPLACE
+ """
+ HELTEC_V2_0: _HardwareModel.ValueType # 5
+ """
+ The original heltec WiFi_Lora_32_V2, which had battery voltage sensing hooked to GPIO 13
+ (see HELTEC_V2 for the new version).
+ """
+ TBEAM_V0P7: _HardwareModel.ValueType # 6
+ """
+ TODO: REPLACE
+ """
+ T_ECHO: _HardwareModel.ValueType # 7
+ """
+ TODO: REPLACE
+ """
+ TLORA_V1_1P3: _HardwareModel.ValueType # 8
+ """
+ TODO: REPLACE
+ """
+ RAK4631: _HardwareModel.ValueType # 9
+ """
+ TODO: REPLACE
+ """
+ HELTEC_V2_1: _HardwareModel.ValueType # 10
+ """
+ The new version of the heltec WiFi_Lora_32_V2 board that has battery sensing hooked to GPIO 37.
+ Sadly they did not update anything on the silkscreen to identify this board
+ """
+ HELTEC_V1: _HardwareModel.ValueType # 11
+ """
+ Ancient heltec WiFi_Lora_32 board
+ """
+ LILYGO_TBEAM_S3_CORE: _HardwareModel.ValueType # 12
+ """
+ New T-BEAM with ESP32-S3 CPU
+ """
+ RAK11200: _HardwareModel.ValueType # 13
+ """
+ RAK WisBlock ESP32 core: https://docs.rakwireless.com/Product-Categories/WisBlock/RAK11200/Overview/
+ """
+ NANO_G1: _HardwareModel.ValueType # 14
+ """
+ B&Q Consulting Nano Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:nano
+ """
+ TLORA_V2_1_1P8: _HardwareModel.ValueType # 15
+ """
+ TODO: REPLACE
+ """
+ TLORA_T3_S3: _HardwareModel.ValueType # 16
+ """
+ TODO: REPLACE
+ """
+ NANO_G1_EXPLORER: _HardwareModel.ValueType # 17
+ """
+ B&Q Consulting Nano G1 Explorer: https://wiki.uniteng.com/en/meshtastic/nano-g1-explorer
+ """
+ NANO_G2_ULTRA: _HardwareModel.ValueType # 18
+ """
+ B&Q Consulting Nano G2 Ultra: https://wiki.uniteng.com/en/meshtastic/nano-g2-ultra
+ """
+ LORA_TYPE: _HardwareModel.ValueType # 19
+ """
+ LoRAType device: https://loratype.org/
+ """
+ STATION_G1: _HardwareModel.ValueType # 25
+ """
+ B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station
+ """
+ RAK11310: _HardwareModel.ValueType # 26
+ """
+ RAK11310 (RP2040 + SX1262)
+ """
+ SENSELORA_RP2040: _HardwareModel.ValueType # 27
+ """
+ Makerfabs SenseLoRA Receiver (RP2040 + RFM96)
+ """
+ SENSELORA_S3: _HardwareModel.ValueType # 28
+ """
+ Makerfabs SenseLoRA Industrial Monitor (ESP32-S3 + RFM96)
+ """
+ CANARYONE: _HardwareModel.ValueType # 29
+ """
+ Canary Radio Company - CanaryOne: https://canaryradio.io/products/canaryone
+ """
+ RP2040_LORA: _HardwareModel.ValueType # 30
+ """
+ Waveshare RP2040 LoRa - https://www.waveshare.com/rp2040-lora.htm
+ """
+ STATION_G2: _HardwareModel.ValueType # 31
+ """
+ B&Q Consulting Station G2: https://wiki.uniteng.com/en/meshtastic/station-g2
+ """
+ LORA_RELAY_V1: _HardwareModel.ValueType # 32
+ """
+ ---------------------------------------------------------------------------
+ Less common/prototype boards listed here (needs one more byte over the air)
+ ---------------------------------------------------------------------------
+ """
+ NRF52840DK: _HardwareModel.ValueType # 33
+ """
+ TODO: REPLACE
+ """
+ PPR: _HardwareModel.ValueType # 34
+ """
+ TODO: REPLACE
+ """
+ GENIEBLOCKS: _HardwareModel.ValueType # 35
+ """
+ TODO: REPLACE
+ """
+ NRF52_UNKNOWN: _HardwareModel.ValueType # 36
+ """
+ TODO: REPLACE
+ """
+ PORTDUINO: _HardwareModel.ValueType # 37
+ """
+ TODO: REPLACE
+ """
+ ANDROID_SIM: _HardwareModel.ValueType # 38
+ """
+ The simulator built into the android app
+ """
+ DIY_V1: _HardwareModel.ValueType # 39
+ """
+ Custom DIY device based on @NanoVHF schematics: https://github.com/NanoVHF/Meshtastic-DIY/tree/main/Schematics
+ """
+ NRF52840_PCA10059: _HardwareModel.ValueType # 40
+ """
+ nRF52840 Dongle : https://www.nordicsemi.com/Products/Development-hardware/nrf52840-dongle/
+ """
+ DR_DEV: _HardwareModel.ValueType # 41
+ """
+ Custom Disaster Radio esp32 v3 device https://github.com/sudomesh/disaster-radio/tree/master/hardware/board_esp32_v3
+ """
+ M5STACK: _HardwareModel.ValueType # 42
+ """
+ M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, Paper) https://m5stack.com/
+ """
+ HELTEC_V3: _HardwareModel.ValueType # 43
+ """
+ New Heltec LoRA32 with ESP32-S3 CPU
+ """
+ HELTEC_WSL_V3: _HardwareModel.ValueType # 44
+ """
+ New Heltec Wireless Stick Lite with ESP32-S3 CPU
+ """
+ BETAFPV_2400_TX: _HardwareModel.ValueType # 45
+ """
+ New BETAFPV ELRS Micro TX Module 2.4G with ESP32 CPU
+ """
+ BETAFPV_900_NANO_TX: _HardwareModel.ValueType # 46
+ """
+ BetaFPV ExpressLRS "Nano" TX Module 900MHz with ESP32 CPU
+ """
+ RPI_PICO: _HardwareModel.ValueType # 47
+ """
+ Raspberry Pi Pico (W) with Waveshare SX1262 LoRa Node Module
+ """
+ HELTEC_WIRELESS_TRACKER: _HardwareModel.ValueType # 48
+ """
+ Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT
+ Newer V1.1, version is written on the PCB near the display.
+ """
+ HELTEC_WIRELESS_PAPER: _HardwareModel.ValueType # 49
+ """
+ Heltec Wireless Paper with ESP32-S3 CPU and E-Ink display
+ """
+ T_DECK: _HardwareModel.ValueType # 50
+ """
+ LilyGo T-Deck with ESP32-S3 CPU, Keyboard and IPS display
+ """
+ T_WATCH_S3: _HardwareModel.ValueType # 51
+ """
+ LilyGo T-Watch S3 with ESP32-S3 CPU and IPS display
+ """
+ PICOMPUTER_S3: _HardwareModel.ValueType # 52
+ """
+ Bobricius Picomputer with ESP32-S3 CPU, Keyboard and IPS display
+ """
+ HELTEC_HT62: _HardwareModel.ValueType # 53
+ """
+ Heltec HT-CT62 with ESP32-C3 CPU and SX1262 LoRa
+ """
+ EBYTE_ESP32_S3: _HardwareModel.ValueType # 54
+ """
+ EBYTE SPI LoRa module and ESP32-S3
+ """
+ ESP32_S3_PICO: _HardwareModel.ValueType # 55
+ """
+ Waveshare ESP32-S3-PICO with PICO LoRa HAT and 2.9inch e-Ink
+ """
+ CHATTER_2: _HardwareModel.ValueType # 56
+ """
+ CircuitMess Chatter 2 LLCC68 Lora Module and ESP32 Wroom
+ Lora module can be swapped out for a Heltec RA-62 which is "almost" pin compatible
+ with one cut and one jumper Meshtastic works
+ """
+ HELTEC_WIRELESS_PAPER_V1_0: _HardwareModel.ValueType # 57
+ """
+ Heltec Wireless Paper, With ESP32-S3 CPU and E-Ink display
+ Older "V1.0" Variant, has no "version sticker"
+ E-Ink model is DEPG0213BNS800
+ Tab on the screen protector is RED
+ Flex connector marking is FPC-7528B
+ """
+ HELTEC_WIRELESS_TRACKER_V1_0: _HardwareModel.ValueType # 58
+ """
+ Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT
+ Older "V1.0" Variant
+ """
+ PRIVATE_HW: _HardwareModel.ValueType # 255
+ """
+ ------------------------------------------------------------------------------------------------------------------------------------------
+ Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits.
+ ------------------------------------------------------------------------------------------------------------------------------------------
+ """
+
+class HardwareModel(_HardwareModel, metaclass=_HardwareModelEnumTypeWrapper):
+ """
+ Note: these enum names must EXACTLY match the string used in the device
+ bin/build-all.sh script.
+ Because they will be used to find firmware filenames in the android app for OTA updates.
+ To match the old style filenames, _ is converted to -, p is converted to .
+ """
+
+UNSET: HardwareModel.ValueType # 0
+"""
+TODO: REPLACE
+"""
+TLORA_V2: HardwareModel.ValueType # 1
+"""
+TODO: REPLACE
+"""
+TLORA_V1: HardwareModel.ValueType # 2
+"""
+TODO: REPLACE
+"""
+TLORA_V2_1_1P6: HardwareModel.ValueType # 3
+"""
+TODO: REPLACE
+"""
+TBEAM: HardwareModel.ValueType # 4
+"""
+TODO: REPLACE
+"""
+HELTEC_V2_0: HardwareModel.ValueType # 5
+"""
+The original heltec WiFi_Lora_32_V2, which had battery voltage sensing hooked to GPIO 13
+(see HELTEC_V2 for the new version).
+"""
+TBEAM_V0P7: HardwareModel.ValueType # 6
+"""
+TODO: REPLACE
+"""
+T_ECHO: HardwareModel.ValueType # 7
+"""
+TODO: REPLACE
+"""
+TLORA_V1_1P3: HardwareModel.ValueType # 8
+"""
+TODO: REPLACE
+"""
+RAK4631: HardwareModel.ValueType # 9
+"""
+TODO: REPLACE
+"""
+HELTEC_V2_1: HardwareModel.ValueType # 10
+"""
+The new version of the heltec WiFi_Lora_32_V2 board that has battery sensing hooked to GPIO 37.
+Sadly they did not update anything on the silkscreen to identify this board
+"""
+HELTEC_V1: HardwareModel.ValueType # 11
+"""
+Ancient heltec WiFi_Lora_32 board
+"""
+LILYGO_TBEAM_S3_CORE: HardwareModel.ValueType # 12
+"""
+New T-BEAM with ESP32-S3 CPU
+"""
+RAK11200: HardwareModel.ValueType # 13
+"""
+RAK WisBlock ESP32 core: https://docs.rakwireless.com/Product-Categories/WisBlock/RAK11200/Overview/
+"""
+NANO_G1: HardwareModel.ValueType # 14
+"""
+B&Q Consulting Nano Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:nano
+"""
+TLORA_V2_1_1P8: HardwareModel.ValueType # 15
+"""
+TODO: REPLACE
+"""
+TLORA_T3_S3: HardwareModel.ValueType # 16
+"""
+TODO: REPLACE
+"""
+NANO_G1_EXPLORER: HardwareModel.ValueType # 17
+"""
+B&Q Consulting Nano G1 Explorer: https://wiki.uniteng.com/en/meshtastic/nano-g1-explorer
+"""
+NANO_G2_ULTRA: HardwareModel.ValueType # 18
+"""
+B&Q Consulting Nano G2 Ultra: https://wiki.uniteng.com/en/meshtastic/nano-g2-ultra
+"""
+LORA_TYPE: HardwareModel.ValueType # 19
+"""
+LoRAType device: https://loratype.org/
+"""
+STATION_G1: HardwareModel.ValueType # 25
+"""
+B&Q Consulting Station Edition G1: https://uniteng.com/wiki/doku.php?id=meshtastic:station
+"""
+RAK11310: HardwareModel.ValueType # 26
+"""
+RAK11310 (RP2040 + SX1262)
+"""
+SENSELORA_RP2040: HardwareModel.ValueType # 27
+"""
+Makerfabs SenseLoRA Receiver (RP2040 + RFM96)
+"""
+SENSELORA_S3: HardwareModel.ValueType # 28
+"""
+Makerfabs SenseLoRA Industrial Monitor (ESP32-S3 + RFM96)
+"""
+CANARYONE: HardwareModel.ValueType # 29
+"""
+Canary Radio Company - CanaryOne: https://canaryradio.io/products/canaryone
+"""
+RP2040_LORA: HardwareModel.ValueType # 30
+"""
+Waveshare RP2040 LoRa - https://www.waveshare.com/rp2040-lora.htm
+"""
+STATION_G2: HardwareModel.ValueType # 31
+"""
+B&Q Consulting Station G2: https://wiki.uniteng.com/en/meshtastic/station-g2
+"""
+LORA_RELAY_V1: HardwareModel.ValueType # 32
+"""
+---------------------------------------------------------------------------
+Less common/prototype boards listed here (needs one more byte over the air)
+---------------------------------------------------------------------------
+"""
+NRF52840DK: HardwareModel.ValueType # 33
+"""
+TODO: REPLACE
+"""
+PPR: HardwareModel.ValueType # 34
+"""
+TODO: REPLACE
+"""
+GENIEBLOCKS: HardwareModel.ValueType # 35
+"""
+TODO: REPLACE
+"""
+NRF52_UNKNOWN: HardwareModel.ValueType # 36
+"""
+TODO: REPLACE
+"""
+PORTDUINO: HardwareModel.ValueType # 37
+"""
+TODO: REPLACE
+"""
+ANDROID_SIM: HardwareModel.ValueType # 38
+"""
+The simulator built into the android app
+"""
+DIY_V1: HardwareModel.ValueType # 39
+"""
+Custom DIY device based on @NanoVHF schematics: https://github.com/NanoVHF/Meshtastic-DIY/tree/main/Schematics
+"""
+NRF52840_PCA10059: HardwareModel.ValueType # 40
+"""
+nRF52840 Dongle : https://www.nordicsemi.com/Products/Development-hardware/nrf52840-dongle/
+"""
+DR_DEV: HardwareModel.ValueType # 41
+"""
+Custom Disaster Radio esp32 v3 device https://github.com/sudomesh/disaster-radio/tree/master/hardware/board_esp32_v3
+"""
+M5STACK: HardwareModel.ValueType # 42
+"""
+M5 esp32 based MCU modules with enclosure, TFT and LORA Shields. All Variants (Basic, Core, Fire, Core2, Paper) https://m5stack.com/
+"""
+HELTEC_V3: HardwareModel.ValueType # 43
+"""
+New Heltec LoRA32 with ESP32-S3 CPU
+"""
+HELTEC_WSL_V3: HardwareModel.ValueType # 44
+"""
+New Heltec Wireless Stick Lite with ESP32-S3 CPU
+"""
+BETAFPV_2400_TX: HardwareModel.ValueType # 45
+"""
+New BETAFPV ELRS Micro TX Module 2.4G with ESP32 CPU
+"""
+BETAFPV_900_NANO_TX: HardwareModel.ValueType # 46
+"""
+BetaFPV ExpressLRS "Nano" TX Module 900MHz with ESP32 CPU
+"""
+RPI_PICO: HardwareModel.ValueType # 47
+"""
+Raspberry Pi Pico (W) with Waveshare SX1262 LoRa Node Module
+"""
+HELTEC_WIRELESS_TRACKER: HardwareModel.ValueType # 48
+"""
+Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT
+Newer V1.1, version is written on the PCB near the display.
+"""
+HELTEC_WIRELESS_PAPER: HardwareModel.ValueType # 49
+"""
+Heltec Wireless Paper with ESP32-S3 CPU and E-Ink display
+"""
+T_DECK: HardwareModel.ValueType # 50
+"""
+LilyGo T-Deck with ESP32-S3 CPU, Keyboard and IPS display
+"""
+T_WATCH_S3: HardwareModel.ValueType # 51
+"""
+LilyGo T-Watch S3 with ESP32-S3 CPU and IPS display
+"""
+PICOMPUTER_S3: HardwareModel.ValueType # 52
+"""
+Bobricius Picomputer with ESP32-S3 CPU, Keyboard and IPS display
+"""
+HELTEC_HT62: HardwareModel.ValueType # 53
+"""
+Heltec HT-CT62 with ESP32-C3 CPU and SX1262 LoRa
+"""
+EBYTE_ESP32_S3: HardwareModel.ValueType # 54
+"""
+EBYTE SPI LoRa module and ESP32-S3
+"""
+ESP32_S3_PICO: HardwareModel.ValueType # 55
+"""
+Waveshare ESP32-S3-PICO with PICO LoRa HAT and 2.9inch e-Ink
+"""
+CHATTER_2: HardwareModel.ValueType # 56
+"""
+CircuitMess Chatter 2 LLCC68 Lora Module and ESP32 Wroom
+Lora module can be swapped out for a Heltec RA-62 which is "almost" pin compatible
+with one cut and one jumper Meshtastic works
+"""
+HELTEC_WIRELESS_PAPER_V1_0: HardwareModel.ValueType # 57
+"""
+Heltec Wireless Paper, With ESP32-S3 CPU and E-Ink display
+Older "V1.0" Variant, has no "version sticker"
+E-Ink model is DEPG0213BNS800
+Tab on the screen protector is RED
+Flex connector marking is FPC-7528B
+"""
+HELTEC_WIRELESS_TRACKER_V1_0: HardwareModel.ValueType # 58
+"""
+Heltec Wireless Tracker with ESP32-S3 CPU, built-in GPS, and TFT
+Older "V1.0" Variant
+"""
+PRIVATE_HW: HardwareModel.ValueType # 255
+"""
+------------------------------------------------------------------------------------------------------------------------------------------
+Reserved ID For developing private Ports. These will show up in live traffic sparsely, so we can use a high number. Keep it within 8 bits.
+------------------------------------------------------------------------------------------------------------------------------------------
+"""
+global___HardwareModel = HardwareModel
+
+class _Constants:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _ConstantsEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_Constants.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ ZERO: _Constants.ValueType # 0
+ """
+ First enum must be zero, and we are just using this enum to
+ pass int constants between two very different environments
+ """
+ DATA_PAYLOAD_LEN: _Constants.ValueType # 237
+ """
+ From mesh.options
+ 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
+ """
+
+class Constants(_Constants, metaclass=_ConstantsEnumTypeWrapper):
+ """
+ Shared constants between device and phone
+ """
+
+ZERO: Constants.ValueType # 0
+"""
+First enum must be zero, and we are just using this enum to
+pass int constants between two very different environments
+"""
+DATA_PAYLOAD_LEN: Constants.ValueType # 237
+"""
+From mesh.options
+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
+"""
+global___Constants = Constants
+
+class _CriticalErrorCode:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _CriticalErrorCodeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_CriticalErrorCode.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ NONE: _CriticalErrorCode.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ TX_WATCHDOG: _CriticalErrorCode.ValueType # 1
+ """
+ A software bug was detected while trying to send lora
+ """
+ SLEEP_ENTER_WAIT: _CriticalErrorCode.ValueType # 2
+ """
+ A software bug was detected on entry to sleep
+ """
+ NO_RADIO: _CriticalErrorCode.ValueType # 3
+ """
+ No Lora radio hardware could be found
+ """
+ UNSPECIFIED: _CriticalErrorCode.ValueType # 4
+ """
+ Not normally used
+ """
+ UBLOX_UNIT_FAILED: _CriticalErrorCode.ValueType # 5
+ """
+ We failed while configuring a UBlox GPS
+ """
+ NO_AXP192: _CriticalErrorCode.ValueType # 6
+ """
+ This board was expected to have a power management chip and it is missing or broken
+ """
+ INVALID_RADIO_SETTING: _CriticalErrorCode.ValueType # 7
+ """
+ The channel tried to set a radio setting which is not supported by this chipset,
+ radio comms settings are now undefined.
+ """
+ TRANSMIT_FAILED: _CriticalErrorCode.ValueType # 8
+ """
+ Radio transmit hardware failure. We sent data to the radio chip, but it didn't
+ reply with an interrupt.
+ """
+ BROWNOUT: _CriticalErrorCode.ValueType # 9
+ """
+ We detected that the main CPU voltage dropped below the minimum acceptable value
+ """
+ SX1262_FAILURE: _CriticalErrorCode.ValueType # 10
+ """Selftest of SX1262 radio chip failed"""
+ RADIO_SPI_BUG: _CriticalErrorCode.ValueType # 11
+ """
+ A (likely software but possibly hardware) failure was detected while trying to send packets.
+ If this occurs on your board, please post in the forum so that we can ask you to collect some information to allow fixing this bug
+ """
+
+class CriticalErrorCode(_CriticalErrorCode, metaclass=_CriticalErrorCodeEnumTypeWrapper):
+ """
+ Error codes for critical errors
+ The device might report these fault codes on the screen.
+ If you encounter a fault code, please post on the meshtastic.discourse.group
+ and we'll try to help.
+ """
+
+NONE: CriticalErrorCode.ValueType # 0
+"""
+TODO: REPLACE
+"""
+TX_WATCHDOG: CriticalErrorCode.ValueType # 1
+"""
+A software bug was detected while trying to send lora
+"""
+SLEEP_ENTER_WAIT: CriticalErrorCode.ValueType # 2
+"""
+A software bug was detected on entry to sleep
+"""
+NO_RADIO: CriticalErrorCode.ValueType # 3
+"""
+No Lora radio hardware could be found
+"""
+UNSPECIFIED: CriticalErrorCode.ValueType # 4
+"""
+Not normally used
+"""
+UBLOX_UNIT_FAILED: CriticalErrorCode.ValueType # 5
+"""
+We failed while configuring a UBlox GPS
+"""
+NO_AXP192: CriticalErrorCode.ValueType # 6
+"""
+This board was expected to have a power management chip and it is missing or broken
+"""
+INVALID_RADIO_SETTING: CriticalErrorCode.ValueType # 7
+"""
+The channel tried to set a radio setting which is not supported by this chipset,
+radio comms settings are now undefined.
+"""
+TRANSMIT_FAILED: CriticalErrorCode.ValueType # 8
+"""
+Radio transmit hardware failure. We sent data to the radio chip, but it didn't
+reply with an interrupt.
+"""
+BROWNOUT: CriticalErrorCode.ValueType # 9
+"""
+We detected that the main CPU voltage dropped below the minimum acceptable value
+"""
+SX1262_FAILURE: CriticalErrorCode.ValueType # 10
+"""Selftest of SX1262 radio chip failed"""
+RADIO_SPI_BUG: CriticalErrorCode.ValueType # 11
+"""
+A (likely software but possibly hardware) failure was detected while trying to send packets.
+If this occurs on your board, please post in the forum so that we can ask you to collect some information to allow fixing this bug
+"""
+global___CriticalErrorCode = CriticalErrorCode
+
+@typing_extensions.final
+class Position(google.protobuf.message.Message):
+ """
+ a gps position
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _LocSource:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _LocSourceEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Position._LocSource.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ LOC_UNSET: Position._LocSource.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ LOC_MANUAL: Position._LocSource.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ LOC_INTERNAL: Position._LocSource.ValueType # 2
+ """
+ TODO: REPLACE
+ """
+ LOC_EXTERNAL: Position._LocSource.ValueType # 3
+ """
+ TODO: REPLACE
+ """
+
+ class LocSource(_LocSource, metaclass=_LocSourceEnumTypeWrapper):
+ """
+ How the location was acquired: manual, onboard GPS, external (EUD) GPS
+ """
+
+ LOC_UNSET: Position.LocSource.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ LOC_MANUAL: Position.LocSource.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ LOC_INTERNAL: Position.LocSource.ValueType # 2
+ """
+ TODO: REPLACE
+ """
+ LOC_EXTERNAL: Position.LocSource.ValueType # 3
+ """
+ TODO: REPLACE
+ """
+
+ class _AltSource:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _AltSourceEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Position._AltSource.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ ALT_UNSET: Position._AltSource.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ ALT_MANUAL: Position._AltSource.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ ALT_INTERNAL: Position._AltSource.ValueType # 2
+ """
+ TODO: REPLACE
+ """
+ ALT_EXTERNAL: Position._AltSource.ValueType # 3
+ """
+ TODO: REPLACE
+ """
+ ALT_BAROMETRIC: Position._AltSource.ValueType # 4
+ """
+ TODO: REPLACE
+ """
+
+ class AltSource(_AltSource, metaclass=_AltSourceEnumTypeWrapper):
+ """
+ How the altitude was acquired: manual, GPS int/ext, etc
+ Default: same as location_source if present
+ """
+
+ ALT_UNSET: Position.AltSource.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ ALT_MANUAL: Position.AltSource.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ ALT_INTERNAL: Position.AltSource.ValueType # 2
+ """
+ TODO: REPLACE
+ """
+ ALT_EXTERNAL: Position.AltSource.ValueType # 3
+ """
+ TODO: REPLACE
+ """
+ ALT_BAROMETRIC: Position.AltSource.ValueType # 4
+ """
+ TODO: REPLACE
+ """
+
+ LATITUDE_I_FIELD_NUMBER: builtins.int
+ LONGITUDE_I_FIELD_NUMBER: builtins.int
+ ALTITUDE_FIELD_NUMBER: builtins.int
+ TIME_FIELD_NUMBER: builtins.int
+ LOCATION_SOURCE_FIELD_NUMBER: builtins.int
+ ALTITUDE_SOURCE_FIELD_NUMBER: builtins.int
+ TIMESTAMP_FIELD_NUMBER: builtins.int
+ TIMESTAMP_MILLIS_ADJUST_FIELD_NUMBER: builtins.int
+ ALTITUDE_HAE_FIELD_NUMBER: builtins.int
+ ALTITUDE_GEOIDAL_SEPARATION_FIELD_NUMBER: builtins.int
+ PDOP_FIELD_NUMBER: builtins.int
+ HDOP_FIELD_NUMBER: builtins.int
+ VDOP_FIELD_NUMBER: builtins.int
+ GPS_ACCURACY_FIELD_NUMBER: builtins.int
+ GROUND_SPEED_FIELD_NUMBER: builtins.int
+ GROUND_TRACK_FIELD_NUMBER: builtins.int
+ FIX_QUALITY_FIELD_NUMBER: builtins.int
+ FIX_TYPE_FIELD_NUMBER: builtins.int
+ SATS_IN_VIEW_FIELD_NUMBER: builtins.int
+ SENSOR_ID_FIELD_NUMBER: builtins.int
+ NEXT_UPDATE_FIELD_NUMBER: builtins.int
+ SEQ_NUMBER_FIELD_NUMBER: builtins.int
+ PRECISION_BITS_FIELD_NUMBER: builtins.int
+ latitude_i: builtins.int
+ """
+ The new preferred location encoding, multiply by 1e-7 to get degrees
+ in floating point
+ """
+ longitude_i: builtins.int
+ """
+ TODO: REPLACE
+ """
+ altitude: builtins.int
+ """
+ In meters above MSL (but see issue #359)
+ """
+ time: builtins.int
+ """
+ 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 time if it is sent over
+ the mesh (because there are devices on the mesh without GPS or RTC).
+ seconds since 1970
+ """
+ location_source: global___Position.LocSource.ValueType
+ """
+ TODO: REPLACE
+ """
+ altitude_source: global___Position.AltSource.ValueType
+ """
+ TODO: REPLACE
+ """
+ timestamp: builtins.int
+ """
+ Positional timestamp (actual timestamp of GPS solution) in integer epoch seconds
+ """
+ timestamp_millis_adjust: builtins.int
+ """
+ Pos. timestamp milliseconds adjustment (rarely available or required)
+ """
+ altitude_hae: builtins.int
+ """
+ HAE altitude in meters - can be used instead of MSL altitude
+ """
+ altitude_geoidal_separation: builtins.int
+ """
+ Geoidal separation in meters
+ """
+ PDOP: builtins.int
+ """
+ Horizontal, Vertical and Position Dilution of Precision, in 1/100 units
+ - PDOP is sufficient for most cases
+ - for higher precision scenarios, HDOP and VDOP can be used instead,
+ in which case PDOP becomes redundant (PDOP=sqrt(HDOP^2 + VDOP^2))
+ TODO: REMOVE/INTEGRATE
+ """
+ HDOP: builtins.int
+ """
+ TODO: REPLACE
+ """
+ VDOP: builtins.int
+ """
+ TODO: REPLACE
+ """
+ gps_accuracy: builtins.int
+ """
+ GPS accuracy (a hardware specific constant) in mm
+ multiplied with DOP to calculate positional accuracy
+ Default: "'bout three meters-ish" :)
+ """
+ ground_speed: builtins.int
+ """
+ Ground speed in m/s and True North TRACK in 1/100 degrees
+ Clarification of terms:
+ - "track" is the direction of motion (measured in horizontal plane)
+ - "heading" is where the fuselage points (measured in horizontal plane)
+ - "yaw" indicates a relative rotation about the vertical axis
+ TODO: REMOVE/INTEGRATE
+ """
+ ground_track: builtins.int
+ """
+ TODO: REPLACE
+ """
+ fix_quality: builtins.int
+ """
+ GPS fix quality (from NMEA GxGGA statement or similar)
+ """
+ fix_type: builtins.int
+ """
+ GPS fix type 2D/3D (from NMEA GxGSA statement)
+ """
+ sats_in_view: builtins.int
+ """
+ GPS "Satellites in View" number
+ """
+ sensor_id: builtins.int
+ """
+ Sensor ID - in case multiple positioning sensors are being used
+ """
+ next_update: builtins.int
+ """
+ Estimated/expected time (in seconds) until next update:
+ - if we update at fixed intervals of X seconds, use X
+ - if we update at dynamic intervals (based on relative movement etc),
+ but "AT LEAST every Y seconds", use Y
+ """
+ seq_number: builtins.int
+ """
+ A sequence number, incremented with each Position message to help
+ detect lost updates if needed
+ """
+ precision_bits: builtins.int
+ """
+ Indicates the bits of precision set by the sending node
+ """
+ def __init__(
+ self,
+ *,
+ latitude_i: builtins.int = ...,
+ longitude_i: builtins.int = ...,
+ altitude: builtins.int = ...,
+ time: builtins.int = ...,
+ location_source: global___Position.LocSource.ValueType = ...,
+ altitude_source: global___Position.AltSource.ValueType = ...,
+ timestamp: builtins.int = ...,
+ timestamp_millis_adjust: builtins.int = ...,
+ altitude_hae: builtins.int = ...,
+ altitude_geoidal_separation: builtins.int = ...,
+ PDOP: builtins.int = ...,
+ HDOP: builtins.int = ...,
+ VDOP: builtins.int = ...,
+ gps_accuracy: builtins.int = ...,
+ ground_speed: builtins.int = ...,
+ ground_track: builtins.int = ...,
+ fix_quality: builtins.int = ...,
+ fix_type: builtins.int = ...,
+ sats_in_view: builtins.int = ...,
+ sensor_id: builtins.int = ...,
+ next_update: builtins.int = ...,
+ seq_number: builtins.int = ...,
+ precision_bits: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["HDOP", b"HDOP", "PDOP", b"PDOP", "VDOP", b"VDOP", "altitude", b"altitude", "altitude_geoidal_separation", b"altitude_geoidal_separation", "altitude_hae", b"altitude_hae", "altitude_source", b"altitude_source", "fix_quality", b"fix_quality", "fix_type", b"fix_type", "gps_accuracy", b"gps_accuracy", "ground_speed", b"ground_speed", "ground_track", b"ground_track", "latitude_i", b"latitude_i", "location_source", b"location_source", "longitude_i", b"longitude_i", "next_update", b"next_update", "precision_bits", b"precision_bits", "sats_in_view", b"sats_in_view", "sensor_id", b"sensor_id", "seq_number", b"seq_number", "time", b"time", "timestamp", b"timestamp", "timestamp_millis_adjust", b"timestamp_millis_adjust"]) -> None: ...
+
+global___Position = Position
+
+@typing_extensions.final
+class User(google.protobuf.message.Message):
+ """
+ Broadcast when a newly powered mesh node wants to find a node num it can use
+ Sent from the phone over bluetooth to set the user id for the owner of this node.
+ Also sent from nodes to each other when a new node signs on (so all clients can have this info)
+ The algorithm is as follows:
+ when a node starts up, it broadcasts their user and the normal flow is for all
+ other nodes to reply with their User as well (so the new node can build its nodedb)
+ If a node ever receives a User (not just the first broadcast) message where
+ the sender node number equals our node number, that indicates a collision has
+ occurred and the following steps should happen:
+ If the receiving node (that was already in the mesh)'s macaddr is LOWER than the
+ new User who just tried to sign in: it gets to keep its nodenum.
+ We send a broadcast message of OUR User (we use a broadcast so that the other node can
+ receive our message, considering we have the same id - it also serves to let
+ observers correct their nodedb) - this case is rare so it should be okay.
+ If any node receives a User where the macaddr is GTE than their local macaddr,
+ they have been vetoed and should pick a new random nodenum (filtering against
+ whatever it knows about the nodedb) and rebroadcast their User.
+ A few nodenums are reserved and will never be requested:
+ 0xff - broadcast
+ 0 through 3 - for future use
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ID_FIELD_NUMBER: builtins.int
+ LONG_NAME_FIELD_NUMBER: builtins.int
+ SHORT_NAME_FIELD_NUMBER: builtins.int
+ MACADDR_FIELD_NUMBER: builtins.int
+ HW_MODEL_FIELD_NUMBER: builtins.int
+ IS_LICENSED_FIELD_NUMBER: builtins.int
+ ROLE_FIELD_NUMBER: builtins.int
+ id: builtins.str
+ """
+ A globally unique ID string for this user.
+ In the case of Signal that would mean +16504442323, for the default macaddr derived id it would be !<8 hexidecimal bytes>.
+ Note: app developers are encouraged to also use the following standard
+ node IDs "^all" (for broadcast), "^local" (for the locally connected node)
+ """
+ long_name: builtins.str
+ """
+ A full name for this user, i.e. "Kevin Hester"
+ """
+ short_name: builtins.str
+ """
+ A VERY short name, ideally two characters.
+ Suitable for a tiny OLED screen
+ """
+ macaddr: builtins.bytes
+ """
+ Deprecated in Meshtastic 2.1.x
+ This is the addr of the radio.
+ Not populated by the phone, but added by the esp32 when broadcasting
+ """
+ hw_model: global___HardwareModel.ValueType
+ """
+ TBEAM, HELTEC, etc...
+ Starting in 1.2.11 moved to hw_model enum in the NodeInfo object.
+ Apps will still need the string here for older builds
+ (so OTA update can find the right image), but if the enum is available it will be used instead.
+ """
+ is_licensed: builtins.bool
+ """
+ In some regions Ham radio operators have different bandwidth limitations than others.
+ If this user is a licensed operator, set this flag.
+ Also, "long_name" should be their licence number.
+ """
+ role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType
+ """
+ Indicates that the user's role in the mesh
+ """
+ def __init__(
+ self,
+ *,
+ id: builtins.str = ...,
+ long_name: builtins.str = ...,
+ short_name: builtins.str = ...,
+ macaddr: builtins.bytes = ...,
+ hw_model: global___HardwareModel.ValueType = ...,
+ is_licensed: builtins.bool = ...,
+ role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["hw_model", b"hw_model", "id", b"id", "is_licensed", b"is_licensed", "long_name", b"long_name", "macaddr", b"macaddr", "role", b"role", "short_name", b"short_name"]) -> None: ...
+
+global___User = User
+
+@typing_extensions.final
+class RouteDiscovery(google.protobuf.message.Message):
+ """
+ A message used in our Dynamic Source Routing protocol (RFC 4728 based)
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ROUTE_FIELD_NUMBER: builtins.int
+ @property
+ def route(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]:
+ """
+ The list of nodenums this packet has visited so far
+ """
+ def __init__(
+ self,
+ *,
+ route: collections.abc.Iterable[builtins.int] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["route", b"route"]) -> None: ...
+
+global___RouteDiscovery = RouteDiscovery
+
+@typing_extensions.final
+class Routing(google.protobuf.message.Message):
+ """
+ A Routing control Data packet handled by the routing module
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _Error:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _ErrorEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Routing._Error.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ NONE: Routing._Error.ValueType # 0
+ """
+ This message is not a failure
+ """
+ NO_ROUTE: Routing._Error.ValueType # 1
+ """
+ Our node doesn't have a route to the requested destination anymore.
+ """
+ GOT_NAK: Routing._Error.ValueType # 2
+ """
+ We received a nak while trying to forward on your behalf
+ """
+ TIMEOUT: Routing._Error.ValueType # 3
+ """
+ TODO: REPLACE
+ """
+ NO_INTERFACE: Routing._Error.ValueType # 4
+ """
+ No suitable interface could be found for delivering this packet
+ """
+ MAX_RETRANSMIT: Routing._Error.ValueType # 5
+ """
+ We reached the max retransmission count (typically for naive flood routing)
+ """
+ NO_CHANNEL: Routing._Error.ValueType # 6
+ """
+ No suitable channel was found for sending this packet (i.e. was requested channel index disabled?)
+ """
+ TOO_LARGE: Routing._Error.ValueType # 7
+ """
+ The packet was too big for sending (exceeds interface MTU after encoding)
+ """
+ NO_RESPONSE: Routing._Error.ValueType # 8
+ """
+ The request had want_response set, the request reached the destination node, but no service on that node wants to send a response
+ (possibly due to bad channel permissions)
+ """
+ DUTY_CYCLE_LIMIT: Routing._Error.ValueType # 9
+ """
+ Cannot send currently because duty cycle regulations will be violated.
+ """
+ BAD_REQUEST: Routing._Error.ValueType # 32
+ """
+ The application layer service on the remote node received your request, but considered your request somehow invalid
+ """
+ NOT_AUTHORIZED: Routing._Error.ValueType # 33
+ """
+ The application layer service on the remote node received your request, but considered your request not authorized
+ (i.e you did not send the request on the required bound channel)
+ """
+
+ class Error(_Error, metaclass=_ErrorEnumTypeWrapper):
+ """
+ A failure in delivering a message (usually used for routing control messages, but might be provided in addition to ack.fail_id to provide
+ details on the type of failure).
+ """
+
+ NONE: Routing.Error.ValueType # 0
+ """
+ This message is not a failure
+ """
+ NO_ROUTE: Routing.Error.ValueType # 1
+ """
+ Our node doesn't have a route to the requested destination anymore.
+ """
+ GOT_NAK: Routing.Error.ValueType # 2
+ """
+ We received a nak while trying to forward on your behalf
+ """
+ TIMEOUT: Routing.Error.ValueType # 3
+ """
+ TODO: REPLACE
+ """
+ NO_INTERFACE: Routing.Error.ValueType # 4
+ """
+ No suitable interface could be found for delivering this packet
+ """
+ MAX_RETRANSMIT: Routing.Error.ValueType # 5
+ """
+ We reached the max retransmission count (typically for naive flood routing)
+ """
+ NO_CHANNEL: Routing.Error.ValueType # 6
+ """
+ No suitable channel was found for sending this packet (i.e. was requested channel index disabled?)
+ """
+ TOO_LARGE: Routing.Error.ValueType # 7
+ """
+ The packet was too big for sending (exceeds interface MTU after encoding)
+ """
+ NO_RESPONSE: Routing.Error.ValueType # 8
+ """
+ The request had want_response set, the request reached the destination node, but no service on that node wants to send a response
+ (possibly due to bad channel permissions)
+ """
+ DUTY_CYCLE_LIMIT: Routing.Error.ValueType # 9
+ """
+ Cannot send currently because duty cycle regulations will be violated.
+ """
+ BAD_REQUEST: Routing.Error.ValueType # 32
+ """
+ The application layer service on the remote node received your request, but considered your request somehow invalid
+ """
+ NOT_AUTHORIZED: Routing.Error.ValueType # 33
+ """
+ The application layer service on the remote node received your request, but considered your request not authorized
+ (i.e you did not send the request on the required bound channel)
+ """
+
+ ROUTE_REQUEST_FIELD_NUMBER: builtins.int
+ ROUTE_REPLY_FIELD_NUMBER: builtins.int
+ ERROR_REASON_FIELD_NUMBER: builtins.int
+ @property
+ def route_request(self) -> global___RouteDiscovery:
+ """
+ A route request going from the requester
+ """
+ @property
+ def route_reply(self) -> global___RouteDiscovery:
+ """
+ A route reply
+ """
+ error_reason: global___Routing.Error.ValueType
+ """
+ A failure in delivering a message (usually used for routing control messages, but might be provided
+ in addition to ack.fail_id to provide details on the type of failure).
+ """
+ def __init__(
+ self,
+ *,
+ route_request: global___RouteDiscovery | None = ...,
+ route_reply: global___RouteDiscovery | None = ...,
+ error_reason: global___Routing.Error.ValueType = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["error_reason", b"error_reason", "route_reply", b"route_reply", "route_request", b"route_request", "variant", b"variant"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["error_reason", b"error_reason", "route_reply", b"route_reply", "route_request", b"route_request", "variant", b"variant"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["variant", b"variant"]) -> typing_extensions.Literal["route_request", "route_reply", "error_reason"] | None: ...
+
+global___Routing = Routing
+
+@typing_extensions.final
+class Data(google.protobuf.message.Message):
+ """
+ (Formerly called SubPacket)
+ The payload portion fo a packet, this is the actual bytes that are sent
+ inside a radio packet (because from/to are broken out by the comms library)
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ PORTNUM_FIELD_NUMBER: builtins.int
+ PAYLOAD_FIELD_NUMBER: builtins.int
+ WANT_RESPONSE_FIELD_NUMBER: builtins.int
+ DEST_FIELD_NUMBER: builtins.int
+ SOURCE_FIELD_NUMBER: builtins.int
+ REQUEST_ID_FIELD_NUMBER: builtins.int
+ REPLY_ID_FIELD_NUMBER: builtins.int
+ EMOJI_FIELD_NUMBER: builtins.int
+ portnum: meshtastic.portnums_pb2.PortNum.ValueType
+ """
+ Formerly named typ and of type Type
+ """
+ payload: builtins.bytes
+ """
+ TODO: REPLACE
+ """
+ want_response: builtins.bool
+ """
+ Not normally used, but for testing a sender can request that recipient
+ responds in kind (i.e. if it received a position, it should unicast back it's position).
+ Note: that if you set this on a broadcast you will receive many replies.
+ """
+ dest: builtins.int
+ """
+ The address of the destination node.
+ This field is is filled in by the mesh radio device software, application
+ layer software should never need it.
+ RouteDiscovery messages _must_ populate this.
+ Other message types might need to if they are doing multihop routing.
+ """
+ source: builtins.int
+ """
+ The address of the original sender for this message.
+ This field should _only_ be populated for reliable multihop packets (to keep
+ packets small).
+ """
+ request_id: builtins.int
+ """
+ Only used in routing or response messages.
+ Indicates the original message ID that this message is reporting failure on. (formerly called original_id)
+ """
+ reply_id: builtins.int
+ """
+ If set, this message is intened to be a reply to a previously sent message with the defined id.
+ """
+ emoji: builtins.int
+ """
+ Defaults to false. If true, then what is in the payload should be treated as an emoji like giving
+ a message a heart or poop emoji.
+ """
+ def __init__(
+ self,
+ *,
+ portnum: meshtastic.portnums_pb2.PortNum.ValueType = ...,
+ payload: builtins.bytes = ...,
+ want_response: builtins.bool = ...,
+ dest: builtins.int = ...,
+ source: builtins.int = ...,
+ request_id: builtins.int = ...,
+ reply_id: builtins.int = ...,
+ emoji: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["dest", b"dest", "emoji", b"emoji", "payload", b"payload", "portnum", b"portnum", "reply_id", b"reply_id", "request_id", b"request_id", "source", b"source", "want_response", b"want_response"]) -> None: ...
+
+global___Data = Data
+
+@typing_extensions.final
+class Waypoint(google.protobuf.message.Message):
+ """
+ Waypoint message, used to share arbitrary locations across the mesh
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ID_FIELD_NUMBER: builtins.int
+ LATITUDE_I_FIELD_NUMBER: builtins.int
+ LONGITUDE_I_FIELD_NUMBER: builtins.int
+ EXPIRE_FIELD_NUMBER: builtins.int
+ LOCKED_TO_FIELD_NUMBER: builtins.int
+ NAME_FIELD_NUMBER: builtins.int
+ DESCRIPTION_FIELD_NUMBER: builtins.int
+ ICON_FIELD_NUMBER: builtins.int
+ id: builtins.int
+ """
+ Id of the waypoint
+ """
+ latitude_i: builtins.int
+ """
+ latitude_i
+ """
+ longitude_i: builtins.int
+ """
+ longitude_i
+ """
+ expire: builtins.int
+ """
+ Time the waypoint is to expire (epoch)
+ """
+ locked_to: builtins.int
+ """
+ If greater than zero, treat the value as a nodenum only allowing them to update the waypoint.
+ If zero, the waypoint is open to be edited by any member of the mesh.
+ """
+ name: builtins.str
+ """
+ Name of the waypoint - max 30 chars
+ """
+ description: builtins.str
+ """
+ Description of the waypoint - max 100 chars
+ """
+ icon: builtins.int
+ """
+ Designator icon for the waypoint in the form of a unicode emoji
+ """
+ def __init__(
+ self,
+ *,
+ id: builtins.int = ...,
+ latitude_i: builtins.int = ...,
+ longitude_i: builtins.int = ...,
+ expire: builtins.int = ...,
+ locked_to: builtins.int = ...,
+ name: builtins.str = ...,
+ description: builtins.str = ...,
+ icon: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["description", b"description", "expire", b"expire", "icon", b"icon", "id", b"id", "latitude_i", b"latitude_i", "locked_to", b"locked_to", "longitude_i", b"longitude_i", "name", b"name"]) -> None: ...
+
+global___Waypoint = Waypoint
+
+@typing_extensions.final
+class MqttClientProxyMessage(google.protobuf.message.Message):
+ """
+ This message will be proxied over the PhoneAPI for the client to deliver to the MQTT server
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ TOPIC_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ TEXT_FIELD_NUMBER: builtins.int
+ RETAINED_FIELD_NUMBER: builtins.int
+ topic: builtins.str
+ """
+ The MQTT topic this message will be sent /received on
+ """
+ data: builtins.bytes
+ """
+ Bytes
+ """
+ text: builtins.str
+ """
+ Text
+ """
+ retained: builtins.bool
+ """
+ Whether the message should be retained (or not)
+ """
+ def __init__(
+ self,
+ *,
+ topic: builtins.str = ...,
+ data: builtins.bytes = ...,
+ text: builtins.str = ...,
+ retained: builtins.bool = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["data", b"data", "payload_variant", b"payload_variant", "text", b"text"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "payload_variant", b"payload_variant", "retained", b"retained", "text", b"text", "topic", b"topic"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["data", "text"] | None: ...
+
+global___MqttClientProxyMessage = MqttClientProxyMessage
+
+@typing_extensions.final
+class MeshPacket(google.protobuf.message.Message):
+ """
+ A packet envelope sent/received over the mesh
+ only payload_variant is sent in the payload portion of the LORA packet.
+ The other fields are either not sent at all, or sent in the special 16 byte LORA header.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _Priority:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _PriorityEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[MeshPacket._Priority.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ UNSET: MeshPacket._Priority.ValueType # 0
+ """
+ Treated as Priority.DEFAULT
+ """
+ MIN: MeshPacket._Priority.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ BACKGROUND: MeshPacket._Priority.ValueType # 10
+ """
+ Background position updates are sent with very low priority -
+ if the link is super congested they might not go out at all
+ """
+ DEFAULT: MeshPacket._Priority.ValueType # 64
+ """
+ This priority is used for most messages that don't have a priority set
+ """
+ RELIABLE: MeshPacket._Priority.ValueType # 70
+ """
+ If priority is unset but the message is marked as want_ack,
+ assume it is important and use a slightly higher priority
+ """
+ ACK: MeshPacket._Priority.ValueType # 120
+ """
+ Ack/naks are sent with very high priority to ensure that retransmission
+ stops as soon as possible
+ """
+ MAX: MeshPacket._Priority.ValueType # 127
+ """
+ TODO: REPLACE
+ """
+
+ class Priority(_Priority, metaclass=_PriorityEnumTypeWrapper):
+ """
+ The priority of this message for sending.
+ Higher priorities are sent first (when managing the transmit queue).
+ This field is never sent over the air, it is only used internally inside of a local device node.
+ API clients (either on the local node or connected directly to the node)
+ can set this parameter if necessary.
+ (values must be <= 127 to keep protobuf field to one byte in size.
+ Detailed background on this field:
+ I noticed a funny side effect of lora being so slow: Usually when making
+ a protocol there isn’t much need to use message priority to change the order
+ of transmission (because interfaces are fairly fast).
+ But for lora where packets can take a few seconds each, it is very important
+ to make sure that critical packets are sent ASAP.
+ In the case of meshtastic that means we want to send protocol acks as soon as possible
+ (to prevent unneeded retransmissions), we want routing messages to be sent next,
+ then messages marked as reliable and finally 'background' packets like periodic position updates.
+ So I bit the bullet and implemented a new (internal - not sent over the air)
+ field in MeshPacket called 'priority'.
+ And the transmission queue in the router object is now a priority queue.
+ """
+
+ UNSET: MeshPacket.Priority.ValueType # 0
+ """
+ Treated as Priority.DEFAULT
+ """
+ MIN: MeshPacket.Priority.ValueType # 1
+ """
+ TODO: REPLACE
+ """
+ BACKGROUND: MeshPacket.Priority.ValueType # 10
+ """
+ Background position updates are sent with very low priority -
+ if the link is super congested they might not go out at all
+ """
+ DEFAULT: MeshPacket.Priority.ValueType # 64
+ """
+ This priority is used for most messages that don't have a priority set
+ """
+ RELIABLE: MeshPacket.Priority.ValueType # 70
+ """
+ If priority is unset but the message is marked as want_ack,
+ assume it is important and use a slightly higher priority
+ """
+ ACK: MeshPacket.Priority.ValueType # 120
+ """
+ Ack/naks are sent with very high priority to ensure that retransmission
+ stops as soon as possible
+ """
+ MAX: MeshPacket.Priority.ValueType # 127
+ """
+ TODO: REPLACE
+ """
+
+ class _Delayed:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _DelayedEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[MeshPacket._Delayed.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ NO_DELAY: MeshPacket._Delayed.ValueType # 0
+ """
+ If unset, the message is being sent in real time.
+ """
+ DELAYED_BROADCAST: MeshPacket._Delayed.ValueType # 1
+ """
+ The message is delayed and was originally a broadcast
+ """
+ DELAYED_DIRECT: MeshPacket._Delayed.ValueType # 2
+ """
+ The message is delayed and was originally a direct message
+ """
+
+ class Delayed(_Delayed, metaclass=_DelayedEnumTypeWrapper):
+ """
+ Identify if this is a delayed packet
+ """
+
+ NO_DELAY: MeshPacket.Delayed.ValueType # 0
+ """
+ If unset, the message is being sent in real time.
+ """
+ DELAYED_BROADCAST: MeshPacket.Delayed.ValueType # 1
+ """
+ The message is delayed and was originally a broadcast
+ """
+ DELAYED_DIRECT: MeshPacket.Delayed.ValueType # 2
+ """
+ The message is delayed and was originally a direct message
+ """
+
+ FROM_FIELD_NUMBER: builtins.int
+ TO_FIELD_NUMBER: builtins.int
+ CHANNEL_FIELD_NUMBER: builtins.int
+ DECODED_FIELD_NUMBER: builtins.int
+ ENCRYPTED_FIELD_NUMBER: builtins.int
+ ID_FIELD_NUMBER: builtins.int
+ RX_TIME_FIELD_NUMBER: builtins.int
+ RX_SNR_FIELD_NUMBER: builtins.int
+ HOP_LIMIT_FIELD_NUMBER: builtins.int
+ WANT_ACK_FIELD_NUMBER: builtins.int
+ PRIORITY_FIELD_NUMBER: builtins.int
+ RX_RSSI_FIELD_NUMBER: builtins.int
+ DELAYED_FIELD_NUMBER: builtins.int
+ VIA_MQTT_FIELD_NUMBER: builtins.int
+ HOP_START_FIELD_NUMBER: builtins.int
+ to: builtins.int
+ """
+ The (immediate) destination for this packet
+ """
+ channel: builtins.int
+ """
+ (Usually) If set, this indicates the index in the secondary_channels table that this packet was sent/received on.
+ If unset, packet was on the primary channel.
+ A particular node might know only a subset of channels in use on the mesh.
+ Therefore channel_index is inherently a local concept and meaningless to send between nodes.
+ Very briefly, while sending and receiving deep inside the device Router code, this field instead
+ contains the 'channel hash' instead of the index.
+ This 'trick' is only used while the payload_variant is an 'encrypted'.
+ """
+ @property
+ def decoded(self) -> global___Data:
+ """
+ TODO: REPLACE
+ """
+ encrypted: builtins.bytes
+ """
+ TODO: REPLACE
+ """
+ id: builtins.int
+ """
+ A unique ID for this packet.
+ Always 0 for no-ack packets or non broadcast packets (and therefore take zero bytes of space).
+ Otherwise a unique ID for this packet, useful for flooding algorithms.
+ ID only needs to be unique on a _per sender_ basis, and it only
+ needs to be unique for a few minutes (long enough to last for the length of
+ any ACK or the completion of a mesh broadcast flood).
+ Note: Our crypto implementation uses this id as well.
+ See [crypto](/docs/overview/encryption) for details.
+ """
+ rx_time: builtins.int
+ """
+ The time this message was received by the esp32 (secs since 1970).
+ Note: this field is _never_ sent on the radio link itself (to save space) Times
+ are typically not sent over the mesh, but they will be added to any Packet
+ (chain of SubPacket) sent to the phone (so the phone can know exact time of reception)
+ """
+ rx_snr: builtins.float
+ """
+ *Never* sent over the radio links.
+ Set during reception to indicate the SNR of this packet.
+ Used to collect statistics on current link quality.
+ """
+ hop_limit: builtins.int
+ """
+ If unset treated as zero (no forwarding, send to adjacent nodes only)
+ if 1, allow hopping through one node, etc...
+ For our usecase real world topologies probably have a max of about 3.
+ This field is normally placed into a few of bits in the header.
+ """
+ want_ack: builtins.bool
+ """
+ This packet is being sent as a reliable message, we would prefer it to arrive at the destination.
+ We would like to receive a ack packet in response.
+ Broadcasts messages treat this flag specially: Since acks for broadcasts would
+ rapidly flood the channel, the normal ack behavior is suppressed.
+ Instead, the original sender listens to see if at least one node is rebroadcasting this packet (because naive flooding algorithm).
+ If it hears that the odds (given typical LoRa topologies) the odds are very high that every node should eventually receive the message.
+ So FloodingRouter.cpp generates an implicit ack which is delivered to the original sender.
+ If after some time we don't hear anyone rebroadcast our packet, we will timeout and retransmit, using the regular resend logic.
+ Note: This flag is normally sent in a flag bit in the header when sent over the wire
+ """
+ priority: global___MeshPacket.Priority.ValueType
+ """
+ The priority of this message for sending.
+ See MeshPacket.Priority description for more details.
+ """
+ rx_rssi: builtins.int
+ """
+ rssi of received packet. Only sent to phone for dispay purposes.
+ """
+ delayed: global___MeshPacket.Delayed.ValueType
+ """
+ Describe if this message is delayed
+ """
+ via_mqtt: builtins.bool
+ """
+ Describes whether this packet passed via MQTT somewhere along the path it currently took.
+ """
+ hop_start: builtins.int
+ """
+ Hop limit with which the original packet started. Sent via LoRa using three bits in the unencrypted header.
+ When receiving a packet, the difference between hop_start and hop_limit gives how many hops it traveled.
+ """
+ def __init__(
+ self,
+ *,
+ to: builtins.int = ...,
+ channel: builtins.int = ...,
+ decoded: global___Data | None = ...,
+ encrypted: builtins.bytes = ...,
+ id: builtins.int = ...,
+ rx_time: builtins.int = ...,
+ rx_snr: builtins.float = ...,
+ hop_limit: builtins.int = ...,
+ want_ack: builtins.bool = ...,
+ priority: global___MeshPacket.Priority.ValueType = ...,
+ rx_rssi: builtins.int = ...,
+ delayed: global___MeshPacket.Delayed.ValueType = ...,
+ via_mqtt: builtins.bool = ...,
+ hop_start: builtins.int = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["decoded", b"decoded", "encrypted", b"encrypted", "payload_variant", b"payload_variant"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["channel", b"channel", "decoded", b"decoded", "delayed", b"delayed", "encrypted", b"encrypted", "from", b"from", "hop_limit", b"hop_limit", "hop_start", b"hop_start", "id", b"id", "payload_variant", b"payload_variant", "priority", b"priority", "rx_rssi", b"rx_rssi", "rx_snr", b"rx_snr", "rx_time", b"rx_time", "to", b"to", "via_mqtt", b"via_mqtt", "want_ack", b"want_ack"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["decoded", "encrypted"] | None: ...
+
+global___MeshPacket = MeshPacket
+
+@typing_extensions.final
+class NodeInfo(google.protobuf.message.Message):
+ """
+ The bluetooth to device link:
+ Old BTLE protocol docs from TODO, merge in above and make real docs...
+ use protocol buffers, and NanoPB
+ messages from device to phone:
+ POSITION_UPDATE (..., time)
+ TEXT_RECEIVED(from, text, time)
+ OPAQUE_RECEIVED(from, payload, time) (for signal messages or other applications)
+ messages from phone to device:
+ SET_MYID(id, human readable long, human readable short) (send down the unique ID
+ string used for this node, a human readable string shown for that id, and a very
+ short human readable string suitable for oled screen) SEND_OPAQUE(dest, payload)
+ (for signal messages or other applications) SEND_TEXT(dest, text) Get all
+ nodes() (returns list of nodes, with full info, last time seen, loc, battery
+ level etc) SET_CONFIG (switches device to a new set of radio params and
+ preshared key, drops all existing nodes, force our node to rejoin this new group)
+ Full information about a node on the mesh
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NUM_FIELD_NUMBER: builtins.int
+ USER_FIELD_NUMBER: builtins.int
+ POSITION_FIELD_NUMBER: builtins.int
+ SNR_FIELD_NUMBER: builtins.int
+ LAST_HEARD_FIELD_NUMBER: builtins.int
+ DEVICE_METRICS_FIELD_NUMBER: builtins.int
+ CHANNEL_FIELD_NUMBER: builtins.int
+ VIA_MQTT_FIELD_NUMBER: builtins.int
+ HOPS_AWAY_FIELD_NUMBER: builtins.int
+ IS_FAVORITE_FIELD_NUMBER: builtins.int
+ num: builtins.int
+ """
+ The node number
+ """
+ @property
+ def user(self) -> global___User:
+ """
+ The user info for this node
+ """
+ @property
+ def position(self) -> global___Position:
+ """
+ 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.
+ """
+ snr: builtins.float
+ """
+ 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
+ """
+ last_heard: builtins.int
+ """
+ TODO: REMOVE/INTEGRATE
+ Not currently used (till full DSR deployment?) Our current preferred node node for routing - might be the same as num if
+ we are adjacent Or zero if we don't yet know a route to this node.
+ fixed32 next_hop = 5;
+
+
+ Set to indicate the last time we received a packet from this node
+ """
+ @property
+ def device_metrics(self) -> meshtastic.telemetry_pb2.DeviceMetrics:
+ """
+ The latest device metrics for the node.
+ """
+ channel: builtins.int
+ """
+ local channel index we heard that node on. Only populated if its not the default channel.
+ """
+ via_mqtt: builtins.bool
+ """
+ True if we witnessed the node over MQTT instead of LoRA transport
+ """
+ hops_away: builtins.int
+ """
+ Number of hops away from us this node is (0 if adjacent)
+ """
+ is_favorite: builtins.bool
+ """
+ True if node is in our favorites list
+ Persists between NodeDB internal clean ups
+ """
+ def __init__(
+ self,
+ *,
+ num: builtins.int = ...,
+ user: global___User | None = ...,
+ position: global___Position | None = ...,
+ snr: builtins.float = ...,
+ last_heard: builtins.int = ...,
+ device_metrics: meshtastic.telemetry_pb2.DeviceMetrics | None = ...,
+ channel: builtins.int = ...,
+ via_mqtt: builtins.bool = ...,
+ hops_away: builtins.int = ...,
+ is_favorite: builtins.bool = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["device_metrics", b"device_metrics", "position", b"position", "user", b"user"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["channel", b"channel", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "is_favorite", b"is_favorite", "last_heard", b"last_heard", "num", b"num", "position", b"position", "snr", b"snr", "user", b"user", "via_mqtt", b"via_mqtt"]) -> None: ...
+
+global___NodeInfo = NodeInfo
+
+@typing_extensions.final
+class MyNodeInfo(google.protobuf.message.Message):
+ """
+ Unique local debugging info for this node
+ Note: we don't include position or the user info, because that will come in the
+ Sent to the phone in response to WantNodes.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ MY_NODE_NUM_FIELD_NUMBER: builtins.int
+ REBOOT_COUNT_FIELD_NUMBER: builtins.int
+ MIN_APP_VERSION_FIELD_NUMBER: builtins.int
+ my_node_num: builtins.int
+ """
+ Tells the phone what our node number is, default starting value is
+ lowbyte of macaddr, but it will be fixed if that is already in use
+ """
+ reboot_count: builtins.int
+ """
+ The total number of reboots this node has ever encountered
+ (well - since the last time we discarded preferences)
+ """
+ min_app_version: builtins.int
+ """
+ The minimum app version that can talk to this device.
+ Phone/PC apps should compare this to their build number and if too low tell the user they must update their app
+ """
+ def __init__(
+ self,
+ *,
+ my_node_num: builtins.int = ...,
+ reboot_count: builtins.int = ...,
+ min_app_version: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["min_app_version", b"min_app_version", "my_node_num", b"my_node_num", "reboot_count", b"reboot_count"]) -> None: ...
+
+global___MyNodeInfo = MyNodeInfo
+
+@typing_extensions.final
+class LogRecord(google.protobuf.message.Message):
+ """
+ Debug output from the device.
+ To minimize the size of records inside the device code, if a time/source/level is not set
+ on the message it is assumed to be a continuation of the previously sent message.
+ This allows the device code to use fixed maxlen 64 byte strings for messages,
+ and then extend as needed by emitting multiple records.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _Level:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _LevelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[LogRecord._Level.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ UNSET: LogRecord._Level.ValueType # 0
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ CRITICAL: LogRecord._Level.ValueType # 50
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ ERROR: LogRecord._Level.ValueType # 40
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ WARNING: LogRecord._Level.ValueType # 30
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ INFO: LogRecord._Level.ValueType # 20
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ DEBUG: LogRecord._Level.ValueType # 10
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ TRACE: LogRecord._Level.ValueType # 5
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+
+ class Level(_Level, metaclass=_LevelEnumTypeWrapper):
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+
+ UNSET: LogRecord.Level.ValueType # 0
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ CRITICAL: LogRecord.Level.ValueType # 50
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ ERROR: LogRecord.Level.ValueType # 40
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ WARNING: LogRecord.Level.ValueType # 30
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ INFO: LogRecord.Level.ValueType # 20
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ DEBUG: LogRecord.Level.ValueType # 10
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ TRACE: LogRecord.Level.ValueType # 5
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+
+ MESSAGE_FIELD_NUMBER: builtins.int
+ TIME_FIELD_NUMBER: builtins.int
+ SOURCE_FIELD_NUMBER: builtins.int
+ LEVEL_FIELD_NUMBER: builtins.int
+ message: builtins.str
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ time: builtins.int
+ """
+ Seconds since 1970 - or 0 for unknown/unset
+ """
+ source: builtins.str
+ """
+ Usually based on thread name - if known
+ """
+ level: global___LogRecord.Level.ValueType
+ """
+ Not yet set
+ """
+ def __init__(
+ self,
+ *,
+ message: builtins.str = ...,
+ time: builtins.int = ...,
+ source: builtins.str = ...,
+ level: global___LogRecord.Level.ValueType = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["level", b"level", "message", b"message", "source", b"source", "time", b"time"]) -> None: ...
+
+global___LogRecord = LogRecord
+
+@typing_extensions.final
+class QueueStatus(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ RES_FIELD_NUMBER: builtins.int
+ FREE_FIELD_NUMBER: builtins.int
+ MAXLEN_FIELD_NUMBER: builtins.int
+ MESH_PACKET_ID_FIELD_NUMBER: builtins.int
+ res: builtins.int
+ """Last attempt to queue status, ErrorCode"""
+ free: builtins.int
+ """Free entries in the outgoing queue"""
+ maxlen: builtins.int
+ """Maximum entries in the outgoing queue"""
+ mesh_packet_id: builtins.int
+ """What was mesh packet id that generated this response?"""
+ def __init__(
+ self,
+ *,
+ res: builtins.int = ...,
+ free: builtins.int = ...,
+ maxlen: builtins.int = ...,
+ mesh_packet_id: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["free", b"free", "maxlen", b"maxlen", "mesh_packet_id", b"mesh_packet_id", "res", b"res"]) -> None: ...
+
+global___QueueStatus = QueueStatus
+
+@typing_extensions.final
+class FromRadio(google.protobuf.message.Message):
+ """
+ Packets from the radio to the phone will appear on the fromRadio characteristic.
+ It will support READ and NOTIFY. When a new packet arrives the device will BLE notify?
+ It will sit in that descriptor until consumed by the phone,
+ at which point the next item in the FIFO will be populated.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ID_FIELD_NUMBER: builtins.int
+ PACKET_FIELD_NUMBER: builtins.int
+ MY_INFO_FIELD_NUMBER: builtins.int
+ NODE_INFO_FIELD_NUMBER: builtins.int
+ CONFIG_FIELD_NUMBER: builtins.int
+ LOG_RECORD_FIELD_NUMBER: builtins.int
+ CONFIG_COMPLETE_ID_FIELD_NUMBER: builtins.int
+ REBOOTED_FIELD_NUMBER: builtins.int
+ MODULECONFIG_FIELD_NUMBER: builtins.int
+ CHANNEL_FIELD_NUMBER: builtins.int
+ QUEUESTATUS_FIELD_NUMBER: builtins.int
+ XMODEMPACKET_FIELD_NUMBER: builtins.int
+ METADATA_FIELD_NUMBER: builtins.int
+ MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER: builtins.int
+ id: builtins.int
+ """
+ The packet id, used to allow the phone to request missing read packets from the FIFO,
+ see our bluetooth docs
+ """
+ @property
+ def packet(self) -> global___MeshPacket:
+ """
+ Log levels, chosen to match python logging conventions.
+ """
+ @property
+ def my_info(self) -> global___MyNodeInfo:
+ """
+ Tells the phone what our node number is, can be -1 if we've not yet joined a mesh.
+ NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps.
+ """
+ @property
+ def node_info(self) -> global___NodeInfo:
+ """
+ One packet is sent for each node in the on radio DB
+ starts over with the first node in our DB
+ """
+ @property
+ def config(self) -> meshtastic.config_pb2.Config:
+ """
+ Include a part of the config (was: RadioConfig radio)
+ """
+ @property
+ def log_record(self) -> global___LogRecord:
+ """
+ Set to send debug console output over our protobuf stream
+ """
+ config_complete_id: builtins.int
+ """
+ Sent as true once the device has finished sending all of the responses to want_config
+ recipient should check if this ID matches our original request nonce, if
+ not, it means your config responses haven't started yet.
+ NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps.
+ """
+ rebooted: builtins.bool
+ """
+ Sent to tell clients the radio has just rebooted.
+ Set to true if present.
+ Not used on all transports, currently just used for the serial console.
+ NOTE: This ID must not change - to keep (minimal) compatibility with <1.2 version of android apps.
+ """
+ @property
+ def moduleConfig(self) -> meshtastic.module_config_pb2.ModuleConfig:
+ """
+ Include module config
+ """
+ @property
+ def channel(self) -> meshtastic.channel_pb2.Channel:
+ """
+ One packet is sent for each channel
+ """
+ @property
+ def queueStatus(self) -> global___QueueStatus:
+ """
+ Queue status info
+ """
+ @property
+ def xmodemPacket(self) -> meshtastic.xmodem_pb2.XModem:
+ """
+ File Transfer Chunk
+ """
+ @property
+ def metadata(self) -> global___DeviceMetadata:
+ """
+ Device metadata message
+ """
+ @property
+ def mqttClientProxyMessage(self) -> global___MqttClientProxyMessage:
+ """
+ MQTT Client Proxy Message (device sending to client / phone for publishing to MQTT)
+ """
+ def __init__(
+ self,
+ *,
+ id: builtins.int = ...,
+ packet: global___MeshPacket | None = ...,
+ my_info: global___MyNodeInfo | None = ...,
+ node_info: global___NodeInfo | None = ...,
+ config: meshtastic.config_pb2.Config | None = ...,
+ log_record: global___LogRecord | None = ...,
+ config_complete_id: builtins.int = ...,
+ rebooted: builtins.bool = ...,
+ moduleConfig: meshtastic.module_config_pb2.ModuleConfig | None = ...,
+ channel: meshtastic.channel_pb2.Channel | None = ...,
+ queueStatus: global___QueueStatus | None = ...,
+ xmodemPacket: meshtastic.xmodem_pb2.XModem | None = ...,
+ metadata: global___DeviceMetadata | None = ...,
+ mqttClientProxyMessage: global___MqttClientProxyMessage | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["channel", b"channel", "config", b"config", "config_complete_id", b"config_complete_id", "log_record", b"log_record", "metadata", b"metadata", "moduleConfig", b"moduleConfig", "mqttClientProxyMessage", b"mqttClientProxyMessage", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queueStatus", b"queueStatus", "rebooted", b"rebooted", "xmodemPacket", b"xmodemPacket"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["channel", b"channel", "config", b"config", "config_complete_id", b"config_complete_id", "id", b"id", "log_record", b"log_record", "metadata", b"metadata", "moduleConfig", b"moduleConfig", "mqttClientProxyMessage", b"mqttClientProxyMessage", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queueStatus", b"queueStatus", "rebooted", b"rebooted", "xmodemPacket", b"xmodemPacket"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["packet", "my_info", "node_info", "config", "log_record", "config_complete_id", "rebooted", "moduleConfig", "channel", "queueStatus", "xmodemPacket", "metadata", "mqttClientProxyMessage"] | None: ...
+
+global___FromRadio = FromRadio
+
+@typing_extensions.final
+class ToRadio(google.protobuf.message.Message):
+ """
+ Packets/commands to the radio will be written (reliably) to the toRadio characteristic.
+ Once the write completes the phone can assume it is handled.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ PACKET_FIELD_NUMBER: builtins.int
+ WANT_CONFIG_ID_FIELD_NUMBER: builtins.int
+ DISCONNECT_FIELD_NUMBER: builtins.int
+ XMODEMPACKET_FIELD_NUMBER: builtins.int
+ MQTTCLIENTPROXYMESSAGE_FIELD_NUMBER: builtins.int
+ HEARTBEAT_FIELD_NUMBER: builtins.int
+ @property
+ def packet(self) -> global___MeshPacket:
+ """
+ Send this packet on the mesh
+ """
+ want_config_id: builtins.int
+ """
+ Phone wants radio to send full node db to the phone, This is
+ typically the first packet sent to the radio when the phone gets a
+ bluetooth connection. The radio will respond by sending back a
+ MyNodeInfo, a owner, a radio config and a series of
+ FromRadio.node_infos, and config_complete
+ the integer you write into this field will be reported back in the
+ config_complete_id response this allows clients to never be confused by
+ a stale old partially sent config.
+ """
+ disconnect: builtins.bool
+ """
+ Tell API server we are disconnecting now.
+ This is useful for serial links where there is no hardware/protocol based notification that the client has dropped the link.
+ (Sending this message is optional for clients)
+ """
+ @property
+ def xmodemPacket(self) -> meshtastic.xmodem_pb2.XModem:
+ """
+ File Transfer Chunk
+ """
+ @property
+ def mqttClientProxyMessage(self) -> global___MqttClientProxyMessage:
+ """
+ MQTT Client Proxy Message (for client / phone subscribed to MQTT sending to device)
+ """
+ @property
+ def heartbeat(self) -> global___Heartbeat:
+ """
+ Heartbeat message (used to keep the device connection awake on serial)
+ """
+ def __init__(
+ self,
+ *,
+ packet: global___MeshPacket | None = ...,
+ want_config_id: builtins.int = ...,
+ disconnect: builtins.bool = ...,
+ xmodemPacket: meshtastic.xmodem_pb2.XModem | None = ...,
+ mqttClientProxyMessage: global___MqttClientProxyMessage | None = ...,
+ heartbeat: global___Heartbeat | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["disconnect", b"disconnect", "heartbeat", b"heartbeat", "mqttClientProxyMessage", b"mqttClientProxyMessage", "packet", b"packet", "payload_variant", b"payload_variant", "want_config_id", b"want_config_id", "xmodemPacket", b"xmodemPacket"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["disconnect", b"disconnect", "heartbeat", b"heartbeat", "mqttClientProxyMessage", b"mqttClientProxyMessage", "packet", b"packet", "payload_variant", b"payload_variant", "want_config_id", b"want_config_id", "xmodemPacket", b"xmodemPacket"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["packet", "want_config_id", "disconnect", "xmodemPacket", "mqttClientProxyMessage", "heartbeat"] | None: ...
+
+global___ToRadio = ToRadio
+
+@typing_extensions.final
+class Compressed(google.protobuf.message.Message):
+ """
+ Compressed message payload
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ PORTNUM_FIELD_NUMBER: builtins.int
+ DATA_FIELD_NUMBER: builtins.int
+ portnum: meshtastic.portnums_pb2.PortNum.ValueType
+ """
+ PortNum to determine the how to handle the compressed payload.
+ """
+ data: builtins.bytes
+ """
+ Compressed data.
+ """
+ def __init__(
+ self,
+ *,
+ portnum: meshtastic.portnums_pb2.PortNum.ValueType = ...,
+ data: builtins.bytes = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["data", b"data", "portnum", b"portnum"]) -> None: ...
+
+global___Compressed = Compressed
+
+@typing_extensions.final
+class NeighborInfo(google.protobuf.message.Message):
+ """
+ Full info on edges for a single node
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NODE_ID_FIELD_NUMBER: builtins.int
+ LAST_SENT_BY_ID_FIELD_NUMBER: builtins.int
+ NODE_BROADCAST_INTERVAL_SECS_FIELD_NUMBER: builtins.int
+ NEIGHBORS_FIELD_NUMBER: builtins.int
+ node_id: builtins.int
+ """
+ The node ID of the node sending info on its neighbors
+ """
+ last_sent_by_id: builtins.int
+ """
+ Field to pass neighbor info for the next sending cycle
+ """
+ node_broadcast_interval_secs: builtins.int
+ """
+ Broadcast interval of the represented node (in seconds)
+ """
+ @property
+ def neighbors(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Neighbor]:
+ """
+ The list of out edges from this node
+ """
+ def __init__(
+ self,
+ *,
+ node_id: builtins.int = ...,
+ last_sent_by_id: builtins.int = ...,
+ node_broadcast_interval_secs: builtins.int = ...,
+ neighbors: collections.abc.Iterable[global___Neighbor] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["last_sent_by_id", b"last_sent_by_id", "neighbors", b"neighbors", "node_broadcast_interval_secs", b"node_broadcast_interval_secs", "node_id", b"node_id"]) -> None: ...
+
+global___NeighborInfo = NeighborInfo
+
+@typing_extensions.final
+class Neighbor(google.protobuf.message.Message):
+ """
+ A single edge in the mesh
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NODE_ID_FIELD_NUMBER: builtins.int
+ SNR_FIELD_NUMBER: builtins.int
+ LAST_RX_TIME_FIELD_NUMBER: builtins.int
+ NODE_BROADCAST_INTERVAL_SECS_FIELD_NUMBER: builtins.int
+ node_id: builtins.int
+ """
+ Node ID of neighbor
+ """
+ snr: builtins.float
+ """
+ SNR of last heard message
+ """
+ last_rx_time: builtins.int
+ """
+ Reception time (in secs since 1970) of last message that was last sent by this ID.
+ Note: this is for local storage only and will not be sent out over the mesh.
+ """
+ node_broadcast_interval_secs: builtins.int
+ """
+ Broadcast interval of this neighbor (in seconds).
+ Note: this is for local storage only and will not be sent out over the mesh.
+ """
+ def __init__(
+ self,
+ *,
+ node_id: builtins.int = ...,
+ snr: builtins.float = ...,
+ last_rx_time: builtins.int = ...,
+ node_broadcast_interval_secs: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["last_rx_time", b"last_rx_time", "node_broadcast_interval_secs", b"node_broadcast_interval_secs", "node_id", b"node_id", "snr", b"snr"]) -> None: ...
+
+global___Neighbor = Neighbor
+
+@typing_extensions.final
+class DeviceMetadata(google.protobuf.message.Message):
+ """
+ Device metadata response
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ FIRMWARE_VERSION_FIELD_NUMBER: builtins.int
+ DEVICE_STATE_VERSION_FIELD_NUMBER: builtins.int
+ CANSHUTDOWN_FIELD_NUMBER: builtins.int
+ HASWIFI_FIELD_NUMBER: builtins.int
+ HASBLUETOOTH_FIELD_NUMBER: builtins.int
+ HASETHERNET_FIELD_NUMBER: builtins.int
+ ROLE_FIELD_NUMBER: builtins.int
+ POSITION_FLAGS_FIELD_NUMBER: builtins.int
+ HW_MODEL_FIELD_NUMBER: builtins.int
+ HASREMOTEHARDWARE_FIELD_NUMBER: builtins.int
+ firmware_version: builtins.str
+ """
+ Device firmware version string
+ """
+ device_state_version: builtins.int
+ """
+ Device state version
+ """
+ canShutdown: builtins.bool
+ """
+ Indicates whether the device can shutdown CPU natively or via power management chip
+ """
+ hasWifi: builtins.bool
+ """
+ Indicates that the device has native wifi capability
+ """
+ hasBluetooth: builtins.bool
+ """
+ Indicates that the device has native bluetooth capability
+ """
+ hasEthernet: builtins.bool
+ """
+ Indicates that the device has an ethernet peripheral
+ """
+ role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType
+ """
+ Indicates that the device's role in the mesh
+ """
+ position_flags: builtins.int
+ """
+ Indicates the device's current enabled position flags
+ """
+ hw_model: global___HardwareModel.ValueType
+ """
+ Device hardware model
+ """
+ hasRemoteHardware: builtins.bool
+ """
+ Has Remote Hardware enabled
+ """
+ def __init__(
+ self,
+ *,
+ firmware_version: builtins.str = ...,
+ device_state_version: builtins.int = ...,
+ canShutdown: builtins.bool = ...,
+ hasWifi: builtins.bool = ...,
+ hasBluetooth: builtins.bool = ...,
+ hasEthernet: builtins.bool = ...,
+ role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType = ...,
+ position_flags: builtins.int = ...,
+ hw_model: global___HardwareModel.ValueType = ...,
+ hasRemoteHardware: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["canShutdown", b"canShutdown", "device_state_version", b"device_state_version", "firmware_version", b"firmware_version", "hasBluetooth", b"hasBluetooth", "hasEthernet", b"hasEthernet", "hasRemoteHardware", b"hasRemoteHardware", "hasWifi", b"hasWifi", "hw_model", b"hw_model", "position_flags", b"position_flags", "role", b"role"]) -> None: ...
+
+global___DeviceMetadata = DeviceMetadata
+
+@typing_extensions.final
+class Heartbeat(google.protobuf.message.Message):
+ """
+ A heartbeat message is sent to the node from the client to keep the connection alive.
+ This is currently only needed to keep serial connections alive, but can be used by any PhoneAPI.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ def __init__(
+ self,
+ ) -> None: ...
+
+global___Heartbeat = Heartbeat
+
+@typing_extensions.final
+class NodeRemoteHardwarePin(google.protobuf.message.Message):
+ """
+ RemoteHardwarePins associated with a node
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ NODE_NUM_FIELD_NUMBER: builtins.int
+ PIN_FIELD_NUMBER: builtins.int
+ node_num: builtins.int
+ """
+ The node_num exposing the available gpio pin
+ """
+ @property
+ def pin(self) -> meshtastic.module_config_pb2.RemoteHardwarePin:
+ """
+ The the available gpio pin for usage with RemoteHardware module
+ """
+ def __init__(
+ self,
+ *,
+ node_num: builtins.int = ...,
+ pin: meshtastic.module_config_pb2.RemoteHardwarePin | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["pin", b"pin"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["node_num", b"node_num", "pin", b"pin"]) -> None: ...
+
+global___NodeRemoteHardwarePin = NodeRemoteHardwarePin
diff --git a/meshtastic/module_config_pb2.py b/meshtastic/module_config_pb2.py
index da42ac73..524b6532 100644
--- a/meshtastic/module_config_pb2.py
+++ b/meshtastic/module_config_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/module_config.proto\"\xbc \n\x0cModuleConfig\x12(\n\x04mqtt\x18\x01 \x01(\x0b\x32\x18.ModuleConfig.MQTTConfigH\x00\x12,\n\x06serial\x18\x02 \x01(\x0b\x32\x1a.ModuleConfig.SerialConfigH\x00\x12I\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32(.ModuleConfig.ExternalNotificationConfigH\x00\x12\x39\n\rstore_forward\x18\x04 \x01(\x0b\x32 .ModuleConfig.StoreForwardConfigH\x00\x12\x33\n\nrange_test\x18\x05 \x01(\x0b\x32\x1d.ModuleConfig.RangeTestConfigH\x00\x12\x32\n\ttelemetry\x18\x06 \x01(\x0b\x32\x1d.ModuleConfig.TelemetryConfigH\x00\x12;\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32!.ModuleConfig.CannedMessageConfigH\x00\x12*\n\x05\x61udio\x18\x08 \x01(\x0b\x32\x19.ModuleConfig.AudioConfigH\x00\x12=\n\x0fremote_hardware\x18\t \x01(\x0b\x32\".ModuleConfig.RemoteHardwareConfigH\x00\x12\x39\n\rneighbor_info\x18\n \x01(\x0b\x32 .ModuleConfig.NeighborInfoConfigH\x00\x12?\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32#.ModuleConfig.AmbientLightingConfigH\x00\x12?\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32#.ModuleConfig.DetectionSensorConfigH\x00\x12\x34\n\npaxcounter\x18\r \x01(\x0b\x32\x1e.ModuleConfig.PaxcounterConfigH\x00\x1a\xa5\x02\n\nMQTTConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x10\n\x08password\x18\x04 \x01(\t\x12\x1a\n\x12\x65ncryption_enabled\x18\x05 \x01(\x08\x12\x14\n\x0cjson_enabled\x18\x06 \x01(\x08\x12\x13\n\x0btls_enabled\x18\x07 \x01(\x08\x12\x0c\n\x04root\x18\x08 \x01(\t\x12\x1f\n\x17proxy_to_client_enabled\x18\t \x01(\x08\x12\x1d\n\x15map_reporting_enabled\x18\n \x01(\x08\x12<\n\x13map_report_settings\x18\x0b \x01(\x0b\x32\x1f.ModuleConfig.MapReportSettings\x1aN\n\x11MapReportSettings\x12\x1d\n\x15publish_interval_secs\x18\x01 \x01(\r\x12\x1a\n\x12position_precision\x18\x02 \x01(\r\x1aw\n\x14RemoteHardwareConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1a\x61llow_undefined_pin_access\x18\x02 \x01(\x08\x12*\n\x0e\x61vailable_pins\x18\x03 \x03(\x0b\x32\x12.RemoteHardwarePin\x1a>\n\x12NeighborInfoConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x17\n\x0fupdate_interval\x18\x02 \x01(\r\x1a\xd2\x01\n\x15\x44\x65tectionSensorConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1e\n\x16minimum_broadcast_secs\x18\x02 \x01(\r\x12\x1c\n\x14state_broadcast_secs\x18\x03 \x01(\r\x12\x11\n\tsend_bell\x18\x04 \x01(\x08\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x13\n\x0bmonitor_pin\x18\x06 \x01(\r\x12 \n\x18\x64\x65tection_triggered_high\x18\x07 \x01(\x08\x12\x12\n\nuse_pullup\x18\x08 \x01(\x08\x1a\xd9\x02\n\x0b\x41udioConfig\x12\x16\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x12\x0f\n\x07ptt_pin\x18\x02 \x01(\r\x12\x35\n\x07\x62itrate\x18\x03 \x01(\x0e\x32$.ModuleConfig.AudioConfig.Audio_Baud\x12\x0e\n\x06i2s_ws\x18\x04 \x01(\r\x12\x0e\n\x06i2s_sd\x18\x05 \x01(\r\x12\x0f\n\x07i2s_din\x18\x06 \x01(\r\x12\x0f\n\x07i2s_sck\x18\x07 \x01(\r\"\xa7\x01\n\nAudio_Baud\x12\x12\n\x0e\x43ODEC2_DEFAULT\x10\x00\x12\x0f\n\x0b\x43ODEC2_3200\x10\x01\x12\x0f\n\x0b\x43ODEC2_2400\x10\x02\x12\x0f\n\x0b\x43ODEC2_1600\x10\x03\x12\x0f\n\x0b\x43ODEC2_1400\x10\x04\x12\x0f\n\x0b\x43ODEC2_1300\x10\x05\x12\x0f\n\x0b\x43ODEC2_1200\x10\x06\x12\x0e\n\nCODEC2_700\x10\x07\x12\x0f\n\x0b\x43ODEC2_700B\x10\x08\x1aG\n\x10PaxcounterConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1apaxcounter_update_interval\x18\x02 \x01(\r\x1a\xce\x04\n\x0cSerialConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0c\n\x04\x65\x63ho\x18\x02 \x01(\x08\x12\x0b\n\x03rxd\x18\x03 \x01(\r\x12\x0b\n\x03txd\x18\x04 \x01(\r\x12\x34\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32&.ModuleConfig.SerialConfig.Serial_Baud\x12\x0f\n\x07timeout\x18\x06 \x01(\r\x12\x34\n\x04mode\x18\x07 \x01(\x0e\x32&.ModuleConfig.SerialConfig.Serial_Mode\x12$\n\x1coverride_console_serial_port\x18\x08 \x01(\x08\"\x8a\x02\n\x0bSerial_Baud\x12\x10\n\x0c\x42\x41UD_DEFAULT\x10\x00\x12\x0c\n\x08\x42\x41UD_110\x10\x01\x12\x0c\n\x08\x42\x41UD_300\x10\x02\x12\x0c\n\x08\x42\x41UD_600\x10\x03\x12\r\n\tBAUD_1200\x10\x04\x12\r\n\tBAUD_2400\x10\x05\x12\r\n\tBAUD_4800\x10\x06\x12\r\n\tBAUD_9600\x10\x07\x12\x0e\n\nBAUD_19200\x10\x08\x12\x0e\n\nBAUD_38400\x10\t\x12\x0e\n\nBAUD_57600\x10\n\x12\x0f\n\x0b\x42\x41UD_115200\x10\x0b\x12\x0f\n\x0b\x42\x41UD_230400\x10\x0c\x12\x0f\n\x0b\x42\x41UD_460800\x10\r\x12\x0f\n\x0b\x42\x41UD_576000\x10\x0e\x12\x0f\n\x0b\x42\x41UD_921600\x10\x0f\"U\n\x0bSerial_Mode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\n\n\x06SIMPLE\x10\x01\x12\t\n\x05PROTO\x10\x02\x12\x0b\n\x07TEXTMSG\x10\x03\x12\x08\n\x04NMEA\x10\x04\x12\x0b\n\x07\x43\x41LTOPO\x10\x05\x1a\xe9\x02\n\x1a\x45xternalNotificationConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x11\n\toutput_ms\x18\x02 \x01(\r\x12\x0e\n\x06output\x18\x03 \x01(\r\x12\x14\n\x0coutput_vibra\x18\x08 \x01(\r\x12\x15\n\routput_buzzer\x18\t \x01(\r\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x15\n\ralert_message\x18\x05 \x01(\x08\x12\x1b\n\x13\x61lert_message_vibra\x18\n \x01(\x08\x12\x1c\n\x14\x61lert_message_buzzer\x18\x0b \x01(\x08\x12\x12\n\nalert_bell\x18\x06 \x01(\x08\x12\x18\n\x10\x61lert_bell_vibra\x18\x0c \x01(\x08\x12\x19\n\x11\x61lert_bell_buzzer\x18\r \x01(\x08\x12\x0f\n\x07use_pwm\x18\x07 \x01(\x08\x12\x13\n\x0bnag_timeout\x18\x0e \x01(\r\x12\x19\n\x11use_i2s_as_buzzer\x18\x0f \x01(\x08\x1a\x84\x01\n\x12StoreForwardConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x11\n\theartbeat\x18\x02 \x01(\x08\x12\x0f\n\x07records\x18\x03 \x01(\r\x12\x1a\n\x12history_return_max\x18\x04 \x01(\r\x12\x1d\n\x15history_return_window\x18\x05 \x01(\r\x1a@\n\x0fRangeTestConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0e\n\x06sender\x18\x02 \x01(\r\x12\x0c\n\x04save\x18\x03 \x01(\x08\x1a\xe6\x02\n\x0fTelemetryConfig\x12\x1e\n\x16\x64\x65vice_update_interval\x18\x01 \x01(\r\x12#\n\x1b\x65nvironment_update_interval\x18\x02 \x01(\r\x12\'\n\x1f\x65nvironment_measurement_enabled\x18\x03 \x01(\x08\x12\"\n\x1a\x65nvironment_screen_enabled\x18\x04 \x01(\x08\x12&\n\x1e\x65nvironment_display_fahrenheit\x18\x05 \x01(\x08\x12\x1b\n\x13\x61ir_quality_enabled\x18\x06 \x01(\x08\x12\x1c\n\x14\x61ir_quality_interval\x18\x07 \x01(\r\x12!\n\x19power_measurement_enabled\x18\x08 \x01(\x08\x12\x1d\n\x15power_update_interval\x18\t \x01(\r\x12\x1c\n\x14power_screen_enabled\x18\n \x01(\x08\x1a\xb5\x04\n\x13\x43\x61nnedMessageConfig\x12\x17\n\x0frotary1_enabled\x18\x01 \x01(\x08\x12\x19\n\x11inputbroker_pin_a\x18\x02 \x01(\r\x12\x19\n\x11inputbroker_pin_b\x18\x03 \x01(\r\x12\x1d\n\x15inputbroker_pin_press\x18\x04 \x01(\r\x12N\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32\x30.ModuleConfig.CannedMessageConfig.InputEventChar\x12O\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32\x30.ModuleConfig.CannedMessageConfig.InputEventChar\x12Q\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32\x30.ModuleConfig.CannedMessageConfig.InputEventChar\x12\x17\n\x0fupdown1_enabled\x18\x08 \x01(\x08\x12\x0f\n\x07\x65nabled\x18\t \x01(\x08\x12\x1a\n\x12\x61llow_input_source\x18\n \x01(\t\x12\x11\n\tsend_bell\x18\x0b \x01(\x08\"c\n\x0eInputEventChar\x12\x08\n\x04NONE\x10\x00\x12\x06\n\x02UP\x10\x11\x12\x08\n\x04\x44OWN\x10\x12\x12\x08\n\x04LEFT\x10\x13\x12\t\n\x05RIGHT\x10\x14\x12\n\n\x06SELECT\x10\n\x12\x08\n\x04\x42\x41\x43K\x10\x1b\x12\n\n\x06\x43\x41NCEL\x10\x18\x1a\x65\n\x15\x41mbientLightingConfig\x12\x11\n\tled_state\x18\x01 \x01(\x08\x12\x0f\n\x07\x63urrent\x18\x02 \x01(\r\x12\x0b\n\x03red\x18\x03 \x01(\r\x12\r\n\x05green\x18\x04 \x01(\r\x12\x0c\n\x04\x62lue\x18\x05 \x01(\rB\x11\n\x0fpayload_variant\"Y\n\x11RemoteHardwarePin\x12\x10\n\x08gpio_pin\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12$\n\x04type\x18\x03 \x01(\x0e\x32\x16.RemoteHardwarePinType*I\n\x15RemoteHardwarePinType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x10\n\x0c\x44IGITAL_READ\x10\x01\x12\x11\n\rDIGITAL_WRITE\x10\x02\x42g\n\x13\x63om.geeksville.meshB\x12ModuleConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/module_config.proto\x12\nmeshtastic\"\xa4\"\n\x0cModuleConfig\x12\x33\n\x04mqtt\x18\x01 \x01(\x0b\x32#.meshtastic.ModuleConfig.MQTTConfigH\x00\x12\x37\n\x06serial\x18\x02 \x01(\x0b\x32%.meshtastic.ModuleConfig.SerialConfigH\x00\x12T\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32\x33.meshtastic.ModuleConfig.ExternalNotificationConfigH\x00\x12\x44\n\rstore_forward\x18\x04 \x01(\x0b\x32+.meshtastic.ModuleConfig.StoreForwardConfigH\x00\x12>\n\nrange_test\x18\x05 \x01(\x0b\x32(.meshtastic.ModuleConfig.RangeTestConfigH\x00\x12=\n\ttelemetry\x18\x06 \x01(\x0b\x32(.meshtastic.ModuleConfig.TelemetryConfigH\x00\x12\x46\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32,.meshtastic.ModuleConfig.CannedMessageConfigH\x00\x12\x35\n\x05\x61udio\x18\x08 \x01(\x0b\x32$.meshtastic.ModuleConfig.AudioConfigH\x00\x12H\n\x0fremote_hardware\x18\t \x01(\x0b\x32-.meshtastic.ModuleConfig.RemoteHardwareConfigH\x00\x12\x44\n\rneighbor_info\x18\n \x01(\x0b\x32+.meshtastic.ModuleConfig.NeighborInfoConfigH\x00\x12J\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32..meshtastic.ModuleConfig.AmbientLightingConfigH\x00\x12J\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32..meshtastic.ModuleConfig.DetectionSensorConfigH\x00\x12?\n\npaxcounter\x18\r \x01(\x0b\x32).meshtastic.ModuleConfig.PaxcounterConfigH\x00\x1a\xb0\x02\n\nMQTTConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0f\n\x07\x61\x64\x64ress\x18\x02 \x01(\t\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x10\n\x08password\x18\x04 \x01(\t\x12\x1a\n\x12\x65ncryption_enabled\x18\x05 \x01(\x08\x12\x14\n\x0cjson_enabled\x18\x06 \x01(\x08\x12\x13\n\x0btls_enabled\x18\x07 \x01(\x08\x12\x0c\n\x04root\x18\x08 \x01(\t\x12\x1f\n\x17proxy_to_client_enabled\x18\t \x01(\x08\x12\x1d\n\x15map_reporting_enabled\x18\n \x01(\x08\x12G\n\x13map_report_settings\x18\x0b \x01(\x0b\x32*.meshtastic.ModuleConfig.MapReportSettings\x1aN\n\x11MapReportSettings\x12\x1d\n\x15publish_interval_secs\x18\x01 \x01(\r\x12\x1a\n\x12position_precision\x18\x02 \x01(\r\x1a\x82\x01\n\x14RemoteHardwareConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1a\x61llow_undefined_pin_access\x18\x02 \x01(\x08\x12\x35\n\x0e\x61vailable_pins\x18\x03 \x03(\x0b\x32\x1d.meshtastic.RemoteHardwarePin\x1a>\n\x12NeighborInfoConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x17\n\x0fupdate_interval\x18\x02 \x01(\r\x1a\xd2\x01\n\x15\x44\x65tectionSensorConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1e\n\x16minimum_broadcast_secs\x18\x02 \x01(\r\x12\x1c\n\x14state_broadcast_secs\x18\x03 \x01(\r\x12\x11\n\tsend_bell\x18\x04 \x01(\x08\x12\x0c\n\x04name\x18\x05 \x01(\t\x12\x13\n\x0bmonitor_pin\x18\x06 \x01(\r\x12 \n\x18\x64\x65tection_triggered_high\x18\x07 \x01(\x08\x12\x12\n\nuse_pullup\x18\x08 \x01(\x08\x1a\xe4\x02\n\x0b\x41udioConfig\x12\x16\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x12\x0f\n\x07ptt_pin\x18\x02 \x01(\r\x12@\n\x07\x62itrate\x18\x03 \x01(\x0e\x32/.meshtastic.ModuleConfig.AudioConfig.Audio_Baud\x12\x0e\n\x06i2s_ws\x18\x04 \x01(\r\x12\x0e\n\x06i2s_sd\x18\x05 \x01(\r\x12\x0f\n\x07i2s_din\x18\x06 \x01(\r\x12\x0f\n\x07i2s_sck\x18\x07 \x01(\r\"\xa7\x01\n\nAudio_Baud\x12\x12\n\x0e\x43ODEC2_DEFAULT\x10\x00\x12\x0f\n\x0b\x43ODEC2_3200\x10\x01\x12\x0f\n\x0b\x43ODEC2_2400\x10\x02\x12\x0f\n\x0b\x43ODEC2_1600\x10\x03\x12\x0f\n\x0b\x43ODEC2_1400\x10\x04\x12\x0f\n\x0b\x43ODEC2_1300\x10\x05\x12\x0f\n\x0b\x43ODEC2_1200\x10\x06\x12\x0e\n\nCODEC2_700\x10\x07\x12\x0f\n\x0b\x43ODEC2_700B\x10\x08\x1aG\n\x10PaxcounterConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1apaxcounter_update_interval\x18\x02 \x01(\r\x1a\xe4\x04\n\x0cSerialConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0c\n\x04\x65\x63ho\x18\x02 \x01(\x08\x12\x0b\n\x03rxd\x18\x03 \x01(\r\x12\x0b\n\x03txd\x18\x04 \x01(\r\x12?\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_Baud\x12\x0f\n\x07timeout\x18\x06 \x01(\r\x12?\n\x04mode\x18\x07 \x01(\x0e\x32\x31.meshtastic.ModuleConfig.SerialConfig.Serial_Mode\x12$\n\x1coverride_console_serial_port\x18\x08 \x01(\x08\"\x8a\x02\n\x0bSerial_Baud\x12\x10\n\x0c\x42\x41UD_DEFAULT\x10\x00\x12\x0c\n\x08\x42\x41UD_110\x10\x01\x12\x0c\n\x08\x42\x41UD_300\x10\x02\x12\x0c\n\x08\x42\x41UD_600\x10\x03\x12\r\n\tBAUD_1200\x10\x04\x12\r\n\tBAUD_2400\x10\x05\x12\r\n\tBAUD_4800\x10\x06\x12\r\n\tBAUD_9600\x10\x07\x12\x0e\n\nBAUD_19200\x10\x08\x12\x0e\n\nBAUD_38400\x10\t\x12\x0e\n\nBAUD_57600\x10\n\x12\x0f\n\x0b\x42\x41UD_115200\x10\x0b\x12\x0f\n\x0b\x42\x41UD_230400\x10\x0c\x12\x0f\n\x0b\x42\x41UD_460800\x10\r\x12\x0f\n\x0b\x42\x41UD_576000\x10\x0e\x12\x0f\n\x0b\x42\x41UD_921600\x10\x0f\"U\n\x0bSerial_Mode\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\n\n\x06SIMPLE\x10\x01\x12\t\n\x05PROTO\x10\x02\x12\x0b\n\x07TEXTMSG\x10\x03\x12\x08\n\x04NMEA\x10\x04\x12\x0b\n\x07\x43\x41LTOPO\x10\x05\x1a\xe9\x02\n\x1a\x45xternalNotificationConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x11\n\toutput_ms\x18\x02 \x01(\r\x12\x0e\n\x06output\x18\x03 \x01(\r\x12\x14\n\x0coutput_vibra\x18\x08 \x01(\r\x12\x15\n\routput_buzzer\x18\t \x01(\r\x12\x0e\n\x06\x61\x63tive\x18\x04 \x01(\x08\x12\x15\n\ralert_message\x18\x05 \x01(\x08\x12\x1b\n\x13\x61lert_message_vibra\x18\n \x01(\x08\x12\x1c\n\x14\x61lert_message_buzzer\x18\x0b \x01(\x08\x12\x12\n\nalert_bell\x18\x06 \x01(\x08\x12\x18\n\x10\x61lert_bell_vibra\x18\x0c \x01(\x08\x12\x19\n\x11\x61lert_bell_buzzer\x18\r \x01(\x08\x12\x0f\n\x07use_pwm\x18\x07 \x01(\x08\x12\x13\n\x0bnag_timeout\x18\x0e \x01(\r\x12\x19\n\x11use_i2s_as_buzzer\x18\x0f \x01(\x08\x1a\x84\x01\n\x12StoreForwardConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x11\n\theartbeat\x18\x02 \x01(\x08\x12\x0f\n\x07records\x18\x03 \x01(\r\x12\x1a\n\x12history_return_max\x18\x04 \x01(\r\x12\x1d\n\x15history_return_window\x18\x05 \x01(\r\x1a@\n\x0fRangeTestConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x0e\n\x06sender\x18\x02 \x01(\r\x12\x0c\n\x04save\x18\x03 \x01(\x08\x1a\xe6\x02\n\x0fTelemetryConfig\x12\x1e\n\x16\x64\x65vice_update_interval\x18\x01 \x01(\r\x12#\n\x1b\x65nvironment_update_interval\x18\x02 \x01(\r\x12\'\n\x1f\x65nvironment_measurement_enabled\x18\x03 \x01(\x08\x12\"\n\x1a\x65nvironment_screen_enabled\x18\x04 \x01(\x08\x12&\n\x1e\x65nvironment_display_fahrenheit\x18\x05 \x01(\x08\x12\x1b\n\x13\x61ir_quality_enabled\x18\x06 \x01(\x08\x12\x1c\n\x14\x61ir_quality_interval\x18\x07 \x01(\r\x12!\n\x19power_measurement_enabled\x18\x08 \x01(\x08\x12\x1d\n\x15power_update_interval\x18\t \x01(\r\x12\x1c\n\x14power_screen_enabled\x18\n \x01(\x08\x1a\xd6\x04\n\x13\x43\x61nnedMessageConfig\x12\x17\n\x0frotary1_enabled\x18\x01 \x01(\x08\x12\x19\n\x11inputbroker_pin_a\x18\x02 \x01(\r\x12\x19\n\x11inputbroker_pin_b\x18\x03 \x01(\r\x12\x1d\n\x15inputbroker_pin_press\x18\x04 \x01(\r\x12Y\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventChar\x12Z\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventChar\x12\\\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32;.meshtastic.ModuleConfig.CannedMessageConfig.InputEventChar\x12\x17\n\x0fupdown1_enabled\x18\x08 \x01(\x08\x12\x0f\n\x07\x65nabled\x18\t \x01(\x08\x12\x1a\n\x12\x61llow_input_source\x18\n \x01(\t\x12\x11\n\tsend_bell\x18\x0b \x01(\x08\"c\n\x0eInputEventChar\x12\x08\n\x04NONE\x10\x00\x12\x06\n\x02UP\x10\x11\x12\x08\n\x04\x44OWN\x10\x12\x12\x08\n\x04LEFT\x10\x13\x12\t\n\x05RIGHT\x10\x14\x12\n\n\x06SELECT\x10\n\x12\x08\n\x04\x42\x41\x43K\x10\x1b\x12\n\n\x06\x43\x41NCEL\x10\x18\x1a\x65\n\x15\x41mbientLightingConfig\x12\x11\n\tled_state\x18\x01 \x01(\x08\x12\x0f\n\x07\x63urrent\x18\x02 \x01(\r\x12\x0b\n\x03red\x18\x03 \x01(\r\x12\r\n\x05green\x18\x04 \x01(\r\x12\x0c\n\x04\x62lue\x18\x05 \x01(\rB\x11\n\x0fpayload_variant\"d\n\x11RemoteHardwarePin\x12\x10\n\x08gpio_pin\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12/\n\x04type\x18\x03 \x01(\x0e\x32!.meshtastic.RemoteHardwarePinType*I\n\x15RemoteHardwarePinType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x10\n\x0c\x44IGITAL_READ\x10\x01\x12\x11\n\rDIGITAL_WRITE\x10\x02\x42g\n\x13\x63om.geeksville.meshB\x12ModuleConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.module_config_pb2', globals())
@@ -21,46 +21,46 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\022ModuleConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _REMOTEHARDWAREPINTYPE._serialized_start=4284
- _REMOTEHARDWAREPINTYPE._serialized_end=4357
- _MODULECONFIG._serialized_start=35
- _MODULECONFIG._serialized_end=4191
- _MODULECONFIG_MQTTCONFIG._serialized_start=790
- _MODULECONFIG_MQTTCONFIG._serialized_end=1083
- _MODULECONFIG_MAPREPORTSETTINGS._serialized_start=1085
- _MODULECONFIG_MAPREPORTSETTINGS._serialized_end=1163
- _MODULECONFIG_REMOTEHARDWARECONFIG._serialized_start=1165
- _MODULECONFIG_REMOTEHARDWARECONFIG._serialized_end=1284
- _MODULECONFIG_NEIGHBORINFOCONFIG._serialized_start=1286
- _MODULECONFIG_NEIGHBORINFOCONFIG._serialized_end=1348
- _MODULECONFIG_DETECTIONSENSORCONFIG._serialized_start=1351
- _MODULECONFIG_DETECTIONSENSORCONFIG._serialized_end=1561
- _MODULECONFIG_AUDIOCONFIG._serialized_start=1564
- _MODULECONFIG_AUDIOCONFIG._serialized_end=1909
- _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_start=1742
- _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_end=1909
- _MODULECONFIG_PAXCOUNTERCONFIG._serialized_start=1911
- _MODULECONFIG_PAXCOUNTERCONFIG._serialized_end=1982
- _MODULECONFIG_SERIALCONFIG._serialized_start=1985
- _MODULECONFIG_SERIALCONFIG._serialized_end=2575
- _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_start=2222
- _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_end=2488
- _MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_start=2490
- _MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_end=2575
- _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_start=2578
- _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_end=2939
- _MODULECONFIG_STOREFORWARDCONFIG._serialized_start=2942
- _MODULECONFIG_STOREFORWARDCONFIG._serialized_end=3074
- _MODULECONFIG_RANGETESTCONFIG._serialized_start=3076
- _MODULECONFIG_RANGETESTCONFIG._serialized_end=3140
- _MODULECONFIG_TELEMETRYCONFIG._serialized_start=3143
- _MODULECONFIG_TELEMETRYCONFIG._serialized_end=3501
- _MODULECONFIG_CANNEDMESSAGECONFIG._serialized_start=3504
- _MODULECONFIG_CANNEDMESSAGECONFIG._serialized_end=4069
- _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_start=3970
- _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_end=4069
- _MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_start=4071
- _MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_end=4172
- _REMOTEHARDWAREPIN._serialized_start=4193
- _REMOTEHARDWAREPIN._serialized_end=4282
+ _REMOTEHARDWAREPINTYPE._serialized_start=4539
+ _REMOTEHARDWAREPINTYPE._serialized_end=4612
+ _MODULECONFIG._serialized_start=47
+ _MODULECONFIG._serialized_end=4435
+ _MODULECONFIG_MQTTCONFIG._serialized_start=945
+ _MODULECONFIG_MQTTCONFIG._serialized_end=1249
+ _MODULECONFIG_MAPREPORTSETTINGS._serialized_start=1251
+ _MODULECONFIG_MAPREPORTSETTINGS._serialized_end=1329
+ _MODULECONFIG_REMOTEHARDWARECONFIG._serialized_start=1332
+ _MODULECONFIG_REMOTEHARDWARECONFIG._serialized_end=1462
+ _MODULECONFIG_NEIGHBORINFOCONFIG._serialized_start=1464
+ _MODULECONFIG_NEIGHBORINFOCONFIG._serialized_end=1526
+ _MODULECONFIG_DETECTIONSENSORCONFIG._serialized_start=1529
+ _MODULECONFIG_DETECTIONSENSORCONFIG._serialized_end=1739
+ _MODULECONFIG_AUDIOCONFIG._serialized_start=1742
+ _MODULECONFIG_AUDIOCONFIG._serialized_end=2098
+ _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_start=1931
+ _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD._serialized_end=2098
+ _MODULECONFIG_PAXCOUNTERCONFIG._serialized_start=2100
+ _MODULECONFIG_PAXCOUNTERCONFIG._serialized_end=2171
+ _MODULECONFIG_SERIALCONFIG._serialized_start=2174
+ _MODULECONFIG_SERIALCONFIG._serialized_end=2786
+ _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_start=2433
+ _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD._serialized_end=2699
+ _MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_start=2701
+ _MODULECONFIG_SERIALCONFIG_SERIAL_MODE._serialized_end=2786
+ _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_start=2789
+ _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG._serialized_end=3150
+ _MODULECONFIG_STOREFORWARDCONFIG._serialized_start=3153
+ _MODULECONFIG_STOREFORWARDCONFIG._serialized_end=3285
+ _MODULECONFIG_RANGETESTCONFIG._serialized_start=3287
+ _MODULECONFIG_RANGETESTCONFIG._serialized_end=3351
+ _MODULECONFIG_TELEMETRYCONFIG._serialized_start=3354
+ _MODULECONFIG_TELEMETRYCONFIG._serialized_end=3712
+ _MODULECONFIG_CANNEDMESSAGECONFIG._serialized_start=3715
+ _MODULECONFIG_CANNEDMESSAGECONFIG._serialized_end=4313
+ _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_start=4214
+ _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR._serialized_end=4313
+ _MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_start=4315
+ _MODULECONFIG_AMBIENTLIGHTINGCONFIG._serialized_end=4416
+ _REMOTEHARDWAREPIN._serialized_start=4437
+ _REMOTEHARDWAREPIN._serialized_end=4537
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/module_config_pb2.pyi b/meshtastic/module_config_pb2.pyi
new file mode 100644
index 00000000..4611807e
--- /dev/null
+++ b/meshtastic/module_config_pb2.pyi
@@ -0,0 +1,1172 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import collections.abc
+import google.protobuf.descriptor
+import google.protobuf.internal.containers
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class _RemoteHardwarePinType:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _RemoteHardwarePinTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_RemoteHardwarePinType.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ UNKNOWN: _RemoteHardwarePinType.ValueType # 0
+ """
+ Unset/unused
+ """
+ DIGITAL_READ: _RemoteHardwarePinType.ValueType # 1
+ """
+ GPIO pin can be read (if it is high / low)
+ """
+ DIGITAL_WRITE: _RemoteHardwarePinType.ValueType # 2
+ """
+ GPIO pin can be written to (high / low)
+ """
+
+class RemoteHardwarePinType(_RemoteHardwarePinType, metaclass=_RemoteHardwarePinTypeEnumTypeWrapper): ...
+
+UNKNOWN: RemoteHardwarePinType.ValueType # 0
+"""
+Unset/unused
+"""
+DIGITAL_READ: RemoteHardwarePinType.ValueType # 1
+"""
+GPIO pin can be read (if it is high / low)
+"""
+DIGITAL_WRITE: RemoteHardwarePinType.ValueType # 2
+"""
+GPIO pin can be written to (high / low)
+"""
+global___RemoteHardwarePinType = RemoteHardwarePinType
+
+@typing_extensions.final
+class ModuleConfig(google.protobuf.message.Message):
+ """
+ Module Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ @typing_extensions.final
+ class MQTTConfig(google.protobuf.message.Message):
+ """
+ MQTT Client Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ENABLED_FIELD_NUMBER: builtins.int
+ ADDRESS_FIELD_NUMBER: builtins.int
+ USERNAME_FIELD_NUMBER: builtins.int
+ PASSWORD_FIELD_NUMBER: builtins.int
+ ENCRYPTION_ENABLED_FIELD_NUMBER: builtins.int
+ JSON_ENABLED_FIELD_NUMBER: builtins.int
+ TLS_ENABLED_FIELD_NUMBER: builtins.int
+ ROOT_FIELD_NUMBER: builtins.int
+ PROXY_TO_CLIENT_ENABLED_FIELD_NUMBER: builtins.int
+ MAP_REPORTING_ENABLED_FIELD_NUMBER: builtins.int
+ MAP_REPORT_SETTINGS_FIELD_NUMBER: builtins.int
+ enabled: builtins.bool
+ """
+ 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.
+ """
+ address: builtins.str
+ """
+ The server to use for our MQTT global message gateway feature.
+ If not set, the default server will be used
+ """
+ username: builtins.str
+ """
+ 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
+ """
+ password: builtins.str
+ """
+ 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
+ """
+ encryption_enabled: builtins.bool
+ """
+ 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
+ """
+ json_enabled: builtins.bool
+ """
+ Whether to send / consume json packets on MQTT
+ """
+ tls_enabled: builtins.bool
+ """
+ If true, we attempt to establish a secure connection using TLS
+ """
+ root: builtins.str
+ """
+ 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
+ """
+ proxy_to_client_enabled: builtins.bool
+ """
+ If true, we can use the connected phone / client to proxy messages to MQTT instead of a direct connection
+ """
+ map_reporting_enabled: builtins.bool
+ """
+ If true, we will periodically report unencrypted information about our node to a map via MQTT
+ """
+ @property
+ def map_report_settings(self) -> global___ModuleConfig.MapReportSettings:
+ """
+ Settings for reporting information about our node to a map via MQTT
+ """
+ def __init__(
+ self,
+ *,
+ enabled: builtins.bool = ...,
+ address: builtins.str = ...,
+ username: builtins.str = ...,
+ password: builtins.str = ...,
+ encryption_enabled: builtins.bool = ...,
+ json_enabled: builtins.bool = ...,
+ tls_enabled: builtins.bool = ...,
+ root: builtins.str = ...,
+ proxy_to_client_enabled: builtins.bool = ...,
+ map_reporting_enabled: builtins.bool = ...,
+ map_report_settings: global___ModuleConfig.MapReportSettings | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["map_report_settings", b"map_report_settings"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["address", b"address", "enabled", b"enabled", "encryption_enabled", b"encryption_enabled", "json_enabled", b"json_enabled", "map_report_settings", b"map_report_settings", "map_reporting_enabled", b"map_reporting_enabled", "password", b"password", "proxy_to_client_enabled", b"proxy_to_client_enabled", "root", b"root", "tls_enabled", b"tls_enabled", "username", b"username"]) -> None: ...
+
+ @typing_extensions.final
+ class MapReportSettings(google.protobuf.message.Message):
+ """
+ Settings for reporting unencrypted information about our node to a map via MQTT
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ PUBLISH_INTERVAL_SECS_FIELD_NUMBER: builtins.int
+ POSITION_PRECISION_FIELD_NUMBER: builtins.int
+ publish_interval_secs: builtins.int
+ """
+ How often we should report our info to the map (in seconds)
+ """
+ position_precision: builtins.int
+ """
+ Bits of precision for the location sent (default of 32 is full precision).
+ """
+ def __init__(
+ self,
+ *,
+ publish_interval_secs: builtins.int = ...,
+ position_precision: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["position_precision", b"position_precision", "publish_interval_secs", b"publish_interval_secs"]) -> None: ...
+
+ @typing_extensions.final
+ class RemoteHardwareConfig(google.protobuf.message.Message):
+ """
+ RemoteHardwareModule Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ENABLED_FIELD_NUMBER: builtins.int
+ ALLOW_UNDEFINED_PIN_ACCESS_FIELD_NUMBER: builtins.int
+ AVAILABLE_PINS_FIELD_NUMBER: builtins.int
+ enabled: builtins.bool
+ """
+ Whether the Module is enabled
+ """
+ allow_undefined_pin_access: builtins.bool
+ """
+ Whether the Module allows consumers to read / write to pins not defined in available_pins
+ """
+ @property
+ def available_pins(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___RemoteHardwarePin]:
+ """
+ Exposes the available pins to the mesh for reading and writing
+ """
+ def __init__(
+ self,
+ *,
+ enabled: builtins.bool = ...,
+ allow_undefined_pin_access: builtins.bool = ...,
+ available_pins: collections.abc.Iterable[global___RemoteHardwarePin] | None = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["allow_undefined_pin_access", b"allow_undefined_pin_access", "available_pins", b"available_pins", "enabled", b"enabled"]) -> None: ...
+
+ @typing_extensions.final
+ class NeighborInfoConfig(google.protobuf.message.Message):
+ """
+ NeighborInfoModule Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ENABLED_FIELD_NUMBER: builtins.int
+ UPDATE_INTERVAL_FIELD_NUMBER: builtins.int
+ enabled: builtins.bool
+ """
+ Whether the Module is enabled
+ """
+ update_interval: builtins.int
+ """
+ Interval in seconds of how often we should try to send our
+ Neighbor Info to the mesh
+ """
+ def __init__(
+ self,
+ *,
+ enabled: builtins.bool = ...,
+ update_interval: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["enabled", b"enabled", "update_interval", b"update_interval"]) -> None: ...
+
+ @typing_extensions.final
+ class DetectionSensorConfig(google.protobuf.message.Message):
+ """
+ Detection Sensor Module Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ENABLED_FIELD_NUMBER: builtins.int
+ MINIMUM_BROADCAST_SECS_FIELD_NUMBER: builtins.int
+ STATE_BROADCAST_SECS_FIELD_NUMBER: builtins.int
+ SEND_BELL_FIELD_NUMBER: builtins.int
+ NAME_FIELD_NUMBER: builtins.int
+ MONITOR_PIN_FIELD_NUMBER: builtins.int
+ DETECTION_TRIGGERED_HIGH_FIELD_NUMBER: builtins.int
+ USE_PULLUP_FIELD_NUMBER: builtins.int
+ enabled: builtins.bool
+ """
+ Whether the Module is enabled
+ """
+ minimum_broadcast_secs: builtins.int
+ """
+ Interval in seconds of how often we can send a message to the mesh when a state change is detected
+ """
+ state_broadcast_secs: builtins.int
+ """
+ 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
+ """
+ send_bell: builtins.bool
+ """
+ Send ASCII bell with alert message
+ Useful for triggering ext. notification on bell
+ """
+ name: builtins.str
+ """
+ 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
+ """
+ monitor_pin: builtins.int
+ """
+ GPIO pin to monitor for state changes
+ """
+ detection_triggered_high: builtins.bool
+ """
+ Whether or not the GPIO pin state detection is triggered on HIGH (1)
+ Otherwise LOW (0)
+ """
+ use_pullup: builtins.bool
+ """
+ Whether or not use INPUT_PULLUP mode for GPIO pin
+ Only applicable if the board uses pull-up resistors on the pin
+ """
+ def __init__(
+ self,
+ *,
+ enabled: builtins.bool = ...,
+ minimum_broadcast_secs: builtins.int = ...,
+ state_broadcast_secs: builtins.int = ...,
+ send_bell: builtins.bool = ...,
+ name: builtins.str = ...,
+ monitor_pin: builtins.int = ...,
+ detection_triggered_high: builtins.bool = ...,
+ use_pullup: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["detection_triggered_high", b"detection_triggered_high", "enabled", b"enabled", "minimum_broadcast_secs", b"minimum_broadcast_secs", "monitor_pin", b"monitor_pin", "name", b"name", "send_bell", b"send_bell", "state_broadcast_secs", b"state_broadcast_secs", "use_pullup", b"use_pullup"]) -> None: ...
+
+ @typing_extensions.final
+ class AudioConfig(google.protobuf.message.Message):
+ """
+ Audio Config for codec2 voice
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _Audio_Baud:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _Audio_BaudEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ModuleConfig.AudioConfig._Audio_Baud.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ CODEC2_DEFAULT: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 0
+ CODEC2_3200: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 1
+ CODEC2_2400: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 2
+ CODEC2_1600: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 3
+ CODEC2_1400: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 4
+ CODEC2_1300: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 5
+ CODEC2_1200: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 6
+ CODEC2_700: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 7
+ CODEC2_700B: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 8
+
+ class Audio_Baud(_Audio_Baud, metaclass=_Audio_BaudEnumTypeWrapper):
+ """
+ Baudrate for codec2 voice
+ """
+
+ CODEC2_DEFAULT: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 0
+ CODEC2_3200: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 1
+ CODEC2_2400: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 2
+ CODEC2_1600: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 3
+ CODEC2_1400: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 4
+ CODEC2_1300: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 5
+ CODEC2_1200: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 6
+ CODEC2_700: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 7
+ CODEC2_700B: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 8
+
+ CODEC2_ENABLED_FIELD_NUMBER: builtins.int
+ PTT_PIN_FIELD_NUMBER: builtins.int
+ BITRATE_FIELD_NUMBER: builtins.int
+ I2S_WS_FIELD_NUMBER: builtins.int
+ I2S_SD_FIELD_NUMBER: builtins.int
+ I2S_DIN_FIELD_NUMBER: builtins.int
+ I2S_SCK_FIELD_NUMBER: builtins.int
+ codec2_enabled: builtins.bool
+ """
+ Whether Audio is enabled
+ """
+ ptt_pin: builtins.int
+ """
+ PTT Pin
+ """
+ bitrate: global___ModuleConfig.AudioConfig.Audio_Baud.ValueType
+ """
+ The audio sample rate to use for codec2
+ """
+ i2s_ws: builtins.int
+ """
+ I2S Word Select
+ """
+ i2s_sd: builtins.int
+ """
+ I2S Data IN
+ """
+ i2s_din: builtins.int
+ """
+ I2S Data OUT
+ """
+ i2s_sck: builtins.int
+ """
+ I2S Clock
+ """
+ def __init__(
+ self,
+ *,
+ codec2_enabled: builtins.bool = ...,
+ ptt_pin: builtins.int = ...,
+ bitrate: global___ModuleConfig.AudioConfig.Audio_Baud.ValueType = ...,
+ i2s_ws: builtins.int = ...,
+ i2s_sd: builtins.int = ...,
+ i2s_din: builtins.int = ...,
+ i2s_sck: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["bitrate", b"bitrate", "codec2_enabled", b"codec2_enabled", "i2s_din", b"i2s_din", "i2s_sck", b"i2s_sck", "i2s_sd", b"i2s_sd", "i2s_ws", b"i2s_ws", "ptt_pin", b"ptt_pin"]) -> None: ...
+
+ @typing_extensions.final
+ class PaxcounterConfig(google.protobuf.message.Message):
+ """
+ Config for the Paxcounter Module
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ENABLED_FIELD_NUMBER: builtins.int
+ PAXCOUNTER_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int
+ enabled: builtins.bool
+ """
+ Enable the Paxcounter Module
+ """
+ paxcounter_update_interval: builtins.int
+ """
+ Interval in seconds of how often we should try to send our
+ metrics to the mesh
+ """
+ def __init__(
+ self,
+ *,
+ enabled: builtins.bool = ...,
+ paxcounter_update_interval: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["enabled", b"enabled", "paxcounter_update_interval", b"paxcounter_update_interval"]) -> None: ...
+
+ @typing_extensions.final
+ class SerialConfig(google.protobuf.message.Message):
+ """
+ Serial Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _Serial_Baud:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _Serial_BaudEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ModuleConfig.SerialConfig._Serial_Baud.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ BAUD_DEFAULT: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 0
+ BAUD_110: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 1
+ BAUD_300: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 2
+ BAUD_600: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 3
+ BAUD_1200: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 4
+ BAUD_2400: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 5
+ BAUD_4800: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 6
+ BAUD_9600: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 7
+ BAUD_19200: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 8
+ BAUD_38400: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 9
+ BAUD_57600: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 10
+ BAUD_115200: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 11
+ BAUD_230400: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 12
+ BAUD_460800: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 13
+ BAUD_576000: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 14
+ BAUD_921600: ModuleConfig.SerialConfig._Serial_Baud.ValueType # 15
+
+ class Serial_Baud(_Serial_Baud, metaclass=_Serial_BaudEnumTypeWrapper):
+ """
+ TODO: REPLACE
+ """
+
+ BAUD_DEFAULT: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 0
+ BAUD_110: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 1
+ BAUD_300: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 2
+ BAUD_600: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 3
+ BAUD_1200: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 4
+ BAUD_2400: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 5
+ BAUD_4800: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 6
+ BAUD_9600: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 7
+ BAUD_19200: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 8
+ BAUD_38400: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 9
+ BAUD_57600: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 10
+ BAUD_115200: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 11
+ BAUD_230400: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 12
+ BAUD_460800: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 13
+ BAUD_576000: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 14
+ BAUD_921600: ModuleConfig.SerialConfig.Serial_Baud.ValueType # 15
+
+ class _Serial_Mode:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _Serial_ModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ModuleConfig.SerialConfig._Serial_Mode.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ DEFAULT: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 0
+ SIMPLE: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 1
+ PROTO: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 2
+ TEXTMSG: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 3
+ NMEA: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 4
+ CALTOPO: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 5
+ """NMEA messages specifically tailored for CalTopo"""
+
+ class Serial_Mode(_Serial_Mode, metaclass=_Serial_ModeEnumTypeWrapper):
+ """
+ TODO: REPLACE
+ """
+
+ DEFAULT: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 0
+ SIMPLE: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 1
+ PROTO: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 2
+ TEXTMSG: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 3
+ NMEA: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 4
+ CALTOPO: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 5
+ """NMEA messages specifically tailored for CalTopo"""
+
+ ENABLED_FIELD_NUMBER: builtins.int
+ ECHO_FIELD_NUMBER: builtins.int
+ RXD_FIELD_NUMBER: builtins.int
+ TXD_FIELD_NUMBER: builtins.int
+ BAUD_FIELD_NUMBER: builtins.int
+ TIMEOUT_FIELD_NUMBER: builtins.int
+ MODE_FIELD_NUMBER: builtins.int
+ OVERRIDE_CONSOLE_SERIAL_PORT_FIELD_NUMBER: builtins.int
+ enabled: builtins.bool
+ """
+ Preferences for the SerialModule
+ """
+ echo: builtins.bool
+ """
+ TODO: REPLACE
+ """
+ rxd: builtins.int
+ """
+ RX pin (should match Arduino gpio pin number)
+ """
+ txd: builtins.int
+ """
+ TX pin (should match Arduino gpio pin number)
+ """
+ baud: global___ModuleConfig.SerialConfig.Serial_Baud.ValueType
+ """
+ Serial baud rate
+ """
+ timeout: builtins.int
+ """
+ TODO: REPLACE
+ """
+ mode: global___ModuleConfig.SerialConfig.Serial_Mode.ValueType
+ """
+ Mode for serial module operation
+ """
+ override_console_serial_port: builtins.bool
+ """
+ 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
+ """
+ def __init__(
+ self,
+ *,
+ enabled: builtins.bool = ...,
+ echo: builtins.bool = ...,
+ rxd: builtins.int = ...,
+ txd: builtins.int = ...,
+ baud: global___ModuleConfig.SerialConfig.Serial_Baud.ValueType = ...,
+ timeout: builtins.int = ...,
+ mode: global___ModuleConfig.SerialConfig.Serial_Mode.ValueType = ...,
+ override_console_serial_port: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["baud", b"baud", "echo", b"echo", "enabled", b"enabled", "mode", b"mode", "override_console_serial_port", b"override_console_serial_port", "rxd", b"rxd", "timeout", b"timeout", "txd", b"txd"]) -> None: ...
+
+ @typing_extensions.final
+ class ExternalNotificationConfig(google.protobuf.message.Message):
+ """
+ External Notifications Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ENABLED_FIELD_NUMBER: builtins.int
+ OUTPUT_MS_FIELD_NUMBER: builtins.int
+ OUTPUT_FIELD_NUMBER: builtins.int
+ OUTPUT_VIBRA_FIELD_NUMBER: builtins.int
+ OUTPUT_BUZZER_FIELD_NUMBER: builtins.int
+ ACTIVE_FIELD_NUMBER: builtins.int
+ ALERT_MESSAGE_FIELD_NUMBER: builtins.int
+ ALERT_MESSAGE_VIBRA_FIELD_NUMBER: builtins.int
+ ALERT_MESSAGE_BUZZER_FIELD_NUMBER: builtins.int
+ ALERT_BELL_FIELD_NUMBER: builtins.int
+ ALERT_BELL_VIBRA_FIELD_NUMBER: builtins.int
+ ALERT_BELL_BUZZER_FIELD_NUMBER: builtins.int
+ USE_PWM_FIELD_NUMBER: builtins.int
+ NAG_TIMEOUT_FIELD_NUMBER: builtins.int
+ USE_I2S_AS_BUZZER_FIELD_NUMBER: builtins.int
+ enabled: builtins.bool
+ """
+ Enable the ExternalNotificationModule
+ """
+ output_ms: builtins.int
+ """
+ When using in On/Off mode, keep the output on for this many
+ milliseconds. Default 1000ms (1 second).
+ """
+ output: builtins.int
+ """
+ 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.
+ """
+ output_vibra: builtins.int
+ """
+ Optional: Define a secondary output pin for a vibra motor
+ This is used in standalone devices to match the UI.
+ """
+ output_buzzer: builtins.int
+ """
+ Optional: Define a tertiary output pin for an active buzzer
+ This is used in standalone devices to to match the UI.
+ """
+ active: builtins.bool
+ """
+ IF this is true, the 'output' Pin will be pulled active high, false
+ means active low.
+ """
+ alert_message: builtins.bool
+ """
+ True: Alert when a text message arrives (output)
+ """
+ alert_message_vibra: builtins.bool
+ """
+ True: Alert when a text message arrives (output_vibra)
+ """
+ alert_message_buzzer: builtins.bool
+ """
+ True: Alert when a text message arrives (output_buzzer)
+ """
+ alert_bell: builtins.bool
+ """
+ True: Alert when the bell character is received (output)
+ """
+ alert_bell_vibra: builtins.bool
+ """
+ True: Alert when the bell character is received (output_vibra)
+ """
+ alert_bell_buzzer: builtins.bool
+ """
+ True: Alert when the bell character is received (output_buzzer)
+ """
+ use_pwm: builtins.bool
+ """
+ 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.
+ """
+ nag_timeout: builtins.int
+ """
+ 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
+ """
+ use_i2s_as_buzzer: builtins.bool
+ """
+ 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
+ """
+ def __init__(
+ self,
+ *,
+ enabled: builtins.bool = ...,
+ output_ms: builtins.int = ...,
+ output: builtins.int = ...,
+ output_vibra: builtins.int = ...,
+ output_buzzer: builtins.int = ...,
+ active: builtins.bool = ...,
+ alert_message: builtins.bool = ...,
+ alert_message_vibra: builtins.bool = ...,
+ alert_message_buzzer: builtins.bool = ...,
+ alert_bell: builtins.bool = ...,
+ alert_bell_vibra: builtins.bool = ...,
+ alert_bell_buzzer: builtins.bool = ...,
+ use_pwm: builtins.bool = ...,
+ nag_timeout: builtins.int = ...,
+ use_i2s_as_buzzer: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["active", b"active", "alert_bell", b"alert_bell", "alert_bell_buzzer", b"alert_bell_buzzer", "alert_bell_vibra", b"alert_bell_vibra", "alert_message", b"alert_message", "alert_message_buzzer", b"alert_message_buzzer", "alert_message_vibra", b"alert_message_vibra", "enabled", b"enabled", "nag_timeout", b"nag_timeout", "output", b"output", "output_buzzer", b"output_buzzer", "output_ms", b"output_ms", "output_vibra", b"output_vibra", "use_i2s_as_buzzer", b"use_i2s_as_buzzer", "use_pwm", b"use_pwm"]) -> None: ...
+
+ @typing_extensions.final
+ class StoreForwardConfig(google.protobuf.message.Message):
+ """
+ Store and Forward Module Config
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ENABLED_FIELD_NUMBER: builtins.int
+ HEARTBEAT_FIELD_NUMBER: builtins.int
+ RECORDS_FIELD_NUMBER: builtins.int
+ HISTORY_RETURN_MAX_FIELD_NUMBER: builtins.int
+ HISTORY_RETURN_WINDOW_FIELD_NUMBER: builtins.int
+ enabled: builtins.bool
+ """
+ Enable the Store and Forward Module
+ """
+ heartbeat: builtins.bool
+ """
+ TODO: REPLACE
+ """
+ records: builtins.int
+ """
+ TODO: REPLACE
+ """
+ history_return_max: builtins.int
+ """
+ TODO: REPLACE
+ """
+ history_return_window: builtins.int
+ """
+ TODO: REPLACE
+ """
+ def __init__(
+ self,
+ *,
+ enabled: builtins.bool = ...,
+ heartbeat: builtins.bool = ...,
+ records: builtins.int = ...,
+ history_return_max: builtins.int = ...,
+ history_return_window: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["enabled", b"enabled", "heartbeat", b"heartbeat", "history_return_max", b"history_return_max", "history_return_window", b"history_return_window", "records", b"records"]) -> None: ...
+
+ @typing_extensions.final
+ class RangeTestConfig(google.protobuf.message.Message):
+ """
+ Preferences for the RangeTestModule
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ ENABLED_FIELD_NUMBER: builtins.int
+ SENDER_FIELD_NUMBER: builtins.int
+ SAVE_FIELD_NUMBER: builtins.int
+ enabled: builtins.bool
+ """
+ Enable the Range Test Module
+ """
+ sender: builtins.int
+ """
+ Send out range test messages from this node
+ """
+ save: builtins.bool
+ """
+ Bool value indicating that this node should save a RangeTest.csv file.
+ ESP32 Only
+ """
+ def __init__(
+ self,
+ *,
+ enabled: builtins.bool = ...,
+ sender: builtins.int = ...,
+ save: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["enabled", b"enabled", "save", b"save", "sender", b"sender"]) -> None: ...
+
+ @typing_extensions.final
+ class TelemetryConfig(google.protobuf.message.Message):
+ """
+ Configuration for both device and environment metrics
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ DEVICE_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int
+ ENVIRONMENT_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int
+ ENVIRONMENT_MEASUREMENT_ENABLED_FIELD_NUMBER: builtins.int
+ ENVIRONMENT_SCREEN_ENABLED_FIELD_NUMBER: builtins.int
+ ENVIRONMENT_DISPLAY_FAHRENHEIT_FIELD_NUMBER: builtins.int
+ AIR_QUALITY_ENABLED_FIELD_NUMBER: builtins.int
+ AIR_QUALITY_INTERVAL_FIELD_NUMBER: builtins.int
+ POWER_MEASUREMENT_ENABLED_FIELD_NUMBER: builtins.int
+ POWER_UPDATE_INTERVAL_FIELD_NUMBER: builtins.int
+ POWER_SCREEN_ENABLED_FIELD_NUMBER: builtins.int
+ device_update_interval: builtins.int
+ """
+ Interval in seconds of how often we should try to send our
+ device metrics to the mesh
+ """
+ environment_update_interval: builtins.int
+ """
+ Interval in seconds of how often we should try to send our
+ environment measurements to the mesh
+ """
+ environment_measurement_enabled: builtins.bool
+ """
+ Preferences for the Telemetry Module (Environment)
+ Enable/Disable the telemetry measurement module measurement collection
+ """
+ environment_screen_enabled: builtins.bool
+ """
+ Enable/Disable the telemetry measurement module on-device display
+ """
+ environment_display_fahrenheit: builtins.bool
+ """
+ We'll always read the sensor in Celsius, but sometimes we might want to
+ display the results in Fahrenheit as a "user preference".
+ """
+ air_quality_enabled: builtins.bool
+ """
+ Enable/Disable the air quality metrics
+ """
+ air_quality_interval: builtins.int
+ """
+ Interval in seconds of how often we should try to send our
+ air quality metrics to the mesh
+ """
+ power_measurement_enabled: builtins.bool
+ """
+ Interval in seconds of how often we should try to send our
+ air quality metrics to the mesh
+ """
+ power_update_interval: builtins.int
+ """
+ Interval in seconds of how often we should try to send our
+ air quality metrics to the mesh
+ """
+ power_screen_enabled: builtins.bool
+ """
+ Interval in seconds of how often we should try to send our
+ air quality metrics to the mesh
+ """
+ def __init__(
+ self,
+ *,
+ device_update_interval: builtins.int = ...,
+ environment_update_interval: builtins.int = ...,
+ environment_measurement_enabled: builtins.bool = ...,
+ environment_screen_enabled: builtins.bool = ...,
+ environment_display_fahrenheit: builtins.bool = ...,
+ air_quality_enabled: builtins.bool = ...,
+ air_quality_interval: builtins.int = ...,
+ power_measurement_enabled: builtins.bool = ...,
+ power_update_interval: builtins.int = ...,
+ power_screen_enabled: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["air_quality_enabled", b"air_quality_enabled", "air_quality_interval", b"air_quality_interval", "device_update_interval", b"device_update_interval", "environment_display_fahrenheit", b"environment_display_fahrenheit", "environment_measurement_enabled", b"environment_measurement_enabled", "environment_screen_enabled", b"environment_screen_enabled", "environment_update_interval", b"environment_update_interval", "power_measurement_enabled", b"power_measurement_enabled", "power_screen_enabled", b"power_screen_enabled", "power_update_interval", b"power_update_interval"]) -> None: ...
+
+ @typing_extensions.final
+ class CannedMessageConfig(google.protobuf.message.Message):
+ """
+ TODO: REPLACE
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _InputEventChar:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _InputEventCharEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ModuleConfig.CannedMessageConfig._InputEventChar.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ NONE: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ UP: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 17
+ """
+ TODO: REPLACE
+ """
+ DOWN: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 18
+ """
+ TODO: REPLACE
+ """
+ LEFT: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 19
+ """
+ TODO: REPLACE
+ """
+ RIGHT: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 20
+ """
+ TODO: REPLACE
+ """
+ SELECT: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 10
+ """
+ '\\n'
+ """
+ BACK: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 27
+ """
+ TODO: REPLACE
+ """
+ CANCEL: ModuleConfig.CannedMessageConfig._InputEventChar.ValueType # 24
+ """
+ TODO: REPLACE
+ """
+
+ class InputEventChar(_InputEventChar, metaclass=_InputEventCharEnumTypeWrapper):
+ """
+ TODO: REPLACE
+ """
+
+ NONE: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 0
+ """
+ TODO: REPLACE
+ """
+ UP: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 17
+ """
+ TODO: REPLACE
+ """
+ DOWN: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 18
+ """
+ TODO: REPLACE
+ """
+ LEFT: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 19
+ """
+ TODO: REPLACE
+ """
+ RIGHT: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 20
+ """
+ TODO: REPLACE
+ """
+ SELECT: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 10
+ """
+ '\\n'
+ """
+ BACK: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 27
+ """
+ TODO: REPLACE
+ """
+ CANCEL: ModuleConfig.CannedMessageConfig.InputEventChar.ValueType # 24
+ """
+ TODO: REPLACE
+ """
+
+ ROTARY1_ENABLED_FIELD_NUMBER: builtins.int
+ INPUTBROKER_PIN_A_FIELD_NUMBER: builtins.int
+ INPUTBROKER_PIN_B_FIELD_NUMBER: builtins.int
+ INPUTBROKER_PIN_PRESS_FIELD_NUMBER: builtins.int
+ INPUTBROKER_EVENT_CW_FIELD_NUMBER: builtins.int
+ INPUTBROKER_EVENT_CCW_FIELD_NUMBER: builtins.int
+ INPUTBROKER_EVENT_PRESS_FIELD_NUMBER: builtins.int
+ UPDOWN1_ENABLED_FIELD_NUMBER: builtins.int
+ ENABLED_FIELD_NUMBER: builtins.int
+ ALLOW_INPUT_SOURCE_FIELD_NUMBER: builtins.int
+ SEND_BELL_FIELD_NUMBER: builtins.int
+ rotary1_enabled: builtins.bool
+ """
+ Enable the rotary encoder #1. This is a 'dumb' encoder sending pulses on both A and B pins while rotating.
+ """
+ inputbroker_pin_a: builtins.int
+ """
+ GPIO pin for rotary encoder A port.
+ """
+ inputbroker_pin_b: builtins.int
+ """
+ GPIO pin for rotary encoder B port.
+ """
+ inputbroker_pin_press: builtins.int
+ """
+ GPIO pin for rotary encoder Press port.
+ """
+ inputbroker_event_cw: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType
+ """
+ Generate input event on CW of this kind.
+ """
+ inputbroker_event_ccw: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType
+ """
+ Generate input event on CCW of this kind.
+ """
+ inputbroker_event_press: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType
+ """
+ Generate input event on Press of this kind.
+ """
+ updown1_enabled: builtins.bool
+ """
+ Enable the Up/Down/Select input device. Can be RAK rotary encoder or 3 buttons. Uses the a/b/press definitions from inputbroker.
+ """
+ enabled: builtins.bool
+ """
+ Enable/disable CannedMessageModule.
+ """
+ allow_input_source: builtins.str
+ """
+ Input event origin accepted by the canned message module.
+ Can be e.g. "rotEnc1", "upDownEnc1" or keyword "_any"
+ """
+ send_bell: builtins.bool
+ """
+ CannedMessageModule also sends a bell character with the messages.
+ ExternalNotificationModule can benefit from this feature.
+ """
+ def __init__(
+ self,
+ *,
+ rotary1_enabled: builtins.bool = ...,
+ inputbroker_pin_a: builtins.int = ...,
+ inputbroker_pin_b: builtins.int = ...,
+ inputbroker_pin_press: builtins.int = ...,
+ inputbroker_event_cw: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType = ...,
+ inputbroker_event_ccw: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType = ...,
+ inputbroker_event_press: global___ModuleConfig.CannedMessageConfig.InputEventChar.ValueType = ...,
+ updown1_enabled: builtins.bool = ...,
+ enabled: builtins.bool = ...,
+ allow_input_source: builtins.str = ...,
+ send_bell: builtins.bool = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["allow_input_source", b"allow_input_source", "enabled", b"enabled", "inputbroker_event_ccw", b"inputbroker_event_ccw", "inputbroker_event_cw", b"inputbroker_event_cw", "inputbroker_event_press", b"inputbroker_event_press", "inputbroker_pin_a", b"inputbroker_pin_a", "inputbroker_pin_b", b"inputbroker_pin_b", "inputbroker_pin_press", b"inputbroker_pin_press", "rotary1_enabled", b"rotary1_enabled", "send_bell", b"send_bell", "updown1_enabled", b"updown1_enabled"]) -> None: ...
+
+ @typing_extensions.final
+ class AmbientLightingConfig(google.protobuf.message.Message):
+ """
+ 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.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ LED_STATE_FIELD_NUMBER: builtins.int
+ CURRENT_FIELD_NUMBER: builtins.int
+ RED_FIELD_NUMBER: builtins.int
+ GREEN_FIELD_NUMBER: builtins.int
+ BLUE_FIELD_NUMBER: builtins.int
+ led_state: builtins.bool
+ """
+ Sets LED to on or off.
+ """
+ current: builtins.int
+ """
+ Sets the current for the LED output. Default is 10.
+ """
+ red: builtins.int
+ """
+ Sets the red LED level. Values are 0-255.
+ """
+ green: builtins.int
+ """
+ Sets the green LED level. Values are 0-255.
+ """
+ blue: builtins.int
+ """
+ Sets the blue LED level. Values are 0-255.
+ """
+ def __init__(
+ self,
+ *,
+ led_state: builtins.bool = ...,
+ current: builtins.int = ...,
+ red: builtins.int = ...,
+ green: builtins.int = ...,
+ blue: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["blue", b"blue", "current", b"current", "green", b"green", "led_state", b"led_state", "red", b"red"]) -> None: ...
+
+ MQTT_FIELD_NUMBER: builtins.int
+ SERIAL_FIELD_NUMBER: builtins.int
+ EXTERNAL_NOTIFICATION_FIELD_NUMBER: builtins.int
+ STORE_FORWARD_FIELD_NUMBER: builtins.int
+ RANGE_TEST_FIELD_NUMBER: builtins.int
+ TELEMETRY_FIELD_NUMBER: builtins.int
+ CANNED_MESSAGE_FIELD_NUMBER: builtins.int
+ AUDIO_FIELD_NUMBER: builtins.int
+ REMOTE_HARDWARE_FIELD_NUMBER: builtins.int
+ NEIGHBOR_INFO_FIELD_NUMBER: builtins.int
+ AMBIENT_LIGHTING_FIELD_NUMBER: builtins.int
+ DETECTION_SENSOR_FIELD_NUMBER: builtins.int
+ PAXCOUNTER_FIELD_NUMBER: builtins.int
+ @property
+ def mqtt(self) -> global___ModuleConfig.MQTTConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def serial(self) -> global___ModuleConfig.SerialConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def external_notification(self) -> global___ModuleConfig.ExternalNotificationConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def store_forward(self) -> global___ModuleConfig.StoreForwardConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def range_test(self) -> global___ModuleConfig.RangeTestConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def telemetry(self) -> global___ModuleConfig.TelemetryConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def canned_message(self) -> global___ModuleConfig.CannedMessageConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def audio(self) -> global___ModuleConfig.AudioConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def remote_hardware(self) -> global___ModuleConfig.RemoteHardwareConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def neighbor_info(self) -> global___ModuleConfig.NeighborInfoConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def ambient_lighting(self) -> global___ModuleConfig.AmbientLightingConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def detection_sensor(self) -> global___ModuleConfig.DetectionSensorConfig:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def paxcounter(self) -> global___ModuleConfig.PaxcounterConfig:
+ """
+ TODO: REPLACE
+ """
+ def __init__(
+ self,
+ *,
+ mqtt: global___ModuleConfig.MQTTConfig | None = ...,
+ serial: global___ModuleConfig.SerialConfig | None = ...,
+ external_notification: global___ModuleConfig.ExternalNotificationConfig | None = ...,
+ store_forward: global___ModuleConfig.StoreForwardConfig | None = ...,
+ range_test: global___ModuleConfig.RangeTestConfig | None = ...,
+ telemetry: global___ModuleConfig.TelemetryConfig | None = ...,
+ canned_message: global___ModuleConfig.CannedMessageConfig | None = ...,
+ audio: global___ModuleConfig.AudioConfig | None = ...,
+ remote_hardware: global___ModuleConfig.RemoteHardwareConfig | None = ...,
+ neighbor_info: global___ModuleConfig.NeighborInfoConfig | None = ...,
+ ambient_lighting: global___ModuleConfig.AmbientLightingConfig | None = ...,
+ detection_sensor: global___ModuleConfig.DetectionSensorConfig | None = ...,
+ paxcounter: global___ModuleConfig.PaxcounterConfig | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "payload_variant", b"payload_variant", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "payload_variant", b"payload_variant", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "store_forward", b"store_forward", "telemetry", b"telemetry"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["payload_variant", b"payload_variant"]) -> typing_extensions.Literal["mqtt", "serial", "external_notification", "store_forward", "range_test", "telemetry", "canned_message", "audio", "remote_hardware", "neighbor_info", "ambient_lighting", "detection_sensor", "paxcounter"] | None: ...
+
+global___ModuleConfig = ModuleConfig
+
+@typing_extensions.final
+class RemoteHardwarePin(google.protobuf.message.Message):
+ """
+ A GPIO pin definition for remote hardware module
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ GPIO_PIN_FIELD_NUMBER: builtins.int
+ NAME_FIELD_NUMBER: builtins.int
+ TYPE_FIELD_NUMBER: builtins.int
+ gpio_pin: builtins.int
+ """
+ GPIO Pin number (must match Arduino)
+ """
+ name: builtins.str
+ """
+ Name for the GPIO pin (i.e. Front gate, mailbox, etc)
+ """
+ type: global___RemoteHardwarePinType.ValueType
+ """
+ Type of GPIO access available to consumers on the mesh
+ """
+ def __init__(
+ self,
+ *,
+ gpio_pin: builtins.int = ...,
+ name: builtins.str = ...,
+ type: global___RemoteHardwarePinType.ValueType = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["gpio_pin", b"gpio_pin", "name", b"name", "type", b"type"]) -> None: ...
+
+global___RemoteHardwarePin = RemoteHardwarePin
diff --git a/meshtastic/mqtt_pb2.py b/meshtastic/mqtt_pb2.py
index 64aa2420..10f162b5 100644
--- a/meshtastic/mqtt_pb2.py
+++ b/meshtastic/mqtt_pb2.py
@@ -15,7 +15,7 @@
from meshtastic import config_pb2 as meshtastic_dot_config__pb2
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/mqtt.proto\x1a\x15meshtastic/mesh.proto\x1a\x17meshtastic/config.proto\"V\n\x0fServiceEnvelope\x12\x1b\n\x06packet\x18\x01 \x01(\x0b\x32\x0b.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\t\"\x90\x03\n\tMapReport\x12\x11\n\tlong_name\x18\x01 \x01(\t\x12\x12\n\nshort_name\x18\x02 \x01(\t\x12\'\n\x04role\x18\x03 \x01(\x0e\x32\x19.Config.DeviceConfig.Role\x12 \n\x08hw_model\x18\x04 \x01(\x0e\x32\x0e.HardwareModel\x12\x18\n\x10\x66irmware_version\x18\x05 \x01(\t\x12-\n\x06region\x18\x06 \x01(\x0e\x32\x1d.Config.LoRaConfig.RegionCode\x12\x34\n\x0cmodem_preset\x18\x07 \x01(\x0e\x32\x1e.Config.LoRaConfig.ModemPreset\x12\x1b\n\x13has_default_channel\x18\x08 \x01(\x08\x12\x12\n\nlatitude_i\x18\t \x01(\x0f\x12\x13\n\x0blongitude_i\x18\n \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x0b \x01(\x05\x12\x1a\n\x12position_precision\x18\x0c \x01(\r\x12\x1e\n\x16num_online_local_nodes\x18\r \x01(\rB_\n\x13\x63om.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x15meshtastic/mqtt.proto\x12\nmeshtastic\x1a\x15meshtastic/mesh.proto\x1a\x17meshtastic/config.proto\"a\n\x0fServiceEnvelope\x12&\n\x06packet\x18\x01 \x01(\x0b\x32\x16.meshtastic.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\t\"\xbc\x03\n\tMapReport\x12\x11\n\tlong_name\x18\x01 \x01(\t\x12\x12\n\nshort_name\x18\x02 \x01(\t\x12\x32\n\x04role\x18\x03 \x01(\x0e\x32$.meshtastic.Config.DeviceConfig.Role\x12+\n\x08hw_model\x18\x04 \x01(\x0e\x32\x19.meshtastic.HardwareModel\x12\x18\n\x10\x66irmware_version\x18\x05 \x01(\t\x12\x38\n\x06region\x18\x06 \x01(\x0e\x32(.meshtastic.Config.LoRaConfig.RegionCode\x12?\n\x0cmodem_preset\x18\x07 \x01(\x0e\x32).meshtastic.Config.LoRaConfig.ModemPreset\x12\x1b\n\x13has_default_channel\x18\x08 \x01(\x08\x12\x12\n\nlatitude_i\x18\t \x01(\x0f\x12\x13\n\x0blongitude_i\x18\n \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x0b \x01(\x05\x12\x1a\n\x12position_precision\x18\x0c \x01(\r\x12\x1e\n\x16num_online_local_nodes\x18\r \x01(\rB_\n\x13\x63om.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.mqtt_pb2', globals())
@@ -23,8 +23,8 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _SERVICEENVELOPE._serialized_start=73
- _SERVICEENVELOPE._serialized_end=159
- _MAPREPORT._serialized_start=162
- _MAPREPORT._serialized_end=562
+ _SERVICEENVELOPE._serialized_start=85
+ _SERVICEENVELOPE._serialized_end=182
+ _MAPREPORT._serialized_start=185
+ _MAPREPORT._serialized_end=629
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/mqtt_pb2.pyi b/meshtastic/mqtt_pb2.pyi
new file mode 100644
index 00000000..ed2b834f
--- /dev/null
+++ b/meshtastic/mqtt_pb2.pyi
@@ -0,0 +1,151 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import meshtastic.config_pb2
+import meshtastic.mesh_pb2
+import sys
+
+if sys.version_info >= (3, 8):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class ServiceEnvelope(google.protobuf.message.Message):
+ """
+ This message wraps a MeshPacket with extra metadata about the sender and how it arrived.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ PACKET_FIELD_NUMBER: builtins.int
+ CHANNEL_ID_FIELD_NUMBER: builtins.int
+ GATEWAY_ID_FIELD_NUMBER: builtins.int
+ @property
+ def packet(self) -> meshtastic.mesh_pb2.MeshPacket:
+ """
+ The (probably encrypted) packet
+ """
+ channel_id: builtins.str
+ """
+ The global channel ID it was sent on
+ """
+ gateway_id: builtins.str
+ """
+ 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
+ """
+ def __init__(
+ self,
+ *,
+ packet: meshtastic.mesh_pb2.MeshPacket | None = ...,
+ channel_id: builtins.str = ...,
+ gateway_id: builtins.str = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["packet", b"packet"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["channel_id", b"channel_id", "gateway_id", b"gateway_id", "packet", b"packet"]) -> None: ...
+
+global___ServiceEnvelope = ServiceEnvelope
+
+@typing_extensions.final
+class MapReport(google.protobuf.message.Message):
+ """
+ Information about a node intended to be reported unencrypted to a map using MQTT.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ LONG_NAME_FIELD_NUMBER: builtins.int
+ SHORT_NAME_FIELD_NUMBER: builtins.int
+ ROLE_FIELD_NUMBER: builtins.int
+ HW_MODEL_FIELD_NUMBER: builtins.int
+ FIRMWARE_VERSION_FIELD_NUMBER: builtins.int
+ REGION_FIELD_NUMBER: builtins.int
+ MODEM_PRESET_FIELD_NUMBER: builtins.int
+ HAS_DEFAULT_CHANNEL_FIELD_NUMBER: builtins.int
+ LATITUDE_I_FIELD_NUMBER: builtins.int
+ LONGITUDE_I_FIELD_NUMBER: builtins.int
+ ALTITUDE_FIELD_NUMBER: builtins.int
+ POSITION_PRECISION_FIELD_NUMBER: builtins.int
+ NUM_ONLINE_LOCAL_NODES_FIELD_NUMBER: builtins.int
+ long_name: builtins.str
+ """
+ A full name for this user, i.e. "Kevin Hester"
+ """
+ short_name: builtins.str
+ """
+ A VERY short name, ideally two characters.
+ Suitable for a tiny OLED screen
+ """
+ role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType
+ """
+ Role of the node that applies specific settings for a particular use-case
+ """
+ hw_model: meshtastic.mesh_pb2.HardwareModel.ValueType
+ """
+ Hardware model of the node, i.e. T-Beam, Heltec V3, etc...
+ """
+ firmware_version: builtins.str
+ """
+ Device firmware version string
+ """
+ region: meshtastic.config_pb2.Config.LoRaConfig.RegionCode.ValueType
+ """
+ The region code for the radio (US, CN, EU433, etc...)
+ """
+ modem_preset: meshtastic.config_pb2.Config.LoRaConfig.ModemPreset.ValueType
+ """
+ Modem preset used by the radio (LongFast, MediumSlow, etc...)
+ """
+ has_default_channel: builtins.bool
+ """
+ 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.
+ """
+ latitude_i: builtins.int
+ """
+ Latitude: multiply by 1e-7 to get degrees in floating point
+ """
+ longitude_i: builtins.int
+ """
+ Longitude: multiply by 1e-7 to get degrees in floating point
+ """
+ altitude: builtins.int
+ """
+ Altitude in meters above MSL
+ """
+ position_precision: builtins.int
+ """
+ Indicates the bits of precision for latitude and longitude set by the sending node
+ """
+ num_online_local_nodes: builtins.int
+ """
+ Number of online nodes (heard in the last 2 hours) this node has in its list that were received locally (not via MQTT)
+ """
+ def __init__(
+ self,
+ *,
+ long_name: builtins.str = ...,
+ short_name: builtins.str = ...,
+ role: meshtastic.config_pb2.Config.DeviceConfig.Role.ValueType = ...,
+ hw_model: meshtastic.mesh_pb2.HardwareModel.ValueType = ...,
+ firmware_version: builtins.str = ...,
+ region: meshtastic.config_pb2.Config.LoRaConfig.RegionCode.ValueType = ...,
+ modem_preset: meshtastic.config_pb2.Config.LoRaConfig.ModemPreset.ValueType = ...,
+ has_default_channel: builtins.bool = ...,
+ latitude_i: builtins.int = ...,
+ longitude_i: builtins.int = ...,
+ altitude: builtins.int = ...,
+ position_precision: builtins.int = ...,
+ num_online_local_nodes: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["altitude", b"altitude", "firmware_version", b"firmware_version", "has_default_channel", b"has_default_channel", "hw_model", b"hw_model", "latitude_i", b"latitude_i", "long_name", b"long_name", "longitude_i", b"longitude_i", "modem_preset", b"modem_preset", "num_online_local_nodes", b"num_online_local_nodes", "position_precision", b"position_precision", "region", b"region", "role", b"role", "short_name", b"short_name"]) -> None: ...
+
+global___MapReport = MapReport
diff --git a/meshtastic/nanopb_pb2.pyi b/meshtastic/nanopb_pb2.pyi
new file mode 100644
index 00000000..840d1e6e
--- /dev/null
+++ b/meshtastic/nanopb_pb2.pyi
@@ -0,0 +1,321 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+Custom options for defining:
+- Maximum size of string/bytes
+- Maximum number of elements in array
+
+These are used by nanopb to generate statically allocable structures
+for memory-limited environments.
+"""
+import builtins
+import collections.abc
+import google.protobuf.descriptor
+import google.protobuf.descriptor_pb2
+import google.protobuf.internal.containers
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.internal.extension_dict
+import google.protobuf.message
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class _FieldType:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _FieldTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_FieldType.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ FT_DEFAULT: _FieldType.ValueType # 0
+ """Automatically decide field type, generate static field if possible."""
+ FT_CALLBACK: _FieldType.ValueType # 1
+ """Always generate a callback field."""
+ FT_POINTER: _FieldType.ValueType # 4
+ """Always generate a dynamically allocated field."""
+ FT_STATIC: _FieldType.ValueType # 2
+ """Generate a static field or raise an exception if not possible."""
+ FT_IGNORE: _FieldType.ValueType # 3
+ """Ignore the field completely."""
+ FT_INLINE: _FieldType.ValueType # 5
+ """Legacy option, use the separate 'fixed_length' option instead"""
+
+class FieldType(_FieldType, metaclass=_FieldTypeEnumTypeWrapper): ...
+
+FT_DEFAULT: FieldType.ValueType # 0
+"""Automatically decide field type, generate static field if possible."""
+FT_CALLBACK: FieldType.ValueType # 1
+"""Always generate a callback field."""
+FT_POINTER: FieldType.ValueType # 4
+"""Always generate a dynamically allocated field."""
+FT_STATIC: FieldType.ValueType # 2
+"""Generate a static field or raise an exception if not possible."""
+FT_IGNORE: FieldType.ValueType # 3
+"""Ignore the field completely."""
+FT_INLINE: FieldType.ValueType # 5
+"""Legacy option, use the separate 'fixed_length' option instead"""
+global___FieldType = FieldType
+
+class _IntSize:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _IntSizeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_IntSize.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ IS_DEFAULT: _IntSize.ValueType # 0
+ """Default, 32/64bit based on type in .proto"""
+ IS_8: _IntSize.ValueType # 8
+ IS_16: _IntSize.ValueType # 16
+ IS_32: _IntSize.ValueType # 32
+ IS_64: _IntSize.ValueType # 64
+
+class IntSize(_IntSize, metaclass=_IntSizeEnumTypeWrapper): ...
+
+IS_DEFAULT: IntSize.ValueType # 0
+"""Default, 32/64bit based on type in .proto"""
+IS_8: IntSize.ValueType # 8
+IS_16: IntSize.ValueType # 16
+IS_32: IntSize.ValueType # 32
+IS_64: IntSize.ValueType # 64
+global___IntSize = IntSize
+
+class _TypenameMangling:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _TypenameManglingEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_TypenameMangling.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ M_NONE: _TypenameMangling.ValueType # 0
+ """Default, no typename mangling"""
+ M_STRIP_PACKAGE: _TypenameMangling.ValueType # 1
+ """Strip current package name"""
+ M_FLATTEN: _TypenameMangling.ValueType # 2
+ """Only use last path component"""
+ M_PACKAGE_INITIALS: _TypenameMangling.ValueType # 3
+ """Replace the package name by the initials"""
+
+class TypenameMangling(_TypenameMangling, metaclass=_TypenameManglingEnumTypeWrapper): ...
+
+M_NONE: TypenameMangling.ValueType # 0
+"""Default, no typename mangling"""
+M_STRIP_PACKAGE: TypenameMangling.ValueType # 1
+"""Strip current package name"""
+M_FLATTEN: TypenameMangling.ValueType # 2
+"""Only use last path component"""
+M_PACKAGE_INITIALS: TypenameMangling.ValueType # 3
+"""Replace the package name by the initials"""
+global___TypenameMangling = TypenameMangling
+
+class _DescriptorSize:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _DescriptorSizeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_DescriptorSize.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ DS_AUTO: _DescriptorSize.ValueType # 0
+ """Select minimal size based on field type"""
+ DS_1: _DescriptorSize.ValueType # 1
+ """1 word; up to 15 byte fields, no arrays"""
+ DS_2: _DescriptorSize.ValueType # 2
+ """2 words; up to 4095 byte fields, 4095 entry arrays"""
+ DS_4: _DescriptorSize.ValueType # 4
+ """4 words; up to 2^32-1 byte fields, 2^16-1 entry arrays"""
+ DS_8: _DescriptorSize.ValueType # 8
+ """8 words; up to 2^32-1 entry arrays"""
+
+class DescriptorSize(_DescriptorSize, metaclass=_DescriptorSizeEnumTypeWrapper): ...
+
+DS_AUTO: DescriptorSize.ValueType # 0
+"""Select minimal size based on field type"""
+DS_1: DescriptorSize.ValueType # 1
+"""1 word; up to 15 byte fields, no arrays"""
+DS_2: DescriptorSize.ValueType # 2
+"""2 words; up to 4095 byte fields, 4095 entry arrays"""
+DS_4: DescriptorSize.ValueType # 4
+"""4 words; up to 2^32-1 byte fields, 2^16-1 entry arrays"""
+DS_8: DescriptorSize.ValueType # 8
+"""8 words; up to 2^32-1 entry arrays"""
+global___DescriptorSize = DescriptorSize
+
+@typing_extensions.final
+class NanoPBOptions(google.protobuf.message.Message):
+ """This is the inner options message, which basically defines options for
+ a field. When it is used in message or file scope, it applies to all
+ fields.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ MAX_SIZE_FIELD_NUMBER: builtins.int
+ MAX_LENGTH_FIELD_NUMBER: builtins.int
+ MAX_COUNT_FIELD_NUMBER: builtins.int
+ INT_SIZE_FIELD_NUMBER: builtins.int
+ TYPE_FIELD_NUMBER: builtins.int
+ LONG_NAMES_FIELD_NUMBER: builtins.int
+ PACKED_STRUCT_FIELD_NUMBER: builtins.int
+ PACKED_ENUM_FIELD_NUMBER: builtins.int
+ SKIP_MESSAGE_FIELD_NUMBER: builtins.int
+ NO_UNIONS_FIELD_NUMBER: builtins.int
+ MSGID_FIELD_NUMBER: builtins.int
+ ANONYMOUS_ONEOF_FIELD_NUMBER: builtins.int
+ PROTO3_FIELD_NUMBER: builtins.int
+ PROTO3_SINGULAR_MSGS_FIELD_NUMBER: builtins.int
+ ENUM_TO_STRING_FIELD_NUMBER: builtins.int
+ FIXED_LENGTH_FIELD_NUMBER: builtins.int
+ FIXED_COUNT_FIELD_NUMBER: builtins.int
+ SUBMSG_CALLBACK_FIELD_NUMBER: builtins.int
+ MANGLE_NAMES_FIELD_NUMBER: builtins.int
+ CALLBACK_DATATYPE_FIELD_NUMBER: builtins.int
+ CALLBACK_FUNCTION_FIELD_NUMBER: builtins.int
+ DESCRIPTORSIZE_FIELD_NUMBER: builtins.int
+ DEFAULT_HAS_FIELD_NUMBER: builtins.int
+ INCLUDE_FIELD_NUMBER: builtins.int
+ EXCLUDE_FIELD_NUMBER: builtins.int
+ PACKAGE_FIELD_NUMBER: builtins.int
+ TYPE_OVERRIDE_FIELD_NUMBER: builtins.int
+ SORT_BY_TAG_FIELD_NUMBER: builtins.int
+ FALLBACK_TYPE_FIELD_NUMBER: builtins.int
+ max_size: builtins.int
+ """Allocated size for 'bytes' and 'string' fields.
+ For string fields, this should include the space for null terminator.
+ """
+ max_length: builtins.int
+ """Maximum length for 'string' fields. Setting this is equivalent
+ to setting max_size to a value of length+1.
+ """
+ max_count: builtins.int
+ """Allocated number of entries in arrays ('repeated' fields)"""
+ int_size: global___IntSize.ValueType
+ """Size of integer fields. Can save some memory if you don't need
+ full 32 bits for the value.
+ """
+ type: global___FieldType.ValueType
+ """Force type of field (callback or static allocation)"""
+ long_names: builtins.bool
+ """Use long names for enums, i.e. EnumName_EnumValue."""
+ packed_struct: builtins.bool
+ """Add 'packed' attribute to generated structs.
+ Note: this cannot be used on CPUs that break on unaligned
+ accesses to variables.
+ """
+ packed_enum: builtins.bool
+ """Add 'packed' attribute to generated enums."""
+ skip_message: builtins.bool
+ """Skip this message"""
+ no_unions: builtins.bool
+ """Generate oneof fields as normal optional fields instead of union."""
+ msgid: builtins.int
+ """integer type tag for a message"""
+ anonymous_oneof: builtins.bool
+ """decode oneof as anonymous union"""
+ proto3: builtins.bool
+ """Proto3 singular field does not generate a "has_" flag"""
+ proto3_singular_msgs: builtins.bool
+ """Force proto3 messages to have no "has_" flag.
+ This was default behavior until nanopb-0.4.0.
+ """
+ enum_to_string: builtins.bool
+ """Generate an enum->string mapping function (can take up lots of space)."""
+ fixed_length: builtins.bool
+ """Generate bytes arrays with fixed length"""
+ fixed_count: builtins.bool
+ """Generate repeated field with fixed count"""
+ submsg_callback: builtins.bool
+ """Generate message-level callback that is called before decoding submessages.
+ This can be used to set callback fields for submsgs inside oneofs.
+ """
+ mangle_names: global___TypenameMangling.ValueType
+ """Shorten or remove package names from type names.
+ This option applies only on the file level.
+ """
+ callback_datatype: builtins.str
+ """Data type for storage associated with callback fields."""
+ callback_function: builtins.str
+ """Callback function used for encoding and decoding.
+ Prior to nanopb-0.4.0, the callback was specified in per-field pb_callback_t
+ structure. This is still supported, but does not work inside e.g. oneof or pointer
+ fields. Instead, a new method allows specifying a per-message callback that
+ will be called for all callback fields in a message type.
+ """
+ descriptorsize: global___DescriptorSize.ValueType
+ """Select the size of field descriptors. This option has to be defined
+ for the whole message, not per-field. Usually automatic selection is
+ ok, but if it results in compilation errors you can increase the field
+ size here.
+ """
+ default_has: builtins.bool
+ """Set default value for has_ fields."""
+ @property
+ def include(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """Extra files to include in generated `.pb.h`"""
+ @property
+ def exclude(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
+ """Automatic includes to exclude from generated `.pb.h`
+ Same as nanopb_generator.py command line flag -x.
+ """
+ package: builtins.str
+ """Package name that applies only for nanopb."""
+ type_override: google.protobuf.descriptor_pb2.FieldDescriptorProto.Type.ValueType
+ """Override type of the field in generated C code. Only to be used with related field types"""
+ sort_by_tag: builtins.bool
+ """Due to historical reasons, nanopb orders fields in structs by their tag number
+ instead of the order in .proto. Set this to false to keep the .proto order.
+ The default value will probably change to false in nanopb-0.5.0.
+ """
+ fallback_type: global___FieldType.ValueType
+ """Set the FT_DEFAULT field conversion strategy.
+ A field that can become a static member of a c struct (e.g. int, bool, etc)
+ will be a a static field.
+ Fields with dynamic length are converted to either a pointer or a callback.
+ """
+ def __init__(
+ self,
+ *,
+ max_size: builtins.int | None = ...,
+ max_length: builtins.int | None = ...,
+ max_count: builtins.int | None = ...,
+ int_size: global___IntSize.ValueType | None = ...,
+ type: global___FieldType.ValueType | None = ...,
+ long_names: builtins.bool | None = ...,
+ packed_struct: builtins.bool | None = ...,
+ packed_enum: builtins.bool | None = ...,
+ skip_message: builtins.bool | None = ...,
+ no_unions: builtins.bool | None = ...,
+ msgid: builtins.int | None = ...,
+ anonymous_oneof: builtins.bool | None = ...,
+ proto3: builtins.bool | None = ...,
+ proto3_singular_msgs: builtins.bool | None = ...,
+ enum_to_string: builtins.bool | None = ...,
+ fixed_length: builtins.bool | None = ...,
+ fixed_count: builtins.bool | None = ...,
+ submsg_callback: builtins.bool | None = ...,
+ mangle_names: global___TypenameMangling.ValueType | None = ...,
+ callback_datatype: builtins.str | None = ...,
+ callback_function: builtins.str | None = ...,
+ descriptorsize: global___DescriptorSize.ValueType | None = ...,
+ default_has: builtins.bool | None = ...,
+ include: collections.abc.Iterable[builtins.str] | None = ...,
+ exclude: collections.abc.Iterable[builtins.str] | None = ...,
+ package: builtins.str | None = ...,
+ type_override: google.protobuf.descriptor_pb2.FieldDescriptorProto.Type.ValueType | None = ...,
+ sort_by_tag: builtins.bool | None = ...,
+ fallback_type: global___FieldType.ValueType | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["anonymous_oneof", b"anonymous_oneof", "callback_datatype", b"callback_datatype", "callback_function", b"callback_function", "default_has", b"default_has", "descriptorsize", b"descriptorsize", "enum_to_string", b"enum_to_string", "fallback_type", b"fallback_type", "fixed_count", b"fixed_count", "fixed_length", b"fixed_length", "int_size", b"int_size", "long_names", b"long_names", "mangle_names", b"mangle_names", "max_count", b"max_count", "max_length", b"max_length", "max_size", b"max_size", "msgid", b"msgid", "no_unions", b"no_unions", "package", b"package", "packed_enum", b"packed_enum", "packed_struct", b"packed_struct", "proto3", b"proto3", "proto3_singular_msgs", b"proto3_singular_msgs", "skip_message", b"skip_message", "sort_by_tag", b"sort_by_tag", "submsg_callback", b"submsg_callback", "type", b"type", "type_override", b"type_override"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["anonymous_oneof", b"anonymous_oneof", "callback_datatype", b"callback_datatype", "callback_function", b"callback_function", "default_has", b"default_has", "descriptorsize", b"descriptorsize", "enum_to_string", b"enum_to_string", "exclude", b"exclude", "fallback_type", b"fallback_type", "fixed_count", b"fixed_count", "fixed_length", b"fixed_length", "include", b"include", "int_size", b"int_size", "long_names", b"long_names", "mangle_names", b"mangle_names", "max_count", b"max_count", "max_length", b"max_length", "max_size", b"max_size", "msgid", b"msgid", "no_unions", b"no_unions", "package", b"package", "packed_enum", b"packed_enum", "packed_struct", b"packed_struct", "proto3", b"proto3", "proto3_singular_msgs", b"proto3_singular_msgs", "skip_message", b"skip_message", "sort_by_tag", b"sort_by_tag", "submsg_callback", b"submsg_callback", "type", b"type", "type_override", b"type_override"]) -> None: ...
+
+global___NanoPBOptions = NanoPBOptions
+
+NANOPB_FILEOPT_FIELD_NUMBER: builtins.int
+NANOPB_MSGOPT_FIELD_NUMBER: builtins.int
+NANOPB_ENUMOPT_FIELD_NUMBER: builtins.int
+NANOPB_FIELD_NUMBER: builtins.int
+nanopb_fileopt: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.FileOptions, global___NanoPBOptions]
+nanopb_msgopt: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.MessageOptions, global___NanoPBOptions]
+nanopb_enumopt: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.EnumOptions, global___NanoPBOptions]
+nanopb: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.FieldOptions, global___NanoPBOptions]
diff --git a/meshtastic/node.py b/meshtastic/node.py
index 9df4b508..473f489e 100644
--- a/meshtastic/node.py
+++ b/meshtastic/node.py
@@ -123,7 +123,7 @@ def requestConfig(self, configType):
print("Requesting current config from remote node (this can take a while).")
msgIndex = configType.index
- if configType.containing_type.full_name == "LocalConfig":
+ if configType.containing_type.full_name in ("meshtastic.LocalConfig", "LocalConfig"):
p = admin_pb2.AdminMessage()
p.get_config_request = msgIndex
self._sendAdmin(p, wantResponse=True, onResponse=onResponse)
diff --git a/meshtastic/paxcount_pb2.py b/meshtastic/paxcount_pb2.py
index 90450e66..890258fb 100644
--- a/meshtastic/paxcount_pb2.py
+++ b/meshtastic/paxcount_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/paxcount.proto\"5\n\x08Paxcount\x12\x0c\n\x04wifi\x18\x01 \x01(\r\x12\x0b\n\x03\x62le\x18\x02 \x01(\r\x12\x0e\n\x06uptime\x18\x03 \x01(\rBc\n\x13\x63om.geeksville.meshB\x0ePaxcountProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/paxcount.proto\x12\nmeshtastic\"5\n\x08Paxcount\x12\x0c\n\x04wifi\x18\x01 \x01(\r\x12\x0b\n\x03\x62le\x18\x02 \x01(\r\x12\x0e\n\x06uptime\x18\x03 \x01(\rBc\n\x13\x63om.geeksville.meshB\x0ePaxcountProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.paxcount_pb2', globals())
@@ -21,6 +21,6 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016PaxcountProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _PAXCOUNT._serialized_start=29
- _PAXCOUNT._serialized_end=82
+ _PAXCOUNT._serialized_start=41
+ _PAXCOUNT._serialized_end=94
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/paxcount_pb2.pyi b/meshtastic/paxcount_pb2.pyi
new file mode 100644
index 00000000..f4377a18
--- /dev/null
+++ b/meshtastic/paxcount_pb2.pyi
@@ -0,0 +1,49 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import sys
+
+if sys.version_info >= (3, 8):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class Paxcount(google.protobuf.message.Message):
+ """
+ TODO: REPLACE
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ WIFI_FIELD_NUMBER: builtins.int
+ BLE_FIELD_NUMBER: builtins.int
+ UPTIME_FIELD_NUMBER: builtins.int
+ wifi: builtins.int
+ """
+ seen Wifi devices
+ """
+ ble: builtins.int
+ """
+ Seen BLE devices
+ """
+ uptime: builtins.int
+ """
+ Uptime in seconds
+ """
+ def __init__(
+ self,
+ *,
+ wifi: builtins.int = ...,
+ ble: builtins.int = ...,
+ uptime: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["ble", b"ble", "uptime", b"uptime", "wifi", b"wifi"]) -> None: ...
+
+global___Paxcount = Paxcount
diff --git a/meshtastic/portnums_pb2.py b/meshtastic/portnums_pb2.py
index 8b7b67c0..77b164af 100644
--- a/meshtastic/portnums_pb2.py
+++ b/meshtastic/portnums_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/portnums.proto*\x8d\x04\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\x1f\n\x1bTEXT_MESSAGE_COMPRESSED_APP\x10\x07\x12\x10\n\x0cWAYPOINT_APP\x10\x08\x12\r\n\tAUDIO_APP\x10\t\x12\x18\n\x14\x44\x45TECTION_SENSOR_APP\x10\n\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12\x11\n\rTELEMETRY_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x11\n\rSIMULATOR_APP\x10\x45\x12\x12\n\x0eTRACEROUTE_APP\x10\x46\x12\x14\n\x10NEIGHBORINFO_APP\x10G\x12\x0f\n\x0b\x41TAK_PLUGIN\x10H\x12\x12\n\x0eMAP_REPORT_APP\x10I\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42]\n\x13\x63om.geeksville.meshB\x08PortnumsZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x19meshtastic/portnums.proto\x12\nmeshtastic*\x8d\x04\n\x07PortNum\x12\x0f\n\x0bUNKNOWN_APP\x10\x00\x12\x14\n\x10TEXT_MESSAGE_APP\x10\x01\x12\x17\n\x13REMOTE_HARDWARE_APP\x10\x02\x12\x10\n\x0cPOSITION_APP\x10\x03\x12\x10\n\x0cNODEINFO_APP\x10\x04\x12\x0f\n\x0bROUTING_APP\x10\x05\x12\r\n\tADMIN_APP\x10\x06\x12\x1f\n\x1bTEXT_MESSAGE_COMPRESSED_APP\x10\x07\x12\x10\n\x0cWAYPOINT_APP\x10\x08\x12\r\n\tAUDIO_APP\x10\t\x12\x18\n\x14\x44\x45TECTION_SENSOR_APP\x10\n\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x0e\n\nSERIAL_APP\x10@\x12\x15\n\x11STORE_FORWARD_APP\x10\x41\x12\x12\n\x0eRANGE_TEST_APP\x10\x42\x12\x11\n\rTELEMETRY_APP\x10\x43\x12\x0b\n\x07ZPS_APP\x10\x44\x12\x11\n\rSIMULATOR_APP\x10\x45\x12\x12\n\x0eTRACEROUTE_APP\x10\x46\x12\x14\n\x10NEIGHBORINFO_APP\x10G\x12\x0f\n\x0b\x41TAK_PLUGIN\x10H\x12\x12\n\x0eMAP_REPORT_APP\x10I\x12\x10\n\x0bPRIVATE_APP\x10\x80\x02\x12\x13\n\x0e\x41TAK_FORWARDER\x10\x81\x02\x12\x08\n\x03MAX\x10\xff\x03\x42]\n\x13\x63om.geeksville.meshB\x08PortnumsZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.portnums_pb2', globals())
@@ -21,6 +21,6 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _PORTNUM._serialized_start=30
- _PORTNUM._serialized_end=555
+ _PORTNUM._serialized_start=42
+ _PORTNUM._serialized_end=567
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/portnums_pb2.pyi b/meshtastic/portnums_pb2.pyi
new file mode 100644
index 00000000..a546cfa8
--- /dev/null
+++ b/meshtastic/portnums_pb2.pyi
@@ -0,0 +1,369 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.internal.enum_type_wrapper
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class _PortNum:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_PortNum.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ UNKNOWN_APP: _PortNum.ValueType # 0
+ """
+ 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
+ """
+ TEXT_MESSAGE_APP: _PortNum.ValueType # 1
+ """
+ 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 (?)
+ """
+ REMOTE_HARDWARE_APP: _PortNum.ValueType # 2
+ """
+ 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
+ """
+ POSITION_APP: _PortNum.ValueType # 3
+ """
+ The built-in position messaging app.
+ Payload is a Position message.
+ ENCODING: Protobuf
+ """
+ NODEINFO_APP: _PortNum.ValueType # 4
+ """
+ The built-in user info app.
+ Payload is a User message.
+ ENCODING: Protobuf
+ """
+ ROUTING_APP: _PortNum.ValueType # 5
+ """
+ Protocol control packets for mesh protocol use.
+ Payload is a Routing message.
+ ENCODING: Protobuf
+ """
+ ADMIN_APP: _PortNum.ValueType # 6
+ """
+ Admin control packets.
+ Payload is a AdminMessage message.
+ ENCODING: Protobuf
+ """
+ TEXT_MESSAGE_COMPRESSED_APP: _PortNum.ValueType # 7
+ """
+ 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.
+ """
+ WAYPOINT_APP: _PortNum.ValueType # 8
+ """
+ Waypoint payloads.
+ Payload is a Waypoint message.
+ ENCODING: Protobuf
+ """
+ AUDIO_APP: _PortNum.ValueType # 9
+ """
+ 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.
+ """
+ DETECTION_SENSOR_APP: _PortNum.ValueType # 10
+ """
+ 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
+ """
+ REPLY_APP: _PortNum.ValueType # 32
+ """
+ Provides a 'ping' service that replies to any packet it receives.
+ Also serves as a small example module.
+ ENCODING: ASCII Plaintext
+ """
+ IP_TUNNEL_APP: _PortNum.ValueType # 33
+ """
+ Used for the python IP tunnel feature
+ ENCODING: IP Packet. Handled by the python API, firmware ignores this one and pases on.
+ """
+ PAXCOUNTER_APP: _PortNum.ValueType # 34
+ """
+ Paxcounter lib included in the firmware
+ ENCODING: protobuf
+ """
+ SERIAL_APP: _PortNum.ValueType # 64
+ """
+ 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
+ """
+ STORE_FORWARD_APP: _PortNum.ValueType # 65
+ """
+ STORE_FORWARD_APP (Work in Progress)
+ Maintained by Jm Casler (MC Hamster) : jm@casler.org
+ ENCODING: Protobuf
+ """
+ RANGE_TEST_APP: _PortNum.ValueType # 66
+ """
+ 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
+ """
+ TELEMETRY_APP: _PortNum.ValueType # 67
+ """
+ Provides a format to send and receive telemetry data from the Meshtastic network.
+ Maintained by Charles Crossan (crossan007) : crossan007@gmail.com
+ ENCODING: Protobuf
+ """
+ ZPS_APP: _PortNum.ValueType # 68
+ """
+ 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
+ """
+ SIMULATOR_APP: _PortNum.ValueType # 69
+ """
+ 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 (?)
+ """
+ TRACEROUTE_APP: _PortNum.ValueType # 70
+ """
+ Provides a traceroute functionality to show the route a packet towards
+ a certain destination would take on the mesh.
+ ENCODING: Protobuf
+ """
+ NEIGHBORINFO_APP: _PortNum.ValueType # 71
+ """
+ Aggregates edge info for the network by sending out a list of each node's neighbors
+ ENCODING: Protobuf
+ """
+ ATAK_PLUGIN: _PortNum.ValueType # 72
+ """
+ ATAK Plugin
+ Portnum for payloads from the official Meshtastic ATAK plugin
+ """
+ MAP_REPORT_APP: _PortNum.ValueType # 73
+ """
+ Provides unencrypted information about a node for consumption by a map via MQTT
+ """
+ PRIVATE_APP: _PortNum.ValueType # 256
+ """
+ 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))
+ """
+ ATAK_FORWARDER: _PortNum.ValueType # 257
+ """
+ ATAK Forwarder Module https://github.com/paulmandal/atak-forwarder
+ ENCODING: libcotshrink
+ """
+ MAX: _PortNum.ValueType # 511
+ """
+ Currently we limit port nums to no higher than this value
+ """
+
+class PortNum(_PortNum, metaclass=_PortNumEnumTypeWrapper):
+ """
+ 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.
+ """
+
+UNKNOWN_APP: PortNum.ValueType # 0
+"""
+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
+"""
+TEXT_MESSAGE_APP: PortNum.ValueType # 1
+"""
+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 (?)
+"""
+REMOTE_HARDWARE_APP: PortNum.ValueType # 2
+"""
+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
+"""
+POSITION_APP: PortNum.ValueType # 3
+"""
+The built-in position messaging app.
+Payload is a Position message.
+ENCODING: Protobuf
+"""
+NODEINFO_APP: PortNum.ValueType # 4
+"""
+The built-in user info app.
+Payload is a User message.
+ENCODING: Protobuf
+"""
+ROUTING_APP: PortNum.ValueType # 5
+"""
+Protocol control packets for mesh protocol use.
+Payload is a Routing message.
+ENCODING: Protobuf
+"""
+ADMIN_APP: PortNum.ValueType # 6
+"""
+Admin control packets.
+Payload is a AdminMessage message.
+ENCODING: Protobuf
+"""
+TEXT_MESSAGE_COMPRESSED_APP: PortNum.ValueType # 7
+"""
+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.
+"""
+WAYPOINT_APP: PortNum.ValueType # 8
+"""
+Waypoint payloads.
+Payload is a Waypoint message.
+ENCODING: Protobuf
+"""
+AUDIO_APP: PortNum.ValueType # 9
+"""
+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.
+"""
+DETECTION_SENSOR_APP: PortNum.ValueType # 10
+"""
+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
+"""
+REPLY_APP: PortNum.ValueType # 32
+"""
+Provides a 'ping' service that replies to any packet it receives.
+Also serves as a small example module.
+ENCODING: ASCII Plaintext
+"""
+IP_TUNNEL_APP: PortNum.ValueType # 33
+"""
+Used for the python IP tunnel feature
+ENCODING: IP Packet. Handled by the python API, firmware ignores this one and pases on.
+"""
+PAXCOUNTER_APP: PortNum.ValueType # 34
+"""
+Paxcounter lib included in the firmware
+ENCODING: protobuf
+"""
+SERIAL_APP: PortNum.ValueType # 64
+"""
+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
+"""
+STORE_FORWARD_APP: PortNum.ValueType # 65
+"""
+STORE_FORWARD_APP (Work in Progress)
+Maintained by Jm Casler (MC Hamster) : jm@casler.org
+ENCODING: Protobuf
+"""
+RANGE_TEST_APP: PortNum.ValueType # 66
+"""
+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
+"""
+TELEMETRY_APP: PortNum.ValueType # 67
+"""
+Provides a format to send and receive telemetry data from the Meshtastic network.
+Maintained by Charles Crossan (crossan007) : crossan007@gmail.com
+ENCODING: Protobuf
+"""
+ZPS_APP: PortNum.ValueType # 68
+"""
+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
+"""
+SIMULATOR_APP: PortNum.ValueType # 69
+"""
+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 (?)
+"""
+TRACEROUTE_APP: PortNum.ValueType # 70
+"""
+Provides a traceroute functionality to show the route a packet towards
+a certain destination would take on the mesh.
+ENCODING: Protobuf
+"""
+NEIGHBORINFO_APP: PortNum.ValueType # 71
+"""
+Aggregates edge info for the network by sending out a list of each node's neighbors
+ENCODING: Protobuf
+"""
+ATAK_PLUGIN: PortNum.ValueType # 72
+"""
+ATAK Plugin
+Portnum for payloads from the official Meshtastic ATAK plugin
+"""
+MAP_REPORT_APP: PortNum.ValueType # 73
+"""
+Provides unencrypted information about a node for consumption by a map via MQTT
+"""
+PRIVATE_APP: PortNum.ValueType # 256
+"""
+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))
+"""
+ATAK_FORWARDER: PortNum.ValueType # 257
+"""
+ATAK Forwarder Module https://github.com/paulmandal/atak-forwarder
+ENCODING: libcotshrink
+"""
+MAX: PortNum.ValueType # 511
+"""
+Currently we limit port nums to no higher than this value
+"""
+global___PortNum = PortNum
diff --git a/meshtastic/remote_hardware.py b/meshtastic/remote_hardware.py
index b8fbc947..55c8c18a 100644
--- a/meshtastic/remote_hardware.py
+++ b/meshtastic/remote_hardware.py
@@ -2,7 +2,7 @@
"""
import logging
-from pubsub import pub
+from pubsub import pub # type: ignore[import-untyped]
from meshtastic import portnums_pb2, remote_hardware_pb2
from meshtastic.util import our_exit
diff --git a/meshtastic/remote_hardware_pb2.py b/meshtastic/remote_hardware_pb2.py
index 76803171..c1365ff2 100644
--- a/meshtastic/remote_hardware_pb2.py
+++ b/meshtastic/remote_hardware_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/remote_hardware.proto\"\xcb\x01\n\x0fHardwareMessage\x12#\n\x04type\x18\x01 \x01(\x0e\x32\x15.HardwareMessage.Type\x12\x11\n\tgpio_mask\x18\x02 \x01(\x04\x12\x12\n\ngpio_value\x18\x03 \x01(\x04\"l\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0f\n\x0bWRITE_GPIOS\x10\x01\x12\x0f\n\x0bWATCH_GPIOS\x10\x02\x12\x11\n\rGPIOS_CHANGED\x10\x03\x12\x0e\n\nREAD_GPIOS\x10\x04\x12\x14\n\x10READ_GPIOS_REPLY\x10\x05\x42\x63\n\x13\x63om.geeksville.meshB\x0eRemoteHardwareZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/remote_hardware.proto\x12\nmeshtastic\"\xd6\x01\n\x0fHardwareMessage\x12.\n\x04type\x18\x01 \x01(\x0e\x32 .meshtastic.HardwareMessage.Type\x12\x11\n\tgpio_mask\x18\x02 \x01(\x04\x12\x12\n\ngpio_value\x18\x03 \x01(\x04\"l\n\x04Type\x12\t\n\x05UNSET\x10\x00\x12\x0f\n\x0bWRITE_GPIOS\x10\x01\x12\x0f\n\x0bWATCH_GPIOS\x10\x02\x12\x11\n\rGPIOS_CHANGED\x10\x03\x12\x0e\n\nREAD_GPIOS\x10\x04\x12\x14\n\x10READ_GPIOS_REPLY\x10\x05\x42\x63\n\x13\x63om.geeksville.meshB\x0eRemoteHardwareZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.remote_hardware_pb2', globals())
@@ -21,8 +21,8 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016RemoteHardwareZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _HARDWAREMESSAGE._serialized_start=37
- _HARDWAREMESSAGE._serialized_end=240
- _HARDWAREMESSAGE_TYPE._serialized_start=132
- _HARDWAREMESSAGE_TYPE._serialized_end=240
+ _HARDWAREMESSAGE._serialized_start=49
+ _HARDWAREMESSAGE._serialized_end=263
+ _HARDWAREMESSAGE_TYPE._serialized_start=155
+ _HARDWAREMESSAGE_TYPE._serialized_end=263
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/remote_hardware_pb2.pyi b/meshtastic/remote_hardware_pb2.pyi
new file mode 100644
index 00000000..ff4fd839
--- /dev/null
+++ b/meshtastic/remote_hardware_pb2.pyi
@@ -0,0 +1,125 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class HardwareMessage(google.protobuf.message.Message):
+ """
+ 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?)
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _Type:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _TypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[HardwareMessage._Type.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ UNSET: HardwareMessage._Type.ValueType # 0
+ """
+ Unset/unused
+ """
+ WRITE_GPIOS: HardwareMessage._Type.ValueType # 1
+ """
+ Set gpio gpios based on gpio_mask/gpio_value
+ """
+ WATCH_GPIOS: HardwareMessage._Type.ValueType # 2
+ """
+ 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.
+ """
+ GPIOS_CHANGED: HardwareMessage._Type.ValueType # 3
+ """
+ The gpios listed in gpio_mask have changed, the new values are listed in gpio_value
+ """
+ READ_GPIOS: HardwareMessage._Type.ValueType # 4
+ """
+ Read the gpios specified in gpio_mask, send back a READ_GPIOS_REPLY reply with gpio_value populated
+ """
+ READ_GPIOS_REPLY: HardwareMessage._Type.ValueType # 5
+ """
+ A reply to READ_GPIOS. gpio_mask and gpio_value will be populated
+ """
+
+ class Type(_Type, metaclass=_TypeEnumTypeWrapper):
+ """
+ TODO: REPLACE
+ """
+
+ UNSET: HardwareMessage.Type.ValueType # 0
+ """
+ Unset/unused
+ """
+ WRITE_GPIOS: HardwareMessage.Type.ValueType # 1
+ """
+ Set gpio gpios based on gpio_mask/gpio_value
+ """
+ WATCH_GPIOS: HardwareMessage.Type.ValueType # 2
+ """
+ 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.
+ """
+ GPIOS_CHANGED: HardwareMessage.Type.ValueType # 3
+ """
+ The gpios listed in gpio_mask have changed, the new values are listed in gpio_value
+ """
+ READ_GPIOS: HardwareMessage.Type.ValueType # 4
+ """
+ Read the gpios specified in gpio_mask, send back a READ_GPIOS_REPLY reply with gpio_value populated
+ """
+ READ_GPIOS_REPLY: HardwareMessage.Type.ValueType # 5
+ """
+ A reply to READ_GPIOS. gpio_mask and gpio_value will be populated
+ """
+
+ TYPE_FIELD_NUMBER: builtins.int
+ GPIO_MASK_FIELD_NUMBER: builtins.int
+ GPIO_VALUE_FIELD_NUMBER: builtins.int
+ type: global___HardwareMessage.Type.ValueType
+ """
+ What type of HardwareMessage is this?
+ """
+ gpio_mask: builtins.int
+ """
+ What gpios are we changing. Not used for all MessageTypes, see MessageType for details
+ """
+ gpio_value: builtins.int
+ """
+ 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
+ """
+ def __init__(
+ self,
+ *,
+ type: global___HardwareMessage.Type.ValueType = ...,
+ gpio_mask: builtins.int = ...,
+ gpio_value: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["gpio_mask", b"gpio_mask", "gpio_value", b"gpio_value", "type", b"type"]) -> None: ...
+
+global___HardwareMessage = HardwareMessage
diff --git a/meshtastic/rtttl_pb2.py b/meshtastic/rtttl_pb2.py
index dc909a56..a69b8681 100644
--- a/meshtastic/rtttl_pb2.py
+++ b/meshtastic/rtttl_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/rtttl.proto\"\x1f\n\x0bRTTTLConfig\x12\x10\n\x08ringtone\x18\x01 \x01(\tBf\n\x13\x63om.geeksville.meshB\x11RTTTLConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x16meshtastic/rtttl.proto\x12\nmeshtastic\"\x1f\n\x0bRTTTLConfig\x12\x10\n\x08ringtone\x18\x01 \x01(\tBf\n\x13\x63om.geeksville.meshB\x11RTTTLConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.rtttl_pb2', globals())
@@ -21,6 +21,6 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\021RTTTLConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _RTTTLCONFIG._serialized_start=26
- _RTTTLCONFIG._serialized_end=57
+ _RTTTLCONFIG._serialized_start=38
+ _RTTTLCONFIG._serialized_end=69
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/rtttl_pb2.pyi b/meshtastic/rtttl_pb2.pyi
new file mode 100644
index 00000000..ddf8591c
--- /dev/null
+++ b/meshtastic/rtttl_pb2.pyi
@@ -0,0 +1,37 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.message
+import sys
+
+if sys.version_info >= (3, 8):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class RTTTLConfig(google.protobuf.message.Message):
+ """
+ Canned message module configuration.
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ RINGTONE_FIELD_NUMBER: builtins.int
+ ringtone: builtins.str
+ """
+ Ringtone for PWM Buzzer in RTTTL Format.
+ """
+ def __init__(
+ self,
+ *,
+ ringtone: builtins.str = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["ringtone", b"ringtone"]) -> None: ...
+
+global___RTTTLConfig = RTTTLConfig
diff --git a/meshtastic/serial_interface.py b/meshtastic/serial_interface.py
index d4f82c8a..0ae68aa3 100644
--- a/meshtastic/serial_interface.py
+++ b/meshtastic/serial_interface.py
@@ -4,7 +4,7 @@
import platform
import time
-import serial
+import serial # type: ignore[import-untyped]
import meshtastic.util
from meshtastic.stream_interface import StreamInterface
diff --git a/meshtastic/storeforward_pb2.py b/meshtastic/storeforward_pb2.py
index e3be3818..b81fd730 100644
--- a/meshtastic/storeforward_pb2.py
+++ b/meshtastic/storeforward_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmeshtastic/storeforward.proto\"\xf0\x06\n\x0fStoreAndForward\x12,\n\x02rr\x18\x01 \x01(\x0e\x32 .StoreAndForward.RequestResponse\x12,\n\x05stats\x18\x02 \x01(\x0b\x32\x1b.StoreAndForward.StatisticsH\x00\x12+\n\x07history\x18\x03 \x01(\x0b\x32\x18.StoreAndForward.HistoryH\x00\x12/\n\theartbeat\x18\x04 \x01(\x0b\x32\x1a.StoreAndForward.HeartbeatH\x00\x12\x0e\n\x04text\x18\x05 \x01(\x0cH\x00\x1a\xcd\x01\n\nStatistics\x12\x16\n\x0emessages_total\x18\x01 \x01(\r\x12\x16\n\x0emessages_saved\x18\x02 \x01(\r\x12\x14\n\x0cmessages_max\x18\x03 \x01(\r\x12\x0f\n\x07up_time\x18\x04 \x01(\r\x12\x10\n\x08requests\x18\x05 \x01(\r\x12\x18\n\x10requests_history\x18\x06 \x01(\r\x12\x11\n\theartbeat\x18\x07 \x01(\x08\x12\x12\n\nreturn_max\x18\x08 \x01(\r\x12\x15\n\rreturn_window\x18\t \x01(\r\x1aI\n\x07History\x12\x18\n\x10history_messages\x18\x01 \x01(\r\x12\x0e\n\x06window\x18\x02 \x01(\r\x12\x14\n\x0clast_request\x18\x03 \x01(\r\x1a.\n\tHeartbeat\x12\x0e\n\x06period\x18\x01 \x01(\r\x12\x11\n\tsecondary\x18\x02 \x01(\r\"\xbc\x02\n\x0fRequestResponse\x12\t\n\x05UNSET\x10\x00\x12\x10\n\x0cROUTER_ERROR\x10\x01\x12\x14\n\x10ROUTER_HEARTBEAT\x10\x02\x12\x0f\n\x0bROUTER_PING\x10\x03\x12\x0f\n\x0bROUTER_PONG\x10\x04\x12\x0f\n\x0bROUTER_BUSY\x10\x05\x12\x12\n\x0eROUTER_HISTORY\x10\x06\x12\x10\n\x0cROUTER_STATS\x10\x07\x12\x16\n\x12ROUTER_TEXT_DIRECT\x10\x08\x12\x19\n\x15ROUTER_TEXT_BROADCAST\x10\t\x12\x10\n\x0c\x43LIENT_ERROR\x10@\x12\x12\n\x0e\x43LIENT_HISTORY\x10\x41\x12\x10\n\x0c\x43LIENT_STATS\x10\x42\x12\x0f\n\x0b\x43LIENT_PING\x10\x43\x12\x0f\n\x0b\x43LIENT_PONG\x10\x44\x12\x10\n\x0c\x43LIENT_ABORT\x10jB\t\n\x07variantBj\n\x13\x63om.geeksville.meshB\x15StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmeshtastic/storeforward.proto\x12\nmeshtastic\"\x9c\x07\n\x0fStoreAndForward\x12\x37\n\x02rr\x18\x01 \x01(\x0e\x32+.meshtastic.StoreAndForward.RequestResponse\x12\x37\n\x05stats\x18\x02 \x01(\x0b\x32&.meshtastic.StoreAndForward.StatisticsH\x00\x12\x36\n\x07history\x18\x03 \x01(\x0b\x32#.meshtastic.StoreAndForward.HistoryH\x00\x12:\n\theartbeat\x18\x04 \x01(\x0b\x32%.meshtastic.StoreAndForward.HeartbeatH\x00\x12\x0e\n\x04text\x18\x05 \x01(\x0cH\x00\x1a\xcd\x01\n\nStatistics\x12\x16\n\x0emessages_total\x18\x01 \x01(\r\x12\x16\n\x0emessages_saved\x18\x02 \x01(\r\x12\x14\n\x0cmessages_max\x18\x03 \x01(\r\x12\x0f\n\x07up_time\x18\x04 \x01(\r\x12\x10\n\x08requests\x18\x05 \x01(\r\x12\x18\n\x10requests_history\x18\x06 \x01(\r\x12\x11\n\theartbeat\x18\x07 \x01(\x08\x12\x12\n\nreturn_max\x18\x08 \x01(\r\x12\x15\n\rreturn_window\x18\t \x01(\r\x1aI\n\x07History\x12\x18\n\x10history_messages\x18\x01 \x01(\r\x12\x0e\n\x06window\x18\x02 \x01(\r\x12\x14\n\x0clast_request\x18\x03 \x01(\r\x1a.\n\tHeartbeat\x12\x0e\n\x06period\x18\x01 \x01(\r\x12\x11\n\tsecondary\x18\x02 \x01(\r\"\xbc\x02\n\x0fRequestResponse\x12\t\n\x05UNSET\x10\x00\x12\x10\n\x0cROUTER_ERROR\x10\x01\x12\x14\n\x10ROUTER_HEARTBEAT\x10\x02\x12\x0f\n\x0bROUTER_PING\x10\x03\x12\x0f\n\x0bROUTER_PONG\x10\x04\x12\x0f\n\x0bROUTER_BUSY\x10\x05\x12\x12\n\x0eROUTER_HISTORY\x10\x06\x12\x10\n\x0cROUTER_STATS\x10\x07\x12\x16\n\x12ROUTER_TEXT_DIRECT\x10\x08\x12\x19\n\x15ROUTER_TEXT_BROADCAST\x10\t\x12\x10\n\x0c\x43LIENT_ERROR\x10@\x12\x12\n\x0e\x43LIENT_HISTORY\x10\x41\x12\x10\n\x0c\x43LIENT_STATS\x10\x42\x12\x0f\n\x0b\x43LIENT_PING\x10\x43\x12\x0f\n\x0b\x43LIENT_PONG\x10\x44\x12\x10\n\x0c\x43LIENT_ABORT\x10jB\t\n\x07variantBj\n\x13\x63om.geeksville.meshB\x15StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.storeforward_pb2', globals())
@@ -21,14 +21,14 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\025StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _STOREANDFORWARD._serialized_start=34
- _STOREANDFORWARD._serialized_end=914
- _STOREANDFORWARD_STATISTICS._serialized_start=256
- _STOREANDFORWARD_STATISTICS._serialized_end=461
- _STOREANDFORWARD_HISTORY._serialized_start=463
- _STOREANDFORWARD_HISTORY._serialized_end=536
- _STOREANDFORWARD_HEARTBEAT._serialized_start=538
- _STOREANDFORWARD_HEARTBEAT._serialized_end=584
- _STOREANDFORWARD_REQUESTRESPONSE._serialized_start=587
- _STOREANDFORWARD_REQUESTRESPONSE._serialized_end=903
+ _STOREANDFORWARD._serialized_start=46
+ _STOREANDFORWARD._serialized_end=970
+ _STOREANDFORWARD_STATISTICS._serialized_start=312
+ _STOREANDFORWARD_STATISTICS._serialized_end=517
+ _STOREANDFORWARD_HISTORY._serialized_start=519
+ _STOREANDFORWARD_HISTORY._serialized_end=592
+ _STOREANDFORWARD_HEARTBEAT._serialized_start=594
+ _STOREANDFORWARD_HEARTBEAT._serialized_end=640
+ _STOREANDFORWARD_REQUESTRESPONSE._serialized_start=643
+ _STOREANDFORWARD_REQUESTRESPONSE._serialized_end=959
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/storeforward_pb2.pyi b/meshtastic/storeforward_pb2.pyi
new file mode 100644
index 00000000..cd2d7519
--- /dev/null
+++ b/meshtastic/storeforward_pb2.pyi
@@ -0,0 +1,341 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class StoreAndForward(google.protobuf.message.Message):
+ """
+ TODO: REPLACE
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _RequestResponse:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _RequestResponseEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[StoreAndForward._RequestResponse.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ UNSET: StoreAndForward._RequestResponse.ValueType # 0
+ """
+ Unset/unused
+ """
+ ROUTER_ERROR: StoreAndForward._RequestResponse.ValueType # 1
+ """
+ Router is an in error state.
+ """
+ ROUTER_HEARTBEAT: StoreAndForward._RequestResponse.ValueType # 2
+ """
+ Router heartbeat
+ """
+ ROUTER_PING: StoreAndForward._RequestResponse.ValueType # 3
+ """
+ Router has requested the client respond. This can work as a
+ "are you there" message.
+ """
+ ROUTER_PONG: StoreAndForward._RequestResponse.ValueType # 4
+ """
+ The response to a "Ping"
+ """
+ ROUTER_BUSY: StoreAndForward._RequestResponse.ValueType # 5
+ """
+ Router is currently busy. Please try again later.
+ """
+ ROUTER_HISTORY: StoreAndForward._RequestResponse.ValueType # 6
+ """
+ Router is responding to a request for history.
+ """
+ ROUTER_STATS: StoreAndForward._RequestResponse.ValueType # 7
+ """
+ Router is responding to a request for stats.
+ """
+ ROUTER_TEXT_DIRECT: StoreAndForward._RequestResponse.ValueType # 8
+ """
+ Router sends a text message from its history that was a direct message.
+ """
+ ROUTER_TEXT_BROADCAST: StoreAndForward._RequestResponse.ValueType # 9
+ """
+ Router sends a text message from its history that was a broadcast.
+ """
+ CLIENT_ERROR: StoreAndForward._RequestResponse.ValueType # 64
+ """
+ Client is an in error state.
+ """
+ CLIENT_HISTORY: StoreAndForward._RequestResponse.ValueType # 65
+ """
+ Client has requested a replay from the router.
+ """
+ CLIENT_STATS: StoreAndForward._RequestResponse.ValueType # 66
+ """
+ Client has requested stats from the router.
+ """
+ CLIENT_PING: StoreAndForward._RequestResponse.ValueType # 67
+ """
+ Client has requested the router respond. This can work as a
+ "are you there" message.
+ """
+ CLIENT_PONG: StoreAndForward._RequestResponse.ValueType # 68
+ """
+ The response to a "Ping"
+ """
+ CLIENT_ABORT: StoreAndForward._RequestResponse.ValueType # 106
+ """
+ Client has requested that the router abort processing the client's request
+ """
+
+ class RequestResponse(_RequestResponse, metaclass=_RequestResponseEnumTypeWrapper):
+ """
+ 001 - 063 = From Router
+ 064 - 127 = From Client
+ """
+
+ UNSET: StoreAndForward.RequestResponse.ValueType # 0
+ """
+ Unset/unused
+ """
+ ROUTER_ERROR: StoreAndForward.RequestResponse.ValueType # 1
+ """
+ Router is an in error state.
+ """
+ ROUTER_HEARTBEAT: StoreAndForward.RequestResponse.ValueType # 2
+ """
+ Router heartbeat
+ """
+ ROUTER_PING: StoreAndForward.RequestResponse.ValueType # 3
+ """
+ Router has requested the client respond. This can work as a
+ "are you there" message.
+ """
+ ROUTER_PONG: StoreAndForward.RequestResponse.ValueType # 4
+ """
+ The response to a "Ping"
+ """
+ ROUTER_BUSY: StoreAndForward.RequestResponse.ValueType # 5
+ """
+ Router is currently busy. Please try again later.
+ """
+ ROUTER_HISTORY: StoreAndForward.RequestResponse.ValueType # 6
+ """
+ Router is responding to a request for history.
+ """
+ ROUTER_STATS: StoreAndForward.RequestResponse.ValueType # 7
+ """
+ Router is responding to a request for stats.
+ """
+ ROUTER_TEXT_DIRECT: StoreAndForward.RequestResponse.ValueType # 8
+ """
+ Router sends a text message from its history that was a direct message.
+ """
+ ROUTER_TEXT_BROADCAST: StoreAndForward.RequestResponse.ValueType # 9
+ """
+ Router sends a text message from its history that was a broadcast.
+ """
+ CLIENT_ERROR: StoreAndForward.RequestResponse.ValueType # 64
+ """
+ Client is an in error state.
+ """
+ CLIENT_HISTORY: StoreAndForward.RequestResponse.ValueType # 65
+ """
+ Client has requested a replay from the router.
+ """
+ CLIENT_STATS: StoreAndForward.RequestResponse.ValueType # 66
+ """
+ Client has requested stats from the router.
+ """
+ CLIENT_PING: StoreAndForward.RequestResponse.ValueType # 67
+ """
+ Client has requested the router respond. This can work as a
+ "are you there" message.
+ """
+ CLIENT_PONG: StoreAndForward.RequestResponse.ValueType # 68
+ """
+ The response to a "Ping"
+ """
+ CLIENT_ABORT: StoreAndForward.RequestResponse.ValueType # 106
+ """
+ Client has requested that the router abort processing the client's request
+ """
+
+ @typing_extensions.final
+ class Statistics(google.protobuf.message.Message):
+ """
+ TODO: REPLACE
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ MESSAGES_TOTAL_FIELD_NUMBER: builtins.int
+ MESSAGES_SAVED_FIELD_NUMBER: builtins.int
+ MESSAGES_MAX_FIELD_NUMBER: builtins.int
+ UP_TIME_FIELD_NUMBER: builtins.int
+ REQUESTS_FIELD_NUMBER: builtins.int
+ REQUESTS_HISTORY_FIELD_NUMBER: builtins.int
+ HEARTBEAT_FIELD_NUMBER: builtins.int
+ RETURN_MAX_FIELD_NUMBER: builtins.int
+ RETURN_WINDOW_FIELD_NUMBER: builtins.int
+ messages_total: builtins.int
+ """
+ Number of messages we have ever seen
+ """
+ messages_saved: builtins.int
+ """
+ Number of messages we have currently saved our history.
+ """
+ messages_max: builtins.int
+ """
+ Maximum number of messages we will save
+ """
+ up_time: builtins.int
+ """
+ Router uptime in seconds
+ """
+ requests: builtins.int
+ """
+ Number of times any client sent a request to the S&F.
+ """
+ requests_history: builtins.int
+ """
+ Number of times the history was requested.
+ """
+ heartbeat: builtins.bool
+ """
+ Is the heartbeat enabled on the server?
+ """
+ return_max: builtins.int
+ """
+ Maximum number of messages the server will return.
+ """
+ return_window: builtins.int
+ """
+ Maximum history window in minutes the server will return messages from.
+ """
+ def __init__(
+ self,
+ *,
+ messages_total: builtins.int = ...,
+ messages_saved: builtins.int = ...,
+ messages_max: builtins.int = ...,
+ up_time: builtins.int = ...,
+ requests: builtins.int = ...,
+ requests_history: builtins.int = ...,
+ heartbeat: builtins.bool = ...,
+ return_max: builtins.int = ...,
+ return_window: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["heartbeat", b"heartbeat", "messages_max", b"messages_max", "messages_saved", b"messages_saved", "messages_total", b"messages_total", "requests", b"requests", "requests_history", b"requests_history", "return_max", b"return_max", "return_window", b"return_window", "up_time", b"up_time"]) -> None: ...
+
+ @typing_extensions.final
+ class History(google.protobuf.message.Message):
+ """
+ TODO: REPLACE
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ HISTORY_MESSAGES_FIELD_NUMBER: builtins.int
+ WINDOW_FIELD_NUMBER: builtins.int
+ LAST_REQUEST_FIELD_NUMBER: builtins.int
+ history_messages: builtins.int
+ """
+ Number of that will be sent to the client
+ """
+ window: builtins.int
+ """
+ The window of messages that was used to filter the history client requested
+ """
+ last_request: builtins.int
+ """
+ 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.
+ """
+ def __init__(
+ self,
+ *,
+ history_messages: builtins.int = ...,
+ window: builtins.int = ...,
+ last_request: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["history_messages", b"history_messages", "last_request", b"last_request", "window", b"window"]) -> None: ...
+
+ @typing_extensions.final
+ class Heartbeat(google.protobuf.message.Message):
+ """
+ TODO: REPLACE
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ PERIOD_FIELD_NUMBER: builtins.int
+ SECONDARY_FIELD_NUMBER: builtins.int
+ period: builtins.int
+ """
+ Period in seconds that the heartbeat is sent out that will be sent to the client
+ """
+ secondary: builtins.int
+ """
+ If set, this is not the primary Store & Forward router on the mesh
+ """
+ def __init__(
+ self,
+ *,
+ period: builtins.int = ...,
+ secondary: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["period", b"period", "secondary", b"secondary"]) -> None: ...
+
+ RR_FIELD_NUMBER: builtins.int
+ STATS_FIELD_NUMBER: builtins.int
+ HISTORY_FIELD_NUMBER: builtins.int
+ HEARTBEAT_FIELD_NUMBER: builtins.int
+ TEXT_FIELD_NUMBER: builtins.int
+ rr: global___StoreAndForward.RequestResponse.ValueType
+ """
+ TODO: REPLACE
+ """
+ @property
+ def stats(self) -> global___StoreAndForward.Statistics:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def history(self) -> global___StoreAndForward.History:
+ """
+ TODO: REPLACE
+ """
+ @property
+ def heartbeat(self) -> global___StoreAndForward.Heartbeat:
+ """
+ TODO: REPLACE
+ """
+ text: builtins.bytes
+ """
+ Text from history message.
+ """
+ def __init__(
+ self,
+ *,
+ rr: global___StoreAndForward.RequestResponse.ValueType = ...,
+ stats: global___StoreAndForward.Statistics | None = ...,
+ history: global___StoreAndForward.History | None = ...,
+ heartbeat: global___StoreAndForward.Heartbeat | None = ...,
+ text: builtins.bytes = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["heartbeat", b"heartbeat", "history", b"history", "stats", b"stats", "text", b"text", "variant", b"variant"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["heartbeat", b"heartbeat", "history", b"history", "rr", b"rr", "stats", b"stats", "text", b"text", "variant", b"variant"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["variant", b"variant"]) -> typing_extensions.Literal["stats", "history", "heartbeat", "text"] | None: ...
+
+global___StoreAndForward = StoreAndForward
diff --git a/meshtastic/stream_interface.py b/meshtastic/stream_interface.py
index b5dc894c..d416785f 100644
--- a/meshtastic/stream_interface.py
+++ b/meshtastic/stream_interface.py
@@ -5,7 +5,7 @@
import time
import traceback
-import serial
+import serial # type: ignore[import-untyped]
from meshtastic.mesh_interface import MeshInterface
from meshtastic.util import is_windows11, stripnl
diff --git a/meshtastic/tcp_interface.py b/meshtastic/tcp_interface.py
index 4a5346d7..42263065 100644
--- a/meshtastic/tcp_interface.py
+++ b/meshtastic/tcp_interface.py
@@ -2,7 +2,7 @@
"""
import logging
import socket
-from typing import AnyStr
+from typing import Optional
from meshtastic.stream_interface import StreamInterface
@@ -12,7 +12,7 @@ class TCPInterface(StreamInterface):
def __init__(
self,
- hostname: AnyStr,
+ hostname: str,
debugOut=None,
noProto=False,
connectNow=True,
@@ -30,10 +30,10 @@ def __init__(
self.portNumber = portNumber
if connectNow:
- logging.debug(f"Connecting to {hostname}")
+ logging.debug(f"Connecting to {hostname}") # type: ignore[str-bytes-safe]
server_address = (hostname, portNumber)
sock = socket.create_connection(server_address)
- self.socket = sock
+ self.socket: Optional[socket.socket] = sock
else:
self.socket = None
diff --git a/meshtastic/telemetry_pb2.py b/meshtastic/telemetry_pb2.py
index 89103a0a..145ca4de 100644
--- a/meshtastic/telemetry_pb2.py
+++ b/meshtastic/telemetry_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1ameshtastic/telemetry.proto\"i\n\rDeviceMetrics\x12\x15\n\rbattery_level\x18\x01 \x01(\r\x12\x0f\n\x07voltage\x18\x02 \x01(\x02\x12\x1b\n\x13\x63hannel_utilization\x18\x03 \x01(\x02\x12\x13\n\x0b\x61ir_util_tx\x18\x04 \x01(\x02\"\x9b\x01\n\x12\x45nvironmentMetrics\x12\x13\n\x0btemperature\x18\x01 \x01(\x02\x12\x19\n\x11relative_humidity\x18\x02 \x01(\x02\x12\x1b\n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02\x12\x16\n\x0egas_resistance\x18\x04 \x01(\x02\x12\x0f\n\x07voltage\x18\x05 \x01(\x02\x12\x0f\n\x07\x63urrent\x18\x06 \x01(\x02\"\x8c\x01\n\x0cPowerMetrics\x12\x13\n\x0b\x63h1_voltage\x18\x01 \x01(\x02\x12\x13\n\x0b\x63h1_current\x18\x02 \x01(\x02\x12\x13\n\x0b\x63h2_voltage\x18\x03 \x01(\x02\x12\x13\n\x0b\x63h2_current\x18\x04 \x01(\x02\x12\x13\n\x0b\x63h3_voltage\x18\x05 \x01(\x02\x12\x13\n\x0b\x63h3_current\x18\x06 \x01(\x02\"\xbf\x02\n\x11\x41irQualityMetrics\x12\x15\n\rpm10_standard\x18\x01 \x01(\r\x12\x15\n\rpm25_standard\x18\x02 \x01(\r\x12\x16\n\x0epm100_standard\x18\x03 \x01(\r\x12\x1a\n\x12pm10_environmental\x18\x04 \x01(\r\x12\x1a\n\x12pm25_environmental\x18\x05 \x01(\r\x12\x1b\n\x13pm100_environmental\x18\x06 \x01(\r\x12\x16\n\x0eparticles_03um\x18\x07 \x01(\r\x12\x16\n\x0eparticles_05um\x18\x08 \x01(\r\x12\x16\n\x0eparticles_10um\x18\t \x01(\r\x12\x16\n\x0eparticles_25um\x18\n \x01(\r\x12\x16\n\x0eparticles_50um\x18\x0b \x01(\r\x12\x17\n\x0fparticles_100um\x18\x0c \x01(\r\"\xdd\x01\n\tTelemetry\x12\x0c\n\x04time\x18\x01 \x01(\x07\x12(\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\x0e.DeviceMetricsH\x00\x12\x32\n\x13\x65nvironment_metrics\x18\x03 \x01(\x0b\x32\x13.EnvironmentMetricsH\x00\x12\x31\n\x13\x61ir_quality_metrics\x18\x04 \x01(\x0b\x32\x12.AirQualityMetricsH\x00\x12&\n\rpower_metrics\x18\x05 \x01(\x0b\x32\r.PowerMetricsH\x00\x42\t\n\x07variant*\xe0\x01\n\x13TelemetrySensorType\x12\x10\n\x0cSENSOR_UNSET\x10\x00\x12\n\n\x06\x42ME280\x10\x01\x12\n\n\x06\x42ME680\x10\x02\x12\x0b\n\x07MCP9808\x10\x03\x12\n\n\x06INA260\x10\x04\x12\n\n\x06INA219\x10\x05\x12\n\n\x06\x42MP280\x10\x06\x12\t\n\x05SHTC3\x10\x07\x12\t\n\x05LPS22\x10\x08\x12\x0b\n\x07QMC6310\x10\t\x12\x0b\n\x07QMI8658\x10\n\x12\x0c\n\x08QMC5883L\x10\x0b\x12\t\n\x05SHT31\x10\x0c\x12\x0c\n\x08PMSA003I\x10\r\x12\x0b\n\x07INA3221\x10\x0e\x12\n\n\x06\x42MP085\x10\x0f\x42\x64\n\x13\x63om.geeksville.meshB\x0fTelemetryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1ameshtastic/telemetry.proto\x12\nmeshtastic\"i\n\rDeviceMetrics\x12\x15\n\rbattery_level\x18\x01 \x01(\r\x12\x0f\n\x07voltage\x18\x02 \x01(\x02\x12\x1b\n\x13\x63hannel_utilization\x18\x03 \x01(\x02\x12\x13\n\x0b\x61ir_util_tx\x18\x04 \x01(\x02\"\x9b\x01\n\x12\x45nvironmentMetrics\x12\x13\n\x0btemperature\x18\x01 \x01(\x02\x12\x19\n\x11relative_humidity\x18\x02 \x01(\x02\x12\x1b\n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02\x12\x16\n\x0egas_resistance\x18\x04 \x01(\x02\x12\x0f\n\x07voltage\x18\x05 \x01(\x02\x12\x0f\n\x07\x63urrent\x18\x06 \x01(\x02\"\x8c\x01\n\x0cPowerMetrics\x12\x13\n\x0b\x63h1_voltage\x18\x01 \x01(\x02\x12\x13\n\x0b\x63h1_current\x18\x02 \x01(\x02\x12\x13\n\x0b\x63h2_voltage\x18\x03 \x01(\x02\x12\x13\n\x0b\x63h2_current\x18\x04 \x01(\x02\x12\x13\n\x0b\x63h3_voltage\x18\x05 \x01(\x02\x12\x13\n\x0b\x63h3_current\x18\x06 \x01(\x02\"\xbf\x02\n\x11\x41irQualityMetrics\x12\x15\n\rpm10_standard\x18\x01 \x01(\r\x12\x15\n\rpm25_standard\x18\x02 \x01(\r\x12\x16\n\x0epm100_standard\x18\x03 \x01(\r\x12\x1a\n\x12pm10_environmental\x18\x04 \x01(\r\x12\x1a\n\x12pm25_environmental\x18\x05 \x01(\r\x12\x1b\n\x13pm100_environmental\x18\x06 \x01(\r\x12\x16\n\x0eparticles_03um\x18\x07 \x01(\r\x12\x16\n\x0eparticles_05um\x18\x08 \x01(\r\x12\x16\n\x0eparticles_10um\x18\t \x01(\r\x12\x16\n\x0eparticles_25um\x18\n \x01(\r\x12\x16\n\x0eparticles_50um\x18\x0b \x01(\r\x12\x17\n\x0fparticles_100um\x18\x0c \x01(\r\"\x89\x02\n\tTelemetry\x12\x0c\n\x04time\x18\x01 \x01(\x07\x12\x33\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\x19.meshtastic.DeviceMetricsH\x00\x12=\n\x13\x65nvironment_metrics\x18\x03 \x01(\x0b\x32\x1e.meshtastic.EnvironmentMetricsH\x00\x12<\n\x13\x61ir_quality_metrics\x18\x04 \x01(\x0b\x32\x1d.meshtastic.AirQualityMetricsH\x00\x12\x31\n\rpower_metrics\x18\x05 \x01(\x0b\x32\x18.meshtastic.PowerMetricsH\x00\x42\t\n\x07variant*\xe0\x01\n\x13TelemetrySensorType\x12\x10\n\x0cSENSOR_UNSET\x10\x00\x12\n\n\x06\x42ME280\x10\x01\x12\n\n\x06\x42ME680\x10\x02\x12\x0b\n\x07MCP9808\x10\x03\x12\n\n\x06INA260\x10\x04\x12\n\n\x06INA219\x10\x05\x12\n\n\x06\x42MP280\x10\x06\x12\t\n\x05SHTC3\x10\x07\x12\t\n\x05LPS22\x10\x08\x12\x0b\n\x07QMC6310\x10\t\x12\x0b\n\x07QMI8658\x10\n\x12\x0c\n\x08QMC5883L\x10\x0b\x12\t\n\x05SHT31\x10\x0c\x12\x0c\n\x08PMSA003I\x10\r\x12\x0b\n\x07INA3221\x10\x0e\x12\n\n\x06\x42MP085\x10\x0f\x42\x64\n\x13\x63om.geeksville.meshB\x0fTelemetryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.telemetry_pb2', globals())
@@ -21,16 +21,16 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\017TelemetryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _TELEMETRYSENSORTYPE._serialized_start=985
- _TELEMETRYSENSORTYPE._serialized_end=1209
- _DEVICEMETRICS._serialized_start=30
- _DEVICEMETRICS._serialized_end=135
- _ENVIRONMENTMETRICS._serialized_start=138
- _ENVIRONMENTMETRICS._serialized_end=293
- _POWERMETRICS._serialized_start=296
- _POWERMETRICS._serialized_end=436
- _AIRQUALITYMETRICS._serialized_start=439
- _AIRQUALITYMETRICS._serialized_end=758
- _TELEMETRY._serialized_start=761
- _TELEMETRY._serialized_end=982
+ _TELEMETRYSENSORTYPE._serialized_start=1041
+ _TELEMETRYSENSORTYPE._serialized_end=1265
+ _DEVICEMETRICS._serialized_start=42
+ _DEVICEMETRICS._serialized_end=147
+ _ENVIRONMENTMETRICS._serialized_start=150
+ _ENVIRONMENTMETRICS._serialized_end=305
+ _POWERMETRICS._serialized_start=308
+ _POWERMETRICS._serialized_end=448
+ _AIRQUALITYMETRICS._serialized_start=451
+ _AIRQUALITYMETRICS._serialized_end=770
+ _TELEMETRY._serialized_start=773
+ _TELEMETRY._serialized_end=1038
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/telemetry_pb2.pyi b/meshtastic/telemetry_pb2.pyi
new file mode 100644
index 00000000..597e048f
--- /dev/null
+++ b/meshtastic/telemetry_pb2.pyi
@@ -0,0 +1,443 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+class _TelemetrySensorType:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+class _TelemetrySensorTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_TelemetrySensorType.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ SENSOR_UNSET: _TelemetrySensorType.ValueType # 0
+ """
+ No external telemetry sensor explicitly set
+ """
+ BME280: _TelemetrySensorType.ValueType # 1
+ """
+ High accuracy temperature, pressure, humidity
+ """
+ BME680: _TelemetrySensorType.ValueType # 2
+ """
+ High accuracy temperature, pressure, humidity, and air resistance
+ """
+ MCP9808: _TelemetrySensorType.ValueType # 3
+ """
+ Very high accuracy temperature
+ """
+ INA260: _TelemetrySensorType.ValueType # 4
+ """
+ Moderate accuracy current and voltage
+ """
+ INA219: _TelemetrySensorType.ValueType # 5
+ """
+ Moderate accuracy current and voltage
+ """
+ BMP280: _TelemetrySensorType.ValueType # 6
+ """
+ High accuracy temperature and pressure
+ """
+ SHTC3: _TelemetrySensorType.ValueType # 7
+ """
+ High accuracy temperature and humidity
+ """
+ LPS22: _TelemetrySensorType.ValueType # 8
+ """
+ High accuracy pressure
+ """
+ QMC6310: _TelemetrySensorType.ValueType # 9
+ """
+ 3-Axis magnetic sensor
+ """
+ QMI8658: _TelemetrySensorType.ValueType # 10
+ """
+ 6-Axis inertial measurement sensor
+ """
+ QMC5883L: _TelemetrySensorType.ValueType # 11
+ """
+ 3-Axis magnetic sensor
+ """
+ SHT31: _TelemetrySensorType.ValueType # 12
+ """
+ High accuracy temperature and humidity
+ """
+ PMSA003I: _TelemetrySensorType.ValueType # 13
+ """
+ PM2.5 air quality sensor
+ """
+ INA3221: _TelemetrySensorType.ValueType # 14
+ """
+ INA3221 3 Channel Voltage / Current Sensor
+ """
+ BMP085: _TelemetrySensorType.ValueType # 15
+ """
+ BMP085/BMP180 High accuracy temperature and pressure (older Version of BMP280)
+ """
+
+class TelemetrySensorType(_TelemetrySensorType, metaclass=_TelemetrySensorTypeEnumTypeWrapper):
+ """
+ Supported I2C Sensors for telemetry in Meshtastic
+ """
+
+SENSOR_UNSET: TelemetrySensorType.ValueType # 0
+"""
+No external telemetry sensor explicitly set
+"""
+BME280: TelemetrySensorType.ValueType # 1
+"""
+High accuracy temperature, pressure, humidity
+"""
+BME680: TelemetrySensorType.ValueType # 2
+"""
+High accuracy temperature, pressure, humidity, and air resistance
+"""
+MCP9808: TelemetrySensorType.ValueType # 3
+"""
+Very high accuracy temperature
+"""
+INA260: TelemetrySensorType.ValueType # 4
+"""
+Moderate accuracy current and voltage
+"""
+INA219: TelemetrySensorType.ValueType # 5
+"""
+Moderate accuracy current and voltage
+"""
+BMP280: TelemetrySensorType.ValueType # 6
+"""
+High accuracy temperature and pressure
+"""
+SHTC3: TelemetrySensorType.ValueType # 7
+"""
+High accuracy temperature and humidity
+"""
+LPS22: TelemetrySensorType.ValueType # 8
+"""
+High accuracy pressure
+"""
+QMC6310: TelemetrySensorType.ValueType # 9
+"""
+3-Axis magnetic sensor
+"""
+QMI8658: TelemetrySensorType.ValueType # 10
+"""
+6-Axis inertial measurement sensor
+"""
+QMC5883L: TelemetrySensorType.ValueType # 11
+"""
+3-Axis magnetic sensor
+"""
+SHT31: TelemetrySensorType.ValueType # 12
+"""
+High accuracy temperature and humidity
+"""
+PMSA003I: TelemetrySensorType.ValueType # 13
+"""
+PM2.5 air quality sensor
+"""
+INA3221: TelemetrySensorType.ValueType # 14
+"""
+INA3221 3 Channel Voltage / Current Sensor
+"""
+BMP085: TelemetrySensorType.ValueType # 15
+"""
+BMP085/BMP180 High accuracy temperature and pressure (older Version of BMP280)
+"""
+global___TelemetrySensorType = TelemetrySensorType
+
+@typing_extensions.final
+class DeviceMetrics(google.protobuf.message.Message):
+ """
+ Key native device metrics such as battery level
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ BATTERY_LEVEL_FIELD_NUMBER: builtins.int
+ VOLTAGE_FIELD_NUMBER: builtins.int
+ CHANNEL_UTILIZATION_FIELD_NUMBER: builtins.int
+ AIR_UTIL_TX_FIELD_NUMBER: builtins.int
+ battery_level: builtins.int
+ """
+ 0-100 (>100 means powered)
+ """
+ voltage: builtins.float
+ """
+ Voltage measured
+ """
+ channel_utilization: builtins.float
+ """
+ Utilization for the current channel, including well formed TX, RX and malformed RX (aka noise).
+ """
+ air_util_tx: builtins.float
+ """
+ Percent of airtime for transmission used within the last hour.
+ """
+ def __init__(
+ self,
+ *,
+ battery_level: builtins.int = ...,
+ voltage: builtins.float = ...,
+ channel_utilization: builtins.float = ...,
+ air_util_tx: builtins.float = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["air_util_tx", b"air_util_tx", "battery_level", b"battery_level", "channel_utilization", b"channel_utilization", "voltage", b"voltage"]) -> None: ...
+
+global___DeviceMetrics = DeviceMetrics
+
+@typing_extensions.final
+class EnvironmentMetrics(google.protobuf.message.Message):
+ """
+ Weather station or other environmental metrics
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ TEMPERATURE_FIELD_NUMBER: builtins.int
+ RELATIVE_HUMIDITY_FIELD_NUMBER: builtins.int
+ BAROMETRIC_PRESSURE_FIELD_NUMBER: builtins.int
+ GAS_RESISTANCE_FIELD_NUMBER: builtins.int
+ VOLTAGE_FIELD_NUMBER: builtins.int
+ CURRENT_FIELD_NUMBER: builtins.int
+ temperature: builtins.float
+ """
+ Temperature measured
+ """
+ relative_humidity: builtins.float
+ """
+ Relative humidity percent measured
+ """
+ barometric_pressure: builtins.float
+ """
+ Barometric pressure in hPA measured
+ """
+ gas_resistance: builtins.float
+ """
+ Gas resistance in MOhm measured
+ """
+ voltage: builtins.float
+ """
+ Voltage measured (To be depreciated in favor of PowerMetrics in Meshtastic 3.x)
+ """
+ current: builtins.float
+ """
+ Current measured (To be depreciated in favor of PowerMetrics in Meshtastic 3.x)
+ """
+ def __init__(
+ self,
+ *,
+ temperature: builtins.float = ...,
+ relative_humidity: builtins.float = ...,
+ barometric_pressure: builtins.float = ...,
+ gas_resistance: builtins.float = ...,
+ voltage: builtins.float = ...,
+ current: builtins.float = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["barometric_pressure", b"barometric_pressure", "current", b"current", "gas_resistance", b"gas_resistance", "relative_humidity", b"relative_humidity", "temperature", b"temperature", "voltage", b"voltage"]) -> None: ...
+
+global___EnvironmentMetrics = EnvironmentMetrics
+
+@typing_extensions.final
+class PowerMetrics(google.protobuf.message.Message):
+ """
+ Power Metrics (voltage / current / etc)
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ CH1_VOLTAGE_FIELD_NUMBER: builtins.int
+ CH1_CURRENT_FIELD_NUMBER: builtins.int
+ CH2_VOLTAGE_FIELD_NUMBER: builtins.int
+ CH2_CURRENT_FIELD_NUMBER: builtins.int
+ CH3_VOLTAGE_FIELD_NUMBER: builtins.int
+ CH3_CURRENT_FIELD_NUMBER: builtins.int
+ ch1_voltage: builtins.float
+ """
+ Voltage (Ch1)
+ """
+ ch1_current: builtins.float
+ """
+ Current (Ch1)
+ """
+ ch2_voltage: builtins.float
+ """
+ Voltage (Ch2)
+ """
+ ch2_current: builtins.float
+ """
+ Current (Ch2)
+ """
+ ch3_voltage: builtins.float
+ """
+ Voltage (Ch3)
+ """
+ ch3_current: builtins.float
+ """
+ Current (Ch3)
+ """
+ def __init__(
+ self,
+ *,
+ ch1_voltage: builtins.float = ...,
+ ch1_current: builtins.float = ...,
+ ch2_voltage: builtins.float = ...,
+ ch2_current: builtins.float = ...,
+ ch3_voltage: builtins.float = ...,
+ ch3_current: builtins.float = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["ch1_current", b"ch1_current", "ch1_voltage", b"ch1_voltage", "ch2_current", b"ch2_current", "ch2_voltage", b"ch2_voltage", "ch3_current", b"ch3_current", "ch3_voltage", b"ch3_voltage"]) -> None: ...
+
+global___PowerMetrics = PowerMetrics
+
+@typing_extensions.final
+class AirQualityMetrics(google.protobuf.message.Message):
+ """
+ Air quality metrics
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ PM10_STANDARD_FIELD_NUMBER: builtins.int
+ PM25_STANDARD_FIELD_NUMBER: builtins.int
+ PM100_STANDARD_FIELD_NUMBER: builtins.int
+ PM10_ENVIRONMENTAL_FIELD_NUMBER: builtins.int
+ PM25_ENVIRONMENTAL_FIELD_NUMBER: builtins.int
+ PM100_ENVIRONMENTAL_FIELD_NUMBER: builtins.int
+ PARTICLES_03UM_FIELD_NUMBER: builtins.int
+ PARTICLES_05UM_FIELD_NUMBER: builtins.int
+ PARTICLES_10UM_FIELD_NUMBER: builtins.int
+ PARTICLES_25UM_FIELD_NUMBER: builtins.int
+ PARTICLES_50UM_FIELD_NUMBER: builtins.int
+ PARTICLES_100UM_FIELD_NUMBER: builtins.int
+ pm10_standard: builtins.int
+ """
+ Concentration Units Standard PM1.0
+ """
+ pm25_standard: builtins.int
+ """
+ Concentration Units Standard PM2.5
+ """
+ pm100_standard: builtins.int
+ """
+ Concentration Units Standard PM10.0
+ """
+ pm10_environmental: builtins.int
+ """
+ Concentration Units Environmental PM1.0
+ """
+ pm25_environmental: builtins.int
+ """
+ Concentration Units Environmental PM2.5
+ """
+ pm100_environmental: builtins.int
+ """
+ Concentration Units Environmental PM10.0
+ """
+ particles_03um: builtins.int
+ """
+ 0.3um Particle Count
+ """
+ particles_05um: builtins.int
+ """
+ 0.5um Particle Count
+ """
+ particles_10um: builtins.int
+ """
+ 1.0um Particle Count
+ """
+ particles_25um: builtins.int
+ """
+ 2.5um Particle Count
+ """
+ particles_50um: builtins.int
+ """
+ 5.0um Particle Count
+ """
+ particles_100um: builtins.int
+ """
+ 10.0um Particle Count
+ """
+ def __init__(
+ self,
+ *,
+ pm10_standard: builtins.int = ...,
+ pm25_standard: builtins.int = ...,
+ pm100_standard: builtins.int = ...,
+ pm10_environmental: builtins.int = ...,
+ pm25_environmental: builtins.int = ...,
+ pm100_environmental: builtins.int = ...,
+ particles_03um: builtins.int = ...,
+ particles_05um: builtins.int = ...,
+ particles_10um: builtins.int = ...,
+ particles_25um: builtins.int = ...,
+ particles_50um: builtins.int = ...,
+ particles_100um: builtins.int = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["particles_03um", b"particles_03um", "particles_05um", b"particles_05um", "particles_100um", b"particles_100um", "particles_10um", b"particles_10um", "particles_25um", b"particles_25um", "particles_50um", b"particles_50um", "pm100_environmental", b"pm100_environmental", "pm100_standard", b"pm100_standard", "pm10_environmental", b"pm10_environmental", "pm10_standard", b"pm10_standard", "pm25_environmental", b"pm25_environmental", "pm25_standard", b"pm25_standard"]) -> None: ...
+
+global___AirQualityMetrics = AirQualityMetrics
+
+@typing_extensions.final
+class Telemetry(google.protobuf.message.Message):
+ """
+ Types of Measurements the telemetry module is equipped to handle
+ """
+
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ TIME_FIELD_NUMBER: builtins.int
+ DEVICE_METRICS_FIELD_NUMBER: builtins.int
+ ENVIRONMENT_METRICS_FIELD_NUMBER: builtins.int
+ AIR_QUALITY_METRICS_FIELD_NUMBER: builtins.int
+ POWER_METRICS_FIELD_NUMBER: builtins.int
+ time: builtins.int
+ """
+ Seconds since 1970 - or 0 for unknown/unset
+ """
+ @property
+ def device_metrics(self) -> global___DeviceMetrics:
+ """
+ Key native device metrics such as battery level
+ """
+ @property
+ def environment_metrics(self) -> global___EnvironmentMetrics:
+ """
+ Weather station or other environmental metrics
+ """
+ @property
+ def air_quality_metrics(self) -> global___AirQualityMetrics:
+ """
+ Air quality metrics
+ """
+ @property
+ def power_metrics(self) -> global___PowerMetrics:
+ """
+ Power Metrics
+ """
+ def __init__(
+ self,
+ *,
+ time: builtins.int = ...,
+ device_metrics: global___DeviceMetrics | None = ...,
+ environment_metrics: global___EnvironmentMetrics | None = ...,
+ air_quality_metrics: global___AirQualityMetrics | None = ...,
+ power_metrics: global___PowerMetrics | None = ...,
+ ) -> None: ...
+ def HasField(self, field_name: typing_extensions.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "power_metrics", b"power_metrics", "variant", b"variant"]) -> builtins.bool: ...
+ def ClearField(self, field_name: typing_extensions.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "power_metrics", b"power_metrics", "time", b"time", "variant", b"variant"]) -> None: ...
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["variant", b"variant"]) -> typing_extensions.Literal["device_metrics", "environment_metrics", "air_quality_metrics", "power_metrics"] | None: ...
+
+global___Telemetry = Telemetry
diff --git a/meshtastic/test.py b/meshtastic/test.py
index 85d881ab..97947d4f 100644
--- a/meshtastic/test.py
+++ b/meshtastic/test.py
@@ -6,11 +6,11 @@
import time
import traceback
-from dotmap import DotMap
-from pubsub import pub
+from dotmap import DotMap # type: ignore[import-untyped]
+from pubsub import pub # type: ignore[import-untyped]
import meshtastic.util
-from meshtastic.__init__ import BROADCAST_NUM
+from meshtastic import BROADCAST_NUM
from meshtastic.serial_interface import SerialInterface
from meshtastic.tcp_interface import TCPInterface
diff --git a/meshtastic/tests/test_init.py b/meshtastic/tests/test_init.py
index a1d54405..c69f0a16 100644
--- a/meshtastic/tests/test_init.py
+++ b/meshtastic/tests/test_init.py
@@ -6,7 +6,7 @@
import pytest
-from meshtastic.__init__ import _onNodeInfoReceive, _onPositionReceive, _onTextReceive
+from meshtastic import _onNodeInfoReceive, _onPositionReceive, _onTextReceive
from ..globals import Globals
from ..serial_interface import SerialInterface
diff --git a/meshtastic/tests/test_mesh_interface.py b/meshtastic/tests/test_mesh_interface.py
index 74075009..06679330 100644
--- a/meshtastic/tests/test_mesh_interface.py
+++ b/meshtastic/tests/test_mesh_interface.py
@@ -6,8 +6,7 @@
import pytest
-from .. import mesh_pb2
-from ..__init__ import BROADCAST_ADDR, LOCAL_ADDR
+from .. import mesh_pb2, BROADCAST_ADDR, LOCAL_ADDR
from ..mesh_interface import MeshInterface
from ..node import Node
diff --git a/meshtastic/tunnel.py b/meshtastic/tunnel.py
index 63412b7e..51837c99 100644
--- a/meshtastic/tunnel.py
+++ b/meshtastic/tunnel.py
@@ -19,7 +19,7 @@
import platform
import threading
-from pubsub import pub
+from pubsub import pub # type: ignore[import-untyped]
from pytap2 import TapDevice
from meshtastic import portnums_pb2
diff --git a/meshtastic/xmodem_pb2.py b/meshtastic/xmodem_pb2.py
index 9e939c7a..a352c637 100644
--- a/meshtastic/xmodem_pb2.py
+++ b/meshtastic/xmodem_pb2.py
@@ -13,7 +13,7 @@
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17meshtastic/xmodem.proto\"\xab\x01\n\x06XModem\x12 \n\x07\x63ontrol\x18\x01 \x01(\x0e\x32\x0f.XModem.Control\x12\x0b\n\x03seq\x18\x02 \x01(\r\x12\r\n\x05\x63rc16\x18\x03 \x01(\r\x12\x0e\n\x06\x62uffer\x18\x04 \x01(\x0c\"S\n\x07\x43ontrol\x12\x07\n\x03NUL\x10\x00\x12\x07\n\x03SOH\x10\x01\x12\x07\n\x03STX\x10\x02\x12\x07\n\x03\x45OT\x10\x04\x12\x07\n\x03\x41\x43K\x10\x06\x12\x07\n\x03NAK\x10\x15\x12\x07\n\x03\x43\x41N\x10\x18\x12\t\n\x05\x43TRLZ\x10\x1a\x42\x61\n\x13\x63om.geeksville.meshB\x0cXmodemProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17meshtastic/xmodem.proto\x12\nmeshtastic\"\xb6\x01\n\x06XModem\x12+\n\x07\x63ontrol\x18\x01 \x01(\x0e\x32\x1a.meshtastic.XModem.Control\x12\x0b\n\x03seq\x18\x02 \x01(\r\x12\r\n\x05\x63rc16\x18\x03 \x01(\r\x12\x0e\n\x06\x62uffer\x18\x04 \x01(\x0c\"S\n\x07\x43ontrol\x12\x07\n\x03NUL\x10\x00\x12\x07\n\x03SOH\x10\x01\x12\x07\n\x03STX\x10\x02\x12\x07\n\x03\x45OT\x10\x04\x12\x07\n\x03\x41\x43K\x10\x06\x12\x07\n\x03NAK\x10\x15\x12\x07\n\x03\x43\x41N\x10\x18\x12\t\n\x05\x43TRLZ\x10\x1a\x42\x61\n\x13\x63om.geeksville.meshB\x0cXmodemProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3')
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.xmodem_pb2', globals())
@@ -21,8 +21,8 @@
DESCRIPTOR._options = None
DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\014XmodemProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000'
- _XMODEM._serialized_start=28
- _XMODEM._serialized_end=199
- _XMODEM_CONTROL._serialized_start=116
- _XMODEM_CONTROL._serialized_end=199
+ _XMODEM._serialized_start=40
+ _XMODEM._serialized_end=222
+ _XMODEM_CONTROL._serialized_start=139
+ _XMODEM_CONTROL._serialized_end=222
# @@protoc_insertion_point(module_scope)
diff --git a/meshtastic/xmodem_pb2.pyi b/meshtastic/xmodem_pb2.pyi
new file mode 100644
index 00000000..07d76bd0
--- /dev/null
+++ b/meshtastic/xmodem_pb2.pyi
@@ -0,0 +1,66 @@
+"""
+@generated by mypy-protobuf. Do not edit manually!
+isort:skip_file
+"""
+import builtins
+import google.protobuf.descriptor
+import google.protobuf.internal.enum_type_wrapper
+import google.protobuf.message
+import sys
+import typing
+
+if sys.version_info >= (3, 10):
+ import typing as typing_extensions
+else:
+ import typing_extensions
+
+DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
+
+@typing_extensions.final
+class XModem(google.protobuf.message.Message):
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
+
+ class _Control:
+ ValueType = typing.NewType("ValueType", builtins.int)
+ V: typing_extensions.TypeAlias = ValueType
+
+ class _ControlEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[XModem._Control.ValueType], builtins.type):
+ DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
+ NUL: XModem._Control.ValueType # 0
+ SOH: XModem._Control.ValueType # 1
+ STX: XModem._Control.ValueType # 2
+ EOT: XModem._Control.ValueType # 4
+ ACK: XModem._Control.ValueType # 6
+ NAK: XModem._Control.ValueType # 21
+ CAN: XModem._Control.ValueType # 24
+ CTRLZ: XModem._Control.ValueType # 26
+
+ class Control(_Control, metaclass=_ControlEnumTypeWrapper): ...
+ NUL: XModem.Control.ValueType # 0
+ SOH: XModem.Control.ValueType # 1
+ STX: XModem.Control.ValueType # 2
+ EOT: XModem.Control.ValueType # 4
+ ACK: XModem.Control.ValueType # 6
+ NAK: XModem.Control.ValueType # 21
+ CAN: XModem.Control.ValueType # 24
+ CTRLZ: XModem.Control.ValueType # 26
+
+ CONTROL_FIELD_NUMBER: builtins.int
+ SEQ_FIELD_NUMBER: builtins.int
+ CRC16_FIELD_NUMBER: builtins.int
+ BUFFER_FIELD_NUMBER: builtins.int
+ control: global___XModem.Control.ValueType
+ seq: builtins.int
+ crc16: builtins.int
+ buffer: builtins.bytes
+ def __init__(
+ self,
+ *,
+ control: global___XModem.Control.ValueType = ...,
+ seq: builtins.int = ...,
+ crc16: builtins.int = ...,
+ buffer: builtins.bytes = ...,
+ ) -> None: ...
+ def ClearField(self, field_name: typing_extensions.Literal["buffer", b"buffer", "control", b"control", "crc16", b"crc16", "seq", b"seq"]) -> None: ...
+
+global___XModem = XModem
diff --git a/requirements.txt b/requirements.txt
index 524cd9da..480ba1ec 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -20,3 +20,10 @@ pdoc3
pypubsub
bleak
packaging
+mypy
+mypy-protobuf
+types-protobuf
+types-tabulate
+types-requests
+types-setuptools
+types-PyYAML