From 852949575b6884c7ea916f6e33755f87e0eae2eb Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Thu, 20 Feb 2025 11:39:16 -0700 Subject: [PATCH 01/38] Enable setting things from more than one configuration section with `--set`, using a configuration transaction. --- meshtastic/__main__.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index f4dbc1d..e5a9243 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -597,6 +597,7 @@ def onConnected(interface): # Handle the int/float/bool arguments pref = None + fields = set() for pref in args.set: found = False field = splitCompoundName(pref[0].lower())[0] @@ -609,11 +610,19 @@ def onConnected(interface): ) found = setPref(config, pref[0], pref[1]) if found: + fields.add(field) break if found: print("Writing modified preferences to device") - node.writeConfig(field) + if len(fields) > 1: + print("Using a configuration transaction") + node.beginSettingsTransaction() + for field in fields: + print(f"Writing {field} configuration to device") + node.writeConfig(field) + if len(fields) > 1: + node.commitSettingsTransaction() else: if mt_config.camel_case: print( @@ -1417,7 +1426,7 @@ def addConfigArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: "--get", help=( "Get a preferences field. Use an invalid field such as '0' to get a list of all fields." - " Can use either snake_case or camelCase format. (ex: 'ls_secs' or 'lsSecs')" + " Can use either snake_case or camelCase format. (ex: 'power.ls_secs' or 'power.lsSecs')" ), nargs=1, action="append", @@ -1426,7 +1435,11 @@ def addConfigArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentParser: group.add_argument( "--set", - help="Set a preferences field. Can use either snake_case or camelCase format. (ex: 'ls_secs' or 'lsSecs')", + help=( + "Set a preferences field. Can use either snake_case or camelCase format." + " (ex: 'power.ls_secs' or 'power.lsSecs'). May be less reliable when" + " setting properties from more than one configuration section." + ), nargs=2, action="append", metavar=("FIELD", "VALUE"), From faa8064ccc7e93848d8602f5645ffe8e084f2a08 Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Sun, 2 Mar 2025 12:14:20 -0700 Subject: [PATCH 02/38] protobufs: v2.6.0 --- meshtastic/protobuf/admin_pb2.py | 22 +++--- meshtastic/protobuf/admin_pb2.pyi | 49 +++++++++++- meshtastic/protobuf/device_ui_pb2.py | 24 +++--- meshtastic/protobuf/device_ui_pb2.pyi | 75 +++++++++++++++++- meshtastic/protobuf/deviceonly_pb2.py | 33 ++++---- meshtastic/protobuf/deviceonly_pb2.pyi | 103 ++++++++++++++++++++++--- protobufs | 2 +- 7 files changed, 259 insertions(+), 49 deletions(-) diff --git a/meshtastic/protobuf/admin_pb2.py b/meshtastic/protobuf/admin_pb2.py index 6be3af1..4e27d74 100644 --- a/meshtastic/protobuf/admin_pb2.py +++ b/meshtastic/protobuf/admin_pb2.py @@ -19,7 +19,7 @@ from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/protobuf/admin.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a+meshtastic/protobuf/connection_status.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a#meshtastic/protobuf/device_ui.proto\"\xe7\x15\n\x0c\x41\x64minMessage\x12\x17\n\x0fsession_passkey\x18\x65 \x01(\x0c\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12<\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12\x37\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12J\n\x12get_config_request\x18\x05 \x01(\x0e\x32,.meshtastic.protobuf.AdminMessage.ConfigTypeH\x00\x12:\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12W\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.AdminMessage.ModuleConfigTypeH\x00\x12G\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32!.meshtastic.protobuf.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\x12K\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32#.meshtastic.protobuf.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\x12\\\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32+.meshtastic.protobuf.DeviceConnectionStatusH\x00\x12:\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\".meshtastic.protobuf.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12\x65\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32\x33.meshtastic.protobuf.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\x13\n\tset_scale\x18\x17 \x01(\rH\x00\x12.\n\tset_owner\x18 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12\x33\n\x0bset_channel\x18! \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x31\n\nset_config\x18\" \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12>\n\x11set_module_config\x18# \x01(\x0b\x32!.meshtastic.protobuf.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\x1d.meshtastic.protobuf.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18* \x01(\x08H\x00\x12\x17\n\rset_time_only\x18+ \x01(\x07H\x00\x12\x1f\n\x15get_ui_config_request\x18, \x01(\x08H\x00\x12\x45\n\x16get_ui_config_response\x18- \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12>\n\x0fstore_ui_config\x18. \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12\x1a\n\x10set_ignored_node\x18/ \x01(\rH\x00\x12\x1d\n\x13remove_ignored_node\x18\x30 \x01(\rH\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\x1e\n\x14\x66\x61\x63tory_reset_device\x18^ \x01(\x05H\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\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x05H\x00\"\xd6\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\x12\x13\n\x0fSECURITY_CONFIG\x10\x07\x12\x15\n\x11SESSIONKEY_CONFIG\x10\x08\x12\x13\n\x0f\x44\x45VICEUI_CONFIG\x10\t\"\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\"o\n\x1eNodeRemoteHardwarePinsResponse\x12M\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32*.meshtastic.protobuf.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\x1fmeshtastic/protobuf/admin.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a+meshtastic/protobuf/connection_status.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a#meshtastic/protobuf/device_ui.proto\"\x84\x18\n\x0c\x41\x64minMessage\x12\x17\n\x0fsession_passkey\x18\x65 \x01(\x0c\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12<\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12\x37\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12J\n\x12get_config_request\x18\x05 \x01(\x0e\x32,.meshtastic.protobuf.AdminMessage.ConfigTypeH\x00\x12:\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12W\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.AdminMessage.ModuleConfigTypeH\x00\x12G\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32!.meshtastic.protobuf.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\x12K\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32#.meshtastic.protobuf.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\x12\\\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32+.meshtastic.protobuf.DeviceConnectionStatusH\x00\x12:\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\".meshtastic.protobuf.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12\x65\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32\x33.meshtastic.protobuf.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\x13\n\tset_scale\x18\x17 \x01(\rH\x00\x12N\n\x12\x62\x61\x63kup_preferences\x18\x18 \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12O\n\x13restore_preferences\x18\x19 \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12U\n\x19remove_backup_preferences\x18\x1a \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12.\n\tset_owner\x18 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12\x33\n\x0bset_channel\x18! \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x31\n\nset_config\x18\" \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12>\n\x11set_module_config\x18# \x01(\x0b\x32!.meshtastic.protobuf.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\x1d.meshtastic.protobuf.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18* \x01(\x08H\x00\x12\x17\n\rset_time_only\x18+ \x01(\x07H\x00\x12\x1f\n\x15get_ui_config_request\x18, \x01(\x08H\x00\x12\x45\n\x16get_ui_config_response\x18- \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12>\n\x0fstore_ui_config\x18. \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12\x1a\n\x10set_ignored_node\x18/ \x01(\rH\x00\x12\x1d\n\x13remove_ignored_node\x18\x30 \x01(\rH\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\x1e\n\x14\x66\x61\x63tory_reset_device\x18^ \x01(\x05H\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\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x05H\x00\"\xd6\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\x12\x13\n\x0fSECURITY_CONFIG\x10\x07\x12\x15\n\x11SESSIONKEY_CONFIG\x10\x08\x12\x13\n\x0f\x44\x45VICEUI_CONFIG\x10\t\"\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\"#\n\x0e\x42\x61\x63kupLocation\x12\t\n\x05\x46LASH\x10\x00\x12\x06\n\x02SD\x10\x01\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\"o\n\x1eNodeRemoteHardwarePinsResponse\x12M\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePinB`\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -28,13 +28,15 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_ADMINMESSAGE']._serialized_start=281 - _globals['_ADMINMESSAGE']._serialized_end=3072 - _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=2521 - _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=2735 - _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=2738 - _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=3053 - _globals['_HAMPARAMETERS']._serialized_start=3074 - _globals['_HAMPARAMETERS']._serialized_end=3165 - _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=3167 - _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=3278 + _globals['_ADMINMESSAGE']._serialized_end=3357 + _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=2769 + _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=2983 + _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=2986 + _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=3301 + _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_start=3303 + _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_end=3338 + _globals['_HAMPARAMETERS']._serialized_start=3359 + _globals['_HAMPARAMETERS']._serialized_end=3450 + _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=3452 + _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=3563 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/admin_pb2.pyi b/meshtastic/protobuf/admin_pb2.pyi index 2c11635..6d5614c 100644 --- a/meshtastic/protobuf/admin_pb2.pyi +++ b/meshtastic/protobuf/admin_pb2.pyi @@ -241,6 +241,31 @@ class AdminMessage(google.protobuf.message.Message): TODO: REPLACE """ + class _BackupLocation: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _BackupLocationEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[AdminMessage._BackupLocation.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + FLASH: AdminMessage._BackupLocation.ValueType # 0 + """ + Backup to the internal flash + """ + SD: AdminMessage._BackupLocation.ValueType # 1 + """ + Backup to the SD card + """ + + class BackupLocation(_BackupLocation, metaclass=_BackupLocationEnumTypeWrapper): ... + FLASH: AdminMessage.BackupLocation.ValueType # 0 + """ + Backup to the internal flash + """ + SD: AdminMessage.BackupLocation.ValueType # 1 + """ + Backup to the SD card + """ + SESSION_PASSKEY_FIELD_NUMBER: builtins.int GET_CHANNEL_REQUEST_FIELD_NUMBER: builtins.int GET_CHANNEL_RESPONSE_FIELD_NUMBER: builtins.int @@ -264,6 +289,9 @@ class AdminMessage(google.protobuf.message.Message): ENTER_DFU_MODE_REQUEST_FIELD_NUMBER: builtins.int DELETE_FILE_REQUEST_FIELD_NUMBER: builtins.int SET_SCALE_FIELD_NUMBER: builtins.int + BACKUP_PREFERENCES_FIELD_NUMBER: builtins.int + RESTORE_PREFERENCES_FIELD_NUMBER: builtins.int + REMOVE_BACKUP_PREFERENCES_FIELD_NUMBER: builtins.int SET_OWNER_FIELD_NUMBER: builtins.int SET_CHANNEL_FIELD_NUMBER: builtins.int SET_CONFIG_FIELD_NUMBER: builtins.int @@ -354,6 +382,18 @@ class AdminMessage(google.protobuf.message.Message): """ Set zero and offset for scale chips """ + backup_preferences: global___AdminMessage.BackupLocation.ValueType + """ + Backup the node's preferences + """ + restore_preferences: global___AdminMessage.BackupLocation.ValueType + """ + Restore the node's preferences + """ + remove_backup_preferences: global___AdminMessage.BackupLocation.ValueType + """ + Remove backups of the node's preferences + """ set_canned_message_module_messages: builtins.str """ Set the Canned Message Module messages text. @@ -554,6 +594,9 @@ class AdminMessage(google.protobuf.message.Message): enter_dfu_mode_request: builtins.bool = ..., delete_file_request: builtins.str = ..., set_scale: builtins.int = ..., + backup_preferences: global___AdminMessage.BackupLocation.ValueType = ..., + restore_preferences: global___AdminMessage.BackupLocation.ValueType = ..., + remove_backup_preferences: global___AdminMessage.BackupLocation.ValueType = ..., set_owner: meshtastic.protobuf.mesh_pb2.User | None = ..., set_channel: meshtastic.protobuf.channel_pb2.Channel | None = ..., set_config: meshtastic.protobuf.config_pb2.Config | None = ..., @@ -581,9 +624,9 @@ class AdminMessage(google.protobuf.message.Message): factory_reset_config: builtins.int = ..., nodedb_reset: builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing.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_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "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", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_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", "remove_ignored_node", b"remove_ignored_node", "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_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.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_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "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", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_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", "remove_ignored_node", b"remove_ignored_node", "session_passkey", b"session_passkey", "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_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.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_scale", "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", "set_time_only", "get_ui_config_request", "get_ui_config_response", "store_ui_config", "set_ignored_node", "remove_ignored_node", "begin_edit_settings", "commit_edit_settings", "factory_reset_device", "reboot_ota_seconds", "exit_simulator", "reboot_seconds", "shutdown_seconds", "factory_reset_config", "nodedb_reset"] | None: ... + def HasField(self, field_name: typing.Literal["backup_preferences", b"backup_preferences", "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_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "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", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_response", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", b"remove_ignored_node", "restore_preferences", b"restore_preferences", "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_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["backup_preferences", b"backup_preferences", "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_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "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", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_response", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", b"remove_ignored_node", "restore_preferences", b"restore_preferences", "session_passkey", b"session_passkey", "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_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.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_scale", "backup_preferences", "restore_preferences", "remove_backup_preferences", "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", "set_time_only", "get_ui_config_request", "get_ui_config_response", "store_ui_config", "set_ignored_node", "remove_ignored_node", "begin_edit_settings", "commit_edit_settings", "factory_reset_device", "reboot_ota_seconds", "exit_simulator", "reboot_seconds", "shutdown_seconds", "factory_reset_config", "nodedb_reset"] | None: ... global___AdminMessage = AdminMessage diff --git a/meshtastic/protobuf/device_ui_pb2.py b/meshtastic/protobuf/device_ui_pb2.py index b88027d..ac6a4fc 100644 --- a/meshtastic/protobuf/device_ui_pb2.py +++ b/meshtastic/protobuf/device_ui_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\"\xbf\x03\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x19\n\x11screen_brightness\x18\x02 \x01(\r\x12\x16\n\x0escreen_timeout\x18\x03 \x01(\r\x12\x13\n\x0bscreen_lock\x18\x04 \x01(\x08\x12\x15\n\rsettings_lock\x18\x05 \x01(\x08\x12\x10\n\x08pin_code\x18\x06 \x01(\r\x12)\n\x05theme\x18\x07 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x15\n\ralert_enabled\x18\x08 \x01(\x08\x12\x16\n\x0e\x62\x61nner_enabled\x18\t \x01(\x08\x12\x14\n\x0cring_tone_id\x18\n \x01(\r\x12/\n\x08language\x18\x0b \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\r \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x18\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\"\xa7\x01\n\nNodeFilter\x12\x16\n\x0eunknown_switch\x18\x01 \x01(\x08\x12\x16\n\x0eoffline_switch\x18\x02 \x01(\x08\x12\x19\n\x11public_key_switch\x18\x03 \x01(\x08\x12\x11\n\thops_away\x18\x04 \x01(\x05\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x11\n\tnode_name\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\x05\"~\n\rNodeHighlight\x12\x13\n\x0b\x63hat_switch\x18\x01 \x01(\x08\x12\x17\n\x0fposition_switch\x18\x02 \x01(\x08\x12\x18\n\x10telemetry_switch\x18\x03 \x01(\x08\x12\x12\n\niaq_switch\x18\x04 \x01(\x08\x12\x11\n\tnode_name\x18\x05 \x01(\t*%\n\x05Theme\x12\x08\n\x04\x44\x41RK\x10\x00\x12\t\n\x05LIGHT\x10\x01\x12\x07\n\x03RED\x10\x02*\x8b\x02\n\x08Language\x12\x0b\n\x07\x45NGLISH\x10\x00\x12\n\n\x06\x46RENCH\x10\x01\x12\n\n\x06GERMAN\x10\x02\x12\x0b\n\x07ITALIAN\x10\x03\x12\x0e\n\nPORTUGUESE\x10\x04\x12\x0b\n\x07SPANISH\x10\x05\x12\x0b\n\x07SWEDISH\x10\x06\x12\x0b\n\x07\x46INNISH\x10\x07\x12\n\n\x06POLISH\x10\x08\x12\x0b\n\x07TURKISH\x10\t\x12\x0b\n\x07SERBIAN\x10\n\x12\x0b\n\x07RUSSIAN\x10\x0b\x12\t\n\x05\x44UTCH\x10\x0c\x12\t\n\x05GREEK\x10\r\x12\r\n\tNORWEGIAN\x10\x0e\x12\r\n\tSLOVENIAN\x10\x0f\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x63\n\x13\x63om.geeksville.meshB\x0e\x44\x65viceUIProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\"\xeb\x03\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x19\n\x11screen_brightness\x18\x02 \x01(\r\x12\x16\n\x0escreen_timeout\x18\x03 \x01(\r\x12\x13\n\x0bscreen_lock\x18\x04 \x01(\x08\x12\x15\n\rsettings_lock\x18\x05 \x01(\x08\x12\x10\n\x08pin_code\x18\x06 \x01(\r\x12)\n\x05theme\x18\x07 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x15\n\ralert_enabled\x18\x08 \x01(\x08\x12\x16\n\x0e\x62\x61nner_enabled\x18\t \x01(\x08\x12\x14\n\x0cring_tone_id\x18\n \x01(\r\x12/\n\x08language\x18\x0b \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\r \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x18\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\x12*\n\x08map_data\x18\x0f \x01(\x0b\x32\x18.meshtastic.protobuf.Map\"\xa7\x01\n\nNodeFilter\x12\x16\n\x0eunknown_switch\x18\x01 \x01(\x08\x12\x16\n\x0eoffline_switch\x18\x02 \x01(\x08\x12\x19\n\x11public_key_switch\x18\x03 \x01(\x08\x12\x11\n\thops_away\x18\x04 \x01(\x05\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x11\n\tnode_name\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\x05\"~\n\rNodeHighlight\x12\x13\n\x0b\x63hat_switch\x18\x01 \x01(\x08\x12\x17\n\x0fposition_switch\x18\x02 \x01(\x08\x12\x18\n\x10telemetry_switch\x18\x03 \x01(\x08\x12\x12\n\niaq_switch\x18\x04 \x01(\x08\x12\x11\n\tnode_name\x18\x05 \x01(\t\"=\n\x08GeoPoint\x12\x0c\n\x04zoom\x18\x01 \x01(\x05\x12\x10\n\x08latitude\x18\x02 \x01(\x05\x12\x11\n\tlongitude\x18\x03 \x01(\x05\"U\n\x03Map\x12+\n\x04home\x18\x01 \x01(\x0b\x32\x1d.meshtastic.protobuf.GeoPoint\x12\r\n\x05style\x18\x02 \x01(\t\x12\x12\n\nfollow_gps\x18\x03 \x01(\x08*%\n\x05Theme\x12\x08\n\x04\x44\x41RK\x10\x00\x12\t\n\x05LIGHT\x10\x01\x12\x07\n\x03RED\x10\x02*\x8b\x02\n\x08Language\x12\x0b\n\x07\x45NGLISH\x10\x00\x12\n\n\x06\x46RENCH\x10\x01\x12\n\n\x06GERMAN\x10\x02\x12\x0b\n\x07ITALIAN\x10\x03\x12\x0e\n\nPORTUGUESE\x10\x04\x12\x0b\n\x07SPANISH\x10\x05\x12\x0b\n\x07SWEDISH\x10\x06\x12\x0b\n\x07\x46INNISH\x10\x07\x12\n\n\x06POLISH\x10\x08\x12\x0b\n\x07TURKISH\x10\t\x12\x0b\n\x07SERBIAN\x10\n\x12\x0b\n\x07RUSSIAN\x10\x0b\x12\t\n\x05\x44UTCH\x10\x0c\x12\t\n\x05GREEK\x10\r\x12\r\n\tNORWEGIAN\x10\x0e\x12\r\n\tSLOVENIAN\x10\x0f\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x63\n\x13\x63om.geeksville.meshB\x0e\x44\x65viceUIProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -21,14 +21,18 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.device_ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\016DeviceUIProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _globals['_THEME']._serialized_start=808 - _globals['_THEME']._serialized_end=845 - _globals['_LANGUAGE']._serialized_start=848 - _globals['_LANGUAGE']._serialized_end=1115 + _globals['_THEME']._serialized_start=1002 + _globals['_THEME']._serialized_end=1039 + _globals['_LANGUAGE']._serialized_start=1042 + _globals['_LANGUAGE']._serialized_end=1309 _globals['_DEVICEUICONFIG']._serialized_start=61 - _globals['_DEVICEUICONFIG']._serialized_end=508 - _globals['_NODEFILTER']._serialized_start=511 - _globals['_NODEFILTER']._serialized_end=678 - _globals['_NODEHIGHLIGHT']._serialized_start=680 - _globals['_NODEHIGHLIGHT']._serialized_end=806 + _globals['_DEVICEUICONFIG']._serialized_end=552 + _globals['_NODEFILTER']._serialized_start=555 + _globals['_NODEFILTER']._serialized_end=722 + _globals['_NODEHIGHLIGHT']._serialized_start=724 + _globals['_NODEHIGHLIGHT']._serialized_end=850 + _globals['_GEOPOINT']._serialized_start=852 + _globals['_GEOPOINT']._serialized_end=913 + _globals['_MAP']._serialized_start=915 + _globals['_MAP']._serialized_end=1000 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/device_ui_pb2.pyi b/meshtastic/protobuf/device_ui_pb2.pyi index 5caab9f..1d3f7fb 100644 --- a/meshtastic/protobuf/device_ui_pb2.pyi +++ b/meshtastic/protobuf/device_ui_pb2.pyi @@ -232,6 +232,7 @@ class DeviceUIConfig(google.protobuf.message.Message): NODE_FILTER_FIELD_NUMBER: builtins.int NODE_HIGHLIGHT_FIELD_NUMBER: builtins.int CALIBRATION_DATA_FIELD_NUMBER: builtins.int + MAP_DATA_FIELD_NUMBER: builtins.int version: builtins.int """ A version integer used to invalidate saved files when we make incompatible changes. @@ -280,6 +281,12 @@ class DeviceUIConfig(google.protobuf.message.Message): Node list highlightening """ + @property + def map_data(self) -> global___Map: + """ + Map related data + """ + def __init__( self, *, @@ -297,9 +304,10 @@ class DeviceUIConfig(google.protobuf.message.Message): node_filter: global___NodeFilter | None = ..., node_highlight: global___NodeHighlight | None = ..., calibration_data: builtins.bytes = ..., + map_data: global___Map | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["node_filter", b"node_filter", "node_highlight", b"node_highlight"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["alert_enabled", b"alert_enabled", "banner_enabled", b"banner_enabled", "calibration_data", b"calibration_data", "language", b"language", "node_filter", b"node_filter", "node_highlight", b"node_highlight", "pin_code", b"pin_code", "ring_tone_id", b"ring_tone_id", "screen_brightness", b"screen_brightness", "screen_lock", b"screen_lock", "screen_timeout", b"screen_timeout", "settings_lock", b"settings_lock", "theme", b"theme", "version", b"version"]) -> None: ... + def HasField(self, field_name: typing.Literal["map_data", b"map_data", "node_filter", b"node_filter", "node_highlight", b"node_highlight"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["alert_enabled", b"alert_enabled", "banner_enabled", b"banner_enabled", "calibration_data", b"calibration_data", "language", b"language", "map_data", b"map_data", "node_filter", b"node_filter", "node_highlight", b"node_highlight", "pin_code", b"pin_code", "ring_tone_id", b"ring_tone_id", "screen_brightness", b"screen_brightness", "screen_lock", b"screen_lock", "screen_timeout", b"screen_timeout", "settings_lock", b"settings_lock", "theme", b"theme", "version", b"version"]) -> None: ... global___DeviceUIConfig = DeviceUIConfig @@ -398,3 +406,66 @@ class NodeHighlight(google.protobuf.message.Message): def ClearField(self, field_name: typing.Literal["chat_switch", b"chat_switch", "iaq_switch", b"iaq_switch", "node_name", b"node_name", "position_switch", b"position_switch", "telemetry_switch", b"telemetry_switch"]) -> None: ... global___NodeHighlight = NodeHighlight + +@typing.final +class GeoPoint(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ZOOM_FIELD_NUMBER: builtins.int + LATITUDE_FIELD_NUMBER: builtins.int + LONGITUDE_FIELD_NUMBER: builtins.int + zoom: builtins.int + """ + Zoom level + """ + latitude: builtins.int + """ + Coordinate: latitude + """ + longitude: builtins.int + """ + Coordinate: longitude + """ + def __init__( + self, + *, + zoom: builtins.int = ..., + latitude: builtins.int = ..., + longitude: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["latitude", b"latitude", "longitude", b"longitude", "zoom", b"zoom"]) -> None: ... + +global___GeoPoint = GeoPoint + +@typing.final +class Map(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + HOME_FIELD_NUMBER: builtins.int + STYLE_FIELD_NUMBER: builtins.int + FOLLOW_GPS_FIELD_NUMBER: builtins.int + style: builtins.str + """ + Map tile style + """ + follow_gps: builtins.bool + """ + Map scroll follows GPS + """ + @property + def home(self) -> global___GeoPoint: + """ + Home coordinates + """ + + def __init__( + self, + *, + home: global___GeoPoint | None = ..., + style: builtins.str = ..., + follow_gps: builtins.bool = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["home", b"home"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["follow_gps", b"follow_gps", "home", b"home", "style", b"style"]) -> None: ... + +global___Map = Map diff --git a/meshtastic/protobuf/deviceonly_pb2.py b/meshtastic/protobuf/deviceonly_pb2.py index 51727ad..afe0c13 100644 --- a/meshtastic/protobuf/deviceonly_pb2.py +++ b/meshtastic/protobuf/deviceonly_pb2.py @@ -15,10 +15,11 @@ from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_chann from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2 from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2 from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2 +from meshtastic.protobuf import localonly_pb2 as meshtastic_dot_protobuf_dot_localonly__pb2 import nanopb_pb2 as nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/config.proto\x1a\x0cnanopb.proto\"\x99\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\'.meshtastic.protobuf.Position.LocSource\"\xe2\x01\n\x08UserLite\x12\x13\n\x07macaddr\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x05 \x01(\x08\x12;\n\x04role\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x07 \x01(\x0c\"\xde\x02\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12+\n\x04user\x18\x02 \x01(\x0b\x32\x1d.meshtastic.protobuf.UserLite\x12\x33\n\x08position\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x10\n\x08next_hop\x18\x0c \x01(\rB\x0c\n\n_hops_away\"\x82\x04\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x03 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x36\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x38\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x1f.meshtastic.protobuf.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\x34\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12M\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\x12\x63\n\x0cnode_db_lite\x18\x0e \x03(\x0b\x32!.meshtastic.protobuf.NodeInfoLiteB*\x92?\'\x92\x01$std::vector\"N\n\x0b\x43hannelFile\x12.\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.Channel\x12\x0f\n\x07version\x18\x02 \x01(\rBm\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$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/localonly.proto\x1a\x0cnanopb.proto\"\x99\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\'.meshtastic.protobuf.Position.LocSource\"\xe2\x01\n\x08UserLite\x12\x13\n\x07macaddr\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x05 \x01(\x08\x12;\n\x04role\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x07 \x01(\x0c\"\xde\x02\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12+\n\x04user\x18\x02 \x01(\x0b\x32\x1d.meshtastic.protobuf.UserLite\x12\x33\n\x08position\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x10\n\x08next_hop\x18\x0c \x01(\rB\x0c\n\n_hops_away\"\xa1\x03\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x03 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x36\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x38\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x19\n\rdid_gps_reset\x18\x0b \x01(\x08\x42\x02\x18\x01\x12\x34\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12M\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"}\n\x0cNodeDatabase\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\\\n\x05nodes\x18\x02 \x03(\x0b\x32!.meshtastic.protobuf.NodeInfoLiteB*\x92?\'\x92\x01$std::vector\"N\n\x0b\x43hannelFile\x12.\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\x86\x02\n\x11\x42\x61\x63kupPreferences\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x07\x12\x30\n\x06\x63onfig\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfig\x12=\n\rmodule_config\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfig\x12\x32\n\x08\x63hannels\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.ChannelFile\x12(\n\x05owner\x18\x06 \x01(\x0b\x32\x19.meshtastic.protobuf.UserBm\n\x13\x63om.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -30,16 +31,22 @@ if _descriptor._USE_C_DESCRIPTORS == False: _USERLITE.fields_by_name['macaddr']._serialized_options = b'\030\001' _DEVICESTATE.fields_by_name['no_save']._options = None _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' - _globals['_POSITIONLITE']._serialized_start=214 - _globals['_POSITIONLITE']._serialized_end=367 - _globals['_USERLITE']._serialized_start=370 - _globals['_USERLITE']._serialized_end=596 - _globals['_NODEINFOLITE']._serialized_start=599 - _globals['_NODEINFOLITE']._serialized_end=949 - _globals['_DEVICESTATE']._serialized_start=952 - _globals['_DEVICESTATE']._serialized_end=1466 - _globals['_CHANNELFILE']._serialized_start=1468 - _globals['_CHANNELFILE']._serialized_end=1546 + _DEVICESTATE.fields_by_name['did_gps_reset']._options = None + _DEVICESTATE.fields_by_name['did_gps_reset']._serialized_options = b'\030\001' + _NODEDATABASE.fields_by_name['nodes']._options = None + _NODEDATABASE.fields_by_name['nodes']._serialized_options = b'\222?\'\222\001$std::vector' + _globals['_POSITIONLITE']._serialized_start=251 + _globals['_POSITIONLITE']._serialized_end=404 + _globals['_USERLITE']._serialized_start=407 + _globals['_USERLITE']._serialized_end=633 + _globals['_NODEINFOLITE']._serialized_start=636 + _globals['_NODEINFOLITE']._serialized_end=986 + _globals['_DEVICESTATE']._serialized_start=989 + _globals['_DEVICESTATE']._serialized_end=1406 + _globals['_NODEDATABASE']._serialized_start=1408 + _globals['_NODEDATABASE']._serialized_end=1533 + _globals['_CHANNELFILE']._serialized_start=1535 + _globals['_CHANNELFILE']._serialized_end=1613 + _globals['_BACKUPPREFERENCES']._serialized_start=1616 + _globals['_BACKUPPREFERENCES']._serialized_end=1878 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/deviceonly_pb2.pyi b/meshtastic/protobuf/deviceonly_pb2.pyi index cf9d64e..e23709d 100644 --- a/meshtastic/protobuf/deviceonly_pb2.pyi +++ b/meshtastic/protobuf/deviceonly_pb2.pyi @@ -10,6 +10,7 @@ import google.protobuf.internal.containers import google.protobuf.message import meshtastic.protobuf.channel_pb2 import meshtastic.protobuf.config_pb2 +import meshtastic.protobuf.localonly_pb2 import meshtastic.protobuf.mesh_pb2 import meshtastic.protobuf.telemetry_pb2 import typing @@ -245,7 +246,6 @@ class DeviceState(google.protobuf.message.Message): 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 version: builtins.int """ A version integer used to invalidate old save files when we make @@ -260,7 +260,8 @@ class DeviceState(google.protobuf.message.Message): """ did_gps_reset: builtins.bool """ - Some GPS receivers seem to have bogus settings from the factory, so we always do one factory reset. + Previously used to manage GPS factory resets. + Deprecated in 2.5.23 """ @property def my_node(self) -> meshtastic.protobuf.mesh_pb2.MyNodeInfo: @@ -302,12 +303,6 @@ class DeviceState(google.protobuf.message.Message): 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, *, @@ -320,13 +315,40 @@ class DeviceState(google.protobuf.message.Message): did_gps_reset: builtins.bool = ..., rx_waypoint: meshtastic.protobuf.mesh_pb2.MeshPacket | None = ..., node_remote_hardware_pins: collections.abc.Iterable[meshtastic.protobuf.mesh_pb2.NodeRemoteHardwarePin] | None = ..., - node_db_lite: collections.abc.Iterable[global___NodeInfoLite] | None = ..., ) -> None: ... def HasField(self, field_name: typing.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.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: ... + def ClearField(self, field_name: typing.Literal["did_gps_reset", b"did_gps_reset", "my_node", b"my_node", "no_save", b"no_save", "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.final +class NodeDatabase(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + VERSION_FIELD_NUMBER: builtins.int + NODES_FIELD_NUMBER: builtins.int + 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 nodes(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NodeInfoLite]: + """ + New lite version of NodeDB to decrease memory footprint + """ + + def __init__( + self, + *, + version: builtins.int = ..., + nodes: collections.abc.Iterable[global___NodeInfoLite] | None = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["nodes", b"nodes", "version", b"version"]) -> None: ... + +global___NodeDatabase = NodeDatabase + @typing.final class ChannelFile(google.protobuf.message.Message): """ @@ -358,3 +380,64 @@ class ChannelFile(google.protobuf.message.Message): def ClearField(self, field_name: typing.Literal["channels", b"channels", "version", b"version"]) -> None: ... global___ChannelFile = ChannelFile + +@typing.final +class BackupPreferences(google.protobuf.message.Message): + """ + The on-disk backup of the node's preferences + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + VERSION_FIELD_NUMBER: builtins.int + TIMESTAMP_FIELD_NUMBER: builtins.int + CONFIG_FIELD_NUMBER: builtins.int + MODULE_CONFIG_FIELD_NUMBER: builtins.int + CHANNELS_FIELD_NUMBER: builtins.int + OWNER_FIELD_NUMBER: builtins.int + version: builtins.int + """ + The version of the backup + """ + timestamp: builtins.int + """ + The timestamp of the backup (if node has time) + """ + @property + def config(self) -> meshtastic.protobuf.localonly_pb2.LocalConfig: + """ + The node's configuration + """ + + @property + def module_config(self) -> meshtastic.protobuf.localonly_pb2.LocalModuleConfig: + """ + The node's module configuration + """ + + @property + def channels(self) -> global___ChannelFile: + """ + The node's channels + """ + + @property + def owner(self) -> meshtastic.protobuf.mesh_pb2.User: + """ + The node's user (owner) information + """ + + def __init__( + self, + *, + version: builtins.int = ..., + timestamp: builtins.int = ..., + config: meshtastic.protobuf.localonly_pb2.LocalConfig | None = ..., + module_config: meshtastic.protobuf.localonly_pb2.LocalModuleConfig | None = ..., + channels: global___ChannelFile | None = ..., + owner: meshtastic.protobuf.mesh_pb2.User | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["channels", b"channels", "config", b"config", "module_config", b"module_config", "owner", b"owner"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["channels", b"channels", "config", b"config", "module_config", b"module_config", "owner", b"owner", "timestamp", b"timestamp", "version", b"version"]) -> None: ... + +global___BackupPreferences = BackupPreferences diff --git a/protobufs b/protobufs index 0686466..2a3a67f 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 068646653e8375fc145988026ad242a3cf70f7ab +Subproject commit 2a3a67f0431926dc3f32a8b216d264daab09b9bf From 3710e6e90979e3da09839b22fe46527d7e1e068d Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Mon, 3 Mar 2025 11:42:15 -0700 Subject: [PATCH 03/38] update README --- .github/meshtastic_logo.png | Bin 0 -> 107788 bytes README.md | 21 +++++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 .github/meshtastic_logo.png diff --git a/.github/meshtastic_logo.png b/.github/meshtastic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8562109307b9854387c74b8319ce71677f30e823 GIT binary patch literal 107788 zcmeFY`9IYC_dh=NB$Tcc5|t$-WEn-a6xp*BvX(8&kUfntmMhxq%NS&|*!P{W43#Zg z*#~2!!q_GZ!;G2vK3%W(bzQE%;rsE6xf!>4JkNRD&pG#VKWARtG1lciEO;0M0&(lz zzG(&mu>vnyL5J9ZUvS||Q6P{gNbjbW#gnX+mXHKHtX)osT3ux?xPiM4>zX0pcwJbo zO)l>f3sa5L(;Su~$8MTf$Q?1NVTniC>tEEnn_CJ-c;M?piSv23DNy}dL{W_avhdy8 zRc5Eh(0b3|r+ApGa;m#i{c_*#8|XmGLMuY{qy{v z{@>64^T7YVJaF$6G3U;OKfb(_-naYlG212M)6Z_ay>lTY_ayL#@K)CJ*2wHFnGFs2_Q2!hG?%UmRe23zXJMhQn6Y48xOUffxR85c>(! zB&o7NWm#X>I8$)C(eJ7X{Ul4R6Y3k>Cfc(L9RFFeF4m&U=T!C?ypoE7@4{`!UYOmP zGnpBObn_+9I(d>$b@L_Jf!AG~d0iqxnd<8!iz`2?-&Y^!=yH{ai|aSa`bsoe+CY)q zP~)f;ITf|tj!MD{*;pf!Fl$8l>;9}gN-H)Qe>xMn7Z=7z3S(@{Ad|~i-l&Fn5LbE> z&{@Ocld7uL-^hhakK>E6nqH9u%wZpW}PzE z8G}&StUda~bPsWvtT6$7u)zUckYHresrWv8W3tBSOsG8~S!1N!LHSoCZMj7xGt+`n zdzrGuCM8)tC?kfC$Ii71`HxdEZ&a}#CWtbMVKE{abb~pc*Bt2Ac3*ve+~89sL4{2E z9E2T`uD-`mTU+O;6f&dP^5M7X9>&F67`o)~@}zT>%QyIXCEUd7#ILM58zG85tG|eF zs!m=oG|c)|Y1(xg*59k*-6~e;kAMC7>x=SuBh=o@xJrjH-(7?E3ds&5zu1J8H8jAg z>nJh)WlxjEab0npWvY7dk8N|lCh_RyboHweSM0iiUaa#i>*jS45fieIwmVxp+(Qya z#ygdHb#-kFZA?cY(cY>bxD)GcPNvx7>TU}SlViK+sWsPzwr>lGK};WqNC>A}|AicD zPL{CYYe@q`Yd&gpd~n!8p#$L>lvL00<2_37bvy&>80v-V9{C1A`v(^X3#BGU zB@PR>aN}@Cs&@af{zCn%kI2+G=6ql-5>8zKzyuhzZ_hZ8T@Y31@Adn z3_F=rHJ%2u$1b6-%5db#9#Rv`;PTG;k1k9n4RMj~MjnME*63ABI?>1{aIP?; z$&zo^a6#gbiS!zGy(zHo^6bb9$k4nv1pm!M&*lQ;T}`aS+uvj2$8R$O=9DnY;My2p zF5w%g9r^I8Ws*N*N^^A)BUBa#e_8`>4GeJI^TuHbXEM*g{Q|asZa$r*-^EF(c%pbh zOd69gPTX$_DU$b-H-j&>4E${6D%*Tg@M3+k?XXt zQ8JoPFpc164blgUAe;d7YbH#e#33_I=hGNDZJCVITTtUVq;Q|}1lUKhTS zZ4N#Omi`(iJwhKjse$}@wfB7p)y*|TFY}th`sg?8iv=T_qA3e^n;5qMq2j5@h{+f5 z@%$-!_o&><_V=cY_y9v4JJ#=Mw7}h_Hb03hsr%24bG-iqKQ}zDnf z**CnCT)t%dg^VDjgtkg*Zyp(=$aA@r0}a?DbNMHJEZ`00 zf3BQ*N&Ln4-E);KCJ&pvS^7MM7`d0_Zo#u_Pe_i0*NB|_pq3c)>rX*+LXGSv`%H6G zUxCTZl`XzwGp{2;lDRg;k8Rsuy=Ib>qk z^R?>3xA#eutr)`Z3tcrhaP6r>SA8}mH{wg8#_6KdQ#l-Da-4Czh6-3=w;t*yS?pB3 z<*C;~-VC^tl+==zuShpPWj^m*p^lZiBT~T2I+N`4=-Ek=hqko z+kZkXScJ@5-yO;goEO-7F2mb@9r7h=*rbpn4`o3%Kt8p_DR2IX_M!L&5=l;Z(`s9f z?yqG`=C6(Xikq|#q^3A@jzDTn1D8`|D8$R=W;!F6H_+gBL0G?PsZV*K-uj5i1Sw@C z=F?K%QV!bpVhG$EA}6(hgu&j!VA_G2b`C;!lqdY&@0D?hF6%DE19W5BPPV4d zBJtcKI48MS>v0p8^-C`-qa>nx7WjS)nF;rG+&C^&tW9Zps~9#T4KLQ#^D5=Zw7OVs zH{H^aDkbz@T-_wTXiCgGGwHMM@$r0e#wj>L3cPKikx|289*?a1-YVsOKKm=A^EjIJ z#7ynO)KMwk&pG{BIxb(KvWe33&G_Q2f5PR7*OH3cnNq2OJd~s~J>| zRnN>I@XmA4w3=nSL6|A^6GTOEfeOi}K*DV`h{`?rs|X&1K!S-R%erbn%w>Uq`1JOm zA*>Ks__L5vj|xULu0$%aoPczZN5;?w6fBsS`Picb z3EHzd`3}_VMxp$ z!>#G(R*g_$s2bJrT+W0DvA1V?UM^J_8H;gp>fM+wd{qOH`7R2XVKFz!5DUz(NQaHp zBzlAY%v^O$;y{b_u;`sWZE~EW(fSZKRp>fOf@?!BvL~9gePZP&Z`TK(9O|JV%TqVpe)L`|SuGU`c4mEQu%ev{O}J?&Ft z67y3pB_J#4GjwG8K8j!kDGi*`3IU6nuunCO&U?szZT%8(R5ie@vOi!CJP`-EQbc5x zd^5l0i`~0?FUi=eGAS^x-;=P@*|YqvweC^5)RHk#h5Gaj;b^bJZmSo)tT-i!s%KW9eCrab;pBSuwv9Ar(6~Ce-=!xq^j({bZu;i-^(U7xdyai3N4m*q-Ya=j zzM=e6$m}PMIbb?+#ym!&(lc}%nz^Mr<0!%bRKU^oPShHFBbm6gOBrUoIt@_8X6&SkfAj;ZR@s%}V72{9}nz%0NU(j514T$U}|bi4yz~H& zj_vuv=C$YD7Quw9?vbx=YSr?F=dvq$MeVbTyueYxYR|`6o+voRC-az5QoaQB-S={n zUJdQ&5uN7lw6WFw8q``9_h?AKR`N~#1(Hg-^}^j&o0D$Bx|n1FM)u}|?U0q$K^4R^ z#k1ie8eu@8lU;FG;Nz-9rFYkRZq~wG*>zI-Df&r=>~^tSqhb$QjS#}M>VbAy(p?Ey zU+XGSq`RoWjF_pY9_8zR^ljHaPJ@jt^?&>km`6KpMy}IATpYy&ZNp56heG9y`@PqO0m+pZ#TukYagPCD}a# z9c324Lb*y9X~-9|cI$#aO%8ZHBzZkdS9)93PP}}0zQtJ86>Gk`;%??=GmW3RCaAtdU|xO0ztBoM)xCYD+sF8-`}U~>^_Qf(9|q6C z5V_m_GF7}lPxZLxi8%+uQuq;Uu&wbtLuY_%ES7*@d84))HSNgwxH%)C+2e>W?I0=- zZ^cUtlNNX~2oY6dbSB(ad?Ckf)frQ;sXqG-bfgZ5U@=?s+9+rfzk>B~!Mx$6R|G|U zxTeU!u+~OdBH_JhPf%LG!i8-WtwgAPazIj&)cXgM0vA7+*lw8EFR7aU&wP!r`jmDV z_^V{r&?M;#nOHX0kVxz$E!RK9pl7=6uc-!VXu2Nj&U-ba+b}G~ku3*3-rdJk-z=(k z}ygdnH|&*E?6UEj72-rCLuu3U!G$7>e;E0wr%eQUb> zNT+0(K<2geX`s6yOX2>0U*Dn*?=>D7_s7Ltx!DQ9I-R-rUh>WZ^xw%jAW&CAaJs7Ix z9xY31+TRlKA^_Vxov9Y$TCN%-8=N(>*`rA3I_~<$z8qF1yKuEPuAQ7&NTv3nHL!{o zuomTAW$pDWw5v8g#IY;@JP(jjavwhk7ov8;ZBoh2M+I|&~GtZ1|OD1;pIiTk=6fG;C&TkfqVORKxb*Snw9!0-> zPM23+6?ps^Ga1+4K7!@NBF&VS^qmQjSYs1XY=3si?l8sf$3h;-V61t{cme)o-hKG_ zmtoj7rzbYGgI-JLqhQuu^)qW9h;hz-vCy;QkEz_yZRd71;R_ZU=6rVVi5k}3W5Us2 z9OBdWWC+rK{Ox+rFT^BHS1B#&YPM;)H`u9bw-(Rh@)P@GphE)8Kjv?~ zt3=aSlCVsYoMpfYVRN<3bnD)5o6nfG%k4JA%haL;S$suLO$f``@ zM1^s!?mUny=90L{sh>{)*ZzePddQwP`@24!={p2DSi0w&vj!7kYFb6s+s%x!oTnAL=EL1mXSFIJYt1c+Vw^JXyY=B<`%yf^Nq01iF?$N zJ;iOAw>?PEVm$L5Re)O54xW}X|GAbmnXm4aPwMrBRvpJEX1LPqZ1G1WbHDx!9J&ML zZb9H=(VaG9r@oLd7y4*23y<*~x$MgO82Bpzo9*?4F}qaXG~MP)IDY8o&$EQh?n0Je z<5eZt+iffh+9yEFfV~-PjXLtgj&g6PE2;HfMYHohbenBg1Q|cw;a;e1XcWCNfCY0r z??E#AnwG*MzSw&xDhxR$yS(soWyV=I4Bm$FqWq}ZZHykZsYe)n?{!<-g*HI0v;E)iMRftO=_f4#@9RKs156PSR^{Sfqq&iqEB*{@~RA$(RgxfTEM(A0u*ui&p4 z)1)H_!>^K@+j7wF)B2Ajyl0P@Hx|=9GJl*&{?cqZse^g@5TNI|RAfakRHID7HteEC zKf&eYVRM^KYm2Sp0q;roH)=5OwT4MGXm?ifrKWAXg|I$5E!B9q4XK5}D(0tn9u+c3 z_q@tgccov@n>uN@ys0nV^SkLaw9d6WMd_pI_8q$u4}Kkyr8i)-Y zv?34W(|vuR{+~@|Djj7Bo)*>1hySi=dx%PmxPEg-gAw^{k`ZgJiFl@%Mh?|#Rbdb* zkfyyY##C<^emx~oJ%cp*VUWMVT@=)ovG6W_UFdaOsn8n%MiAvQ-gpzSYPX1 z$llHu+Rat{HOW3`SnZGW@%aKk?^gL+BY3jQm*MDYx*(B`lts1wFFgZ~;h-0$ccz;q zWh*skxPFqKoFUE}jJ0MO;z(|_N;>pJT}{m~;OXAfP%t#A>ku=j?XYX15G9udj?}4J zSc%XO$wWT+c4SXhY++a;lOk;SraGpNQZtpmozX|)Z$hFJE%eSmQutNYpd<6etvfkd zu1~4XeH#~M{}@w`I@v;eNmmN{^z#2|Ul&Gy?^g1mgke^d{`rXUyVOyLxsxj@*DIv$ zruwlQ>f&g|gyR+Ild9{aL{h`%eep0_J0L=oq<82Wu;I^~+| zkJa+zIW#3sv z57xPDr|Yr4ZiHpdOQew2Ka?vwh{)|H?ut390n@OsHn=6B{ArkL!_#+`ygTr8p1r{L zXIbFb38K2%Z^raU!sNZxyOwuV1D%G`25l{u1aoaUms`0q!8u!4Kg?O_&$%V-uLWEF zeTZ+eF!_)R)lzGUu-Z(|PkBTM*j3~)xr;Bt8w0A_M0hOY$@+K`N_hL89w_c8E2yEb zv7nui9}J_kM5Uh31k~<)acyZ9hO@s$$Q-(RcXU z_@y;E!JN^G*oON#d(4S!qa!dfQ9+gr4!3Nx`Vk$&AC=bZbo7-g+$Of;;kj__Uv70Y zV)CC6<5xR!qnCeDZ=@)B`27)wKP9oe^ba7`W#xAXTn{6}J z*8Fnoys&(pF!}C5_Sp$dPJyhU%H{O ze}_pt92>Ul4V%sb^nnpT^g!Pw1D8Jz;bZy{^j=es)v#5)gc?1hdnAL%)uzV;0wL0K z&#WR?*W=-PINGe#42`jzg> zv-LaYLq3^5uj;EtZp^#Y|El*Zh4k(91rEvWnorO7+Qu4;vP`N(|?t#tyco&dc7q`(h5l#)qs91 z;cN<~TnRLX+_5_zoGD$Ycp>jW62UbQ@?maQ@Pd1QzBNDkZHm{A6eayzQ_sb@%@^$~ z>#&c@-+ul-s`jIck+=H_jjDe;^nenoJjxy*^4oXx%8xjnnqFq-pv94$29hv~D+?f0 zf~DPO861|hb}0M%_fws&5|~R(m<$5l|A#C0g!XXN0Nesnx?L2DzVhf>?5$Ub7v7Ja zdx6ojf-=Eu z!^$b@bGPgCW`n7N!ZQ-E9!J6ppdLTrvI>aOkP?<%W7K||{Cv_m>Lm8Nh6WB^ZnuC> zE!k9#jmf-!ugLRtbM2#<;9Ho=7gggO7Zj0%l6EO2#haZcQ~hGk{#|`F==EJhKBmk7 zhsSP^c(gW|J2$>T(vDy5K^og@W0TOgKRP7C`nP1GI+PEy0@F0-MqMhhZSNKQ_bVdS ze{J!e+9D%cb?FxPDIx1x!CL0iX+tswjkbZjP7b8IZ%-I07f-l5dH)b_mowC{7EJnJ zD)oWeY(qsgGH>mw;8a^WG$Z<=XP+PH|F}N@4fqso!;#BP7;O&ipV3m9}o4hpDKHERRY!@E(Rp<%mFiYdSg5Myy^nw z?_B^gGKvB8|IQG@fq+pK__c+*;N2!S0H)dyO-Nw?ayHvoxH!d2q9J7!oaqhz;g)EC zg(6DhXw;Nd;^z1ccPzE}4&32ywhQz`&m7c~bKm;iZ{w~Ft2V76iRYR~!3>&|HH|1) zK;{hZ-~&Qdj<*;4onaTejetLFcp9q7;e0$@T+^U)JCTq-dfEKEhi7fq^{qjdc%iD^ z+>**}CD8|ya({Sj#)PV`)mi5ktGBT?{f1oIXgS`_uQ~&>DPTEj=I^Q*-5oJ~pL7 zzx8c_&-KIH+y?I1#EZ~pKER>Tg{YLg#`^Q7=jO-W~7mB zMLknKBnD7-z(V0YOcQzKEyKslbpz%6g;8;4rTajKH45D0;aox~OZrn{=tC?F+KhFKC%IY$B$**VWW- z&PWT;MpC34*H*A{HvaqwKknyEV}`1)Xk;_}yep5#bC1p&HX;Pqk)d4Qx@WiA8%g^ zbc3KK?N<$gcVs7LAytj;I?5tHX=FBpc-+dCY0#S{1SUrFEaZ-UkB+=)x~JIK_kYb+ zqCXTza*IM)yvnzWRP)GyqR)~i>j6HLB2b8qzX%)6@zra)A;iWEDiPpUos<>cS>9M% zvm`TmCP<%4I4i1y-eZvYqy4oH0*$8MgFmm@=Z&+G<+$eEIfqLgmz{l1%W>Ec7}d_v1kss@YM@a0g8hTOQT#F;iPb2(lE z$lA3u`5lvSDjB8bM_cUs$=k03ua@jfVNml>ca%riN9P-cSH|uevee)%kFjq>;;wg| zCi6jKHGfup);phQD8Mz`nUmm}wTWDybbhFeX!|GSWA4+ESQ7;DGgo~h$VO@pD0$j| z(FV*qZj$f|u<;yU2T;=gd|!>3PG(@5-Kg;K$C-bXxDxs=@ARm ziY8rM^fdkS!?7nt)zzh8SjX??%)pejt;n@-nTCgv9RlgS-zQ%T#`ha%)ZVT7v2q#LCv1>c5G^ zb5s`9D?d^?dS+PnGNH97%P@77>+#&?P(C+*Hg{VqVDv@nA#=Fhj2-=p6Y5l9EGkHM zZ>#UjJzhhNLhq6;4?LT5Ps+GUut|k{&KN6~>e#7EW@{^%0V8mIVPpW_4FOx|Tno~eC1 zl+D%sOrktlbCvC>Y*S`7pQvZEGsW_c`LOx{OgvSljC%T?1_H z42G$rXRs$7bzGSZn`L131S)$hm09jMpj-d3DeP9YILlBj-|N3b85ALWje;x5D|>^D z6BX`iSPI>`XX1Yp7MnwnLv-NeNCenmHjN|=#6McuP`<>3EgbqFscP7p5 zuVj8vmlxTN;rSC+9Wx3WHYr&4pt-V~;7kvjm6>qNVEaoa*wD|-8aUNW6u9#x(l5m& zA`@}+fTNXvBGgMskn-Z~VrssKGRz*qn$TK7dJ#3B$pU1N@ZPwN?7i`FGCbH|YJiu! zL$cH5@JIqrxSh(;83kH8&ubWv4Tf3mlxvHQ8i;aNYYN7IE7H6w0=4Q=jMq1+n`FM8 zY#HPVOCW<^UWu5>W_k5bi56jGen&uiqR0Ghw5bip7ne0^=ka&)}J zag170V$>@G=7d9_@cOJ*f_pww!9Gm7jbBki^>>$M2xED3Y)%`VbV5K6KoZvnOTjQww-agm%#w@$z zyW^=#dA`qfK_b-lnM)E!5zVhJABbF^Qimiqp-aNs>1|h%Sx?F7h3kpKe%(p}0qJ5E z;?`(FhdX;x%i?)DyX+I(87%%?cdt^j0HSDVXTEyxvad~sRG??+9_T(v*{5))ecS;q z4o_~gd2C+S{JI!pY%maXd1Cn&`o;>L_W+dY$7IJ#%WIIWzgNwncc=RN!JKk$qXSXa zl!2ibo(UjaWzL>dT4gBk+S7h$r#iva9-{VQRN8PVN*>HJ?7}-Q?Lno3X_SbDqll_- z;a}yO29@8dE7qDS+(G};en0|T{oRY-GHoIpH^5)b3K=7%#^er`Q1{QU;sIK}=fI_% zT$@?fQri(hw8Jqxk6eT&f{bDdJm5Ad z7^QN+g@{hsjy~4s;+%5ts9&f?e2$+_AA90uOBvc{R1K`s(0)d0Q`ug47UbeGlHD~P z+0M9Jdn_=pwl^y#gSSllxacc)$38c`q;u7)1&eo&h z-?9p9k$v|mOfkYgF{qs)rS=9%X!@zNebXMw|I2MNI%zHQj34m5bu#x&UDRo0ohRMp zw?-}p!?&LEvHR>RuY>@%Vzj0}NV$`cB5tIZbm7FVT@cDyC6()=yG!aYnaNbl{R<2DHOjBn%ajbyK>ThU;b%a2 zJMy?bWo)R6r^*^6#sr!*a>07i19ua%5hz+8&=@cC74*$wzbrkO;e*v)GZm! zX#2;dT%WfyBDu0m`7hu+;U1}(RjF)`4%*{`5j!&0Rdw329&Ja?O%`iw=wp2Xi(m8P z;F4sz4Rlpi*4r5X2^psMOVV$19idv2BPV*GT!M@22fhiNgJlKUP6;z`Fn+?sVcih}NvnCt*XA1Q2PjyQjaOKp=p@lRK9~LyP z3~W7I4M5B}tL5GY)xzHE6LnrkaR^H=1WNCIEes)TB)y!ogs`5CEh`h?b~g?!x}3zwt?Bb{hui?7HyD6b+Z6Sq>8oO`RFirIUwRpeHT{w%3>u4-%xn zo$*XDO#}gIAQGxc?uZFM*;3})HlCa7Z$`~<;@N+{&V>9v_Qn+%~?klWHZQ~83r0PGnHOJ3$e*9NuTQ9$X*~6J( zOTFI+-i4rLWndd`m)5Tl-gERP@0T-C7bz1)|15)n!*0BdSX@MKxEUA3A)}V!3R~tw zhqz6l+91P0B_oB5UC{-MY=gABb9sE#@=KYcPdTG+2;MR1(Ya{4$YyoWkLB=|YiBBS zab?swzw5IJYncWjc9bP8b=g5BC{oDs}s&D?f`K82x;pxY;XM^*hTa2i{GPFmxf zg3kAki8q2=f(>f5N*$GDuXMfnY=88%ZJHuyQcp^u9C!3H#UIGQ&@qnTPSA@3?MAag52DdlRKwh*Fa$!mDz5i6;+q;u}L$my;5dNAKHcR5<1lMyy z;K2*Mj0yENW-s6=jLApcgZasauT>l1)gEQB-9fPeopYPu1M4Wp9Lz>T#p)Vml`e%P z5v>CaAU7dp0Yz#0HheX6($A4wcet4@iF6+Zcc0i>KF2uYt#&u*SfFR&;rYNGdt&R~ zvuq#&;j0uIl283-yS#XrOy+G9Ve_G2gnFnZAIQnuIHK7DMF|<|AJz)i z?v7hP1CDwaL?LTlQuT`t$yF{bvX| zex`J-02q*Nw@(7mx8q2sfdE!g!QN2N4&T|5q}z_s$bF{)z^IkgS&|F5eVaJ1_gLhK z$>k2enUnrR;HVX|azO&?J(oX_dpL|Vs*%RA@>+_S^nax-U`_ZZF?A{{2*77EZIt9EJ6-;87oC7Fo#-~Rf7PH-x^PAfq-f=j?%c10cR`H?5H z4s%C*;R>)1s$Psll=voz-8j(sg`SZ-K)rUfhb{581bJ96;S;Z+aPoU5liPT8t1w`x z`JNn?5iK|hF2#4MY>_gcpvvyib$5ZJ6$mvNqY>}*py4Oeo7>WQpSmJ@Lml<2GH+2E zZ5C351LYk=4Z&)@*b!UD1JNe}k8%JnrO`kic=7IJmW0+8(mKQezeS~qfjB|ocXeRQ zIfP-x6r<>eGW(npe)*01yR~AqG9c9Z&~Q$tvzMd8Q;clBa5RO6 zOG{dRQ(R0PhPp6u|4Wd=_PBO`)eFsmYt`1w0paHD2NR6~>UKTj?w}9rt3hT_CQ!v; zt1rWFg&oE(6Z!@RWl%Wm!QhDLs7kE^&O+G2vg6Gce47}T?RG74>}RTe()R#?L9c!@ zDXvJ@Vx zeaUINecD2~w(uz8KYT#}Om)V|}RMeO=fgGPz zWW_SdCbm}2GnO?&NliHOm{B$J_#()teQoPd9*b#Op&^Sw3R}9ZUa&;1R)4P}nphoZ zJd=_;fm8Kr{%1R3->-;Yh|l4qU-ccZJRiIo%u3I}fwHHS#OkQ68GiS3XcU7|$iNOW zP`gO->NV)2s`4N!wd-3c=(98L!JWeHzvUxzBU8Aq>*alOx%?^gu|7*yzXf_O(l%xA zj>LFOqa(sqP;cu9tJr+W`KP$7 z6Tv|!4{3U!5Uo380S)7i=G=I^dZ6ZN;Th8*GOwT;Q-ugHdUd&G&cHYM@06j4@o{}Y zCc%eSDcbh`lR5idp9BwNM}d^sg*wP&%fB_gg6)AOaT?u`F>nQe&@#+j?WJ5#9k z-n(EcvykDvlpyl_u&)%CmHp8o*^cPJk7(k@Jf;$Ln}5dKK)s_Y&m+X5Nb5cY+r?vr z`Kcrt)L7&c_l6L&%&$k9zyJWj+0V}4TBE=jTriCCQ4v@RZ0TCH_F`H?@5-qR)j^&7COqVy5$geZavDhs_a5v9+31)owbwXPL@oQ zdj#{PkCwhN;2!TGKfA!?aiEm_fcw+tEy6v@*Qgq0XitvR*KE#)N2OOSKxr%>TODb) z-?9R&!ki;93RFOem7SeXC-_mmq63+WR{mmsMM;cp@H@QDr9>u4NXA( zp|Axvz?U(6O@940v|J5Gw*Wm(TvLBdj^d*U(YZYCT&?p}SUn+&!$8-jXdbt>lJ{5F zR+7*Z%s28f+tZHr?-YK2q-9Q9-tsAn3tqm`W8ZU4njx) z7iWZ`6T{r$aFfuRYF1FQ)s#YpFO<)APxBa}Kkl8x?T$^hf}a#cF6hWb#DQEqc!p4R#w^&<<%b56 z;-gGYc65xqRVZ^R#51v(_%f^lm`^4dUYJ;MYNxfz96fPK@6Kk_vH#rJ832W4vCt79 z#}(p6qx3ruX~}arzBOk81RvWQX?{N)(90MZViR!_sy=FYt>k`wwyE-6j*-rW;a+L9 zl3vhc!qk(S%+Wm;^hNa|fd=Y!&+Ir9$VbcXwN_M{(5L5WqV zgi7&kn1y#kC$Hk#<_#L`pfzy4Jy(9s=?D8av{-uD4EX$XHb8l;9C2a{*)iZ$a}4cm zwgQK}N4a{jcWGQv@ujMD2OGPD%Jy?7H9soKA)Rzc%kxcf=o06~vqw+RG{uNQRhj<@ z;wGT!eAfjWkWhJJ5E&)gGjaC+5}(gsiBEAS*o1+{Q&M3PQ zNAy|KM~9?yLt43(BaQeifL85d1CgY5c#G-C!OD;5lXZ#`PPJFN_vA*PB~Q_vcwy%w z$DFG{{QAs&$~sKp%D1cA88^%s{Xn^5>u$o1#x1)u*X$%(q~gzE~ZN zt51gGZ4)ZS$J|c%Gl^S%oc5{m{Ex#5X&qM;omj8&%e_XK;@q;KrkzK%HmyNif7Peo z5?{T36D2`Q9E^DaL)+mrrFZQMQ=re*6@Zo8UB0v$RAic7dhMk_BWRBK6*A}#Dls=D zi8ZoC#tvg)`H~PVv1Oic<6tN`=!9M4ztee`d{4v@x6ZWn6%kFB?{;NUv^hK*uLtNM z%`c?4N%++Psnj8EI{swn&L@q@z$I*X$`7}Zg*mNSy*OHR`=>!^e%rJ=>hY@%)Ye7j z#NIo35#2M|V7?bOWZRtEd#5k;Kbns^axk=Hc`?&I=DFIiGWic*dZfe4yRFW3gIPm; z62w9CfPxFC6UVLBhT(+;MEER`!l=3Q)EH+DGlaZ?8oCa;fL?7yh;Bz2_izc$EGx>1 zGoA03&g)7{scLhkM`L}4BLD4`fbZq?%Q`)S_|~6MyJ-mL!tO0I)_rZs520?AfE9d&a^xN{rbd$}dhb!#p@5mc|^95Y$Z~Z)9{9o^N30i$PX}lvkJeAk^V4PvD(>nAs(M3b< zokxFt2@`jEnd8gf24!|-0yPs9RVhBLg^b30hAJ7ySTEb;u*Z~dq)*!G1<}dl6tPrw zPU%L_L*^U&(p7DDHfCZPXTQtGO5C{>NPbm?KOiB+Gd9TOh!)UAHT_P$ra=ud`t{|= z4mYL-F_11Zvn?x7tmq?*JQIe21GMCid)cN$XhD73j^}68=)C({{;n3))>p>XnDQF+3>8>E64BFpjU4W?KhUkGPvoP zr8JW`8doIm-T-lLKv!j8rF=$2t*EYJjerrkxhHyOL*1Y0Tn*DF-XpnUpDv6yg&%8t zuctp>G88Dof}DBp9CiEoK?t7s=}@jQb&p^!pSO5*)9`NRDJ?M9>`TWG$$h9>{n?RC zZ`xEA%BJJVAKTnMZUTeWi=RCFM+#rMKdWok9^2_Ap)T~Xr3Z$!`QkeQQB!7*HdHt* z>~q$uULCw92Z1mF?QX+|0_NQlH-JNc)bR>(2&h($$7GfW7#WSR^^M^{jZ^y#EM+9R zpx<>PX~q5<`;qzqNmUQ$R?P%2mAR@Hjcs$KLSOQZ{!)n9ZTnC2nhF@w#ix1+n)3Rx z^Xs!tv9oh-OrSPqX_p0fp%;LFDP12%>~{5Fa~M=HukL13|CKY?nzx}YgB;KOl1><2 zYN1`eQ3OXMs;K>?W4a$J9 z?;9c@4W?lpEWqu;N=UV^+_6QeKqr^@$vf_rm%}ul>sudvUM20g$v4le+s>XW{di*B z^?st|#hw$`q=u>+g0aZ$9jLx7C_b9rP z#%gvg)IIw^NUm<}MBw$ZcPB4dkCo3_`uV&+di?6jwH$8`)3a%VpQIB$zvY(3!jg&l zg`Wmx4l*OS3&q8-QfcijdGSj0YbEEtW747LK-IvC^X=;QjQLCo{x^wHwxC)rje_1^ zeHp#_4G!TJXmhvdt!ePIDfTMfnrV>&rnpElc#x_~NQF{@oMjt)B3=Jp=&E8m?pl z6u^g`3?t@QClSU@OmDfmQs7i0FjA?Rni8nVD&z9FAaOLM`Sn{kB;A$0de$*tsKZ6p z;FN^cdF9v(eH^F$bCeZk<&uQc5dqKcbnVVFT4^AwFZQ6*T!-#-Jv3q9b~ES$3<8NU zW&9_D{#^kWoDP!RbQvK68t^v>S*yrU?`o)h_+wAl9>|QO%nQuGx-dR|8oPGwMgkxI zRqsR?FUh^1I$~3U0;A4&UJu>&6?clyS--8xxEbC7W(CF$p4qR$fU>|LLZM8wsV!_5 zLQLcDi-fd)Opz0jTf#$`KB(I)azx&+{lctcQRY9wCjK8Q1mV5AU-xhOtW&%w=E&?r zAXk>Sr&Vn-ngIg0y&ey1*jq{-wHX9dT+{rXuO|%o2j2*JTzahNkeiLEl8ksaa?~&> zm+gU5&I>`i|3tZP*lyFUcqQ*|PH`KBl11|Doc!5r`*nt^VuG}vAA^OxsmU<|>fU)j zKMXTk^xu@M_b|7k8&Zl#mc3jMAX7sYZFPh6l1qoH-EReIoySUl2%Bd*SfDMVfW@!M z&aDMJl~awvjb~RVJI1me^+4uk;7x7*UYKzPa7(R57;!ivEFN??aDO$I4nNt%JbK^B0CWKwK+Xzmk-2c#6TEM zVH&7JN*QLMFMaZ9olWh{nO&5rSw#Oxj-uws8{Q>2euZ4D@5!?#Rz82N7unel%Dl`1NKi+mAvBBz4S$_B{!5z|2Km{2*)4h`&A(@j zk@qq4re;s^@7!q3J0)VNlf3NS$-IbTeUTCM{N4N0tIP`rc6NcDf0Uq{&(tjsQv1I{ z_N2pI^O-7mK_wwGS4^xQ(cs<`hV0%_c^IkPlH3wR!>ZS=hd#<@EX31qU-UF1Bx@$# zou6I+i+(`$s7-f@q<%FPO43YXO}!y_G-(`p{2z}2FN#Nf(wMS*%$1k+J?3o4r|7_5 zF`*6;V|MHZI4|ZWfuWk+N;D_8qAek+0(wh@_;&0A>j_*aqyyGEG{b0 z7}*#ihPTtZ`l2RlznwrlwY^@Gk{1MAT1&yAYIZDf+&(A-AZ>25)v~8h#+Cm zF#-zG0@5*rh%^Y&CEeW&Gv71A&-Yc{bIy0pKU`dwm(MeM@3roA-}hR3;H}VYeyYF= ze{TDLzwy;~=S9Jn{(lA6!cP1ouuXgG+Z92!*ZD6QQ?DBmetrjj)kjv`N9iMk=K*FF z)4+sL-$fSeo|f#`$=EJHV|+PGAAS_{p(+}$4pA!WIFi+1y5RsQI^gz`%z_l;V zRwf@~61+rBp9ao0zWCGbMzW!rq=CeR-fmE?v)wEvt3jL^kAk>dy$r^!BHlRr%KpN5 zK7-nBM(C`?F6NEYp%4@B11i=1%B1?u;VLPwGVQ=(>QZ?MDFLs13?ZIRcy^cr?`D;8!AM0@Z|oYj>7YOd6p^#i;)mk^LOuE>EJ^|p9cg%#`W1sZ{+}E zae&O#^7PI3+zkZ>Lqn~HRA+b$CpAU#LddB^Oka~0zoGf3S)}piy!*ce%kMrd7VKf< z2h(D*18h89F`gS3A)N5hMk4q?G**#y+Dl=E$9VMAc%$YuM=Ha%EkS4EH8b%Tj#P z5A4Y6xog=b=))^{Z8c=O@AkBjRbGTYO{Tkq#z6(epTO0ZBEuQm4dnhbr=&~$uE!b! zV*;!oHE}a3;TS`iFN?d*KDPH9#k-S(tqYa(UOAo$MKv1~M2c;3mijC|m2Em~Jr&eR zNG8Mo?hRS0(dxz5lJtM6R{Qom8NMW**!(6(zOx*3Sp?2YVxR?o=V%LKMGS}@jj;k2 zJZ&$WZ|r=Zi8mch&6VhO3LA|G*0cHa$wXndz(+yX+cGp<1@p3Qc(r$b7bj43=@b8A zEUD;CRw0qH{b^7-Mqbt@TuZ);0Bk(yW&QBrSAlHK(evCqka2a)t|)+7b2OcEsz67Y z6b=MxiD>3S^^x4r=(A*ZJ@Ra1JQsZnQl)1|2|#_v8y`c;JzCEES8>!pUIp5VIp|V{ zcLGKnLGtLr00E19)EfYF__Ll`fsF+MxXh7E3EDLJ?AW^LPC~zbrXf{FV5Zk-UeKG7 z!pIWd%NE@p8mz(eE@aJqzZ<*-J5<89)y{-8ra{ezo9^7h?2GU#X4l_o;*76S+ zXky@P?LyX~Az<=gUl<0$vU553uJB=W8@gK;v7oiMLkS#AWzW*y<1f{s zv&HT5?k`A-I&xE&5-FR}dQpDFfS+#JN>Q2b2hx_B%m?Bi==5SRU!9MdF#Dt>RbqPw zGeV4+(+RmYvxbhAo{^Q{B;R_W4=7u(lYFe*)aAQCSod{OkTS(8C997fW(^mQOm z){)q59Xq~fv(={2R_IC&`Fv6m69skHTkjt=8Zh#|LOKcKt54PO!s?Y<;iataF|0P# zXKUn$0TKM?+6sl~7*a>zn!VMBAK&TY!iT*ker4tPWZZESOU%Z2GI*7eAS}0)Y=LVB zk=@!G*AUDqxo4q~Qf=t{-Keplju5Ip!(oyyKDJ5lb{TrwgcV!~7<*Ho8t4A z(;+pP7Rdy%h1(c3A)IMoJD|ON(PUnS2P~OJI!&q{+f*lsH>qyya8>B4T)yT_CyyEA zZzHp+tySB7*(8e0R4R70lfUGPlO0*m@e#iOH zZFR3G&m(hU{(e+OmRF>J5~qKy>cG07KU#uOe5mk2Ui2c#AIfFj@6Qx!gjH)(b-a7` zO55qDIW=7cfwM1*ES##1VGy_%9X@&xS}mlD984y`)%&c7M<4sw^!0X)`@i7zS(6^g z-V0LJuL+v*{0lBa_gNph6lYsxyAAanwiD>%jfXlA5PeS3SHr6@#W;%qsD03qK@M*( zS2H>J7mZwk=r!wZeNXJN<;rTB5ccoY%b3ku!d`u=y{gY}L4=V0&%Mu6MP7=((EhGx zMw4-YTFUBmzH-DEQRmocP)KAGg9&L<3>klcsmG7^UrbxwiX9OqEkJ`8L^(c0ifZ{= zfe6_|&*c0~_Qu%KlQ+cY8m{wC6+Uk&PvMW((W1HjSBBg^5)|n&f0w0J#6eg1y`NQ) z0(A9=zyZ{332J5Fx*>Kg!yEm}FprUt5xe?~f<#DXoR&&-Ei_WpjjE57Fn_l%=P<(p zDRi?gaXHp%y|OQ#oZe|6TuSLLtlTrkdr&`L@J1lymGM*5ZTRLgK3My8gttLeL{ww7 zi0LK=JTEzqwTqEo44eAF6gmGMN%kIn4fLo!+u4Ak*yaER#+53p z`;y6_+Y52X`*BCWCTu-ukt>&r)lj@}F{GG+{R#6{F4vI5dzxz#;2d5L!Ao!s@5vv8 z#vf%Vbeki|NxQFlIKyc#o}X-k0mA!*40}dOAmQLHMvplFpIX#M_evNK^ZYX8b0jtI zBcycIxUw^PaE+SDv?U9wFDt(Hu#Fl%%Kmdi3H7JW{22+8(Z~Yzfq^&Wx5M?F4l2Tq z1OtiVoC*3Jn6TyFPH*7=mT>`n0DBAcZ%3~1IliU@+Ha)1p#+BG7!CJRmL3U^s9N#< zcjD!bSxj&XLuKrQ&vJ<(f8<&$;WQ-^eD}2S*lF-P)e1TfFbbkT&vd%x3g zi$91|4W?NvT``Y&;LU)m{Ny2wn37HqPWHbt9j#z|Crcjx)XodsA%Nf4$xr3a`aqTE zR=(=qpxSZps->(ZqN4W{Ud2mAW^!6^wvKr7$*Dh?+1@nsbZh}#;qclr2wyQE5OagL zRS14LPW~`~tP_3>Mz4Bi%w%_Y#O_%uAQo@YM>3z!SS%RNozzzMr*xT9qmBU1S&i-Y z{TyNV>kZxZQ_LSPp8C|tE$H!DK&7+vJXp2#wtLhurYqnost)ppFq2`c?io?tli{pXzL4a;4x^~t~P;N#L`5jAtI zMl)w2jz;q5qmB~kbJvpy#wkFPm;g*bor@u?0BRf4Mgh!#kH zTE`G~Dp6ykCbs8tX41bI+c5*12dl964SgNZ{nmW>R&dgEEq++!49ekxOR&h1%N&e=Y>2_13IVE^Dql5 zLb_GiT+6XK+Aa*PUXf+_PX|XN96x#>1seUpIk+IBD1Ks!rgzEwcHTyzKOPdSO3 z|G9W$C{v``NT&~$v#5ftxpx77yniqowOvYFI4AivT);EqN z(XhY&E9I)8HK${Owprn&^yIo3F1K2pji)fQ;S=TWBHX=3#_@9ED36?n44n*X) zv^#rn(zOum6V#kuj%j2(rH25Jrm5Tnzg&l|kZ%OGYB1yF+5{dqTAU`Z)FN(`=(UHRKstie|I#3!4 z+{F^yGGZW>geCH3Sfe5(V3<^8-6A~Z)E7B-ep~-7VAICwITbc@Ew)giuZ+ydKwr6- z;)Tg6&phLE*Sry+i#7=Vbvp3=n_pRf5$bScS6(A$z~&p^8V6ndcRjZ6>;O7|adYoD zP-`2m0v4KN85i7C0`CG2QXXSDhSfP-GZ}ZZKsnLRC`D>A&3#=@{U>8Kiz*Oj6}t0_$y-zvcjY9ekFt;%VJ;BOFu5;oO*LaH31Yr zfq0PLN*mon7^tnqW=L|zErb+bWX?|=mH66_s$hHT)7e>B5d&Wm|J}gx6R*;x zz9+{Z_9p=Yu_X_~Mht)PGi~*`-R!I~i(p#5c|7=1BfN2`o6?X@2Ws$&OdH7YG1xS5 zVE|?*07+A#vrdoi>VE0YX(EGPr_^mXiMN$9$+$`<9lhSdX~98?2hPShU}xj5?Wz5R zn0cG=nk{NYnW}t|Kig@VPe0qI1Z3!^C;=y|g$!nektqsZyA@Nccl_-=Jd+_APF5* zTDDvp-d+6BiV(GA_lOj6s4R&eoIL$EWy;%Zk#DJseKWXr|L*eMi(=>Im~UZ@3+i}Y zNJi4vAfDE`Q37CX+ajs~3zF%4kVvHw$jiFzII|_4g_^#UWgExjCD@)SiIw=L%QJPr zuRGAagn&8k|9P`%Z(Ve=`PPmUQ4xBk?{e)=rNIP) z;$%4|UHww0IUQX$L0dRpVSnlfLv+BRsjaqP)N29N&Kr=< zrK{LdI`K&zi(0)10BkQr7z@G{Fy#vv^tL^+E4O#PnMMDL+(+T8&nB$dzvtjEh$_+W zu*vdO-@`7}cZ#1ta|QP-YcVAVe~%ekrmj2IiQ zi#0(fyzZhXhFmMziYG_%bNb)#yzY{VctiB&T91X*XzN|8QI$7`2P-9+qy(MWR@!4| zbbHz9k)J=eADZ^;7Oc`B4=X51#1^RI@SjkYjz2pqz4z}Ql$-j5@Rk|=-Jdgp?rLu* z32S_yq9Oo#*XT$G&JUd9p`@e(Tn&N#pIq?Yvj9r?aHkMva`^7D#N^iS;lb)_v}bcG z@ZM~~9$HD8+$1FtpcfmW3(Gd?SvQ;Q^H?OLT&q0|_FjJfKoRdtV>k~5DEawu~ z(o67sOJX)vEPz`jc+Vklo7f;BV4@g!M+l6Zc^3S{DZG{pK6qtYm5j1e4tBEfC?W@UG-j6YJ{-^1gV$)YIdR4K}mlKRX z4k)v|e(FUTRL(0bFHtng&Ai-4D|^d`*{Zv2vQ9+PcVR^Gu}T_w(@p$;Z!q>Zn4Gkf zf6o2*`gh-J7_{A%gqTW&MDrn+OYjnYzjK}*_(DrKLZe9!Acfb;tVh)qY5yHXxZf7ax8nL*mcnD$ zN3-8N>5$s>mndnn#UJncI((WCsLLz`fB$NV@PGWCjo$jpEt0WHwxs;3Xt@^vXn@8vVY{A}opY&ukliCL@5@__lX( zW=|oyQ(Tpo4j*6xt`wdZ-A5EdTvk0>V2?%H0NS6zK~jqdFlAEcKG^yZ-%4fSEz@Pn6rOX=d>&P)S2=+V)vJsI~l=# zx7tID82*keWSD7u;e~Id5EqB9th?yXTlx|u=b;I^Q(qu!x!|chXBCKr$nKVX5EUQU z-JpR|(gM4f&l^9@S+tWN<51nOV5f=9_#cs3y~O!8X9%{${dlHU${v3vBEOtOPkZ9f z*(VE^rokoUp2uz(n6cwD4GDAB4Htp=AA)tHN~YQ|8P5_?1nknb1^BNp*QQj$WELB zi}c8;al6--BT0faMN~SE1-rz*5V3V97??rczkHlip1#+`_B*Ji*_whGa&x8_x;OlqgO0*k4M9#v4^a)|AcE2*A4LCcuaf zUx9kd<3DI$u`C(cG*ESqwj`7d2zg2Tlk}yogrmwQ|638&{^9fl9~7s{88>}BR7Fw# z!nFT!{!GvTCV|8f<>&3#fIp8lEx@Jb5bv|G9rtOJ^KGRbUX4O_ zx3d@LS(-GZ65=oQ*1>Th+LAs$5}`eh>QaOgrS4P_{v8D}#AE4%vW{mqbpkrY$rFdB z>IiG{rojj{xbfyX;BVi}au}81Tg8@8qV&Nflp2!l@*(1n-v2WLKHG#MFux* zQXqrpbnN6w+$4vWya<3i_%Qt{KG$eZfF_gKz5XSa()tf!>FY<0yK<{Sd3h$JR~moQ zntyWA`D;2I&wJO zOI?i?IE|@qa>O?yhO-C)pY%fHA}YrNt%f@cix$q_NbALVlt;mX}N?Y2GczA41 z#OmEW{{Sioccn3#yPEv02*{5r*-zsG4{u(z1W;BvM;@z8qa~}QnUI=>X`*D?U%`#s zIgK`x!@u5!At*j@UcDBu97qU1m}bMndi=8uVi#O}^A^2EuYvNK?Dpb{{~AD@Ma z@&jT1s9z>gkTs8&Q+c{xaiJI7#)%(R$T@5XoAlSyovrY>Kc_HRY94%}^NMvH)gipO z=Mww-MyV68XxhJyKTbbJ7(oxXJH4&QhpcVl;xgnGIeY>kH3&1JhG-1|^mQ9WHFB!j zGZ#`sF5cLGjC4c4dY33`GL(fZ)_|Y;8&NTVzNSlfYa$)MduTkiqFD-P^7 zJnE}}m0-vy2E>J#Qlim#O2V3TKB?WUd{Mi%uzKLZ#6}TZUT$;xQleaTYeSZd4&Q=T z{-%A!BQwIk_Xo*r+5^1bZVl@q!yZ98sAhu8z;X#9P6rNgu3-^pc7+ci4P8>rCy;f( z{~qi_a2}F{xFnD$wfU&}+nta?8JER&^F?=Go_~ps6P)<%nm(ayELP;qtnkTr2DZCm z&zV}`K4HzF-LhvGY$vYz3&Iwue-a`iO%$%EZ!G)jWF1Xu%|zrm&-5Ian+&?BtjH^jTgr^cbATjBDk zjcTGNg`4F3=95~X_AC<7PTFfvIkV=P2wz@yf}aS?@UPhiHDkR7z9%4iT(#O`Nrf4 zavChMpShiSfxYd7hd{#K4k?rPPFf2&e9^Mb1M)!5Bl2EITEFj6>6}k% zZ1+>oMZ%{OVl+kKwBN5Vv8BR{Wd4>MwTO4>Lg2i_pv}wSZL0uqBe2TtF$ldW4J@Fd zne;T~ep`1<7%;kjF^f1jH*dY{(?wQAw4QVA`O&avA(2e8azD+^Fw)>Zl@Q_edQ!>; z-8vcOzX}}zW1Wsyy!O)T%eCRNxIMW_2GWHlR$z?oU@9@2P*$G`GG(??SGOa@^TSm> zVWTL{<);bartsC)&N8>l=M-*S6n^0Kx|ZMsjuE0<^GQLT&j;CSFH@fZ2|5F|){$Ph zi$CtE?(4kP-3r`O25vFS{uTkl~eLEphY5q^TK4nqJZa?C6zYnh+Z05B$yKKzZ2hoUwIP z0iW~v_8O9b_Zau-A5Es1}*Ju=f!w%t^nsfiyQN zgdULL^eZu?f_%W6d>UNt;5(wG^*+TQ{ajJ%!s(b(vNxi%Ym6nN71!P|s*@9jxuNRX znNA?wb5uTw5RlOI@Q2L(E4w{2B4v+3+K#K37qMYsdJ$cl$YOc_)63gV_iFA-Ve zt$ziZJ%I9?XXT`>CV!uGs`dFoz*nwB5jHKED~hJbJI3gwZAN7+hV-ip?u}J;)<90EA}VPvJg<*mgMlQ} z-FdSx2JmUv8h4dK7*MO!DsQy|UPaxlO+O`hgJ-ISvd%4_|HF6hhi9#CEUny4rU{)4 z0YBsrq1|!|Ej|jA^_*=y^?HxgI^PLG*_tVCe`BEFZn!l<$OY#t|r3aCbQJJzF8H~ zA9-kPauT&kd_`WA8L$NmCIq%SV$(gUA(RXbi;ho%ticjcw%$DthkyloK&w=N`POoc zx6zm6>zDYr*J>_QboI-Q(}yK`=cXszloC5BW!t0afUWR2cG!LTkI;nSE$l|ip2>jjz63o6B$OCZB5|Fjv zOtS+}4o-H2HIM9o&MG0sGV%xGcD3|ZUKN{-2=Hyhi6+BSos$34e+kI51A1nzgA6A= z?zi-QIZq47AmWDs+EgcfEChOw7T^J4jh>SmR*zu?$ORBi@$xZrz0a}CgC%)=o=bNZ4Ddm zO}t~8o)VdoX80uLKVV90zgO{^q`$j=zJt4Flub=2PV+4+$TR|`$xgqm| zM@Vn*RW?NS)GVo|8d1l3(dM`NPAZ<^!I4Q^UmYYojbf~V)vJ6Odsp@j#7|(V*4}me z%Q8wOkc(-AH8MD-EW|dK zcIlIEvNsbYP01)u!v0htXyk*Rtr>=+E!20d0n}{e@TnTlvU33pvx>ihXB%W?L^ORY zn!~7VEMRJzF_lrj2ztp0PCjWIivM12qZPP@nLVyaTf6|KAz2yd=LM)(Z_W2=BvY&A z?;p5!?ZybDpIQYU(csE!2j!1YkXE^kDfK^dBGIX;p;f)P8>|4kNd_wV_?a$*vhx@o zBYLv{p@jTQ#i3-mnH0Bom-o%9PTld6Jj1KwpFpY|BJOTPMzla%708XcnMZu$u?o_O z^_`Ec0$wu<-uq4HpO-+mF}g2)0-ruzfg7oq==E2pD@Zs6X;$k{<_<0jeF}U|C!u?W zASLKUDj^x)6{{0;g<*4=7ihPPgWNmF!_w83E5EM5KVoh-q(lQml(OZI?1s*)CorBx z{1;61#))Tvf5H#~mT=y)uPO6%(1ypRNjcHDOg$Hyq%sJ;KX{Vq(_>#VUeqN{A+g82plXa)X@PeGE`H%fVr7t*uT8z z-~pWXEJX%PoO_5h@eEP+z&)?f-!`zAeT&wdsxSF2;*k>V|P@{b&m*f301X=XMVTj+d z+ws>X8T<`Dz=@HzSU->{bNpr|2wS}Ewins$xV`@m2N`3l9>khJvs@S!&rL$v z9s=3R_d{Qz51c^``Zh}x@Monl2QJE(qL~7eS$X3Gct-#7kW;))53R896GBYO-Hkrn zux!+P_9XS9430t|=TSK@H@>o*)Ob4J%cE8kC6S}rm&N<2e-6W$672D{{~Yw45flcR z!JaAd4fcg>G$H_7GamMHFyO2m@LyKjLD}eOw~V>5Znuwt@{+#<8NmbQ@|trW_`-dZ zhQkyayX>J~_kR=#U93%EwqkWcavIfSGCN`88a1;XUb%xeZ%`?xiq>8n>;d?QEbQ^Ya1 zCC+Q-=p7;Wx8wZ$JLBe!vC2TB4i>sg*tqrA+z&b9oQFU$%yS5)+G4;UGgHG~vPUaZ>9LbPfkUJK;E&2VTf9Dlt#$$ej-y%Ok|c zEpTezP=;FV2&rM{;lL-pah6XHJm8XNt47eKu8?O_Yc1(bPmn%wOZy9y7MK#ml@}%w zs$tdsVHlXx`YcYn=S}v}w^^k@E#C(@1QlQ&~xLFR7`w%W^ znZ2BjRiCU|z0oUIgsevPq>}`o#QNKN=YQItF`Li)6GYIk~C@JkN>3j zolwarK2Tq^|6j=U+iA(ZW(#z2Xm=bct4YgRRNr7&ek1yY!OrHhu|ZU-Gui8gDoMr0 z;g8)Fp4Pm~q#h1ePFEjlDZ~768+v!Ynkx$U>+dcDcW>R)ibA2rOW2SuIdURBD~o)Aj~0S5{`^S$B0^Ge>}D-a&zM;LlW~X zU2BqC1R32Pb!KPJp3`0-;q0>iWp@*IdSf@n%2o<4%w1*ISmMisM(3y4`!4n@`TMUK zzFjq?We#_QbO_e)z$5o_EyNB~yru`PT8H1uLPefD-d?=fobT^3rsq-*;p7n5|t ze8*XT`wi!@k|K`XYzJuHSTa)4dhMSOiwAqwucGwG;gj3g7hx&fC9G>8pz91&@>x?u zE}jSXz56L+5;fLZFOze)Kb5PrE-)g+v6bRFETG_Yf#l(DXZ_PtY$~(Y$)F}@-zpy= zZ^oC{;)}11qzmot*E*}B)6SlWpi6A4vbHsR?90UQsx0>Kc+uqR`k>V_cIq>)6 zj55R7V=3qH$BoN~$>4E{=%ULYfy=rk!0~Y3;6ZX4CzM2k;Y^aRao(oDeGfcu$2|1l z?elWDc)h*9|C%DU%I#4%yGG_C_qUSmBX>8PBL&xSA0nAaro$t#lxml|?ZLodWTW6e z@Xs*QVhr4#;{`s#+El^M!3D;8*Hh30b&;b5_Oqz2?2=j?%MbVE%FkkvH36FJ@fXUN zJm&WHO%#`!kA(7Y@^kDO(!+No7HufHFFN?tk>PtS5>{Mw$b<^q+vl22>&YtBSd1xp zchT?2hz*1S5Es#^>lqLiRSO`2uO5_pG{n|`7CO=?_NGGWu!!l0Ap-6CCzC4%Vxf(s zq&N5*oUV(UD-ATaPFm!!zIXNvu6~5Bd&1_swAe5Ud|8PhO<=3}fREm>7c(yUZR}pv zehw#tZHqeN_pis7~STg+ebP+^4?2f7Himu`*bcK@Vhu+q`cm`bJ(xd_?Ey ztiQQ$dFt1kPr3qKRpr~}yTy+%*qoqV%Yg7Jk;89-0_Hc3BCJ8Kvx3oGLnZg9=mGip z+lK#zqtEb*Pv#N-Q4_LDf@UWol<7u0a`?+l%(F27>EYZuRxI%I@SPL6*HjU7c>n`$ zNHwGHYsmO#GB^niHn%9?uvDj5b6P;fsG8bE(WZJhRWm5E%xk-GL4lFa!{4z)trfSA z-M>~3zrD@=tUve`UEZYK!TDpi_wzQmAbivyrYsAwqI`7eqhnX{@^T;UJyNJauQ;Y@ zVIT~9aMu zV+ZKdNC9+mw7PZkm%(+Kv&GuSn+I0M_?93?;34+ZK$+3LNd^>?zt<~C{hwWbagT44 z$C_Qn5nWKR`%&6E*q&klg}a)49JwDi9oD7yZyfubi^Fi?MiJbJsT?l*Cvubg^o?a|Mu zU75YmbzPZA^`lFn_N2QG%Ceg(()M+S33>rfS@vdsmaPr7yQsCS3VU4CpkpmY+%F{%=dsoi{66B4E4AL^cx8% z@xX2*d-f`9jbU>209EhctvI+lf6Fn|b9mwSl~W8uK$4g#+p$J)#ec8f13Xw^q)Ks_ zyvSj+Uis%-QHSmCxgs1xyGwtj#&t&}kenvI&$zBM&Yu5D4zK(8&hRu0L$VH>K3INw}xr_qH3hL;Lw6x$_-;K1wD6Yb? zOU8+u8*3Yy!=cG`0x!ZsAU7FP`yv8l=7e!%nEe-1mDnwb+1(G)cQX%LY^_BH4n@Na z$8d;(MNRE(Od!Z*v;7M?GLN@%rf<~r{SXjFb_MLSSzfIof1t`OFWjXS6kA}IHs|ut z+u*}wpxCs%@UM(2>1TF|G0D(r*~`IRVsd;*2Yz6V z(;}#!FU1scZ~M4Q-X)PV_iNJj{zG@F7h@YQ;7y43_EDv}*h-y%HrJ z;s{6IW?|d`a>eL1%&G+}H}jj}l>&<8PNqo*Qjaxr3ged!hU2sVWx<jW7f*uJiVMkQ-w0 zE+3@kGwc~hraHruN^t8!uJ5XUfQ5_X^Kh)NZRC0AFTp^jge2d;91FZ+29YfgCFk_a=2XK9blO?-Im0=WQ}>!J2Gt6T`qXGNr;qnj#K z2M)P7M>d=n8&?XC--VG>e;X#Qtcg^QA1U_Ts#e*-1$CNl9E9KCAsv7}3s$hD5Vi}D zix!bWvH!@&0FKN5vwD=C%=4XdS$LaJTI|w6J@Kjxn?l{Ql6_oDXvM=zRaA~M%Us`I zZ(0le#A1U#!{$+NJ^_GrMQnbEz%3~T|3f~O^}Yy+A(eEOu1I6>N77?UGRk9y3570P z;#;;=cUxeS3ekx`Y4;tMyp(q3_>y{O-e(b>%Tdw2&_o`z+ z@ZqbJm9QQ{95{>E{ct?!lw~`>`XA0v=`6@SWPnC{Lz04X2{ zdX#;S)s`q>MW0KsA&-FB2eq2yOKkgG54~L?al`FbKr#9V3n+BsS;j!%Yp@mzQt;w^ zC$+keJAVak1!ePU4X`5`ahV9dU+ErtRu!{e)p;mKwr_B+1KZCS3PDctF)8`UQTEv^ zV1DVg8{mqDsb{$i_>Q*X2ZwC;z0!M%k=PKF!S~H4mGvjUrtvGb9&qN#8|=!w`uysV zh(rMU(r`dP(@0f{7;oSHT#obvA)d*We7QIFbPw0VO)gqdE`MPcdIXlCrTzHEf66?1 zV{(2hmClAi#;cMCh6{z;VDEB6*IP$O5I84tyE_=5_T$lsU1-MjW{eX#&i&n*$qUFj zg{AT(46uO_A5Fy9uSF}>#d@M_cg$O@Z~u@KxEIde+ABB z22NTVe6H`7J9C4XTQ^8Gcvzc5I<0~|z~p+EWZL&oIcAkoGp2j7gOdc<`9fsd-j>W_ zE?FA7Bc|;65*o#F{H|T!Y1bbD_IDR{ZF>jf&Q1+Y>|&XO^{Wm$;2l^jKpwH90F44V zje!^_)A`)IQ`B~uf?yB!*LYK(ylvrz!IR2jU6^Ak5i^!I${?Hu3SBy)df0hf9euZK@gr}c+^BgE@-S!#t!O_MFuLcnA!NrbI6%=TZJuvOQY7_82dvBj|zSfh18 znYLx`U}j^u!TuqZ&fk!2ZCCoP*%p2T0b;^rA(@u?A*)e_S#J?q9)wUn2-`;;3bT zFu?0l(keg(u<@Fbie0^Ky3)n*wb`ihzc4XzBRR_r z9=+S(F{&1;4@ZMmw_>y82nMOW3Ya_jqQ1D4>wY=8!7rG4{{m& z17W_2XSmAG-y+ENfBe;br?qdNo{6U&U6UgjUcIts(BsZ^4zx1B6Ih<^cD35s_?e-u zG%;A-9d^tns<|wGl=1s$VfaI=vx&T8i3jR$q_&LmyP<5RE+65#i5ek3z_;HUDz%~^fApDz3v zCpHfRVDj^{%KB!_I${tg*!+D)ZNzsq~;opivN7p-N#}13wzrSi&RIgQMkdKSkV zAbE0m=EvGFRXjVmT{nEbs;eg@#0`<{r*C2aqF*Q`t$4Q;5B%@6Sk5F(?z``(90pCq z^PZwGr-J=@_8goJV>&pT)hF=*f#!oow^DCbkUzRk(o)cKd9Vi)>govc2*(T@CXC7X zrV@?Uc!S-W!z=$6WmXcbzDuC)vvD3|_a^crea4Hp&<;7{1giH?dr9fdadH_V(OYHUGx=q(k<$-cdySgDS-mSvNkw&;N{}Wpm7s}fkw>g<$kio(W76o8L2L4) zne4sBIbn-mXCJF#lZ+m0(8*cl8N5CCz>@2Tu77(B?q@MuWb+0QRhgK=$2xCQofG0W zW=%_dlov2F<-J|1BBhOjN5^L#Vd?{W;)E|I7z9d#$k!+lI15(7eX(g&)m0;D`PXd{ zb=+-|IoxELY0e8_fwO$QJm4D?d~5AhUB)EtMHlL{w)K~<7l zCe^+tLIWu07LJF?ZeUkUf=)tu-`IY6+h{SS@YTgKmv(HNL;RO9HRL}lG?8~E4LX{R z$oPLs;s@*${Mb2Jfc`OOGsS|`+_Md_~7HUv-f7KR! zRIaKOqyWAAzGHD%s_$Hux2ifh8J2|DZyw$bRP0Nc&QKSe7|iXEwm7Z?t9^*8C6)zV zCZgg82W5fMNNA2ydH9OTk!U>aVy=badQGvV|DmSYCKP{vPM^$1b&&=1sN z#*0gAKIns&@dv2uBk1BVGT$i0)NkLCkbZ)cxY~zo*f*mAdcY8;Z)*bHXLz~M035fN zzkJG~p>Y4?oxD2-O??{Wgz)BJIXaDHp8Dt=%q&DORmcaXkXYo-+7upjoX2^OvqeEd zm&;S(lQ){V!6uCfQTGGF>VoNTeLI z*Z!{!9xF*|pPKS&k1O)E&$=oNTW(pOU;zPK#no||IR{_K*14i;OMz5L&G>2SE|LIW1r5n|D{=U+Jy<=eb4mqiLwjihZ zN0Q2|p(Sm5JM-ax`H$W$YD+lREK8=d?_CG-sQYXhdSGI(btUpD%)7K|1-sue;?hDu z1juVdDNOM?br0QILjb$=+r}c*PT+kejU3IO!SfB0{r8_9-*s_)z43c&4x3BJQ~U17 z^{_G!!)|>o8Zmv`dR#JA_-?#8IHK#D$u(^B_+isKYr5|uvdGv8qv5*T%eKperEr%K zVT`)UA65lHmhEwSLKz_81TQ=31@ZC|%(qM?QIxR!aNQcb=vwW*OeUXf6QuugD365Z zvt1BYO**ss|B6$N+FDif+ql;!QQow`9)2twWWWxdg~&Dx{}Be*1I@SWm@U?qg70y^jvvet5cm z&pgC-)Bhi7Umg$D+x|Z#RFX=_mQtvMkfp@5NrhCBvR1M+)@)fv36(6R2%%5Pl8}9i zv6bwVWvmUd?@M-Oe%F1b&$EBO-{*OL|9bW6%sJ;i_jO(G?Y0&)99@0jF;=5&HXk)O z5M!gxwd!Dmbg_~6r4s`_?Ap(|-xA!+76Zq5c8^N|ewQJ*YqX54|lXNlYFc#8cN zZbR^qHpU&Nu6#bs8(G5cI95{9GiGpsFLc=L*JS})hE)=aJ3G)9h0k|0h3KN>I)l~& zmJxWjO8N)Y6{-=;9SMV~?P#Z8o$SgqC7#AY7QH#f-_r0a3tvEaM88oflH)n*zPeio zq4{j4v$^PX$|s$z_j(xRj+}UqT)Xwb+KX|c_djjlzT;gx$EDZgl15Bam|ls^+h>mH zMYxt9zL;|{i;m6YI3dJNe|SJx7w=&$yhxj1i&iJ$Z}24gPjuVCxQxCgbvgyPb=Apc z9`y=bCv0B#99aL(vJ>VLb8?WtWz+rJu!E0ScBfPixO90d_6!ib=xbQ+QXtmhdgo_t z>VFpzMy31`VEXcSgB5Gez*ooF-a;*Uh2WepX9WoI7VsMWJ$|@=2l}|r=EWN|SPo6x z|Dd-MG=AD|=U8GMC`=UkeRae=rZqFtk)qly zxIC7kE6NYgtg9lgW|7efgALPWqG#A8GVn~D2kT?SR_#d>!Wo>-nX-+O zV;1>S3-HZt%&zN@lyUh#@{R_PC$1dy^F=Dmu+9{>H*zx)E4E1rq+oe^b3ZseZOsBf0rzC3NURcP zgcsNqv`VdzmRJIT+8&(K&8VT|+?BWQfBpCe5$*Bofr&hSjT^@SW6ZE%3lEMfN4IYq zs2M|382Pq@OUw;yyq1-Rhuq}xl_0iE%q^2}L^OvduTd=i7p>>#kvD9x- zU5Rc?54SWXpIsSmpcbH+reM6gwUXIYn!Z2pokZ@3JwS?#`1gR|;eTTzjh=_O|8^ds zM>{w@c&KARKY>^gNXYOE9|h$7=W_0FT8>uljkIBwz^t3Jev0^$Ly1jqe)xWCl62kM zGTkU5<%De-dnZ>OU0}eeBAh6VsmM8M74U{zhaE3XvZg*~W{cyq^n@9`6l?@nqa zFL9H{jRc>&y6!8ly~B42VP_jAoZM$OOYQO^D!IC=*tHFPOy+}3Uf($Oc)2*v^UDu(1 zwk_3Twxz{ShJ1}&htNJPL+#S8Gr2vbk!=^l*kD2D3|EHOVUL!yoUN2WEmrRmv2mBm z#qp|~tnNau8zo zn@epXNdv^i(Ai|=s`~Nz7s8?18N(R(oL{zowft|{UpsDqT?Y5URmFQxyS&PJ?IRLQ zi>YC);K9o{x@*ZUyu2r~x}jzOThwtSlwZCg7im%gWRq&0v+IAQ#D`#uT3g9R9(D9d z?zPvwe_0IDRw&CyhunF{1IatwtzQz_mSDFnPFeqVQ?k8+n8|;@VNzT$iih0Ikw6R! zl+_s-?qrL~q!*`^V78mLD=MMuZNBUvJ43ST5K5HJ`y?p3vDF7XXD^8#C!DV4f>MFr z)qj9Aj)f|(_clyi|MrNC=b(-*WyMm3l#-KNGP1=M5mB}z&KBGvstrKlDc$~$#yv%I z(WzOqe#gcf5bx1KMBicMoGb-x(aayk}2*Eq7yVd?LEYwzUSbIebZieH`!puZ3-r0 zJDEKu5XA_Ukr$W<9P}U-{(Uz=67`^!@qbNfh^WO+ti)A34pY5IOEZ}3bq8YlSIJfS z!;SF3N9bzR>XQPD8=8O6E>J_*D8UtPxA|?f6sc`ITaPEUV%KB=1KfHj#8-IKC2>|*vq3*3*9mC8-XXSRU(Z$8xLceEK+wih@NO078@?HcchzUP_;yqQqo@^G&?SsT%((P&Vtp< z2`=l=HXXLg6V`D7fB~L`s->^jzT&iQF#b90_PM|2f9u_Y%z2yCu<>aEEU_bh!ehbZ#{^gGn3mwgMWl-z!;_3 zD^cKTJwyu5$(r>Rq-7(Gh8LyDE&P*P=E+6zT~MD)cNeaC^-2o&#?yOX^@*UuBV&7Q z6$JTJQffB$tCDLEY<=YO;(5*|L-j`&8@}10#oaS6NcOSw59; zNYT0;k;pk&E1GPuu=AH_(0#W$J)^dBWWp_Bt`6iT|BOevO*3tO)LB|@;vd=MO;4mn%hFgwI5@` z%~|E(tX2Dizh353i#Is^@w>Uv@tIxse$BX6XDaEH={5f`-6GR5vDA1CK`5-u4+QePX44qS(>}q;=wu|40^eEMIo+s?<5dOL`dhadq%cCP_oN6zS z*ZDQs&tAH<3H4ulh%H5h4J5bnOre$hHjq0+D^a-Zq{9~RMtxh-e%7-AI3ZUmq36_M z*j`W7|FkmZ=-#y%+r8SJ0%vyVv;eGfj3Vh~!lkTwC5_`7>^@_=aGS6(bhNQWf?r9RcnRmX~C0xDLOurv7Vy@6VhGgM%e&Y0L6O9(k#uDkV=m`~r#3Z*aaOx&*U z6oL0HV~5P#X(GjxnFW>R`wF8J?U9@l(%Z$LniN|r6t*&6+XgxU(Oq4Fo*%EB>IxTM zZ6<4auUs$Q=PRp7@}5ts4nc4GMnl({`B2*|88JI)HiT+@79+5fG} z6)80gZ_LbLn@ihj4V?wjt9(z|7kbk!v9cqYShh&jc&ZV~RjVIS+`20>YuFCc=y*{s zgDiI;@kk;!+#PR>xiZeLkdts>?NhGyi48mR4r}fZJRO0*zUeiC3(=DkwEZHjWH2>zOX>8Y?3yZCcFLRv# zxQnv1NQXSez3ukv9~zZt`F4uDW}McfiM~kx$-#h4=4h*I`mXie79Agz9aa! z1W!4?X3wcVHVNycvc;>7+TKItQ#6kFt;;fjm>WP)WLToFVLUMt_I(Fr=I6%aOLIM&XR;+AiLQV?3djnc02Y`!^j9B=k1=Oma@Dts!eMk zT_R`JTBXeq{*5NAPAm@~Q)V$*Si?qnknT!gusVk+H=&@&qYp{9} z1Q|My0FF6}j5!=x#!MXkx7*yFSg~JXWe&(Ebp6jR!TR3%Oly!es;^Yp>*>12{+4rs zF6B)5`w?}jX#-V#sgU|+W`!uaQ0ox7|8P)o?-~A%n^giGSb;2Tbc0F-1FC9_xhn1v zWZrUZNp{ma7`>!-CqS)5k`Heexv`_Iesh2Q^vj};QQG~RIBU9hLUE>M%tt6445D%k zzBomuawb1R%P6i+qCxn+>i7@9C3wg{^(2kc4$k{}%v%VDuKwyc!CZ%6RxfL@|8O+c z2t+J6;w-gVViRb-hDw%nB%n&=+*@Mc=ZrAb%RwcXk7ib)If>-EvjpHi_Cz4h1&)9X1$QZncVh zfl6V*G}l<`%f-nT}WUC)ba?!L_+95zF;i#R^u~tBxLHj{YP@LqjAOCkXB| zQ-6xx4dM`KDJN^FLP=0WL>BcQx}|fX@1wW@k+AUZVfCy!u^X?`ttIazfA`|I+*a>I zLh`0KPU8y?Ua-{vefY;ZbmM229pci%7D)pWj(_313N`a3`mEc7(2CA-|Md*km@@SV z$O{P9q5RVjr#VZUX27~1-BP(nxQ%pLV2d1X@gys5meGIxg&f;}t;u%`HvBS@&QysV zF}r(ew*O#Y1%dnAwGM1drUW7MC3XE$0`W}p()W)q#8f{NAjK4^xIkeAjuUj~capLz znWfh4Ba#gjp(t+xzF9{#pb!;i(4ccb*3zZsmrSTo?E?PV#{2~@&O>?Kg*=B#@yePO zg&ump6#J^pi}M{Aj@iESYvtQ;^9ftA734^_Kc##UuM3{#1H(&lVh-q9j1BdKU1D zAdcG3*RNN<`S&cE@Bo&7cqI_`1`zyaEfd_Iq@bNbBN}4qo-!(=WsmZT9nA)|3OdiE zBB$iMn@DFtVYjvHH&nF1sz}u|VO-*?B~FD2Q;|KTFxlLU7Y={KIhr$AdFI~`1jj5h zP~3gqw#2P?%eUrnrtI)0pv?nxDv8@i)e)HwcolqzNhNVt1+TXA-?&^igpID&=Ab7+ zU{uJdDQ;XE6HfQvQU;e#(Ft7uC%6L$ZA!M$^e*89-a{Pbs&wsSVRtTO*g-Ghcd>=PlZKSw040po+3u;vbqrV&UNq;eGT7 z6Nj-V!h^<-v2jdHsO2jWusc(y$b6Bug^wH(eb|hS0-1!?RGR6`0kH~8DqD~=p0p*5 zbjVdfxf*1|;H27#ecQSrh7qL*5~;x)m(7evlWQh3OZ!eT4yi%PKPlGV>?1Nw{+-- z-h)|l#KdW`cEDSYlrq$LwPnnWUym^(*$jG@M0%V{3*z}_;1OmVsV~_z&J63zP`OG68mpY=kC%!ZuoM1c>2-p9Y}+8wQadPuK6(=$OXcUhab(`@7!?A0Re#kJfazVY~a?|{^z)kd2p-l~=> zS86&Qk=Z6+IXR7B3LR0s#GnP;bnSH!Suz?kR}q%|8Si2nWM5tRBZSxx)V$P){2997 z47CJA{SiS|$?d7}Ir{Xro zSg(cM&+5K*eCBxf^K-oH?*ul#Nuhvsr%SM}WMkxCt*_P^Nd3df-yX6U+KOsmQ`Fw4 z9vAjBG+~QvT-3DU{o9tr<{tpuA6ky7hoM8$qvAgmYh>8 z@rV9YTy=PFu+nPzrapG(50cm-Nq_zq8;8E1_8X$LGEb7^&h!{0YAmih7!5Z6ASDyr zGt7`y#)>mwIBJTM|Nbesd#bmIPrNNL-SDu@+4sqtQcWLRPzv$#B=7|@+!tZmpjieN zk6K=SdwrIxDuYygiZ^MI_^X74K4xW8D-tk##HPOwx--Y0IWZW!k?}xa$0qOahRusBk-zD;J44Yr6T-zX;zho-^t>gWi>3UeDGey z-QMLp^NyWfQ6bL)vfAW-MJ*fO3S_w%*QF9gT$SGs7+%O;o>ZiNOKc>!aQj-r5Gp)$ zduIQb?-^-1G>Do@@#r=in!Bbqtdtj=q?(0oU+n)s`f9O0av_8p5oO8A;tGXzRM@DU6B?IaMF>kG9so z6JDFr&M^1Qd_3&?!Hkm)G-s*{u7%5HLxyTbr1!OY#{&u_Q7=!~Mho~u0h4`AEwN=O z)4YgA)Iw{;=ZgjM7lz$u=nO)_G;03(4|*XYP%8We%H}cF31H9B`QWoQCh3Y(wcp1+ z^*x>Ox{z266Sruz72ER)((9(yu{t~w@=>-C>nKOgSq%??pU*$5Hn-}r7|1%KvzUq)$3hPItSTz&C9Lwj-&gfd zDf(rQnJhcydTvZ(rOHfC*TurxY}{TKgWk-CXdnHD;SOW`P2Qtq1oYB1`|Dr3+L29d zbQ^Wreii@3R##l*e=Ek;U1+0@cw`v>9QOJfl!)-5z;djuL{BdO)FE0ou6);yP$a_2FX< z-A;$~NwhYNCvAt*O?7GtjP#Ke)_;=BMtOcF-GLh7ePR>IPE@hK&9?UEf~UR-?_=N z9y7L34`6~*z)znanlsglVf+zqZVY~n=nc_fDcm{MF_u3Nf#=+e?V!4qrjRvVV~!+^ zk}$xp&y=`S{qM`NEjty+iEow$Y8yxvO^C|v3q$t_oglGi#D;sv3 z8UY&FKXmQyfIQtwPuHmxtp{dcPzf$h$q=R4%(MyCng#CJY3kGt(U--_%8aMItCf5A z9Gfb4VF{RUpHQ_e+gRlw)nCal+iXbA%*cP(tdU1jhTTeV5p(|))ii@*Dj!gi(dt$9br z?zbP(mcN^vOwavi5Lo8y*Oa#W(KiD)^kV`c+6k3v-k<%H?ZW!pYAfSeAQmqtYqH zZ)l!u9xPLliQ-}T9{NLu!arL>0$={NumUQ38l$6=Fo+e%s2h!;qa-H)dB^?}t;;tB(ljWqOEwfAsE^%0b4{V=IHdQ%C!p z_xFM(T=zMtk6UC$;)$(4=XoPlH?%@|JIRFy#FR3`KtIxIV(*BRXeiyVYfRf~d$y%( z58pEpwpc1#!HS5SzktqaPf)+jDuYfKVnrd8G=(Jjo$&0HzQLE$xea#-lTvaThg_~d ziKycr+_Kp1W*Dvgi~&L|v$qi`Ag||74~?Y>NqvVw`P||uCiEV8f0{ZZR<_Mq3)MOx z$0nX%smdh`eB(<;T1~_Zl@|>J&?90d?R5)Tb)HVE01*1han*sp#7D(t{j|wE(4wJ1 zQjyWfz4yo69S4-hdAxk!5Du~OIQHjioS{P_!n{g%+Tj9_((r`EKCyB{{T^Ub*BIL@ z;8)c50x|?0k&B+Ly^Sswqaadi%7jB?0un_pinIC&dg^?<5bB@O_Hg~BOT$}VJD!}} znDuPOzY31h4WLMWkeHDGXUrK}C-mRd_ty*U1Rn>eRX%5m5pScFiidcL1r|rEb1NPx zs4Xpz6UZQ;LDF2Q=0>58pnE6+;G{tje*Qc+?qbn#>@bv^tl ze>I=%XKQFHK!M*|58m?iRY2mf!LVU?@Q<~fJC^)5u|Kuxxw9(Z-2uk3yojTIFOtd= z*e$Mn3D}ft6xAO=4jOjeT?$)ANSA>7C|_9QH_~e>S`P;2`cKZePcwwQTy_!z)T$2K zv+FpCKgansR(=E${Mal_GsDnpDAsuV->}Xt{V8`k&kq@H`KjY{ohwoG8q_6-bfAuI zY2y$ag|%%~@Ca1#4d|J>y2Z&}|MFVcEJjA}_azMpXudgwiNGYuYRO$)f=z>RN1m%J zo9^}I`4>r1`()OFO|X_SnE=q=?QIwsx86FGzMNBBjzoCZaSF6Nq!EiW{3&u$ClB|T zSaWfKA$0C7%pzS@(0k{R`kspgy{2zqESzcWy=SK%G2e;K zG0BTd6y4qO^u4L>Q!)J2EOFhmlO1yEkJc2idwFfER#P8OpDSQ>U1_!xk3|^`l_j~k5@ajVz-aB(i@7%?mC|6*d~dg_9u%cuIuSi|8V~dPm^^@MJf;a z0mroAM79?Qt70S-D0msU>MC4ax_PWBND>Ud%(Qp&V7gsK3Yr((n&%l_ot(1Z^4xaa zeAwdBdX45>7M9?AS7qBHS4_EXGspZz2@W(tIoFs`a7cr|`dy=oGK8=Iby%n(b#bwc zQ~BvvQ*Jb#&_}mz@;jIe&QSdY6kjfu8tO%)+8nBg zl;B1$^RuBxe<6kkQFGMS8#JQJA6n>0nR{xUo|Y?GRGY#liQVo_aNBe9T4oJkp zvGW~_*WPS-uy<2P+#1eX$BY5=tSJs2PjpbysXV7{(3V8Xy4=GAO7xO(x5;gAxR~+~ z8}Zwz?4&&JBo-MkHvnk_k2SS-r#U6=o2+T63vFi&x|FpQb&TYCAUNOT{L0oJ19Ir< z#P1MlQgn13^c|0p6}r?k2hteZ4mb-o`p{2`_?~H3+P&fTNf8C;qzI=IH`vPw>&(gLJonSKbal$$4Kfe!TE3dp`Z@;& z)AOv5MHS6T?F*ztEtVSSMPyrQszSjE?r+<*F^s4wt1g=5(=q|q#cu zeJK>co5ONsqrUk)wEKL1M%Ra1fj->f0!Rkp_mPB=^^Bn z#v4PIj#|TZxU07h^Pm@+nY;mfxs6nSsJVU2X^!&r=6AI|`iRFU}!y25L#2i0@ovhW4 z*|$$8VP5N5nEh~qvkie0!#cVOxs$;H2VoV-g=%DTL=;H5%E*|tEe_`UqmmfCi4tAf z!;B2#R=W)uj*73Em_N*a**=DIv&}?`s=cWOF*;@PLib3*A&35NbCwzp!>t%!vw>A9 zT9!B-7`3}z>cyf4OT0t$s5DxbnnZUMABD8vG)b>1o-bxQ_K9 zR=Q>`=-uYHrMzy$=x=AlQThC)zawAG`!rX2tb z-0TKEg;9qjh?`EB?zd_UT0Ehz*Y@j4DN1G0h@!Y>g>s(+8I415FmFikGOzJZ*khVH zQ=E@P=f!rnmaNESok)*aA+^?lmffZLOr5%vmss6~*6x=j;#sK5Q`p&kPd z_0ZpVsPQs|L|RHt_O2P<+-ByF0i!3AeWkO|&ErRIW*L0y)A(^6ePU8>dDSMxpnx3S z*J}2;wGaQX1HLeUWzngE^@*lFAm`9T8Za^`0WBWhpOmRmKzi{%TYoWDo$gPFL2o;$g7WKI zX#!zCuooV?D%dWgpI02%`xhhi3(QDuCuD`Y^ZY2?NIi68x?%Wrzm(~@bw3i|P`wzv zhDCI!-oWFi3p3z-FeFfieDgJlcl>~MrZjAUrh{R*YhPG8OggaE+Gcup^}(gZs^U~v z^;x#O$gAzY`qEER5=8B%WxxY!ia@=v6s$==rb2YTEb2X0J z{61}O4Z3>@)!Vg2sn;BzqpaIDBJ^hZc`&+FK!6nWPorw-$C7`kk?4gMTVMT#P)Pc#G~T86M;iYQ50$JhMpqkT3eWgvnZ+naIxf#(y$K}z;iuQSe$_xq zkE^Pe7l^8r=y!G2XU)_*JvFbdC+mavBsFY6IZ_=k!(z5cx?23e!M`(8i#KPTSgsE6 zt^4LJ9@w_isdn?ZS26G0nLa5A_TOcrW_B+T_j7VNy`_HOB!_Hox5VlPWqWeaA>Oo5 z`1;Mp=7*QC?Sx!sUN?GL-xWZ~t6$V{>1bzT0Cy3SxxO@rFcyOi}`naA}K8-^b zj+b5;^qB55QIF4Zt0VdFb9~^EFvvgG3|~j)a9?HFvqTdgtS}j(z4OgGbFD0_6*`f!agWj6VVU+?*ot1sX5+!WSWe3J+h3;g z6)uvYC!IFSh7De6{v#(2P%o&(+jyWZ^|;eT;<5yL!EUA!R_t_;J--dqdADjbYSyj0 zGN~6b#h^5=SwophV0%kF&q+4PO4+S%>Pr8TQ*u(Ip%ZYtH+dyM@lF^L$`XZ?I#P{4 z-|I~nmP{U9o?^h3mM`6D;Y{~Wf2}Kn6lb$RnY*v}VMw==xho1ox`Yj!96}~$y;U7} zIIZYF*NNkmmusb|Ct6EJ6yJQC3FpVVe@D%hBz2aQCxR>{H3q5Sqi?Qbwc#YBRxMo- z4h_*K!OLHN4gN^!c7y783giW;D1cKQBn^hEJIx?*Ys1TeYYH1x)&;K&zpGnQ!;1XV z=j)Zn&Afcj9akEDfLH@IBU{Ub$m|TXH{vM7_^`<02IApwgD!(F7SJON?yTq6``%=t zr+cxz5p6Imzs2FXNF3gt`xH3tvcKcFbuo_nR_l(=Gob-~&*DaMimzQ`4u}R^K=U)& z1H<;elC>TdPR7$4-O(bnGHrS1Qo=F&%ZjHa5J*}#Oc1ztC z8tE@2LeGpLxuFSWn?AV$I-|gH*}{UV zu@rHsuR)*?GFA$)rQ<)De~!Pdrzg58v3a_n94iYX9%^fhIFKiu(qyoYOtyDYDbn`o9UP=YFUmI zQczykZOH3-Id1ejuj@OUF&KE~!1Lotdwn&yAj|nSWI3BMgC6{{)9k&59Z-oMkj9w< zO%KkHBJG!#!Z{H06vPB&U=TBsq zerm*Ylp88S&gphsrwr~Alc$*ek-g#?RyAE83J$xzVc>euxLMFqMzWF&hUpA2Oxt|& z{KF3n)9l?#bJJKy|AB)ndzp=q1Nr>Rs(iB zecVzmLzLID&%&;ai5H>Ay{wnt)t7{-F6%Vc{G1Bva0vtv-i|gM;2{BJqTbVQY4>of zSJ{a5BZ63{7s}>?A`lNQEqbU|hJ)y5i|l?!G?sh8{^DLIU~E2TJ}loFTc>+A&p-(c5fs7yYCx8&tuq`E zsqeoze%&vtMu1d`eMcVT1f#I_!;h1%kGb^Thj$L&dIf3HC_65>7i10`-yP~>;n#^3 z3D{oo=K;6$3m#33*#62mY*xaN0>pOHDU8@wWEI);Hcqc7HG&tVG}CU)Ckj--zRW>x zomOb}3W4$ijl8$&%FQ2r{s_3Wg!PI|-o$qc_9NEgtx%N62H;g3?P z@SCJ@vlxZG4{GOOb9M7txXtBxcMB@^+;G^4Z=DUp4h_v<#V5B;DDS&p9w|H6ntR=r z>333?0ZIzX-U4I3 zmJD+Mt!sVUWX|=wWcyTtKkJ%+zUIOHyt~rzOw2HY@e%8!*-WQ&p9AI=yzHHZ-l)+s z$D9L(ioEr;vU-T-hJ*79a+M?2Ct42&W@TOVYuR`htu>!1x`ld!|6Vxu;if9CJ;D0=B#tE-@2r;6J{o(|S36U3;&wR{lxJ$OIXqeIzWpHVrgD!Zq;Ts&`L-I0 zlHP7zhEAcekd|=7Z|_C?_CK8xKZN*g_AcwCX_y|aJR;O{?cb%J5{brPYtQk(bOOTm z-tCI)LpNx8Kiah*bS3Gu?i>hKxdIWs#`}4Wmeu#)%*Xf(9%B{)VM* zp9&VCk80!d-778a@4l0)r~9k0HD&scR7cab?f5m~&n(TE6yL^CR0g2PjzaBk^r*3q zC=aOgchuOq^M7;TjmD$%>_+NK+F+p8ipC7oOaYOzd6%IKubXaTQP3owenhAmZ&exT zdIwJyHWkGa98#{0;b>tKA`0%0(0s8G67WyT_JkmgxiJm*4G##a)@?@U%ie^vs@bbf zLZSNj;vNr9C`6VW4&%8ueP2Q3zNu@av(a9;ynK~UXX`j_G({?it0{hp`%w^6ezO%! zQyTY4y}?dF=G@CoH*0+y-W(WFTNsaqxePw(0JwB-J{7Cm$9#oNu99Diy7Q2to|(rJ$m)rmGun5%jZxT+5we|eVfs@7IO zu4>Cy@mei;S7c9nvQg!ilS4IvxIr>t_4KkmWhIlD-ujMHmwcr_-TE;p;(_7~m~GfR zLO}8{d7!H7jO&pHS=@5_Mf6jmF$l#og=5tbHzxEfplE-Ay{5V#<~STIDdsKeA>PzL zP(;GGf z#e~3hwwA?XVivcJQPbP=SHUb=DZNHG4)Pe%X= z#v{K;zw>}BPU6r9qGsw#DDd}`V`0>V{k7t+jll2CQnqv zyLaD{fLqS~YUg?`8H(r7VI-u%v!-r(OOjl0Q;%UW~v z1@3ziOV;QnJPIJQhX6812q3%9J^-g$9!m}U0%4>ArG`rxk&C4odJ!ZC4Dp19#rKK# zk~M(qNd(K$n@oKpuka8n9Uy#pCEV)30Z+EV+PX+FA7BCd~Vph9_ml;FuarShQ4#NT91&RrWXls>)TPfK;O&a|f8 z@zs})gpNq2tbSdrZpi(aL|y$miP{4hs!yq=tXnfWaeRAJ;yS&Dp}Ed?W4JhTsp(?+$2DG# zCt&JuQtyKIPG3Eei{%iTyhBn_qy??yH`-&pFv%XKH;1?EyOFiO_!sm9ZtM&B)Ujf< z08u-+BoXh;)9AT&r9<#F)(Rr3pjaHYxCN)eF3e@rIl|axD}VOIh@rN-u$fgSilz=1 zcTwRz$Tv}JN=sgzpf(6tb+_Kr*L|R-EuD)X&FG5C4rE=OJW6;n`k z-~Z5DbbK7Eq+96mVh2#XSdfDD7G>P?J2B$ChS}^K@$pTdXY}jlx7d43op;TV!S7hQ znB2AvBSn+oV~!r7wtBs>Z0c?huy}3R_g(AFk_9$_8ZFBN_9GQ3kN%1F^=Ok4o}T7X z?OA+IxG13U+F$%(KBRu29X!JGzn_+^jXlPI2Dy?WIO7`*ZC*j7#X|6JaC4kUH4`Qe z)&eZi!?cKvtB_MQOZw=mC#UGDy2?b{;LH>k2Dowe1F2mMq_#Z0HoUke=vnaow(#GP z+TmLybptg;nm+_t?!2vwud7elNuECK!vaVHOQ}}cvKMqkFCG%AmT93F_Ox8`Nh(aq z`YNn$G+D{HkCkFyQ}&kV*!DQ3tg;Lafgc(p*gM}a{hyD_9->oD9+Rhs*d%Q&7iUyY zkIfj+mp37>m0p-v_}_m>gx{hxpHyag^|su84R^PP1O?KRC+bjr7CaF9SMlWIDx1Q< zT$9_ZY+R{lNnHs?mJ4=t#K!U|={M-TuWSh(d&#c{y6}z`mWy6R)`vXEsxYL^K2N|G zHDqQvrY$A1p-u}aqO2I~WpzQnbS8{2AoUd=dHTZK)t(v^tc z-VJeMQcx9a0mz29vG@%*T@*JK1#x57A#Ut6v-qaOT_;Cw-FTJ){I(h5w;!!K!6iAL z^u^F+xF!Mru`JWrckXG_pKZ|si;$EPmcR}RAw6cE?{J11&-|Bcd*T-bN`0%eXf3;KBvAT~Ysd=bN7x`l+thHrtY~3j=lC zHcS?dim|lOddOcsO_zmRM*5%aTBqQ2{rYXElsy4e4obHY19R?ra;*eeZJ$pnjicPW zd0Wv4SfGUnHf*Q=Oj%k1c<7$0^cI~zpdbh=?`xrr)Q7cmT>D(o3mqDI8K#dlq^HHF z-=LK1r(bQ}VchNSrt-3sd-|-E(7Xss>Je$|q~uDfNNi18-oxe- z9O&O}m{j4Thh?kz@5NHa2JSf=?0Q7rpQJ*FY3~XSh>r4MfAC#XytBE66$Ih%M5~C@ z^FwTVp`D1G8DV=spPTI?65nQzVu~(8AO|+MGUKc34EF^y=F7$@QOh#Lq8G8r*=Ifj ziVrtPtUjNbf)IoxT?12wpQ;ysGs z@(SMlsanMIf(GUArh++zK&)-~OrhqwekZ9IwZ5DIGtKb|gtfU%3@-5-W@Tn_+4(78D7EL#bH2O4Hhg9db z)E;K(tD!f)Q6sJ-A=(iVmVgjo5CTKs0Vzn{*cjc#bd-AA`=Rf;!2gq1=B+VwdMz^J z`!vUKQ%i;^8Zj zdrq0`z98jpFk7e`sbsx(@XpxZz;D5Ov!m7^LyBlN>O8&e_e;}$^~~g)L!k{q zHt@!9+7WWz{vl~hH&pY2p<2IzIGZzJF4-7 zYA(FGtVnU)KjRyi+6woB0cqRlyBGB_L2jg@2^$;`=ekn4PRi0{@#iJI{Dn5G`H3r= z>p!q?40!VwycJ|zkSgv7cJ6Du@*2M7;Vm64^%O8vKa+R8b*{ttmwTHgI`?$|&VB8h z9L$cllYOtTQXG?f zST2aP_(X4rjUR@vTHZ6)KcL+T?_8+Z6U1xP5`xU+8JoIh=~xLo@st1!C&nv!)qS;) za6EwUIgPuZ68W7v2Dmw#L8BV6?iTKRv2#fzdr7)t@5j_`Y`nLWl=?aEYKPFL6N}`u7Hk9*l>#28GD}eGG z%65WO=bU@{BiUOw$Do-)9WOcLFEjJMJ14)Q*PJ!DvqftQg;4pvbkMecfIzq z-uncy%dJ4QmJ6%>N9qy;g2~@s7UjWlpS$K&tviAjPn-fb!f;LTxEUO`1DpocAC7O^ z?@D>`Eo)TT31hR_Jf@blRPrtgkh)vDm(Oi!t*!YA@=~73FxXA(c(Bq1s`QdvkcfXg zyMunXtwXBwki(N?Y4$N*t~Z);o3^SX-tuHyGu|ZWa;mYeQw~ogQPGI&^XU&v zx6iBBPylw2Uhq7|65ry5i8emZi;fLr-1?|u{vF%PuydmQ%|%IHzWyEvH4s z55N}}edC`PW^E&m|C3;@sfZK4D6C0~%MR`^B-&IGX&JCPf1b}LQ8$@abzXjMUn9;N z$_j54^nI<93Q?}%88ug*F3xjWN^>ReSdha2@wlMzIxMlf2O)GZpwA}v-Ko5u9q?Y;F^WOX0iJC)fn*sbP;HQ6GETN0i077Mi`BjXO z+`rOGc8Vf#<>8GXBR%B6m0n^Z!^}r~1X4qk)(zA`@T#M8p|kt0|MgJce;AwP_=!vX zV>|1ma>x@Ia(#?D8q5#oiME2CZObG!P)5(4e8sdI%s2gN;* zfJhGLb3uZ&4d-ll(851pQ)mqw0c^w2#f0+6wr&0OAQo3qfY;CLi|f0;=KURU$m#|W zU!;UmB-N{Q8yh=J(O9!(UM&v!X=EFj^Kk>JI6id<>b{%KWl`R>=Xx4Ze|4e(ojwJEZeq6*JJC&~g5K52~rY|*i8>UWUSAz3zb3lp}@Fgn0GuJ3Q7+EMOB zLZzMqew1Ait$}s_HR0^RKB-_Jf68Qk^^ffM`hIbtC2H4isG?2DPFt8X6Q1q7E7g~u z-Xzp*#5*NdXH}@XF8i%0Q0b^Ndr$rQCsoEz6#`+V3PYUt@t{>Z826vlu3s})@zZLD zmF}CL@tKFZ-3D9DeU4vXx7%Trf{qXtwwj2zhwl!`<&}Fw4cY|Uc8DD4%&i|plLqi3 z;M>M1*b+kS+oC*U`gW%A-3^XYw&d!3SUtBC}fbh6B) zxzcG7*u36p8cq6X4M4uyV*)wls%l={EGn6XLYS?ZPa0PVF=U^W=`mzdI13a*<_s}p zz7RvUi$CY+`+!ZUi4QLnf~`7+A8gg4OdIseI!(inaB;@>ZjP)|z00WXB|EsGifLD$ zeK#*?&t|=QL$CsSbtHNLpx6C>l)ZO6*6sU0{<`cv6C$gm$j(Yu5oJfnCQ)Q$CF{B< zAuAD4MhHbl_8yTvvS)^-jQ`koiv_l^7ge*Zqdf3Al|k4LZb^*YbvJdWqFo(H45 zThi5&%zZICeRREAOf#5JQN>NqEMjTGeZzFXLS~{s1M7M#@y&`yQ+Yc2ACm5==aPV= zd(#pWX6Mw7tUj%4aI&6}B9I+id!h(Rc^kvgD9qe6z%8{l9F3`|xG&*-;K~D@I1%y@ zrcYVcj-5=*;{zE7CA<|x`()ji4iocln3BKH1G4Uc%M7oNl67|-BJ0j+h|2*}6v&}R z^WQ>7egM!5G>HK(vjv_y$av?r=;V5HmkAsIg30kk5Hm0v2>jix7*%HK#Mi$cLVLLw z7go`n6Ajue`1q64L2tFjpJBln=VayYVTJ{F{5>ofFG0Kdwl|)XqPtt+O)Ym9_$+*H zT-VLhcmKHEi%;79n0%;(#1!%T!9c4k+LG-{_A7`HQe#=CTQEfpmP$A9 zpb=bY+Vn(1?Najx61oh($l@IL)-Ju14v)2m)!Eo=Rh_#eUA1FngyXqX zJDXNce^3A@OLv`qmp8ZX$%1n1KlYgPXNaiTU367fT}xqpQsLkpFvs@)p)|Wf-(<|B zI`Oa3z(ZN0*j~gbDuA_|_jmj9>hQ}x>`m1QVL)6xvPQf4axU3|*C+ad=J7=S%`gK3jyVUY?isyFyI$&Cs^y~qFGyCy6GK>LL^#5GJyajOfHLidR`1ugw5D+8dwDHul|x( zaKGR7zEVFGf=v%=^!YO`Bii*i37#u@fI}%b4!C{`^A7@6XP!7KSH$W8YO-}eO_uVl zK>kxwnVZ`zd}w^2CQ;J*z!g)yY^LN7z))-W1F`?&NJ|-@GAiJFVcne;pq%jc`+qb@hTFz8eqaz z=g-Hnmv1JwwHgu$S&LVIAsYLxED+wapr#O$T0hA31BLarZE?#tF)E$-lJ#}*{>{$) zIA`6@T|nE-0!Xr&|Il_b?GF*|V#6XsIr%UAo>^QKlDzp&LMR3Bl9kV2!0?i-RY4%a zaE9#8!$l=z$P-XAs1v-z_8JfD7wK||p_q(0x556TCmWFV#9T9w5^~zoL$9@V)pZww zNqpw7D)#;83apW|`v^?N}Nq|XALLEsF=y;lu2LnoK*a)Il>V4 zVZXz?#jq%v=FA@z-ZQ=#s9E3a!*z?uxA50Nn@vd7CMV!4Lsm~yfLHN42zgK7 zHyJyczx&?pFfRfUG_TeO zK%~qt3N%U2tKT0`1uceGi-8uy^yY#7wqF>HkR;gy2w@m{FqKoxUwZ?fSWH&{FF>QI ziV=SmZU1jSde5qHWG980tur|V?JGVoXc z1L0DS(*4xroW%mB;6$n#(`7y3LMaWp$i~@z8bF+Aby4jxJcKskv-883IlB^ggjLIU zTzMQO!$)I^z2Ze1b%7g&{=A=j2VIqIi|*SvQF&Ly@92PH2o?Yr<(oj$2qnsI zT&k^+4T0g!|8$>&;jdbNakd$22z>@#9{CTM*%xe?m0rs~{nvY$ z{8+rq>CeaAsBvf_8E$4pQeK%Ic)FYyCVk5!Q+(7U-azDBcXA6#I7buiIX zl$>D?WUL51BV-vaHXbBf76jec^0dWQYcg*qPXPcM4Y>oU)xaAn5r`qOt%5D zvqb;f70C=FB%>BjN075OzKng{%^YT41396Y!~%=SO-v`)#s>keYWaev#af%(!(?f@ z>pztCP#~@=x%FV_K?{>^$&_wjk)ylO$YaEby=6(R3Mnw8bk~8dXurAR-2RD_G(r?s z4p)9<^{acihQ@t-BlLb?MFM@wS+mlx)MXybN{(a4B=)AF&9E;HRB(rZhqPcKD`$WU z@v#l>4JI$R)AzF(d9ZSCbj55{#sy}FsUL-2KtSpQw|BvK1`xw%0aNTt4i3QpXK7?6 zHp)k4Hc6}c>WQlX#jdO}zR?UjftN)%@6T+^^mcT>E87?=SPBf@CfI7Fv>9MZ7GwKI zFeL!Ho4;4YH$a~Ut!n?*>9OjJ->5%pzf{%81)VQ^Lgr~w!I-k`PVlxDR()V3UCq{t_@2?@t+Ml;Sim}4DVw(VScpD$Qk9ANAz8IdQ zZHwyi{es?oIuZ^r)|35)!z~HLP6KhH%c0vN7}JQ4)?J>tg-EI!h$7a0RW{-lIPLQ( zX9s*g8<@TPr!Whci%@z9sdU9185ChiO)&7&=gJjr>Ov}BhgB>LAsW&`ulQN4=!nMt za4pZ|?bEzWX99@D!*);RSL=flVtqwdV(|0Vjaj8dV{wDJgB0xPpf(ZMdDZp|$wVVSBaq8fet0kz2XM zSOIYHr7(@x=4ao+?27kno&UR+A8dTo%MV^05z&)cm(im15P(n9I@ySf?_W{W*J=>5 z%3{Sf?iFFOL>-6;{KYmyBR&W6LuIV3q|!u0R|{$vV-eQw4%{lZ>O)p@L;!Dc@9XcmXzPj#ooSK%`>9*d4iZ>Y_ob8b=2) zL7(S0R65oh2@^d*sFpj9NBOlPWb+i5Rz5KBbsCMS$TdZ!>_ zqIH8FD2M%{!G)u9RKsRg>kNtb#-IN}ZSBfjfqTQd-HQXo&SOpgwIL6%N8u-0R}CPd zGq+yy5OzFC-MYfw{68}4uBac(k}8wdy3Be`9>0*Mzk$ORVTPjv>gq||3cf9#7-b&Z zevKc9`m-P26`(t)Hep~@tU>xEL6tRdA%wC{leE5jKzvd$)rcQm&C zzl8@FzHTzYzf^!egCfzb#1UZ&|E-gGxL~W_hJfnx>2VWFBC@ELb}_(?@|)x~%_h>EzY! zXBlFT^fX z8!Mi;=le4*!<<~E&q4OSs+T>zSZaGt-|SPl52f1L+#kizRPNuOgP%A8;9(bPo^w>W zHYNNw9*6V11A%szTw~v~XZj94S&W#;T!wvLnMnVxH7`w;Z9QCT{?7}7ntc<=Ojx_B zJ@!L}N_akC`XdPdtSTD6;O2_ZbaB+rn=HxFI(?h5~9}4^o z8>w!zY8Q8o5H`ZUNdt?FuqDjRktkb$HWQ^&mO5VBnmOO)Pk&_d@!?k_W4=!Cg5(zx zZHC$YlMOsDQG@L|W5P;;|KYhx(tJK4G)yGROakaZ4?mKlu|S>^WKh4RG@pg_`lBVBI;eQuGH+off8e*FNG3xj4AL>a!CQoG1G_mw?1)jGrbk9f;9q8M1 z=X3r~UBG%J;~(P=Ngd{;IjR9U=#wI1gj7NHfgA@w=pWJSzmq?toIDE^1 zo9e$bZ&LC76olm=uOgh?ccy&s+rw^}EkDCtiI~NH0I4jJ%8KA}N31I|pI6kq(uKRaQP-~~JWTVp; znxi}r)5Qg#U$o6J7lRLxW!DR`@Ac@Ng$q!$6TD^MCrd>oFf7;8q&tQ zg$XWY!tA!T%U2H+`fn=4)J+R(OGuydqXCpe;nSXwVW`mle)73wVrvkQZn4KsUhW$6 zFXcT$;mF$a?M()|={` zcrevsNByKL_v%RTu*L26s#}>4zaS`7db1ZwBnbVkqG})yCx{u;!QA=U*CYs|FI%Kn zB4A5oiuBOp=HMceXZ|AYTR`qpP8!eQjAfkAfipw+UR|blf`4J@)F&vygp=CfAoX-4^GrzEg|)kEyj$XZ4sJcuoa(gISTmOce_HM{_~&Zd?Q z^7V9Hc~TCBBeW3EvN>VMnmB*b!vN>;p+3+PA3S4IjIL!&g_4Na;T*qm^(hXKp)Yi> z)YyDuCALdxY@xm4+qO`>E&2m2zU?#6n*!A6Fd^rYl}V(CLC>Dui%kG>oTP^m$RO%Z z3{;tp18>yI{8%K`ql_tDvb~;jUIWvCVwR?!?hj))bVzVUNo6$i$CZcXme7_1!`v(> zV%nY9OF;;e&_(8Ma%_P4J8Be)P@&)LeJ0~-k`8Oj#-E*XEw!KCNzAnNS2r4 z2$7pf@@9})_DLU>Csm}{)Cq}SaM-*xABdY|`{Mg?KE}oVuKm>Ng3MvD1UEM1Yl@K} z*=-#ehs!Bq6MuO`Alxo>Wmza1LoOc+V>vAJ?P zX_l|VDd)|k_JDy$dbCfJ{ofI4|HkIjaQl5qVgWPc_0U}kX#?Avj)yqpzJaL2h!je0 zR|t&eQG>JO|1SWmg`haHsrcv@?iJZ2(B;S{d9pT0)OX$k%a3{8U=+>gH&Jeh&BKD6 zS2=I7URlU38p~riX~FVmA}kmr?OD!1i z+Q@EOFV$t+R{VuwKe16KP#3e~f%As{m&(gS+X|$i?q`TS=(8k_uFzt`FGsFT9XRyB zUmATJ;_>_iJNkMQ2HKkZZ0waoT7(d{MO+XU`n5GP=Q#Z%HeWO@)}nW9uITLSK}P7P zC}@v`h(6@V*^`6wtm-n0Z4IYL{V{mv(3RD-xONgSs0H!idlw_S&M<{vuIVtp$V#ku zG9uCDz2tHAAJUZa9E_DYAC@4M^7q{W?v+R^O13S{BMIODCH+_`JB9nPLx~!GuZvvP z>t^Ln^E!K4r>Ha^I&aK7YEJ~5g2bX>OP2nOYk&Ddz;xP5uKT9rK?YcS%>^(sIT1@r z7(TjK_VLEr=JqLO_SV>FjmJ!SDdT_AG>FW(W8Mq1FQ_}&+17u43L0@ABL|p=;H#+s zUS+1vI2}}*De-fobf8K0ZiuEk|Ly-1@~w%79g)_jQcQ5o6R=Xva}t^RCT5%gsxSpG z;*z>j7vvHq1jCM>T4ds-HR28%@_F?M#>Y978_nQ1uo1rc?Us$>>bCVBg$Ym9~f6Uk#g@XJu31X<0Dh;N#1Q1*e&<7arM49R?J(R2b1KMgFuluND zPrKtMq3KVVa^k~bT)bU5dX)CYUv~&P_94ta-DqynB>+HN4})VoQmwmq2+0%x7V0(i z8=&~sZZi_ZNOr|meHgf%ywTNmKHS*ni9}i>j`G|j?mAfh!*g@wE;5Hm%@SZ>T2{qg zeVAkLUFBA2D-HuhNdStIM%gmCZjEx?vw=v~sq={;>Mzs;d8q*{8kqsHP4C3mT~cgV z&IjA8&pq|Jxbj|bzqs(IgpXr57VcG)sk7l5UI^VAxw4aWfSxQNNA&vBO=gg6yMOr0e_9S;NKp1G%PKw7gFEQ#7uWxY!!el0@yQTbkwdT@)@dru zU6L0bvaJF7fHeP*roxwsSR@3TNd9Z39rD1yj^S1AV${ktHt??n7fm2XGwR9cFO2EtdI;?$gQNUD0f)`VXFebpvzt;=Pp&)DF`3=kJSRsLvUl&yynHCRd!SI zb$mVNzVz>wF*Yni#z>VU8mn1BlkCQMG5v!&yo+u39!LoxkGpPMOAmUgetE)qI_rR; z`Qxq1k|M0@$c9{&*rQ?Xbv4)IlC?*3v1Pr2BzVH=k(CjIy)46PKoDRW&dh;-|v@w zm?FAI*(VdRWt3^l5=l=DSRLD1u4VZo@IFW0GjG$z$aOR@9j3-AF+hb#eKUv4`N@e$ zeNYAol|g<@Ux*47>+lIe0rg!DFJ-L*)xCnQ6RFQNS^){ zZeG>ANX4UK9^$RN%zO@*FY`-LeF7Km3kDG%Len09qv^8B7~%|S z%K22PFQ-c}^X3n!LHIq%n38s0{#9&t`z6g0-h&(O_Bji-B+SpTa~o)^ga)=7;Hn}w zysq(vqu3wkM}oZjMeNE5p4bzS90ikheTFd-9bUvWvjmhS(Urff#0W$O_{F3PO)J~+ z@c=jR;g5ssgZYWlQ+$p*4%4+O6<`D3j04IFI%FByt`YI2 z9BN*`C^f~201ZQeQE$wl34FyQi$0UN2XB@vGbr*g^qsB5ZheU+ zk5!4vQco8+h4zNmN7>a%#tY=tWqcpcIHhn*-HdOoz5D5T54d-ynAIx(t_1+fw{#E_ zG++T$|1YFOca%A!_i800V3i#YuuLv^`Rb}gY53_nEKTf6c&(-YHj{+HN;~dXGG3q)HldxmoiEkxzApkEdjIzISsQ7;|@xH2~dCuTrn+bOrbx zLvJ{o!TcaP0W% zCPDF5y@>xFys^Z^yq8DF3U(O61M) zS8Ukie7JBG^d3dJ-dF$tt??FKrP~2~06GNexjUTEHUeiBf{4mpezU4WS^tUUvH|Pq ztu99{3J<=~IamE7y9*c;lQ_BEOG>Ecq+O)!}5ZCo(zYQvI`&kzBpVz)x-2GFKPoFW?iY zx*1SEeXfK&<`jgC=YV)RAeswVD;>h@IuVF}QaQwpWP!!r?#D%6)Q}DFbf@cdevmvjr+z;ptIB#&0tG)ao&KNDc7oQgZ0cv)jmkaX)&W) zBE>DrEusQ=FJJXj^G{^h^}P^U*HxVly&!%wJ`^dles@JTnp#JMLILmSb@L<{*_gVx z@ypW&dbe=KQDq;>-{XG_zOCL7cs}vLJK1!&V@wNA0c^!)fRPhFiqJ};wfs%vn-yIy(YmX`|g*Jl6{lBGO?&S@5pD8_!Ps=6M>hr0F@iGtIvr)RT=NI>6G6A-~ z{Ic+{3J1%sySJG%MPOr()?xq`CJyPv4<<0!I6RWWuC%Q%a(};RRAMA`W2M|L^^Msn z6_$r>x7kj2*IXD`Z6n|3%fP<&XC}k}$gjaYssS^nI(fN#Prq87;&CL?aL?W}ntAu_ z)Cjaib6}P+2zqZrvH}@ABB|!SP}qwcAbeHPH5K4*4iR|a4LTF>3*ME!Y`cCnvTpvR z_%s1WJF84yTYR7VL}@*kD|BSFYwppo(Y8DGkvEfe^TLw0$T_ZDPN8&oyXjv<20o24 z^cigFEr3y3aOdCa3)-r{!K~&37x7lN@=W9HIXv$p@c%ya=&6^N^{R~2G1JHVD+I$0 zMGC>m?xH99=CsPdV=;RN;}^oK1hy%h9wB=+)g3YoS!%-gL_Di(EU;^}- z%KTC(XzeB@yxcX^ZqZewE~8kWS`iU}I)e`;qa5Coz4Ks3JFuojicu4wZqt6mW6TPZ z49V2PxYCR_PC<+7gSL9Wai3h4vKTAslP4;FbN_?NY^8jTMH$(ZHZs#{7%%bkm^!kg&Llj}mAU428WfKmf|KA@oEmZ16I1k= zXkCA`r^ulI9tdxY1|M_|BeVVql-Q%%$c>Y8M0l04sv{oSKbr}`T2lcZI2%2~ zrKyWW4j#{1O>92>7?7E|6d?fpu*Rf;PTY-xKwapM2XZ8cJo4Xn;^50T4&OoA`xf0t zyQ(KcpYJAozCf9?F6!h>O5A^vtzdoi3i6b_M2K0T*O_`^#4$tayX{ycAOrz7JD`p* zrb%ZVuTuOoAY6L0cSe9A2w1wDZ+wvXkHV#$>HrRfh2Mm)m@iVh=}^Z~WIFB~gy=8W zaNm|c>Sj1`9~E%-7}cEDtC5XoH+OE_a#=oG)CxB6E(3V_DM5(BuUXC%53!ysg7iXG zFT>|N=W(d11)+&(CRIW~h0Txu@G>f5cp1r073WysFBY9u;J`YfSgIo3;VZVCry-u# z1TiIRdwW|I--`lYr^67^W&#+)_I1qEC357)c){lG{A1+Cu8&0snNx-9yNNfjcIE-X z`19||OqB_`I&1%2taK$GZmVo6>qvbKoA~H0 zE}z(S2;ZX+f_4;ox$15#l!SPEeE}9U2?B|nZEBF@)TnX6gOsh`i-;*ZZ3|g3V#lw} zk;C(MKa3~sUIk1K$RPs;8Ztv=>Woy2NSwHHz{kIKii2m!F=U8E2y;l79KQAyZX0P%34$;-_W3R zidzK1mwQI3DlC_yY`#7_KY0G}7I0=r2u$b5*dKCSg1SURF4^^6KDw{?Mu4ch!DxZw z3B0w#W0G!Wt0UC&awMfg^rpX9tF3M$fN!4?5;g?P`_7%( z7E_k{1{42ICy+9lGOI-m-0huyq)mEO2s4-UklvRvK5?B+@d$?h8L9`Afv{CfLU7*d@Y~hN9nUYVxtxYHyo~ z!xVa3Ndp8a{!9j}CS#QvA@!HAL$6tNwgrsK%^!_AR`_fi`n0G|N4_4;j63@TjzQx+ zAZ5R`!TkLa#)c1i0{qj3iW?wmV+OQpF)Tic>_+-D9fAq6t+EU^kIWF@@A@-CfNeNM ztD8~!$Uaqk*habe{3L4Fb)XTp*xr5wR&wMyGkFQ<-fwkgqzI$U!9h%Fzn2ORF@lO5 z%Be$re7lgcjWG}Qn#10j(`83nRlRqrZ8>?cs~PLx@n0qwUXcad z*GK&35KTV`eO56`s9mfnM;`6pYH|_tc;I6U)(+tVcR!V`4T|5@?|2)t0A^N!tM-*c z)v4Syd_FCTxknJ1)yrOZb7*G3@90E465d$SBa0N!jU?(pT7CK-=3d`@)@qRMPY+da z0zv** z&74N-RNA+l7gJpIER)oJ4*%5AEfm^D4V{G-T`lGfSLjs)!d8M&^(C0_%SnD(*Bp#= zOV@yyeGvH27N93nXoMlpUfYU_MMZg3)@n1qk!IOLxN;FrC0Wfrv4dPo@78^K?7YI? zFnMdzx!stGN;DgZ4B2Ci`RZ2`XakjMG(Y)a z4#H0LPxkdmtqvaKl>1Epy3bGY062)Yiv`bMS#zLEAa!+3{T0JByN@DGe(UqUMh0XE z({<&-!FWIQbunRu`Z5V@+P|DDNrEW?RULhtP}`;;TCc^pCG4bpC{o-;s2Q;Hf?q^#BHzqcu;ST&pwh zWFNv5ND&Kh%x4@IOqD@>N(ULHTwIxknje}_fgE>U^{f7AEx2te9fo*eiKKWZsYjRxE(*Z zW}lKCu~#Fmdz8L?k*9&Ri*zirf9HtaYG4KX4Q`L^9Z;6@dB1*x9}F%`E>!@|ldp`N zOhH{dTc|k9z0ww*h1Mg7hb-c>*FDCfFwKo(IjuZoVnSQ{Z{mi@^BrE#$T^+)SdI!9 zchhED4&d@`jZ1VacMSiH?m@Txhw}xjV!3eOR zp0ta85P>dkDgmS$AY(-4LBlfNwx>IjBj~A*tP;@L{cc%q{xk$K>sW})HQ2RZ;Z5AK z7cY^_;f}2weWHbnb%E`b9oF>$f^!dSjbV~YUgYkh*vwm%_~6eG+hqm?=%p4kAat`k z_+I+j482tHfLssX4pC)Wqpmz9q|OD&K$WhqeJCNBx6oBWgt}D8V%4Y3h^%OAu6f?5 zG+1Rt*1KAVJEE%r8HTDZeO2LRSQ^dhyN)%Ifm4BPDxy}`5QkO-e{O2Kmt$q+`S+f` zy~t~l=qZen;fjU`1|bN1ELTeiL@g$$y%v>lZ98G0| znt4lhKd9U{>U!oHqItQ6*Y2B?iwoBC9q*~qNW5b^%Dg<2qnfM}WAIij=xQEO_eHHz z8iYCy;*M&SvBUroE7YtEF=171tfr0VIwn}Q*_WH2d6Xa~-_VH^n2mKVPruQYGfAtP z?XhF=U|x!o;(pv~zU;$ihS@=K_uYQHl5?!E%1^^hce>vaKftcsj*x=I+d>cwnsbQY zg&EsmEg9hIWSg|k-7bmvQhY5a{ijY?UrE$5A=cVGCmf09lPr0=g7d9=W*V_jLhLVV zsXNHW_P2FMEVg1r5SNj|DRJs2`((l3YI$AhMJp z?1$*NpHk%(*V(PH`s8scb;}7W@2%F*3jEyuk}}MjGtQ=Swnh47cg5NT?)&$p#Jyy2 zuzl~~96K`j(x9%3h&?h}DBTr(Q)~N&Dfq@;RFDY+bOIKi3E_Y(?LG;%V0Zr#TuFm$ zqXd&vEeB0`zNpvvKr@Q{58Y)x=%(!5;);RF7tW;NdIg#i%DtrEzV?8F?kwZCwx+$P zsYzL6~uLqeDp49Inox{U~U*@hgn)|GhoW2X$5>T7o?2E@(`DW0MZF5a3?^Bra@vb z<6T^u%vO(zm8b0K8x)j~axCwKxVnbzYS)T-!fhYr>9z+lGQamU;bG>M5$CJmDh*TJ zZnLY$rIx{+9ddCIN*gE&zg;T4>GA3I#Yo662a5t+zcw8UYN(a7ax5hob+k zN9q1T@01#N^Y8y!#(5UFV{i5ODyKqf5i9Zu6UD6`6}G)tetQ=sT+SySzwziw)!grU zaKSXOtQX&ZP3V+d&-T`aydlK;6Ru~F+FNM4>Ae|)a&HPaw4lKU-z0Ak0XyAEw-V3n4l^7Xhz3~D|} z=~vB$Wc(UqxY3_6?zzl99%;So{$M!nHig22%#ToL1ne3)$%QJu72Z;!6P7{>FBXY# zkDR5~2>H^DXQiK`y8H7K)_t4kyU&f}Se@W<$2F#ajTXQljCRuYH?Ad^1#!9zWdxA@xvdv|1{xqB*-BW%OHs&2-}W!1%5x)3>k~j5eY~DsO^8s{<$>Adr+Z~#QS?lut6?ED1!kIF zuD-V`hFnb}yX!XS^wA&pOXGz_}1*K*}d+F)cMC_1pmZ1euv_(W}l#nHjF&Rv4 zZ8|BUab8iU#p`uC>J1%syf7om=Mt9pVE#DriyO9VfH7_iuSdY@9UJKzfi!WnP`c!=qKKTsW2s5c(NBik0V zio3{|I%?3K?y!zU}k*UUS~{$356yW!Pho~DCtqWK$t^*yA9&CSbe5!vrvdcH2l609goY?7MA{nF zSZ;it5Eo@o5pLqOY9xeiAOq6NC+K;vosU&@EB{Tl%VDINS`nGak+=D3N6__OnCJ1* zj014$-aB!p{V4E$-Je%qFVB(m*$#_^874i1`nnT{8w8W3guJdIM4FjzYi+b%)ylKD zkS0D*e@Z23i}nrH)#|OW5Ub5cOa!-1-A$Ex>-s${wLrCiG67Sv%& zn5Uc3$yYn)Q&|&TH=Aad&N2@4lmN;_f89y)nSo>pVI7ei^7x}eys^9UUs@c{w%x5C z(j(@eOF7SlS)1RNHxnWQnx5j}60?jlRCDC}{ZE1s+;L){eS$ zE-&iz&j+@Zd~l#*8&1x8v4koY!OnD=8q>)T9+%WATk2J`ri0qNjF7@|@l56|Wm6}8 zsQn!pADGQ`P-%e^1bapVBipVkiHxw-tN*l_VZ1KSu&qQ!J2iSSc3|*AMJ0U&Zyq|* z0Oy6K3Lj;T%*>EU)OJY;eZUJo)~TfIhyGli3Nl(0D8QDNyYf z01*@2zZ;hyljZMCp}*ol zw|Aw0rHspWCxARiSTqURcfzEKvK+_XDb?-<+~E#_o-@n@AX7oTdwWVbGPrm z=Bk`W`Y~RHTl(GUa2fW{M^W-W?2~c=j;R1QDbErXC>0rJ8T`dMK<9fHHB+|t6#6L+ z)P1mM0SlJ25$=5|sEd>O0*=f07=PX+Jn7G(PQL5>i10nr5*gMD6*X*psk~)PJM3%H zq1HcNBwSH2Lt;I1`C-E9fYEh3lZ%fahy}VKE2DYnm_0M=BInVXR+_&Js~huMEkt;D zGV;ajqau7!r}ijoPHDq2O5yb=ULOL&L$uKpqYe?lDuP-+ zMAK&dbOyJ`k46<*(&vhWFd!`MOUNAqcAWcnMhYL?cy#RoGq%pRS+dV#+?Vx9Ucy6b zBR$`lEp^M z|A=n0kjkRC@FxwkpNx~wJU%6o$>|$R%es8hW;x;png_HcLJ6{R2 zNh?VS)@pnD_kGNafs`{FCRb8CwI9CE5tc>8K4^Gyo&3`Av!$1$MO#hg$^H6)fn`G1 zuZS%_0w0Utf`<335J8?p0QEi^Kw}R1S?xSlyAOnP1o-fEBDP&;#}~61J%>BB_=*^V zc;{N$V-lA4xISiNC2#DX`fwnUVk#?p1KUSVDJ3l2KrRaY=sm7IsN4q`27Ygb2xS)o z1yb9}o?eq7lscIOw1*Q`r7dbi6{4t>N^jGX$1G|#3l-jljJCJf?;5>b=e;*b`(+jY z)8T9({j9I^SPB7gEzqlFawh+Gm9JKw@LJ ztVf|&mfPU7R84~@+g3CeR($(5oG!iX4rWosd$Sm|N$h*Yeev1{+qS#6^+~cq0mvG2 z5a$$~w!Y@tq;{2@$rVw5e_ozb0l1_0MZEoq*qBuR3L^aFCCY7e-B79?TlZzS(;a&+ z-Eq!ccrDb8IU)M1{UEw!8_o{tOz%mN^l)(Vz~a9_j;8?_zCQ~s@go%HY#257Cf{iQ zwYV`##MAe^J%WlP_T&}WG}VEa?S|wlFj`ih4n)q=>Ht7FL4N#+yyPwI(^nDYbHEJt z)YB%H8tg2%^K_{{&J7i+=Z8YF@X1dtVBFS@xjXCSTOu=+ z(_Rka_2Vu`NL_)I?+$f7^PR7sHh3&F^#a{J8wWM5bgJgij<8DA##7hx(7P?*FrayK zmZ!;fFzh_5v=E-O(U*5lhpD|_s)8hg~YN5^is1eH|h!(Or$_wd4v#M}DD?`qICh8q0cRP$)hIW&M< z78f%imI1U0-vfZJWbQ)AWYX<)P%lh$swuAc;cqK)l-0H{E1r&9QfL6|+)UHEZg1)9 z+0WP%{371xQj<`TjZfcWYB7Gr5TB&`afk87l_jS$$0d@!yXhhxqu_|w`@$%nhaTTx?y1;N^tS_|+c+}p0P>rG}i8YtfR zd;(kP-3cR9(l>&0dB$TnkxBt(FumN-1c|rZSg%&~2MBox`-3N1&oxZZSP>rc%%*;7 zEN9xF$v>L|Ag#W#aYcCAga@^0-2_L*^<(bCE)5#k6=W-j&2-Tr%E{VoNk;WXKBB5# zX1_I$8{>j)W*V=54*KyLLBB~Hr)lKMU0G-?`ykoepK5O^+}*IOcPyW*Audb|*2GYM z9D_-_&(b9iqI>d6pPwHt_Y3O3G$3TG+)*5_@RORF2!$rZd;I6&#&k1J zX!ryyg>Jl9gJbk za~;$$sQ~E@xTk^)ls=8h30_~@J|^)c%yBko)ugR?c#9WJsWY8bFGVj8lf)0sQl!*< zlu@P!X2Bqj<`+!ZEWLG*cRoyQE@)90nrjy1z2Isx>p6>++E*6deOk9=Hbf-*k#&oJ zOH$Bi0zM<_<%B+2RpalI&xcO3@jA?qDtQ|yHTK4cojG>#hhMZ=pttAYi3WlfO*F+% zl!-o(>Za1l+NrQaZ)%`>2hq0;sC!W4Al5p??FTK*VYSyme(D-`p_*JD8|*CP7{jS1 zzycv_00k7Cg!tWZDW&J}Z@1o&;h3)P6?B!p(Nr0F((9VPUuxwC$u^|eo>^5HsD;nz zYTfH408yuGe&-hHyr=9o=%)kd3bUelbn+HPCA~nu-|}5|3+Tk9$R(8yg6(e&BA|7< zLoAZ^^V=TXFZU$VhVq_ud*((9G3s#%W4*Mvt=5heWN)omNys=U*gAJJN)w%)JLU1X z^@i1*V~!MjXK6l;0m!IenndA124w`Od;3J+y8T-$Qg3WSDiw(i(6ZTuhwn%|LmTt8 z>=i>R^w?_q`%^RIF}3rnw)48}yV}NlZnN8N+F2Ow{*`bR>%Q~TXQnhXyXTFjynMaG z-6cMjMRvt~$5t#c<9waQ61gl8KKA68u%?iXcm`Q|6`u(Ls)Dp}{*+0e0hbzPQ_@+z z!JZh?^q@kyfq1sJfsmnOkZe$M?k>>q^(*Joj?>Ka|1FrQtKQJYl){Advl-tn$>Qzz1)oqxy8U zR=;x^GMuoDs(UUa@_@FRB!UY?+l4|u;VMQN0X;E~=F_RjFT4!x2t(bt(imB7XT-Lv z0ob8+)12&PVE+~i*Kj`Kwnw42pyxVAbj^9`5^<{}{Fg~QOdT2c%pNE|6pa_h`%pqc z3A^Q~^EwxnsT%an*V~Rs%gF03Qu^!-)nQa*c?lxO)8pLkk2M)W#Ua$(7)FW5g$en2 z?q(LC>!Q%URXce!Ur42$fHqMMr;DG)%1T#!j@BNX<;+nLT?6kc|fkA?Hq!KCuo! zaNW$d5%br%-D&)p0&Dcu2dudSydx;i-f;7N?P}C4TI6+KU-2#)odqmz zdM*oHBmQhi40+EKN`s%vnLYJZZ)hp}<75r39?jJx?_a_X?=-2v)dqVl^Tm_6IDZRk zHf;UxO&Mq}U_~x=ni#mOq4j-}rX>(YsD~1P^!|TBu>lip|A+QD1=NyX(*)GKgoR#U zGq(Z0!3MuG_qY=VmyCV_u)|5|Q;$+WkILPG^pNJq5Pd4KKxAjdxf%DcYJFSyMVOaM zZp|f@SG#7y%~C{g1SHyn1y4_Keu93-K#}2i zi7F=s_*F5Z*Ikpu)FT905n!d~;5`up^7HT1dioZ*ZRl6$jE);nqwklg6#&4V6?WD| zk;*l~I-FM&c^2`x_p6(nJDYs&;|uOL66-mO9X5;LWgjy8zok+5AEF}@s^D>)VOQmj zk|J^V`sPoK*!xNR_%GMg)Y61T~W_T+}`z zdx$*Y6!iCEFP^G?H#)=*bD&jA8woOK8c^+Rd#}=@SY%G7xgjt6LZ(UcQuY1?sNQ!4 ztO3>AW{TM6e|F~jzPNR+VJ%iSN~;u?vz3df-o`VQVjJMKUf%7(hFWEvW6*2yYM3B>k!@T;s8^D0Etp=*bKr$-JiRJE z^l6-y-SZYt%20f<=SFBc)BkFz(UF6uxM->Bsq4ktGXVsH``xWKBPje20!!mjrrBrX z2{_S;pafh8fC)@4NeN4DBLx<4kO4%=18inT@-;ddk_J6E`1k-wE%LPl`g=Nv1V1gi zpgKqmnZf%Y&5DgeYaUZKh|VLb*GImTO(|}{d3=bx^fuzZ!7-Fj!DDYq#*eKQJ1rx> za>C;o1>IP=iY!Q*cQeHSf61bFtsZAeoX3vs+{t-Z|nwBcb;2TfSn(gXjdL+l}wOlD+p=FL{8ks<0g8%sl za*HDD_~95%$)Lf3M9|wyA%_+B7FlZYq@fhY*k_V;y&h+O0xh}}=*bzZ6!Bq(FTv75 z2-^(zft7oi85MEyik~zJH#(kK3%0pdGK+m8V2>L;!oM9|AP-+wa3H+h<++iWR}1|F z``_g=X5PnX{+NM_bF7t4H3cQ8jpD34qqG`YSLm^_=6|ke1u>ZkNg*vrhXuSI!CZ3% zVc>h_3HB>Sqn?C6&Nv}rCg7j1d_Br;^lduiGdt*J`1XB#fDu~xE_yZNCBDXY2L4*q z?d<`%XMnz*59sS!#+Xxv|H)+mXWRX9wgodSo;X$6q@*GoaIAPMX9j!QxbYIp6`Ypw za4+tkj8VY^z|^xaFhkW9SSi8LOYj7CmPMC7a)eh8Xle~=9R!NcmES>L$b&Q?g<0`5 zcX?B47#3z0x+c{_hK~qkFsHArRm2a@-=WMN5!~&Hxf4kJcZF#^Yoc?IRw>0foHM!P zrFSGbruUiRT+|b!9!0sV%wdab;prdI|Ccq0ga?!m{KAL|5l}6|&~J$JVVZb36S@;) z`qeS*n`(VOV-6_9Fk%#8Mg_xX4w-y87MnZM)``<-YX9zfrR2R0=l2ao(L4f;ZCgIE z{QsfN>LWbhH4PCWTN{++i-I`SdSS~ak^|QFw$d`(d@qw2i^0)0d}QlSx)7=2S8VfZ z0=3#V1R+|@L2&QsdP0U4=@qFO<_dJngA$*4QUkSOa2`8?cEJr2uP2zGD15C;?W{4b zgaKbXoQGcVQH^?Dx@GbUCN0s!=Y+a{oe>hc%s1s&?|$SXYgj%fYKU!-N!1b2l4+p_ zT5H%CAzK6H;XYNcM-`AZvP82d31AjR?$_IrguUnxOi&(TW%aCThM|+)$1PcQ7lnql z6-&bI#(5?buN;Llg_m+bSFf(~XMI~pjM-M+aRgYN@Y)fk;arCAX$y(ZV}4z2wL+y=&a#bQ6v`<>gX-W6e&eRwQzRGFd<;L!`*GeN_1++fMf zG%joGl4mgDGXau`9wS1A6sDdr&ktKLflcF9qcZ1@zpsyTJmuLHvZQZHtZ0ljsP>U< zi}}KDD^=}Gy?m(rhufgJ)x&eNcI(2n(3`hCw8*#!A7|{$)l+zC@)vwWW5af9u;tHc zJ)<Y|2y1l!AM1cf zsez>L&KU6f!fH@cPF4JV-mZw{B?l}K@|vI1LV~Ls{3@%L34AjrD0QqTHz@am>5t4c z@XZwr%2OE8JNP5Gz}n=mctQsRYh}Zogw1k_Pk=GT$-Gr;h`j7?{*}E%UlhD@#R((& zbUQNu#W8x>6%%e|5nKUT0i0M6!k&&(oq9-|bZ@)JK`net3#0Xr%5s;~0G@mV8gqlR z4deGTk{7U#+^=v;(ddf$v8!@8sU86YyGhO~YLDs6&UuvsMSsG-@a_Ege%=!Fx%()a z(^Gv<=f|!7vB{`P+P!rGvs*=5AZc5Q>kFZHA#0bQl;D2`YY17?(7CD~B2MPGwLWQ~w%qqF8elUxV zFx)cx?tVC2-v2bdSa-nrycjEZxj*xC*q^4j(QRarAOOR)(H)lNj;>M=IxgZurOW8H zrCXr2z#g53$RD?1Z?f1{{qVX(cxuM8?W2C;pfJcInCbGFP_$`>-&8dpNub2YD1(_i| z`DG33Koz?_|L8F~dh&Keq@QcAi@?Krpn@ZvyiIYK*Ej`R0y5mn&kL&H_Qs*5m*ALg zdi>lI4r_=2C$)HCG~`tyz`LP)jqmZ&0dQ>o$y{3hKaG7-HPDrtQ6ZEOPxB|OS6ks;zhQj&%> z@213p6C4v$!6(AD$AB1w+2SGH=EGqmv zMt>9P41m(dPl1#Wjz81{T6zc3whUz@sKA5+f3q-tnDaQjJ-j|S75u?CyYxX6UT(T2 zf2RiB;ip>lXZqSBkkU)#;_YF$#2^pX&X&zm&zmV9ek{_z! zV)^bq@&sXy-Zkr0-AeQQ?jSxH)7`zBYc>;ZfDx@ZhDPmikP~hak^vTiItYFw1mB4u z3-rF4zU`zBhbFS%kVZGCq}(hYw7yLGfa|bwBesF31Tl%vV7-K83Ffr6X+!kK!eiwcFNE0)le7i%5~%THa7}6m!-|ag)h6`qIEM3xI(}@Y&5q7oS2~p z9>AehusZ^_QVCKRxy1-SqLn#jDuh3#PzR(-wQwNFJMWF_Ny^8JPiRzk`n1XSodx{3 zc%tEFAyAo|&2xi|38qn}NA)_)v6mwG>aKeupZjC+y}y$|M)+lR+W8)VyI1^5Q=>sb z6uWJf>gKFQhYN7WG4`fm{Q8;>M2n808z&a!H!l;Wd>cUPeNjdfmV&HuK>6&5>!fEG zo}4vCpzot2D12l>_1RWnURM?TE*kIYBPH!)syZ(1e7B%a$&spSgj4UPVv8Vr{*QMY z8Wh?7LXo@I&aTQ@BmxIEq=!zLmN`z=sGjUeD#*+>n?4A~p7&!Ie_ZSqTyPkmFUx=9 zq{1o#pA29o{l^QitXK>_oFt{LW!4_YTi|Ys6i$Gf9v!@tJc*o4!!N|XXkcqI*oS?U z1y7~QD|)1n*M+@f(R)rG&Q9KCra$FWd@CrQ8h9Pw&-pI4^kE2R>fhX_FM~pZ5O#BG zDbvlaH?O<(TLfH5rf!Ada-XaOaisc~Q$h4U@f4(txLXg=&JueFR+mSx>cFPUKX3C< zL`V8OyF+CJP{L0EQ1YY}aP+(#vtge|llkeG{tj(A|JgW7LPo@Y7yf36mbZ zocIl5hj!^=Oz~>jlf4OSy>uQt*~88lV+&F2av?Tnn}cxk0fQvz zi~NL4b^u^56cE9{Jvl@#P6`HFJ%_HJHp^@zJkO?WqkKB*3lx`VgTn;gFxsH)5##aK z?EKZj&AJGpZvYX*FeoeJ7*+7p(j(aI5uxjq|V9%f39Z86|H%gma+DOrv;$R*c@ed`~II00a4 zvkR$kT3(Jm6vXzA;j)%4+uE@{p-dfsOO6?|Z!_`%tx=wBQ3P`|;V{GH0}J3%M-cT(~!aWtwi*QVR^hJUWZdp5JIcjrq0rSdz+#prG_PUx^|&tE(cVcJnk5= zRxLMpLr!1`^49@+-3fSWgMF~C#b~APn>z(%M5neBLKOn$y&3(F4f;&cso9qSABLrf zX*f3&a@pq?y>OYs=9~cxe9THUvo;68dMJOE3dHQ23Ifi)>j{bBZOh05C@*_y}LwUq5;O_aVvx|JmU-^Ojaa zZmkq$M_)YS#E1iIUX`~GUDmz^b0FbTE4}gJro&xug>3j`$O{6pjge@bv^nS(5bc@l zFd%!)9|QFGw{9?d%PvMow2wY;nvSF*9I%&OVS!BD&tffL8h89qT}AgYSl@8A?uIxu z-!V)bxmM96AZ6qWk^URuf&Glpd|RybfNv?|@E{fEMD|KVy%GVDUmHzK98 z;XqEc*+llDTv1fP$5sGj5u+r@ihw*?(8)#wq=Ma)K{OKAp8d>DDyRm8_CpUo{idX< z4|v5!E!<#cRvH+AL6Vh5GWZTaC4mjeMgS^_z)~Dxiw^eU;;Z=EeB!vH(KClO!xz6DzvmmvQ5)=JYa$X#cKBmK8gBPs)l$@b zFo&wf48+cU&6>-MZ9k%H;xVSW=0x3^g0@_K8i4F{_i=}b^=DKxm zQUR{^>t%Ua+|tVQFQqR(lN!gI3t%&Cy(4g9!^nz%=mn0-yDA_aQYKq**pN>fjAr3o z^?E`uGdCQOUuT9Ud6*`D*> zs$*Hlx=(O3*7t5@=hbt+ul^#RC?Q?ce;>Ny*|tFITx0uy)h1>6s*KZlR9DH2=Bwq*Y)EKVa$WyQ((mZj|Xvg#xYnGtD#9s;YyDc;M6o5r{I4{}+EWqBHrjCrb zoX5*uIDuYofzt$;J$eJ@eRySpDH`5?005G3oc#_obBV(ppy;8Met*9BKBTZ8s98*w z-azpehf$Nf7}Y0J5@Fr{5|3lPEH$2oW|h2q9V;a#IiqIMdDz#j*I+5aezEdv`Cjgw{O`#WWae^Q+z(`W@fZiKHT)9htV{#A z#HHUVemd%v>jqq>OiiYo{xMpx3*K_ZVF|>5sL^5kAs%imple;+3=*m#C}yCRH5+IvU9^Ulf{aRJ$II}}h`q6lI^Y{pa* zIy49`h+p;6hYc$&jh>+oFdEfswIc`VYR1P{`Vy@2bq721zUgA=rc{q$>CEn4l8HH3 zMvS7uM`+S8^j^O^iIP$Od!DmFf%9gca)N(DVhla>`YJ}HI=mBW4_r}t*}NaP{FHZY zlU7<X3aInb^)#aYo`_?e*q0Zr+ry-;wT^6er#R%tDD+Ip{wVGL+Qk#utkp zlWqQ;mriN@>`z_P_T}OSQE?OVkIlCRMX=*qw!!R8E{rQR2F*+JY3Cf4D|HyJnzM(~ zP;$cMKfsP2AeN62=P{tlJK%wft%86Tn_As1Vs5i~k{7ipB>-_$0`RSV`9(XNzah5| zVnGie#Q6qPGd`AHDdt_2KmS9Id6;yZU0bSyhaqW+f`2;y8$_X7BQvio7uJ-0xLu^Y zRsMbuCA!qGVMl|ib|0UHPwhcgstnfp(Wza?M`)@WSPuvY*fhdJqcjmjR1Ao~0TP3= zbTalii_q1KoDxfq^uMq5jjxQ_Er)T^WyRbxO~{p zJ}Fn9qFw0z4Yp`Wl6ahyL40P+N;jp5_b()ao{QGH3m-XwSEa0_)q3t2JFR8KMp; zKEw^SgZ^eLwWNVPhjem*3CU4A6W5~Wy)1uSd}?kfdevuUP-*@SzfeCgY+1uvL@1`2#-gYDyl|WIzIH>9cj8nOIE^GBgCNc&IY0MaLE<0z$talXQ3Ar1@c4>@3Qmm zv@ceDiTY3?7xVt0B{zWc-_s>XuLaxAQs58BZA9*9uoUul3(Z%C(z~R0f7R~83I4pg zk{uuS$Qj6cxW3W>VQj(@@&miIdOQ5-i1fD}_X0xjFO(6j8B10QkNA!e>@L;82W@hw^e=X!QIo`;ADhol zIltwz8N5nci&2pgwz<<(Lir*0PFnNGQ!j=aOdYn$+WwW5*n_o_9{7zRQv}gJeW1NOeGNnN zegT`%4f^2&tp>i8ECc60+{!K67WLH%n|*lTcW<2PYMcG2g+dpyw`p`6u5g*Ag3nDJ z-Uctd!&?`G$f`po0*>j$Lk5^nwqDQE$v^@RrFBhfZBy0>rB(04XgSF2Vz$bBsdME+ zB0CiN#?KdFA+P^qs-jBt{H7;p7^42QPy64X2+6YlyDro1UhkD{v)I84K)$OwWvE)J zUp<&{8@YJyI8jXtzb8|WFnur|yJS&%vH7kJK63#myg?) zN;}l3Me7br$By4wM(OoJ7RwIuOCF}=$h=ZS`z2ne2AHDzjj|=z&yr6)b<*NbDQQb; zL;mZzip^^wQa6A)-d-cpQGHVKZ>$Mq@;oKF$k0d5M)QpZ{OH5u0JXDHs7GQ{oqKQW zW`0GWXOv1q{)z><*c+~owh(fk_}qnT*q{=}i7{=}m>N1<#(xTrhFR7=WZveS?=)>@W(|aSjj2On?;BsK zHwB!nAKD(3OTS7x4rX318T>TtJo(x$BSY=!-Z83EhFcY_Ufs2j{fZntACpW(2#xcyQg8rsObjw(lFjwWRd*H4l*=hO6Jh;T6ibk3g2GR>3b_LzE}@Hhi5sD=>_rB(h>sujQbU*7%JXM)ci0)Y!Sz} zKZ!bfXU5Y(#oJ{m>u$3_{ev>6$d5yQ8i!+C`8HORzE)JJmRi+ zb!cWQgm57{vy&*6ZA>I1aPvn_R$n>a6Wj2>{<&RH;`en#L9g#iBO5LfwsYbX=v3u`MG}VI z<6Eg3lF4`<5{L48#BRN0sqQdXt1M|I%l~Os_&U|Ml6ml72KestcW`l0EK5|m$0{1o zXD#(*ld6C`TnXgi{j~D+mFLZ~aNrAeko?|1%?(~OAsdfR9nQzsFtWP8|H&EM#t$XH zXk|nN1^5n$SQ{xjiI^e5g%in(P(-zY>zK#5Fh{k`#7|mma0I^dtD#|{tb0KQ?L+UF z_#k$-7oWHv|)WsdXFt_!{uLW zG+-*AJ6-O@a_`x$IeLU_f5|LAHvQ_}NF%d0IEoq9coL7&p;T_jS`kJE>tTZp&?&+= z#V&aK4|v)iCX;Z}U{jrj)A1gnfmi!CB>6g+F0?}l0%-yRQ!^GUFZ-f5GTE`{T;1#A z8jBa8E|>3CJf;mAZF$!ykR@q~7pk;do{0n8t-BUAh=_ivpMr$Ll$H zC$~P;LS*`g-DfH5C6)N#=C(3KpzIBx^7_XjAg@e=VUkVleCt zokJE`a-4=7W3h{QA28(iUJ9#ro>=gs^zaoWpEJ6k>dK&&4c<0uw3~eIdC99c@N2?2 z9S3YsCzezgh<2dV2ytj2#JJjA?!jV2U^DuGMJ${?x(I3NR$MyDxd}d$bGmbNA5ABD z!1DnAdmUBWIa+&>4UAG2s)!wpRcfoW`6wpX1tGY~NhxJJ?o`+1F4jnt;z_M~CH1wt zWqxGG?QMA@@#m*8j=-GXzx=7l@`Yk_QRFI0*H0)8KXsE*qUwe$UvbPE__yi9^F+Sh zS^kjgrF^}=MVfY3Q3Bo7*%9!TJt?AlD(gVd((7TChcXF1JcV=g0>XtvcJMm(T7nWE{G&CS5|T;h=<{`7eTSi=MST7 z#{FJ>G_<8;gm+4vUo!bj?8iU-0`RJ(*FB%ejqd~yLOIiGWe!f&)ds{b6#pfI&TsCC zXLmf}zmTf-`LJK_UV5p2k0N^q+HZIXTRrpCG^lz|dlB&kes&l)sVy7Q)H|@kUr;^s zWgcL|Trm2JyWCLc_DcsyD1r_^AD+>{)r;vaToKp&EPK$68?QQ30WNA_fN40R9U_ulE;DRg8@g1N12EyT+<)rY# zvH9{9K;9V*ha$ZJxdQ6g&vD7{j0u)r=SB!n+C|}OXGKn3u1DPo1dWBo;qOs{ZPPr) zJPiAKk^glL?12#3I%jrPClvPFxBbV?X7~ybnn{XHia(Ifk zv-iD2Jl4GeXj0W!LP~uLd2532e4M+^Fe}&gFZkF*Yf)3I_!j797O}D zw^&uS`^J3b#6SZ>1(0eRi?E^^%WrTC-8=Hi4a_T!20*d!+;pi!6&u5mrf_HikOESL zaaPvwbHE1+EUQ>ZomEVo7GcInM9xA&JWXR+MmEw7(UXGx$_J@!;Ayi=&Z{>*xyXVy zdX2werZAF9xKsmKFjK*fTdCEvWeBRoiXy6{YJfaFqcr)Tn-g5J_?h{NohPO2P2Q{t zPt1#vsojxl0#v$j`lqag>{`Cqul{3lL;qTv7H#WKHUSsZ^!;Irauc-5h}PVR;ZD30 z7BDGW%Z@WYTQiII)uB{sm`IPFX^L*VdXBMP*9c*O^Av6lA933aP2*bZ{BK`b>^g6^5c{FF*O@)5owpp>p zo6fxdh0dTR-~$uYgmgrLV@gL81epKrEbe&81q6hJ=_-Y%~ zeQ)K1x+cen6JN4jPHJoEgVT3|*VIF5uNOY4Tlh5F^xSJzB=vxG;a^%%deq<{>wbOq zy33F709mM;3EHrtNM6mG@jFyPx6uIb&)d+zu--JQbMbLmqc^0TktiuDcA z>L4NvGXv8=khM!f$iKy@fQoj%T%*mi0*bezjPh8Uqn8L1q`Z? zrFZ!FB>0pSUmie~%gD*OApk$uAY~@wa5fW&Y<8I5TjM<_11WG-SP@mxwt3SG z6{K8vXAFTWY1?J;LK1jUWmY7%dN7|9r&}1|9_tIZAo1U^1F5%GKc7XKM%JSy}g16>PG5MGdYYHcki;>tH(s! zGtV2Vzq&}zo=i6+q(AA;G3z50MU$Ct7et^bfY(g0OEu`HhR?45#|zM{bMb#`?3$&{ z^1?%ZqF11y=ApKu0k0Y%=6hkf++vbfEI*YYkhJDtGr=~6Hl;Gdr)@%#Z^ua7ZdqQN zH#My_wIh51ZjUyo{BSR_SvD&}aK4uk>>YDw8FF>I!h_Q8)0iNYNA25~^678(D!_p2 z5tjvkV)rKabYv~;QznQQ*Xb52}VY`FiDh$?89pXrr3+I+PlQ(cGrt# z92wC>hLbV_sv^G(EBojV1!q+s;8+86xD3uTp1cg?az^p>Ok>s5wr5oPPl;+Ti2Bb{ zx!?iC81xjT-xMeI5ek5kma}Nz&C7|W;A3MlQ~LFBipx0Wp)Pd5dkx&zQgZSiMB4XZ z6LyF#Qt8dNyPBV$^p@hZPq&5&c+obU?r~@BU+ana_uHgw4$td;c&)mF+Ye3|)n*aT znuVh%`!71esf{+NA;;ZaifSRw!81ZJcC;Z1d?ZJBW|b#XkqD9AW!9Y(hI|v;%&)t? zlEpmu1MbiH8kBoHVP2B|H4LBH``OYWdL)?b^kR#T3yfNt7t3AfrO>qxe>JuSXV)S( zI_Uk-m0t#&lzXDx(rIMZKF)-=Wn~+VXdumxre$bWRO7{UcAl7g`yl%Q>_~xW__9OiM!klj!rz!8~(T zIrUK};SYr=wH>6#k}xpi{rrO!Z8}(YqKC1d3Xm7c!0mtuC0WY0+FFF`Ga|v+qVtBQ zhz(#{uTz}-OCZalgx3&SKa0i_;aua2h! zGZx{yqAWlCx}j0N?i0GS0R_Z?S44Y{gKG2_YEy!!E2u`__qzjnW`mjb&@}>}HdcF# zzNcGAhukM+b$)vMaO9$0DKVxIa?E|Z=Ubr7!@`iMbLO-G@Tmn~injQht5P>zrzom- zD1tLaLZ5cEOlsHDlB~Hmt3(7;FAlKfrzk}KmyV!7OV$^9h5Dne29(u*Gxoo+_q#c1 z4N1N3u#`kNqTiD~zad!Js_&^;8NSAVUJ4Ayutj_hxZ-gm(J`IR`D~tA3OzEWMF3q9 z(c6ozA;VgEYKm`tA_{mYL%DJ%{!n}8iTBz?|CjmZZ7PSuQ`)mb-BYP)%&0w7{|qI7 zW^~)+&^!CnAc;MsJ|0)!Y!OCe;ix9i9lirb$ve#`js9|&6?&-pVj~v=H0e4th78O5Ut9Z`9I3y6@AOa0l zF^ZYmSx1zeS(5M(7AcH`1=5!cD2zBzm0Ej*bSY|mZ)M`64udUyreoI=^!@yyob{$Q z8~)3PnCA@j3|Hm%smq(b-1ni$;ZqdYmPp|IX8b@4!eemFM?o~lfHv=}Y{_+lu=D&~ zyn6PJ{}irMO|*J7|G}{a%;`OT%$n#pRz_fa>r-`O4I+M;PlBS*%y)P4Dr<$ zw;vfT(_MH*!QQl{i|*b8Y7hFXal+FoH7?8Qp8)^%pbEd#$5^Fa{dJlr6XLWu zWts03{m-BcpRsR!pE@9o_qv@9scxV(T!F0>3`7=wvB*3;bvTVS*=00916|PN^d8gq z-c0x+~NLf}HQDvw{x*a(X{c7P}fa%{%|O?x-6No-rf$>)Sr^ zV@Ja3>RWdTunK9jTqM0yOgf~-^Tkg`z|ur%yQ=amiE!4QsJ*}CUh{L)`dHA_^b7E${nRn*=f|^_Az}~%LBVm$*$u*zjfO-!Lx^phZ zth-3Gzbtg3F4T)5u~|H6jWYh;oQj^Euq3`K4vQqo8#c;zOiR2yPNl2`JpL;4o!T=y+?Td? z@x=zVTeLdYE^?jYtC8Q^oINLN$gQDm~(wafANn|&Uel5)#E79Yw zLwD3aHTh}aXYIh`2HnX4dd2DDB`=53w?Vrfghf?@jyelJd*xB&1(3{vlT(HRr+Yly zx76*?E`!Un!SS^3CU2`TT!?R{SvB^sjZMG7-tnl08Z!Vgb439kI?#=(SCOCbW7>U( z-_h=U9QsG8^%%uB$j0s6k}puzMQG6q$D4l+C;%+3%r92L0^@^xcSdk>ajNnUXqM+GB@e6}DaU$^6pu)VMMTa?$5msR-7OEz4D9)cMh+f+yE`d)?XEH#{>sP$ z*ffdfkL|!03M@TuNF=H(ky|%nxZc#>vic;$T|=T5qPT4(AeI}(M3Vxjid$F8mhr!s zq%ci>dsMt7{o;Q3SfkW6zM8RaT2=g;c~>ahusTS6nOHX!qT>sa28}?dXcH5E%JO!i zFy)n4ySTyP6See`m~^V0-2f7<#k!usF&F=%*Ht`pnR6_B1neGnJDpgLd7I|&jdxr; z-_OMZFBaaN<)XEfaWA@`%lhX5RSX5Ppc86=j_co<_^_cWdzB408)TLSM(3x`6;yX( z>oe+qpwggjZy(QmErtX{HpeE_AH3%*Pv|`_iYb?`QL0(wFj+~98;Q~)khjRGkDfY6 zI{eala1S*PJTbeHk+-y(F|f$CbkdqOU`w+&&HLu8ZeYdQPj5k1>il+&sLSE`JW$h1u70^iqq3iRaXdj9$>*5%Y^>FZq$~Jb*r2P#N=BaOcxVeRs^~;?-y)&nJx=v9bXfGq-;2@24yd zs!KoP*iw(A*((D}XjW+2k;nX`0BO-YruD&#mnOdU#n{?>G1a;g5r@Cqqe0-gq$vD) z#gpqU35k|^kC)J*)7ueq?OHWE+Py3IToej)oq_k*rSXH3RZ0{%YsiYI%HGcs6~B_b zUMq2Me6JUHbLJSmri8Mv_t#Syv)594+QQAOZuo>!&PulNtHzAU8-#T_H}_fTJNtUM z)#JBM9MYnQ_^vt9|9YcJLp#Ov1}W7CtRywN>*w=xIT3i`CI?#*8$hw5Z}OF`61GD6 z-e>-~YacUp-FtXy5)P|>XGxd8+HcjO+Z#pAxR-9+yD-l1_Dz&o%i>?{x~gLP>>L&G zCT@sbbYnXxV_?kdzLkZ#)M@HAe7=ed)nDC3p^)BxJI*C@bYx%3zJvVXyXe97a@rf{ z>lVpd4gG5k2=jHST6etOEBuC8X@PD;z1O}sf8pCDzHxFKG%s|q%zqxzf0|l^U5!Lq zEOKz~CAl=gwf8yryxz0}+(oEIJbtJwLl!LfP@0@V0qXZATdmEMW|yA>6$BDO>(ZoL0c<#oRRJnz^h zOSzT1Ca=Q9&t((0Hy8D92cP!B^_P^z zKQt%kD!4008MD5O)7Wp43~HY@?ShxZmO006D7a=Iu{pMce4xOS<5Sa-z#Q&My`8 zHf;$@Kf4daKSQT|%DtQ3IKOV8aEos+kBvK-Z}0|l!E`HPz9;FYah*n*Q&Fg>zb%-r zUu`Z!RQctNU)%1nw3{d1-&{85E66S)chK^+tI>(|Co>jx5vZj6u&7oKYu?P4foH}T z^iv=toPmE{7qmIrMHl#<&S15d5?HpyaUXad6ble#nIYUDg3UdmH4{=~*a7|v{ZypD zjxFF$fxy>{_etSMPxwCs9R-6VB@hU%Um;({2$imY8{(s}_hZ4UcNC%h2PcbCtLb=*bQU`Plex0_aQJXxf|O(e_ADP+?tM^~88v--eX;43+}qmkQbxh` z{pMOwNGV6T_CV%z#75aJ^6J7vVzcLOqA5DB5d<+|jkp6Z`!)EYtOc7}`?_F}Xv5lSm|;I#<=K?} z6BB1g5!`t{KneVwhJSeF1h{5>;6qPN*_aPD_i?`Ky0lmh4+e7D?YFlAQ+kd`I+=pj zC7A?B@M{-g#LPdCTmnl{Y~kv!o`0B-Xb$+0Wc2Dm6Hjb93HR&50A9v#6XaUfk|uSU z2izLYy3|jo4lL$IVJ0M1vyZT{Q`ZD+?vN}@Xox&ll#)SP_$bZo5ErAF7qDy zh1Uah-Byxk@}^SjV|6G}fM(G8y!@y6;u$M8?GR;i{+$Io80G(yM?aiC13Q^Ii=+G_ z7g2StxjIF;N0cfg;V}7=vHLD1_f7^*z79r)gDAt0EVjKtsV0lIja~JQ5sa=FMd7)o z{Y+BV0FfT|Y`b8)kD^Pqp+ZAE&*j}(?20+^4CX%t`KK#+I?TEa^vgjvYq+r9ifM<{ zdsn?heq4Q?nQ$+I35Wc>l`9@U@aT@Ni(}c@`LSTQ>3T`auMAVZACo9!6nTEN^ifHa z*I2jkN$}KpKTCja3$$c?x5o+j_-wNjdkOH42LT-J-UpCeKpP(H5xY_?kagVwZwoy7|8{yxqk5l@;TE|82C88$8{R z^_A^t{$VQsJEbb)q;7B4XofHrG(Mr(Jn9^J;WL13;!>p>br`7r*}2xj4Nn}T-M{J9 za^{~p2P5N%*EkmFf@r)RP>K^3#id)$u_UR`!2sC_Lp6>$vHmO zcB8uBt_td70~F_n)sLvPL`O2|p;XIKd$gLvDYw5XqymEot&sya?o@9r`OBtT)nju5 zFu+26-wxEVeCTCw3^<=SI%SA5a$O0&w-(@qcG49oId3;#i*7Cn8c@1(ebhUp`}~88 ztA+B%Oqcd@!PAi1({6!_9B0&_0Kmd-61};kNH)O?A^3YN6vSNM10KlHap0Y+)FbrN z4+vj-5S@7tcmAg7Nn#@ABEF+a)5$|s*4H;Ez3ii!sNg?rNa+9jf=r3>^I_Hdaz=CG z<81(zx0=H-@{IHTeXn;FUZ6$<^C>bOID{*=B!9hHW_-s-csAP%S#-Ah++shnpC0#0 zSFNifK5Z85r5`;>gdB&)}69ix8|2+6Ca@LFdS6EJq#A6UY?-vRmJX z0&H<8U(Ht&I7(mpFYq7R)Vukwe7gvg5nFNzVo1e$)V9ba}Y&eUC1(+R#XQenFd z&rEq?&lJlys4gcF|2lKsOVvK}q_(Pk-gKr5PWIb*`kdF?PdMC%2G{fv?Hx-; zm9X11IJqk?tJo@{;J#jcv340c(EhUn)Zmjg0d~O*o&BJtPCPn6?Eh=;%KzEQ+PH)e zk%?>Xf{3lQ4y~3{RDw|2PF1y{H3l6c?b{Ab2caTJVkpK^)0Pt3EKFO)Ft4?!XlbV+ z-3%SX5*6BtwSt8AUixRe_m?D}e9rlv=Xt)*a-MTP_Xgs#%@U)=GcyUFrZz(d^0YSW zmj1Zz{NOfALo;``7krI{kMFF4^QVe_mR6Ag#)y{PbwQXyGiLOKF&D? z=es>m6*X)gzPNrJ^pnKrStV6$%Udo-_r1xgipl&ffFP#OB~6Qzl@Gh5)&%8$YX`Fa zmW<5TiTu-FG;G?eDrXN8YrkzU;6=)PL3<7Cli$MjJI84~jwSTxmCMyX4ERtLxQHlo z!651T#VCJ4fh$#oi@QBQRpnaNUrgoa!|2Qk4!_7JSbEd7HAK&GZj~FHGW?QW-?(Bu zw`jTaOT>yiLduI+UEHGW&BkDtl*FNNp=|>hItvLIzK{~7m~WgM?nt5nuuv0tRE?!^ zhpFPytO6Gh5R}T1Fybkr%pG$kDxF>|hANA1j&XYXlR_$Q>`LsB*1EoGH@=_|!4#}U zyn``Q+JbAb6{D263@fQTeC^DOYSdkXhY%TkeT>NY zUO4f-Ap3_FYzz-;I$p7`d-3;RTUl=*^XkL7Y`-PFbJA`Nsr#0Yhr1SncIK;Vgk&iz zMI&+&pIBWcCw-08LYhEub?!zO%a9l~(J`RwqhZ>vgBCyI@!VhG5Z+ib{at}hw2LRV z+Sh|w1Q*&YP3W#O5$%Khk-D<*cw*Dw_~v)VM8`uLE*pN>9<{#kg zovvl2aC1YcmyTq_*Y*6PCa*kCoc$v4^dqd9c;%3FyTfK>C-HLC*2%K+dlTJ*7=Rj> zgw+5J8s@0)6rANGd84{;%AH8Ky|aKIo%&F+eOa4MdE@t~l*C&$#KB|ChN$4qeK#1-^IDnb{ zg&Qyt*8?eX2jwAwUD~?%QhRTfMW@lTUo`JA9-4R?LMn_erhhu*+jCYYdL#N*5N3fF zvC!*AjHneBAQFqpi6su3Zs9T>X9H~Fq5F^Roqg7U-vx6GOB&PxsAQ4^ZP%jsoR-}9 zS*G%4<>Ob4?y^fymK&wx(-tbbtgyDGwcEN|<~y4#94;y6w`6I53QxxRiwY6UA~&JU zrwPznfr$Z^5(8df``<|@OWoZ0)J~{xvP{dkr=Fv(Q3`I3jEzb(k{gF%G$brfJIx&p zQX)S{$-qplyoYVKa_o-NxUcs)N?hAhQ&6&%7|Da!e+Q>LU8w%AS1De;k-96Z+EN-S zp>81CZ?5~{0>=z_=`E)GM`B4Ja{=!Gw(ui$p!DfMU<`8C*{qIrq)@cE@9_NyiP&`5rT80+;n9mChWsOayslGfd;E%seS*@@vm7(&Z3F4O&rQtXJNi3?16QwwdN@hTXLP* zJaOqrAG>nVe5N(sYP8pF#76v;ZG8vG-DNl8-2o7meQvF{aHBMk*MmT{Cz+x}&hb!;c4H{!H4m>`darJ^ zwmj5bJqmuRH7$e0vfE)3`Cfb>$y+&R^ZKL@N*qQS$_0aWNA`|1V-*&XRrvx=ywR~# z9WXYGa8>H0xI0@Ur_XrdgNh?rNGK#EVgB^r$+)}pg>BQ(whLTD8Zlpa3S+imkm@fcV(w1!;#jD+_)eoG$WR!BI<~6&nme6RwAXj)%xMh?-P4nMkBMjt zrd7uee9t^xhK;V1IP$Qkm)0jqt_WiIHlz3YBUORhXr!jbfo{aYG?3J-Bn6E}JrNNEyQc@@oa8iUjfmfda~g$$fMGC1!jlwzZcMe#0^eqAcV{p(G^ zGzmSXaH=J^3|leKH}xa&ewENxCEagn`wS%!+%cS7ge&LK9%E zG~9ER10^MfWTw$z>O;?pbGnnT6BS3ywi3(J*BBYHN{0>poiT~m81$qYsGf)ja)oQ( z#Q|ibG#5_0p4>=IE=Y?~4h0;F0s7^#Uw(C?#20mGfy-aNK?fttg<8W&8vnm|M8Xi9 zI5U*xCkA)Bz76XJmTSJ?Ll?k(ZC@Y-tfO<`OmqUU5AX!Yxd;OsdOSyYHPb?5-zm`f z%-=a#>%EECBYg!7emx^%W(=Hd~j zFA>MxmaOiYdX6D1PKeM!FP?nXoBWB>M5ztgr_{bDnc>CC0+fSXjiYpP1%o5QsHht81EGmv_ng@ZG zJZzbWrRdHYaGU!6A>6^1rfo%w`-N2mg6auMg)21*8`VIkpF%-G_qGrs=#TfxrW*^o zdk;flJS1VrY28k8*|^lc1?9wc7Gor{UD{A)F9Z!Z`@wi4O4v`29{U^uYa;3&;0Ic6 z0OE^bZj@{EJ-Z6Us_$yut;AJG + +Meshtastic Logo + +

Meshtastic Python +

+

A Python library and client for use with Meshtastic devices.

[![codecov](https://codecov.io/gh/meshtastic/python/branch/master/graph/badge.svg?token=TIWPJL73KV)](https://codecov.io/gh/meshtastic/python) ![PyPI - Downloads](https://img.shields.io/pypi/dm/meshtastic) @@ -7,17 +13,20 @@ [![Fiscal Contributors](https://opencollective.com/meshtastic/tiers/badge.svg?label=Fiscal%20Contributors&color=deeppink)](https://opencollective.com/meshtastic/) ![GPL-3.0](https://img.shields.io/badge/License-GPL%20v3-blue.svg) + + +
+ ## Overview -A Python client for use with Meshtastic devices. This small library (and example application) provides an easy API for sending and receiving messages over mesh radios. It also provides access to any of the operations/data available in the device user interface or the Android application. Events are delivered using a publish-subscribe model, and you can subscribe to only the message types you are interested in. -**[Getting Started Guide](https://meshtastic.org/docs/software/python/cli/installation)** - -**[API Documentation](https://python.meshtastic.org)** - ## Call for Contributors This library and CLI has gone without a consistent maintainer for a while, and there's many improvements that could be made. We're all volunteers here and help is extremely appreciated, whether in implementing your own needs or helping maintain the library and CLI in general. From b42d33824a018ea09fca5c3e8d8300779f06a675 Mon Sep 17 00:00:00 2001 From: Chris Danis Date: Fri, 7 Mar 2025 13:16:20 -0500 Subject: [PATCH 04/38] Fix pytest test collection on default install As is, with a default `poetry install`, a simple `poetry pytest run` will encouter import errors while reading the test files themselves -- which causes pytest to fatally error during test collection, meaning no tests are run. --- meshtastic/tests/test_analysis.py | 6 +++++- meshtastic/tests/test_mesh_interface.py | 8 ++++++-- meshtastic/tests/test_tunnel.py | 6 +++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/meshtastic/tests/test_analysis.py b/meshtastic/tests/test_analysis.py index ea8d6ae..69e157d 100644 --- a/meshtastic/tests/test_analysis.py +++ b/meshtastic/tests/test_analysis.py @@ -6,7 +6,11 @@ import sys import pytest -from meshtastic.analysis.__main__ import main +try: + # Depends upon matplotlib & other packages in poetry's analysis group, not installed by default + from meshtastic.analysis.__main__ import main +except ImportError: + pytest.skip("Can't import meshtastic.analysis", allow_module_level=True) @pytest.mark.unit diff --git a/meshtastic/tests/test_mesh_interface.py b/meshtastic/tests/test_mesh_interface.py index bacf85c..65c0725 100644 --- a/meshtastic/tests/test_mesh_interface.py +++ b/meshtastic/tests/test_mesh_interface.py @@ -11,8 +11,12 @@ from ..protobuf import mesh_pb2, config_pb2 from .. import BROADCAST_ADDR, LOCAL_ADDR from ..mesh_interface import MeshInterface, _timeago from ..node import Node -from ..slog import LogSet -from ..powermon import SimPowerSupply +try: + # Depends upon the powermon group, not installed by default + from ..slog import LogSet + from ..powermon import SimPowerSupply +except ImportError: + pytest.skip("Can't import LogSet or SimPowerSupply", allow_module_level=True) # TODO # from ..config import Config diff --git a/meshtastic/tests/test_tunnel.py b/meshtastic/tests/test_tunnel.py index 690e99a..e2e917e 100644 --- a/meshtastic/tests/test_tunnel.py +++ b/meshtastic/tests/test_tunnel.py @@ -9,7 +9,11 @@ import pytest from meshtastic import mt_config from ..tcp_interface import TCPInterface -from ..tunnel import Tunnel, onTunnelReceive +try: + # Depends upon pytap2, not installed by default + from ..tunnel import Tunnel, onTunnelReceive +except ImportError: + pytest.skip("Can't import Tunnel or onTunnelReceive", allow_module_level=True) @pytest.mark.unit From e591cc184fda7aaa1f6e19e6f713e6a700f2ab66 Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Mon, 10 Mar 2025 16:17:40 -0700 Subject: [PATCH 05/38] set 2.6 version num --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 577e13f..979ecfe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "meshtastic" -version = "2.5.12" +version = "2.6.0a1" description = "Python API & client shell for talking to Meshtastic devices" authors = ["Meshtastic Developers "] license = "GPL-3.0-only" From 0c38a9eb0bed1c9f0192f5b879f062e640aef587 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 10 Mar 2025 23:18:47 +0000 Subject: [PATCH 06/38] bump version to 2.6.0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 979ecfe..1ab290e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "meshtastic" -version = "2.6.0a1" +version = "2.6.0" description = "Python API & client shell for talking to Meshtastic devices" authors = ["Meshtastic Developers "] license = "GPL-3.0-only" From 32a61b02096381ca5596406aed357c221c81e050 Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Wed, 12 Mar 2025 14:13:43 -0700 Subject: [PATCH 07/38] Make nanopb.proto stuff work right again, hopefully --- bin/regen-protobufs.sh | 3 + meshtastic/protobuf/deviceonly_pb2.py | 32 +-- meshtastic/protobuf/nanopb_pb2.py | 35 +++ meshtastic/protobuf/nanopb_pb2.pyi | 324 ++++++++++++++++++++++++++ 4 files changed, 378 insertions(+), 16 deletions(-) create mode 100644 meshtastic/protobuf/nanopb_pb2.py create mode 100644 meshtastic/protobuf/nanopb_pb2.pyi diff --git a/bin/regen-protobufs.sh b/bin/regen-protobufs.sh index 4a3d179..c7a1cb4 100755 --- a/bin/regen-protobufs.sh +++ b/bin/regen-protobufs.sh @@ -22,6 +22,7 @@ OUTDIR=${TMPDIR}/out PYIDIR=${TMPDIR}/out mkdir -p "${OUTDIR}" "${INDIR}" "${PYIDIR}" cp ./protobufs/meshtastic/*.proto "${INDIR}" +cp ./protobufs/nanopb.proto "${INDIR}" # OS-X sed is apparently a little different and expects an arg for -i if [[ $OSTYPE == 'darwin'* ]]; then @@ -36,6 +37,8 @@ $SEDCMD 's/^package meshtastic;/package meshtastic.protobuf;/' "${INDIR}/"*.prot # fix the imports to match $SEDCMD 's/^import "meshtastic\//import "meshtastic\/protobuf\//' "${INDIR}/"*.proto +$SEDCMD 's/^import "nanopb.proto"/import "meshtastic\/protobuf\/nanopb.proto"/' "${INDIR}/"*.proto + # Generate the python files ./nanopb-0.4.8/generator-bin/protoc -I=$TMPDIR/in --python_out "${OUTDIR}" "--mypy_out=${PYIDIR}" $INDIR/*.proto diff --git a/meshtastic/protobuf/deviceonly_pb2.py b/meshtastic/protobuf/deviceonly_pb2.py index afe0c13..fdb2ad1 100644 --- a/meshtastic/protobuf/deviceonly_pb2.py +++ b/meshtastic/protobuf/deviceonly_pb2.py @@ -16,10 +16,10 @@ from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2 from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2 from meshtastic.protobuf import localonly_pb2 as meshtastic_dot_protobuf_dot_localonly__pb2 -import nanopb_pb2 as nanopb__pb2 +from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/localonly.proto\x1a\x0cnanopb.proto\"\x99\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\'.meshtastic.protobuf.Position.LocSource\"\xe2\x01\n\x08UserLite\x12\x13\n\x07macaddr\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x05 \x01(\x08\x12;\n\x04role\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x07 \x01(\x0c\"\xde\x02\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12+\n\x04user\x18\x02 \x01(\x0b\x32\x1d.meshtastic.protobuf.UserLite\x12\x33\n\x08position\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x10\n\x08next_hop\x18\x0c \x01(\rB\x0c\n\n_hops_away\"\xa1\x03\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x03 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x36\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x38\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x19\n\rdid_gps_reset\x18\x0b \x01(\x08\x42\x02\x18\x01\x12\x34\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12M\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"}\n\x0cNodeDatabase\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\\\n\x05nodes\x18\x02 \x03(\x0b\x32!.meshtastic.protobuf.NodeInfoLiteB*\x92?\'\x92\x01$std::vector\"N\n\x0b\x43hannelFile\x12.\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\x86\x02\n\x11\x42\x61\x63kupPreferences\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x07\x12\x30\n\x06\x63onfig\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfig\x12=\n\rmodule_config\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfig\x12\x32\n\x08\x63hannels\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.ChannelFile\x12(\n\x05owner\x18\x06 \x01(\x0b\x32\x19.meshtastic.protobuf.UserBm\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$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/localonly.proto\x1a meshtastic/protobuf/nanopb.proto\"\x99\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\'.meshtastic.protobuf.Position.LocSource\"\xe2\x01\n\x08UserLite\x12\x13\n\x07macaddr\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x05 \x01(\x08\x12;\n\x04role\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x07 \x01(\x0c\"\xde\x02\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12+\n\x04user\x18\x02 \x01(\x0b\x32\x1d.meshtastic.protobuf.UserLite\x12\x33\n\x08position\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x10\n\x08next_hop\x18\x0c \x01(\rB\x0c\n\n_hops_away\"\xa1\x03\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x03 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x36\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x38\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x19\n\rdid_gps_reset\x18\x0b \x01(\x08\x42\x02\x18\x01\x12\x34\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12M\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"}\n\x0cNodeDatabase\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\\\n\x05nodes\x18\x02 \x03(\x0b\x32!.meshtastic.protobuf.NodeInfoLiteB*\x92?\'\x92\x01$std::vector\"N\n\x0b\x43hannelFile\x12.\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\x86\x02\n\x11\x42\x61\x63kupPreferences\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x07\x12\x30\n\x06\x63onfig\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfig\x12=\n\rmodule_config\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfig\x12\x32\n\x08\x63hannels\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.ChannelFile\x12(\n\x05owner\x18\x06 \x01(\x0b\x32\x19.meshtastic.protobuf.UserBm\n\x13\x63om.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -35,18 +35,18 @@ if _descriptor._USE_C_DESCRIPTORS == False: _DEVICESTATE.fields_by_name['did_gps_reset']._serialized_options = b'\030\001' _NODEDATABASE.fields_by_name['nodes']._options = None _NODEDATABASE.fields_by_name['nodes']._serialized_options = b'\222?\'\222\001$std::vector' - _globals['_POSITIONLITE']._serialized_start=251 - _globals['_POSITIONLITE']._serialized_end=404 - _globals['_USERLITE']._serialized_start=407 - _globals['_USERLITE']._serialized_end=633 - _globals['_NODEINFOLITE']._serialized_start=636 - _globals['_NODEINFOLITE']._serialized_end=986 - _globals['_DEVICESTATE']._serialized_start=989 - _globals['_DEVICESTATE']._serialized_end=1406 - _globals['_NODEDATABASE']._serialized_start=1408 - _globals['_NODEDATABASE']._serialized_end=1533 - _globals['_CHANNELFILE']._serialized_start=1535 - _globals['_CHANNELFILE']._serialized_end=1613 - _globals['_BACKUPPREFERENCES']._serialized_start=1616 - _globals['_BACKUPPREFERENCES']._serialized_end=1878 + _globals['_POSITIONLITE']._serialized_start=271 + _globals['_POSITIONLITE']._serialized_end=424 + _globals['_USERLITE']._serialized_start=427 + _globals['_USERLITE']._serialized_end=653 + _globals['_NODEINFOLITE']._serialized_start=656 + _globals['_NODEINFOLITE']._serialized_end=1006 + _globals['_DEVICESTATE']._serialized_start=1009 + _globals['_DEVICESTATE']._serialized_end=1426 + _globals['_NODEDATABASE']._serialized_start=1428 + _globals['_NODEDATABASE']._serialized_end=1553 + _globals['_CHANNELFILE']._serialized_start=1555 + _globals['_CHANNELFILE']._serialized_end=1633 + _globals['_BACKUPPREFERENCES']._serialized_start=1636 + _globals['_BACKUPPREFERENCES']._serialized_end=1898 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/nanopb_pb2.py b/meshtastic/protobuf/nanopb_pb2.py new file mode 100644 index 0000000..4776512 --- /dev/null +++ b/meshtastic/protobuf/nanopb_pb2.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/nanopb.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/nanopb.proto\x1a google/protobuf/descriptor.proto\"\xa4\x07\n\rNanoPBOptions\x12\x10\n\x08max_size\x18\x01 \x01(\x05\x12\x12\n\nmax_length\x18\x0e \x01(\x05\x12\x11\n\tmax_count\x18\x02 \x01(\x05\x12&\n\x08int_size\x18\x07 \x01(\x0e\x32\x08.IntSize:\nIS_DEFAULT\x12$\n\x04type\x18\x03 \x01(\x0e\x32\n.FieldType:\nFT_DEFAULT\x12\x18\n\nlong_names\x18\x04 \x01(\x08:\x04true\x12\x1c\n\rpacked_struct\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0bpacked_enum\x18\n \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0cskip_message\x18\x06 \x01(\x08:\x05\x66\x61lse\x12\x18\n\tno_unions\x18\x08 \x01(\x08:\x05\x66\x61lse\x12\r\n\x05msgid\x18\t \x01(\r\x12\x1e\n\x0f\x61nonymous_oneof\x18\x0b \x01(\x08:\x05\x66\x61lse\x12\x15\n\x06proto3\x18\x0c \x01(\x08:\x05\x66\x61lse\x12#\n\x14proto3_singular_msgs\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1d\n\x0e\x65num_to_string\x18\r \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0c\x66ixed_length\x18\x0f \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0b\x66ixed_count\x18\x10 \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x0fsubmsg_callback\x18\x16 \x01(\x08:\x05\x66\x61lse\x12/\n\x0cmangle_names\x18\x11 \x01(\x0e\x32\x11.TypenameMangling:\x06M_NONE\x12(\n\x11\x63\x61llback_datatype\x18\x12 \x01(\t:\rpb_callback_t\x12\x34\n\x11\x63\x61llback_function\x18\x13 \x01(\t:\x19pb_default_field_callback\x12\x30\n\x0e\x64\x65scriptorsize\x18\x14 \x01(\x0e\x32\x0f.DescriptorSize:\x07\x44S_AUTO\x12\x1a\n\x0b\x64\x65\x66\x61ult_has\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x0f\n\x07include\x18\x18 \x03(\t\x12\x0f\n\x07\x65xclude\x18\x1a \x03(\t\x12\x0f\n\x07package\x18\x19 \x01(\t\x12\x41\n\rtype_override\x18\x1b \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.Type\x12\x19\n\x0bsort_by_tag\x18\x1c \x01(\x08:\x04true\x12.\n\rfallback_type\x18\x1d \x01(\x0e\x32\n.FieldType:\x0b\x46T_CALLBACK*i\n\tFieldType\x12\x0e\n\nFT_DEFAULT\x10\x00\x12\x0f\n\x0b\x46T_CALLBACK\x10\x01\x12\x0e\n\nFT_POINTER\x10\x04\x12\r\n\tFT_STATIC\x10\x02\x12\r\n\tFT_IGNORE\x10\x03\x12\r\n\tFT_INLINE\x10\x05*D\n\x07IntSize\x12\x0e\n\nIS_DEFAULT\x10\x00\x12\x08\n\x04IS_8\x10\x08\x12\t\n\x05IS_16\x10\x10\x12\t\n\x05IS_32\x10 \x12\t\n\x05IS_64\x10@*Z\n\x10TypenameMangling\x12\n\n\x06M_NONE\x10\x00\x12\x13\n\x0fM_STRIP_PACKAGE\x10\x01\x12\r\n\tM_FLATTEN\x10\x02\x12\x16\n\x12M_PACKAGE_INITIALS\x10\x03*E\n\x0e\x44\x65scriptorSize\x12\x0b\n\x07\x44S_AUTO\x10\x00\x12\x08\n\x04\x44S_1\x10\x01\x12\x08\n\x04\x44S_2\x10\x02\x12\x08\n\x04\x44S_4\x10\x04\x12\x08\n\x04\x44S_8\x10\x08:E\n\x0enanopb_fileopt\x12\x1c.google.protobuf.FileOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:G\n\rnanopb_msgopt\x12\x1f.google.protobuf.MessageOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:E\n\x0enanopb_enumopt\x12\x1c.google.protobuf.EnumOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:>\n\x06nanopb\x12\x1d.google.protobuf.FieldOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptionsB\x1a\n\x18\x66i.kapsi.koti.jpa.nanopb') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.nanopb_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\030fi.kapsi.koti.jpa.nanopb' + _globals['_FIELDTYPE']._serialized_start=1005 + _globals['_FIELDTYPE']._serialized_end=1110 + _globals['_INTSIZE']._serialized_start=1112 + _globals['_INTSIZE']._serialized_end=1180 + _globals['_TYPENAMEMANGLING']._serialized_start=1182 + _globals['_TYPENAMEMANGLING']._serialized_end=1272 + _globals['_DESCRIPTORSIZE']._serialized_start=1274 + _globals['_DESCRIPTORSIZE']._serialized_end=1343 + _globals['_NANOPBOPTIONS']._serialized_start=71 + _globals['_NANOPBOPTIONS']._serialized_end=1003 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/nanopb_pb2.pyi b/meshtastic/protobuf/nanopb_pb2.pyi new file mode 100644 index 0000000..c5d7d87 --- /dev/null +++ b/meshtastic/protobuf/nanopb_pb2.pyi @@ -0,0 +1,324 @@ +""" +@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.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.""" + 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. + """ + @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. + """ + + 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.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.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] From bc1664dadefb689d011ecef0407d1fdbdcefc026 Mon Sep 17 00:00:00 2001 From: Dale Whinham Date: Thu, 20 Mar 2025 13:14:58 +0000 Subject: [PATCH 08/38] Work around RTS/DTR serial reset issues on Windows Some devices (e.g. Heltec V3.1) are reset when the RTS or DTR pins are messed with, which means that without workarounds, Meshtastic CLI will cause a reset with any operation that opens the serial port. This behavior is documented in this PySerial issue: https://github.com/pyserial/pyserial/issues/124 On Linux, we already handle this by disabling the HUPCL termios flag, which has the effect of preventing the offending lines being toggled. On Windows, setting the initial state of RTS and DTR before opening the port has a similar effect. Implement this workaround so that Meshtastic CLI can be used on Windows with these devices. --- meshtastic/serial_interface.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/meshtastic/serial_interface.py b/meshtastic/serial_interface.py index 39f2648..7133b39 100644 --- a/meshtastic/serial_interface.py +++ b/meshtastic/serial_interface.py @@ -46,7 +46,12 @@ class SerialInterface(StreamInterface): logging.debug(f"Connecting to {self.devPath}") - # first we need to set the HUPCL so the device will not reboot based on RTS and/or DTR + # set port to None to prevent automatically opening + self.stream = serial.Serial( + port=None, baudrate=115200, exclusive=True, timeout=0.5, write_timeout=0 + ) + + # first we need to clear HUPCL (UNIX) or clear RTS/DTR (Windows) so the device will not reboot based on RTS and/or DTR # see https://github.com/pyserial/pyserial/issues/124 if platform.system() != "Windows": with open(self.devPath, encoding="utf8") as f: @@ -55,10 +60,14 @@ class SerialInterface(StreamInterface): termios.tcsetattr(f, termios.TCSAFLUSH, attrs) f.close() time.sleep(0.1) + else: + self.stream.rts = 0 + self.stream.dtr = 0 + + # set proper port and open now that we've worked-around RTS/DTR issues + self.stream.port = self.devPath + self.stream.open() - self.stream = serial.Serial( - self.devPath, 115200, exclusive=True, timeout=0.5, write_timeout=0 - ) self.stream.flush() # type: ignore[attr-defined] time.sleep(0.1) From 675169167c60d5191856b32dcc26e1843af585a6 Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Sat, 5 Apr 2025 22:53:02 -0700 Subject: [PATCH 09/38] protobufs: v2.6.4 --- meshtastic/protobuf/admin_pb2.pyi | 8 +- meshtastic/protobuf/config_pb2.pyi | 4 +- meshtastic/protobuf/device_ui_pb2.py | 4 +- meshtastic/protobuf/device_ui_pb2.pyi | 8 ++ meshtastic/protobuf/interdevice_pb2.py | 30 +++++++ meshtastic/protobuf/interdevice_pb2.pyi | 105 ++++++++++++++++++++++++ meshtastic/protobuf/mesh_pb2.py | 16 ++-- meshtastic/protobuf/mesh_pb2.pyi | 44 +++++++++- meshtastic/protobuf/nanopb_pb2.py | 4 +- meshtastic/protobuf/portnums_pb2.py | 4 +- meshtastic/protobuf/portnums_pb2.pyi | 10 +++ meshtastic/protobuf/telemetry_pb2.py | 32 ++++---- meshtastic/protobuf/telemetry_pb2.pyi | 36 +++++++- protobufs | 2 +- 14 files changed, 267 insertions(+), 40 deletions(-) create mode 100644 meshtastic/protobuf/interdevice_pb2.py create mode 100644 meshtastic/protobuf/interdevice_pb2.pyi diff --git a/meshtastic/protobuf/admin_pb2.pyi b/meshtastic/protobuf/admin_pb2.pyi index 6d5614c..9c17aa8 100644 --- a/meshtastic/protobuf/admin_pb2.pyi +++ b/meshtastic/protobuf/admin_pb2.pyi @@ -74,7 +74,9 @@ class AdminMessage(google.protobuf.message.Message): TODO: REPLACE """ SESSIONKEY_CONFIG: AdminMessage._ConfigType.ValueType # 8 - """""" + """ + Session key config + """ DEVICEUI_CONFIG: AdminMessage._ConfigType.ValueType # 9 """ device-ui config @@ -118,7 +120,9 @@ class AdminMessage(google.protobuf.message.Message): TODO: REPLACE """ SESSIONKEY_CONFIG: AdminMessage.ConfigType.ValueType # 8 - """""" + """ + Session key config + """ DEVICEUI_CONFIG: AdminMessage.ConfigType.ValueType # 9 """ device-ui config diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index c4479b9..de56127 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -615,7 +615,7 @@ class Config(google.protobuf.message.Message): POWERMON_ENABLES_FIELD_NUMBER: builtins.int is_power_saving: builtins.bool """ - Description: Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. + Description: Will sleep everything as much as possible, for the tracker and sensor role this will also include the lora radio. Don't use this setting if you want to use your device with the phone apps or are using a device without a user button. Technical Details: Works for ESP32 devices and NRF52 devices in the Sensor or Tracker roles """ @@ -796,7 +796,7 @@ class Config(google.protobuf.message.Message): """ ntp_server: builtins.str """ - NTP server to use if WiFi is conneced, defaults to `0.pool.ntp.org` + NTP server to use if WiFi is conneced, defaults to `meshtastic.pool.ntp.org` """ eth_enabled: builtins.bool """ diff --git a/meshtastic/protobuf/device_ui_pb2.py b/meshtastic/protobuf/device_ui_pb2.py index ac6a4fc..b11c3b7 100644 --- a/meshtastic/protobuf/device_ui_pb2.py +++ b/meshtastic/protobuf/device_ui_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\"\xeb\x03\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x19\n\x11screen_brightness\x18\x02 \x01(\r\x12\x16\n\x0escreen_timeout\x18\x03 \x01(\r\x12\x13\n\x0bscreen_lock\x18\x04 \x01(\x08\x12\x15\n\rsettings_lock\x18\x05 \x01(\x08\x12\x10\n\x08pin_code\x18\x06 \x01(\r\x12)\n\x05theme\x18\x07 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x15\n\ralert_enabled\x18\x08 \x01(\x08\x12\x16\n\x0e\x62\x61nner_enabled\x18\t \x01(\x08\x12\x14\n\x0cring_tone_id\x18\n \x01(\r\x12/\n\x08language\x18\x0b \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\r \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x18\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\x12*\n\x08map_data\x18\x0f \x01(\x0b\x32\x18.meshtastic.protobuf.Map\"\xa7\x01\n\nNodeFilter\x12\x16\n\x0eunknown_switch\x18\x01 \x01(\x08\x12\x16\n\x0eoffline_switch\x18\x02 \x01(\x08\x12\x19\n\x11public_key_switch\x18\x03 \x01(\x08\x12\x11\n\thops_away\x18\x04 \x01(\x05\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x11\n\tnode_name\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\x05\"~\n\rNodeHighlight\x12\x13\n\x0b\x63hat_switch\x18\x01 \x01(\x08\x12\x17\n\x0fposition_switch\x18\x02 \x01(\x08\x12\x18\n\x10telemetry_switch\x18\x03 \x01(\x08\x12\x12\n\niaq_switch\x18\x04 \x01(\x08\x12\x11\n\tnode_name\x18\x05 \x01(\t\"=\n\x08GeoPoint\x12\x0c\n\x04zoom\x18\x01 \x01(\x05\x12\x10\n\x08latitude\x18\x02 \x01(\x05\x12\x11\n\tlongitude\x18\x03 \x01(\x05\"U\n\x03Map\x12+\n\x04home\x18\x01 \x01(\x0b\x32\x1d.meshtastic.protobuf.GeoPoint\x12\r\n\x05style\x18\x02 \x01(\t\x12\x12\n\nfollow_gps\x18\x03 \x01(\x08*%\n\x05Theme\x12\x08\n\x04\x44\x41RK\x10\x00\x12\t\n\x05LIGHT\x10\x01\x12\x07\n\x03RED\x10\x02*\x8b\x02\n\x08Language\x12\x0b\n\x07\x45NGLISH\x10\x00\x12\n\n\x06\x46RENCH\x10\x01\x12\n\n\x06GERMAN\x10\x02\x12\x0b\n\x07ITALIAN\x10\x03\x12\x0e\n\nPORTUGUESE\x10\x04\x12\x0b\n\x07SPANISH\x10\x05\x12\x0b\n\x07SWEDISH\x10\x06\x12\x0b\n\x07\x46INNISH\x10\x07\x12\n\n\x06POLISH\x10\x08\x12\x0b\n\x07TURKISH\x10\t\x12\x0b\n\x07SERBIAN\x10\n\x12\x0b\n\x07RUSSIAN\x10\x0b\x12\t\n\x05\x44UTCH\x10\x0c\x12\t\n\x05GREEK\x10\r\x12\r\n\tNORWEGIAN\x10\x0e\x12\r\n\tSLOVENIAN\x10\x0f\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x63\n\x13\x63om.geeksville.meshB\x0e\x44\x65viceUIProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\"\xeb\x03\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x19\n\x11screen_brightness\x18\x02 \x01(\r\x12\x16\n\x0escreen_timeout\x18\x03 \x01(\r\x12\x13\n\x0bscreen_lock\x18\x04 \x01(\x08\x12\x15\n\rsettings_lock\x18\x05 \x01(\x08\x12\x10\n\x08pin_code\x18\x06 \x01(\r\x12)\n\x05theme\x18\x07 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x15\n\ralert_enabled\x18\x08 \x01(\x08\x12\x16\n\x0e\x62\x61nner_enabled\x18\t \x01(\x08\x12\x14\n\x0cring_tone_id\x18\n \x01(\r\x12/\n\x08language\x18\x0b \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\r \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x18\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\x12*\n\x08map_data\x18\x0f \x01(\x0b\x32\x18.meshtastic.protobuf.Map\"\xa7\x01\n\nNodeFilter\x12\x16\n\x0eunknown_switch\x18\x01 \x01(\x08\x12\x16\n\x0eoffline_switch\x18\x02 \x01(\x08\x12\x19\n\x11public_key_switch\x18\x03 \x01(\x08\x12\x11\n\thops_away\x18\x04 \x01(\x05\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x11\n\tnode_name\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\x05\"~\n\rNodeHighlight\x12\x13\n\x0b\x63hat_switch\x18\x01 \x01(\x08\x12\x17\n\x0fposition_switch\x18\x02 \x01(\x08\x12\x18\n\x10telemetry_switch\x18\x03 \x01(\x08\x12\x12\n\niaq_switch\x18\x04 \x01(\x08\x12\x11\n\tnode_name\x18\x05 \x01(\t\"=\n\x08GeoPoint\x12\x0c\n\x04zoom\x18\x01 \x01(\x05\x12\x10\n\x08latitude\x18\x02 \x01(\x05\x12\x11\n\tlongitude\x18\x03 \x01(\x05\"U\n\x03Map\x12+\n\x04home\x18\x01 \x01(\x0b\x32\x1d.meshtastic.protobuf.GeoPoint\x12\r\n\x05style\x18\x02 \x01(\t\x12\x12\n\nfollow_gps\x18\x03 \x01(\x08*%\n\x05Theme\x12\x08\n\x04\x44\x41RK\x10\x00\x12\t\n\x05LIGHT\x10\x01\x12\x07\n\x03RED\x10\x02*\x9a\x02\n\x08Language\x12\x0b\n\x07\x45NGLISH\x10\x00\x12\n\n\x06\x46RENCH\x10\x01\x12\n\n\x06GERMAN\x10\x02\x12\x0b\n\x07ITALIAN\x10\x03\x12\x0e\n\nPORTUGUESE\x10\x04\x12\x0b\n\x07SPANISH\x10\x05\x12\x0b\n\x07SWEDISH\x10\x06\x12\x0b\n\x07\x46INNISH\x10\x07\x12\n\n\x06POLISH\x10\x08\x12\x0b\n\x07TURKISH\x10\t\x12\x0b\n\x07SERBIAN\x10\n\x12\x0b\n\x07RUSSIAN\x10\x0b\x12\t\n\x05\x44UTCH\x10\x0c\x12\t\n\x05GREEK\x10\r\x12\r\n\tNORWEGIAN\x10\x0e\x12\r\n\tSLOVENIAN\x10\x0f\x12\r\n\tUKRAINIAN\x10\x10\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x63\n\x13\x63om.geeksville.meshB\x0e\x44\x65viceUIProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -24,7 +24,7 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['_THEME']._serialized_start=1002 _globals['_THEME']._serialized_end=1039 _globals['_LANGUAGE']._serialized_start=1042 - _globals['_LANGUAGE']._serialized_end=1309 + _globals['_LANGUAGE']._serialized_end=1324 _globals['_DEVICEUICONFIG']._serialized_start=61 _globals['_DEVICEUICONFIG']._serialized_end=552 _globals['_NODEFILTER']._serialized_start=555 diff --git a/meshtastic/protobuf/device_ui_pb2.pyi b/meshtastic/protobuf/device_ui_pb2.pyi index 1d3f7fb..cd31d3b 100644 --- a/meshtastic/protobuf/device_ui_pb2.pyi +++ b/meshtastic/protobuf/device_ui_pb2.pyi @@ -122,6 +122,10 @@ class _LanguageEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumT """ Slovenian """ + UKRAINIAN: _Language.ValueType # 16 + """ + Ukrainian + """ SIMPLIFIED_CHINESE: _Language.ValueType # 30 """ Simplified Chinese (experimental) @@ -200,6 +204,10 @@ SLOVENIAN: Language.ValueType # 15 """ Slovenian """ +UKRAINIAN: Language.ValueType # 16 +""" +Ukrainian +""" SIMPLIFIED_CHINESE: Language.ValueType # 30 """ Simplified Chinese (experimental) diff --git a/meshtastic/protobuf/interdevice_pb2.py b/meshtastic/protobuf/interdevice_pb2.py new file mode 100644 index 0000000..955bc80 --- /dev/null +++ b/meshtastic/protobuf/interdevice_pb2.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/interdevice.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%meshtastic/protobuf/interdevice.proto\x12\x13meshtastic.protobuf\"s\n\nSensorData\x12.\n\x04type\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.MessageType\x12\x15\n\x0b\x66loat_value\x18\x02 \x01(\x02H\x00\x12\x16\n\x0cuint32_value\x18\x03 \x01(\rH\x00\x42\x06\n\x04\x64\x61ta\"_\n\x12InterdeviceMessage\x12\x0e\n\x04nmea\x18\x01 \x01(\tH\x00\x12\x31\n\x06sensor\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.SensorDataH\x00\x42\x06\n\x04\x64\x61ta*\xd5\x01\n\x0bMessageType\x12\x07\n\x03\x41\x43K\x10\x00\x12\x15\n\x10\x43OLLECT_INTERVAL\x10\xa0\x01\x12\x0c\n\x07\x42\x45\x45P_ON\x10\xa1\x01\x12\r\n\x08\x42\x45\x45P_OFF\x10\xa2\x01\x12\r\n\x08SHUTDOWN\x10\xa3\x01\x12\r\n\x08POWER_ON\x10\xa4\x01\x12\x0f\n\nSCD41_TEMP\x10\xb0\x01\x12\x13\n\x0eSCD41_HUMIDITY\x10\xb1\x01\x12\x0e\n\tSCD41_CO2\x10\xb2\x01\x12\x0f\n\nAHT20_TEMP\x10\xb3\x01\x12\x13\n\x0e\x41HT20_HUMIDITY\x10\xb4\x01\x12\x0f\n\nTVOC_INDEX\x10\xb5\x01\x42\x66\n\x13\x63om.geeksville.meshB\x11InterdeviceProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.interdevice_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\021InterdeviceProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_MESSAGETYPE']._serialized_start=277 + _globals['_MESSAGETYPE']._serialized_end=490 + _globals['_SENSORDATA']._serialized_start=62 + _globals['_SENSORDATA']._serialized_end=177 + _globals['_INTERDEVICEMESSAGE']._serialized_start=179 + _globals['_INTERDEVICEMESSAGE']._serialized_end=274 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/interdevice_pb2.pyi b/meshtastic/protobuf/interdevice_pb2.pyi new file mode 100644 index 0000000..6e70f9e --- /dev/null +++ b/meshtastic/protobuf/interdevice_pb2.pyi @@ -0,0 +1,105 @@ +""" +@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 _MessageType: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _MessageTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_MessageType.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + ACK: _MessageType.ValueType # 0 + COLLECT_INTERVAL: _MessageType.ValueType # 160 + """in ms""" + BEEP_ON: _MessageType.ValueType # 161 + """duration ms""" + BEEP_OFF: _MessageType.ValueType # 162 + """cancel prematurely""" + SHUTDOWN: _MessageType.ValueType # 163 + POWER_ON: _MessageType.ValueType # 164 + SCD41_TEMP: _MessageType.ValueType # 176 + SCD41_HUMIDITY: _MessageType.ValueType # 177 + SCD41_CO2: _MessageType.ValueType # 178 + AHT20_TEMP: _MessageType.ValueType # 179 + AHT20_HUMIDITY: _MessageType.ValueType # 180 + TVOC_INDEX: _MessageType.ValueType # 181 + +class MessageType(_MessageType, metaclass=_MessageTypeEnumTypeWrapper): + """encapsulate up to 1k of NMEA string data""" + +ACK: MessageType.ValueType # 0 +COLLECT_INTERVAL: MessageType.ValueType # 160 +"""in ms""" +BEEP_ON: MessageType.ValueType # 161 +"""duration ms""" +BEEP_OFF: MessageType.ValueType # 162 +"""cancel prematurely""" +SHUTDOWN: MessageType.ValueType # 163 +POWER_ON: MessageType.ValueType # 164 +SCD41_TEMP: MessageType.ValueType # 176 +SCD41_HUMIDITY: MessageType.ValueType # 177 +SCD41_CO2: MessageType.ValueType # 178 +AHT20_TEMP: MessageType.ValueType # 179 +AHT20_HUMIDITY: MessageType.ValueType # 180 +TVOC_INDEX: MessageType.ValueType # 181 +global___MessageType = MessageType + +@typing.final +class SensorData(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TYPE_FIELD_NUMBER: builtins.int + FLOAT_VALUE_FIELD_NUMBER: builtins.int + UINT32_VALUE_FIELD_NUMBER: builtins.int + type: global___MessageType.ValueType + """The message type""" + float_value: builtins.float + uint32_value: builtins.int + def __init__( + self, + *, + type: global___MessageType.ValueType = ..., + float_value: builtins.float = ..., + uint32_value: builtins.int = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["data", b"data", "float_value", b"float_value", "uint32_value", b"uint32_value"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["data", b"data", "float_value", b"float_value", "type", b"type", "uint32_value", b"uint32_value"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["data", b"data"]) -> typing.Literal["float_value", "uint32_value"] | None: ... + +global___SensorData = SensorData + +@typing.final +class InterdeviceMessage(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NMEA_FIELD_NUMBER: builtins.int + SENSOR_FIELD_NUMBER: builtins.int + nmea: builtins.str + @property + def sensor(self) -> global___SensorData: ... + def __init__( + self, + *, + nmea: builtins.str = ..., + sensor: global___SensorData | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["data", b"data", "nmea", b"nmea", "sensor", b"sensor"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["data", b"data", "nmea", b"nmea", "sensor", b"sensor"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["data", b"data"]) -> typing.Literal["nmea", "sensor"] | None: ... + +global___InterdeviceMessage = InterdeviceMessage diff --git a/meshtastic/protobuf/mesh_pb2.py b/meshtastic/protobuf/mesh_pb2.py index 0057d93..113a015 100644 --- a/meshtastic/protobuf/mesh_pb2.py +++ b/meshtastic/protobuf/mesh_pb2.py @@ -20,7 +20,7 @@ from meshtastic.protobuf import xmodem_pb2 as meshtastic_dot_protobuf_dot_xmodem from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/mesh.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/xmodem.proto\x1a#meshtastic/protobuf/device_ui.proto\"\x99\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 \x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\x12@\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\'.meshtastic.protobuf.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t \x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\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\x19\n\x0cground_speed\x18\x0f \x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 \x01(\rH\x06\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\xea\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\x34\n\x08hw_model\x18\x05 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12;\n\x04role\x18\x07 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08 \x01(\x0c\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 \x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 \x03(\x05\"\xfd\x03\n\x07Routing\x12<\n\rroute_request\x18\x01 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0broute_reply\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\"\xb0\x02\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!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%B\t\n\x07variant\"\xd4\x01\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.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\x12\x15\n\x08\x62itfield\x18\t \x01(\rH\x00\x88\x01\x01\x42\x0b\n\t_bitfield\"\xbc\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x17\n\nlatitude_i\x18\x02 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x03 \x01(\x0fH\x01\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_i\"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\"\xb6\x05\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\x19.meshtastic.protobuf.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(.meshtastic.protobuf.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c \x01(\x05\x12<\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\'.meshtastic.protobuf.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\x12\x12\n\npublic_key\x18\x10 \x01(\x0c\x12\x15\n\rpki_encrypted\x18\x11 \x01(\x08\x12\x10\n\x08next_hop\x18\x12 \x01(\r\x12\x12\n\nrelay_node\x18\x13 \x01(\r\x12\x10\n\x08tx_after\x18\x14 \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\x0c\n\x08RESPONSE\x10P\x12\x08\n\x04HIGH\x10\x64\x12\t\n\x05\x41LERT\x10n\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\"\xc0\x02\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\'\n\x04user\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12/\n\x08position\x18\x03 \x01(\x0b\x32\x1d.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x42\x0c\n\n_hops_away\"t\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\x12\x11\n\tdevice_id\x18\x0c \x01(\x0c\x12\x0f\n\x07pio_env\x18\r \x01(\t\"\xc9\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\x33\n\x05level\x18\x04 \x01(\x0e\x32$.meshtastic.protobuf.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\"\xf7\x06\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12\x31\n\x06packet\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x32\n\x07my_info\x18\x03 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfoH\x00\x12\x32\n\tnode_info\x18\x04 \x01(\x0b\x32\x1d.meshtastic.protobuf.NodeInfoH\x00\x12-\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12\x34\n\nlog_record\x18\x06 \x01(\x0b\x32\x1e.meshtastic.protobuf.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 \x01(\x08H\x00\x12\x39\n\x0cmoduleConfig\x18\t \x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12/\n\x07\x63hannel\x18\n \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x37\n\x0bqueueStatus\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.QueueStatusH\x00\x12\x33\n\x0cxmodemPacket\x18\x0c \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12\x37\n\x08metadata\x18\r \x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12M\n\x16mqttClientProxyMessage\x18\x0e \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x31\n\x08\x66ileInfo\x18\x0f \x01(\x0b\x32\x1d.meshtastic.protobuf.FileInfoH\x00\x12\x45\n\x12\x63lientNotification\x18\x10 \x01(\x0b\x32\'.meshtastic.protobuf.ClientNotificationH\x00\x12=\n\x0e\x64\x65viceuiConfig\x18\x11 \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x42\x11\n\x0fpayload_variant\"\x8c\x01\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x33\n\x05level\x18\x03 \x01(\x0e\x32$.meshtastic.protobuf.LogRecord.Level\x12\x0f\n\x07message\x18\x04 \x01(\tB\x0b\n\t_reply_id\"1\n\x08\x46ileInfo\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\xb8\x02\n\x07ToRadio\x12\x31\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 \x01(\x08H\x00\x12\x33\n\x0cxmodemPacket\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12M\n\x16mqttClientProxyMessage\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x33\n\theartbeat\x18\x07 \x01(\x0b\x32\x1e.meshtastic.protobuf.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"I\n\nCompressed\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x90\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\x30\n\tneighbors\x18\x04 \x03(\x0b\x32\x1d.meshtastic.protobuf.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\"\xe9\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-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12\x34\n\x08hw_model\x18\t \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n \x01(\x08\x12\x0e\n\x06hasPKC\x18\x0b \x01(\x08\x12\x18\n\x10\x65xcluded_modules\x18\x0c \x01(\r\"\x0b\n\tHeartbeat\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"e\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x02 \x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x03 \x01(\r\x12\x15\n\rpayload_chunk\x18\x04 \x01(\x0c\"\x1f\n\rresend_chunks\x12\x0e\n\x06\x63hunks\x18\x01 \x03(\r\"\xb3\x01\n\x16\x43hunkedPayloadResponse\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x1a\n\x10request_transfer\x18\x02 \x01(\x08H\x00\x12\x19\n\x0f\x61\x63\x63\x65pt_transfer\x18\x03 \x01(\x08H\x00\x12;\n\rresend_chunks\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.resend_chunksH\x00\x42\x11\n\x0fpayload_variant*\x87\r\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\x0b\n\x07WIPHONE\x10\x14\x12\x0e\n\nWIO_WM1110\x10\x15\x12\x0b\n\x07RAK2560\x10\x16\x12\x13\n\x0fHELTEC_HRU_3601\x10\x17\x12\x1a\n\x16HELTEC_WIRELESS_BRIDGE\x10\x18\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\x0b\n\x07UNPHONE\x10;\x12\x0c\n\x08TD_LORAC\x10<\x12\x13\n\x0f\x43\x44\x45\x42YTE_EORA_S3\x10=\x12\x0f\n\x0bTWC_MESH_V4\x10>\x12\x16\n\x12NRF52_PROMICRO_DIY\x10?\x12\x1f\n\x1bRADIOMASTER_900_BANDIT_NANO\x10@\x12\x1c\n\x18HELTEC_CAPSULE_SENSOR_V3\x10\x41\x12\x1d\n\x19HELTEC_VISION_MASTER_T190\x10\x42\x12\x1d\n\x19HELTEC_VISION_MASTER_E213\x10\x43\x12\x1d\n\x19HELTEC_VISION_MASTER_E290\x10\x44\x12\x19\n\x15HELTEC_MESH_NODE_T114\x10\x45\x12\x16\n\x12SENSECAP_INDICATOR\x10\x46\x12\x13\n\x0fTRACKER_T1000_E\x10G\x12\x0b\n\x07RAK3172\x10H\x12\n\n\x06WIO_E5\x10I\x12\x1a\n\x16RADIOMASTER_900_BANDIT\x10J\x12\x13\n\x0fME25LS01_4Y10TD\x10K\x12\x18\n\x14RP2040_FEATHER_RFM95\x10L\x12\x15\n\x11M5STACK_COREBASIC\x10M\x12\x11\n\rM5STACK_CORE2\x10N\x12\r\n\tRPI_PICO2\x10O\x12\x12\n\x0eM5STACK_CORES3\x10P\x12\x11\n\rSEEED_XIAO_S3\x10Q\x12\x0b\n\x07MS24SF1\x10R\x12\x0c\n\x08TLORA_C6\x10S\x12\x0f\n\x0bWISMESH_TAP\x10T\x12\r\n\tROUTASTIC\x10U\x12\x0c\n\x08MESH_TAB\x10V\x12\x0c\n\x08MESHLINK\x10W\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\xe9\x01*\xb4\x02\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\x12 \n\x1c\x46LASH_CORRUPTION_RECOVERABLE\x10\x0c\x12\"\n\x1e\x46LASH_CORRUPTION_UNRECOVERABLE\x10\r*\xd3\x02\n\x0f\x45xcludedModules\x12\x11\n\rEXCLUDED_NONE\x10\x00\x12\x0f\n\x0bMQTT_CONFIG\x10\x01\x12\x11\n\rSERIAL_CONFIG\x10\x02\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x04\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x08\x12\x14\n\x10RANGETEST_CONFIG\x10\x10\x12\x14\n\x10TELEMETRY_CONFIG\x10 \x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10@\x12\x11\n\x0c\x41UDIO_CONFIG\x10\x80\x01\x12\x1a\n\x15REMOTEHARDWARE_CONFIG\x10\x80\x02\x12\x18\n\x13NEIGHBORINFO_CONFIG\x10\x80\x04\x12\x1b\n\x16\x41MBIENTLIGHTING_CONFIG\x10\x80\x08\x12\x1b\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x80\x10\x12\x16\n\x11PAXCOUNTER_CONFIG\x10\x80 B_\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\x1emeshtastic/protobuf/mesh.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/xmodem.proto\x1a#meshtastic/protobuf/device_ui.proto\"\x99\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 \x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\x12@\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\'.meshtastic.protobuf.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t \x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\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\x19\n\x0cground_speed\x18\x0f \x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 \x01(\rH\x06\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\xea\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\x34\n\x08hw_model\x18\x05 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12;\n\x04role\x18\x07 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08 \x01(\x0c\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 \x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 \x03(\x05\"\xfd\x03\n\x07Routing\x12<\n\rroute_request\x18\x01 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0broute_reply\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\"\xb0\x02\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!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%B\t\n\x07variant\"\xd4\x01\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.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\x12\x15\n\x08\x62itfield\x18\t \x01(\rH\x00\x88\x01\x01\x42\x0b\n\t_bitfield\"\xbc\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x17\n\nlatitude_i\x18\x02 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x03 \x01(\x0fH\x01\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_i\"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\"\xb6\x05\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\x19.meshtastic.protobuf.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(.meshtastic.protobuf.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c \x01(\x05\x12<\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\'.meshtastic.protobuf.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\x12\x12\n\npublic_key\x18\x10 \x01(\x0c\x12\x15\n\rpki_encrypted\x18\x11 \x01(\x08\x12\x10\n\x08next_hop\x18\x12 \x01(\r\x12\x12\n\nrelay_node\x18\x13 \x01(\r\x12\x10\n\x08tx_after\x18\x14 \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\x0c\n\x08RESPONSE\x10P\x12\x08\n\x04HIGH\x10\x64\x12\t\n\x05\x41LERT\x10n\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\"\xc0\x02\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\'\n\x04user\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12/\n\x08position\x18\x03 \x01(\x0b\x32\x1d.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x42\x0c\n\n_hops_away\"t\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\x12\x11\n\tdevice_id\x18\x0c \x01(\x0c\x12\x0f\n\x07pio_env\x18\r \x01(\t\"\xc9\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\x33\n\x05level\x18\x04 \x01(\x0e\x32$.meshtastic.protobuf.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\"\xf7\x06\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12\x31\n\x06packet\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x32\n\x07my_info\x18\x03 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfoH\x00\x12\x32\n\tnode_info\x18\x04 \x01(\x0b\x32\x1d.meshtastic.protobuf.NodeInfoH\x00\x12-\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12\x34\n\nlog_record\x18\x06 \x01(\x0b\x32\x1e.meshtastic.protobuf.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 \x01(\x08H\x00\x12\x39\n\x0cmoduleConfig\x18\t \x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12/\n\x07\x63hannel\x18\n \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x37\n\x0bqueueStatus\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.QueueStatusH\x00\x12\x33\n\x0cxmodemPacket\x18\x0c \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12\x37\n\x08metadata\x18\r \x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12M\n\x16mqttClientProxyMessage\x18\x0e \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x31\n\x08\x66ileInfo\x18\x0f \x01(\x0b\x32\x1d.meshtastic.protobuf.FileInfoH\x00\x12\x45\n\x12\x63lientNotification\x18\x10 \x01(\x0b\x32\'.meshtastic.protobuf.ClientNotificationH\x00\x12=\n\x0e\x64\x65viceuiConfig\x18\x11 \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x42\x11\n\x0fpayload_variant\"\x8c\x01\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x33\n\x05level\x18\x03 \x01(\x0e\x32$.meshtastic.protobuf.LogRecord.Level\x12\x0f\n\x07message\x18\x04 \x01(\tB\x0b\n\t_reply_id\"1\n\x08\x46ileInfo\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\xb8\x02\n\x07ToRadio\x12\x31\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 \x01(\x08H\x00\x12\x33\n\x0cxmodemPacket\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12M\n\x16mqttClientProxyMessage\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x33\n\theartbeat\x18\x07 \x01(\x0b\x32\x1e.meshtastic.protobuf.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"I\n\nCompressed\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x90\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\x30\n\tneighbors\x18\x04 \x03(\x0b\x32\x1d.meshtastic.protobuf.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\"\xe9\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-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12\x34\n\x08hw_model\x18\t \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n \x01(\x08\x12\x0e\n\x06hasPKC\x18\x0b \x01(\x08\x12\x18\n\x10\x65xcluded_modules\x18\x0c \x01(\r\"\x0b\n\tHeartbeat\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"e\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x02 \x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x03 \x01(\r\x12\x15\n\rpayload_chunk\x18\x04 \x01(\x0c\"\x1f\n\rresend_chunks\x12\x0e\n\x06\x63hunks\x18\x01 \x03(\r\"\xb3\x01\n\x16\x43hunkedPayloadResponse\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x1a\n\x10request_transfer\x18\x02 \x01(\x08H\x00\x12\x19\n\x0f\x61\x63\x63\x65pt_transfer\x18\x03 \x01(\x08H\x00\x12;\n\rresend_chunks\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.resend_chunksH\x00\x42\x11\n\x0fpayload_variant*\xe7\r\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\x0b\n\x07WIPHONE\x10\x14\x12\x0e\n\nWIO_WM1110\x10\x15\x12\x0b\n\x07RAK2560\x10\x16\x12\x13\n\x0fHELTEC_HRU_3601\x10\x17\x12\x1a\n\x16HELTEC_WIRELESS_BRIDGE\x10\x18\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\x0b\n\x07UNPHONE\x10;\x12\x0c\n\x08TD_LORAC\x10<\x12\x13\n\x0f\x43\x44\x45\x42YTE_EORA_S3\x10=\x12\x0f\n\x0bTWC_MESH_V4\x10>\x12\x16\n\x12NRF52_PROMICRO_DIY\x10?\x12\x1f\n\x1bRADIOMASTER_900_BANDIT_NANO\x10@\x12\x1c\n\x18HELTEC_CAPSULE_SENSOR_V3\x10\x41\x12\x1d\n\x19HELTEC_VISION_MASTER_T190\x10\x42\x12\x1d\n\x19HELTEC_VISION_MASTER_E213\x10\x43\x12\x1d\n\x19HELTEC_VISION_MASTER_E290\x10\x44\x12\x19\n\x15HELTEC_MESH_NODE_T114\x10\x45\x12\x16\n\x12SENSECAP_INDICATOR\x10\x46\x12\x13\n\x0fTRACKER_T1000_E\x10G\x12\x0b\n\x07RAK3172\x10H\x12\n\n\x06WIO_E5\x10I\x12\x1a\n\x16RADIOMASTER_900_BANDIT\x10J\x12\x13\n\x0fME25LS01_4Y10TD\x10K\x12\x18\n\x14RP2040_FEATHER_RFM95\x10L\x12\x15\n\x11M5STACK_COREBASIC\x10M\x12\x11\n\rM5STACK_CORE2\x10N\x12\r\n\tRPI_PICO2\x10O\x12\x12\n\x0eM5STACK_CORES3\x10P\x12\x11\n\rSEEED_XIAO_S3\x10Q\x12\x0b\n\x07MS24SF1\x10R\x12\x0c\n\x08TLORA_C6\x10S\x12\x0f\n\x0bWISMESH_TAP\x10T\x12\r\n\tROUTASTIC\x10U\x12\x0c\n\x08MESH_TAB\x10V\x12\x0c\n\x08MESHLINK\x10W\x12\x12\n\x0eXIAO_NRF52_KIT\x10X\x12\x10\n\x0cTHINKNODE_M1\x10Y\x12\x10\n\x0cTHINKNODE_M2\x10Z\x12\x0f\n\x0bT_ETH_ELITE\x10[\x12\x15\n\x11HELTEC_SENSOR_HUB\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\xe9\x01*\xb4\x02\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\x12 \n\x1c\x46LASH_CORRUPTION_RECOVERABLE\x10\x0c\x12\"\n\x1e\x46LASH_CORRUPTION_UNRECOVERABLE\x10\r*\xd3\x02\n\x0f\x45xcludedModules\x12\x11\n\rEXCLUDED_NONE\x10\x00\x12\x0f\n\x0bMQTT_CONFIG\x10\x01\x12\x11\n\rSERIAL_CONFIG\x10\x02\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x04\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x08\x12\x14\n\x10RANGETEST_CONFIG\x10\x10\x12\x14\n\x10TELEMETRY_CONFIG\x10 \x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10@\x12\x11\n\x0c\x41UDIO_CONFIG\x10\x80\x01\x12\x1a\n\x15REMOTEHARDWARE_CONFIG\x10\x80\x02\x12\x18\n\x13NEIGHBORINFO_CONFIG\x10\x80\x04\x12\x1b\n\x16\x41MBIENTLIGHTING_CONFIG\x10\x80\x08\x12\x1b\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x80\x10\x12\x16\n\x11PAXCOUNTER_CONFIG\x10\x80 B_\n\x13\x63om.geeksville.meshB\nMeshProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -33,13 +33,13 @@ if _descriptor._USE_C_DESCRIPTORS == False: _MESHPACKET.fields_by_name['delayed']._options = None _MESHPACKET.fields_by_name['delayed']._serialized_options = b'\030\001' _globals['_HARDWAREMODEL']._serialized_start=6529 - _globals['_HARDWAREMODEL']._serialized_end=8200 - _globals['_CONSTANTS']._serialized_start=8202 - _globals['_CONSTANTS']._serialized_end=8246 - _globals['_CRITICALERRORCODE']._serialized_start=8249 - _globals['_CRITICALERRORCODE']._serialized_end=8557 - _globals['_EXCLUDEDMODULES']._serialized_start=8560 - _globals['_EXCLUDEDMODULES']._serialized_end=8899 + _globals['_HARDWAREMODEL']._serialized_end=8296 + _globals['_CONSTANTS']._serialized_start=8298 + _globals['_CONSTANTS']._serialized_end=8342 + _globals['_CRITICALERRORCODE']._serialized_start=8345 + _globals['_CRITICALERRORCODE']._serialized_end=8653 + _globals['_EXCLUDEDMODULES']._serialized_start=8656 + _globals['_EXCLUDEDMODULES']._serialized_end=8995 _globals['_POSITION']._serialized_start=310 _globals['_POSITION']._serialized_end=1231 _globals['_POSITION_LOCSOURCE']._serialized_start=926 diff --git a/meshtastic/protobuf/mesh_pb2.pyi b/meshtastic/protobuf/mesh_pb2.pyi index bcb66e9..6d2b837 100644 --- a/meshtastic/protobuf/mesh_pb2.pyi +++ b/meshtastic/protobuf/mesh_pb2.pyi @@ -295,7 +295,7 @@ class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._ """ TWC_MESH_V4: _HardwareModel.ValueType # 62 """ - TWC_MESH_V4 + TWC_MESH_V4 Adafruit NRF52840 feather express with SX1262, SSD1306 OLED and NEO6M GPS """ NRF52_PROMICRO_DIY: _HardwareModel.ValueType # 63 @@ -402,6 +402,25 @@ class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._ MeshLink board developed by LoraItalia. NRF52840, eByte E22900M22S (Will also come with other frequencies), 25w MPPT solar charger (5v,12v,18v selectable), support for gps, buzzer, oled or e-ink display, 10 gpios, hardware watchdog https://www.loraitalia.it """ + XIAO_NRF52_KIT: _HardwareModel.ValueType # 88 + """ + Seeed XIAO nRF52840 + Wio SX1262 kit + """ + THINKNODE_M1: _HardwareModel.ValueType # 89 + """ + Elecrow ThinkNode M1 & M2 + https://www.elecrow.com/wiki/ThinkNode-M1_Transceiver_Device(Meshtastic)_Power_By_nRF52840.html + https://www.elecrow.com/wiki/ThinkNode-M2_Transceiver_Device(Meshtastic)_Power_By_NRF52840.html (this actually uses ESP32-S3) + """ + THINKNODE_M2: _HardwareModel.ValueType # 90 + T_ETH_ELITE: _HardwareModel.ValueType # 91 + """ + Lilygo T-ETH-Elite + """ + HELTEC_SENSOR_HUB: _HardwareModel.ValueType # 92 + """ + Heltec HRI-3621 industrial probe + """ PRIVATE_HW: _HardwareModel.ValueType # 255 """ ------------------------------------------------------------------------------------------------------------------------------------------ @@ -680,7 +699,7 @@ CDEBYTE EoRa-S3 board using their own MM modules, clone of LILYGO T3S3 """ TWC_MESH_V4: HardwareModel.ValueType # 62 """ -TWC_MESH_V4 +TWC_MESH_V4 Adafruit NRF52840 feather express with SX1262, SSD1306 OLED and NEO6M GPS """ NRF52_PROMICRO_DIY: HardwareModel.ValueType # 63 @@ -787,6 +806,25 @@ MESHLINK: HardwareModel.ValueType # 87 MeshLink board developed by LoraItalia. NRF52840, eByte E22900M22S (Will also come with other frequencies), 25w MPPT solar charger (5v,12v,18v selectable), support for gps, buzzer, oled or e-ink display, 10 gpios, hardware watchdog https://www.loraitalia.it """ +XIAO_NRF52_KIT: HardwareModel.ValueType # 88 +""" +Seeed XIAO nRF52840 + Wio SX1262 kit +""" +THINKNODE_M1: HardwareModel.ValueType # 89 +""" +Elecrow ThinkNode M1 & M2 +https://www.elecrow.com/wiki/ThinkNode-M1_Transceiver_Device(Meshtastic)_Power_By_nRF52840.html +https://www.elecrow.com/wiki/ThinkNode-M2_Transceiver_Device(Meshtastic)_Power_By_NRF52840.html (this actually uses ESP32-S3) +""" +THINKNODE_M2: HardwareModel.ValueType # 90 +T_ETH_ELITE: HardwareModel.ValueType # 91 +""" +Lilygo T-ETH-Elite +""" +HELTEC_SENSOR_HUB: HardwareModel.ValueType # 92 +""" +Heltec HRI-3621 industrial probe +""" PRIVATE_HW: HardwareModel.ValueType # 255 """ ------------------------------------------------------------------------------------------------------------------------------------------ @@ -2187,7 +2225,7 @@ class MeshPacket(google.protobuf.message.Message): """ next_hop: builtins.int """ - Last byte of the node number of the node that should be used as the next hop in routing. + Last byte of the node number of the node that should be used as the next hop in routing. Set by the firmware internally, clients are not supposed to set this. """ relay_node: builtins.int diff --git a/meshtastic/protobuf/nanopb_pb2.py b/meshtastic/protobuf/nanopb_pb2.py index 4776512..797b8a0 100644 --- a/meshtastic/protobuf/nanopb_pb2.py +++ b/meshtastic/protobuf/nanopb_pb2.py @@ -14,14 +14,14 @@ _sym_db = _symbol_database.Default() from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/nanopb.proto\x1a google/protobuf/descriptor.proto\"\xa4\x07\n\rNanoPBOptions\x12\x10\n\x08max_size\x18\x01 \x01(\x05\x12\x12\n\nmax_length\x18\x0e \x01(\x05\x12\x11\n\tmax_count\x18\x02 \x01(\x05\x12&\n\x08int_size\x18\x07 \x01(\x0e\x32\x08.IntSize:\nIS_DEFAULT\x12$\n\x04type\x18\x03 \x01(\x0e\x32\n.FieldType:\nFT_DEFAULT\x12\x18\n\nlong_names\x18\x04 \x01(\x08:\x04true\x12\x1c\n\rpacked_struct\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0bpacked_enum\x18\n \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0cskip_message\x18\x06 \x01(\x08:\x05\x66\x61lse\x12\x18\n\tno_unions\x18\x08 \x01(\x08:\x05\x66\x61lse\x12\r\n\x05msgid\x18\t \x01(\r\x12\x1e\n\x0f\x61nonymous_oneof\x18\x0b \x01(\x08:\x05\x66\x61lse\x12\x15\n\x06proto3\x18\x0c \x01(\x08:\x05\x66\x61lse\x12#\n\x14proto3_singular_msgs\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1d\n\x0e\x65num_to_string\x18\r \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0c\x66ixed_length\x18\x0f \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0b\x66ixed_count\x18\x10 \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x0fsubmsg_callback\x18\x16 \x01(\x08:\x05\x66\x61lse\x12/\n\x0cmangle_names\x18\x11 \x01(\x0e\x32\x11.TypenameMangling:\x06M_NONE\x12(\n\x11\x63\x61llback_datatype\x18\x12 \x01(\t:\rpb_callback_t\x12\x34\n\x11\x63\x61llback_function\x18\x13 \x01(\t:\x19pb_default_field_callback\x12\x30\n\x0e\x64\x65scriptorsize\x18\x14 \x01(\x0e\x32\x0f.DescriptorSize:\x07\x44S_AUTO\x12\x1a\n\x0b\x64\x65\x66\x61ult_has\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x0f\n\x07include\x18\x18 \x03(\t\x12\x0f\n\x07\x65xclude\x18\x1a \x03(\t\x12\x0f\n\x07package\x18\x19 \x01(\t\x12\x41\n\rtype_override\x18\x1b \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.Type\x12\x19\n\x0bsort_by_tag\x18\x1c \x01(\x08:\x04true\x12.\n\rfallback_type\x18\x1d \x01(\x0e\x32\n.FieldType:\x0b\x46T_CALLBACK*i\n\tFieldType\x12\x0e\n\nFT_DEFAULT\x10\x00\x12\x0f\n\x0b\x46T_CALLBACK\x10\x01\x12\x0e\n\nFT_POINTER\x10\x04\x12\r\n\tFT_STATIC\x10\x02\x12\r\n\tFT_IGNORE\x10\x03\x12\r\n\tFT_INLINE\x10\x05*D\n\x07IntSize\x12\x0e\n\nIS_DEFAULT\x10\x00\x12\x08\n\x04IS_8\x10\x08\x12\t\n\x05IS_16\x10\x10\x12\t\n\x05IS_32\x10 \x12\t\n\x05IS_64\x10@*Z\n\x10TypenameMangling\x12\n\n\x06M_NONE\x10\x00\x12\x13\n\x0fM_STRIP_PACKAGE\x10\x01\x12\r\n\tM_FLATTEN\x10\x02\x12\x16\n\x12M_PACKAGE_INITIALS\x10\x03*E\n\x0e\x44\x65scriptorSize\x12\x0b\n\x07\x44S_AUTO\x10\x00\x12\x08\n\x04\x44S_1\x10\x01\x12\x08\n\x04\x44S_2\x10\x02\x12\x08\n\x04\x44S_4\x10\x04\x12\x08\n\x04\x44S_8\x10\x08:E\n\x0enanopb_fileopt\x12\x1c.google.protobuf.FileOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:G\n\rnanopb_msgopt\x12\x1f.google.protobuf.MessageOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:E\n\x0enanopb_enumopt\x12\x1c.google.protobuf.EnumOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:>\n\x06nanopb\x12\x1d.google.protobuf.FieldOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptionsB\x1a\n\x18\x66i.kapsi.koti.jpa.nanopb') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/nanopb.proto\x1a google/protobuf/descriptor.proto\"\xa4\x07\n\rNanoPBOptions\x12\x10\n\x08max_size\x18\x01 \x01(\x05\x12\x12\n\nmax_length\x18\x0e \x01(\x05\x12\x11\n\tmax_count\x18\x02 \x01(\x05\x12&\n\x08int_size\x18\x07 \x01(\x0e\x32\x08.IntSize:\nIS_DEFAULT\x12$\n\x04type\x18\x03 \x01(\x0e\x32\n.FieldType:\nFT_DEFAULT\x12\x18\n\nlong_names\x18\x04 \x01(\x08:\x04true\x12\x1c\n\rpacked_struct\x18\x05 \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0bpacked_enum\x18\n \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0cskip_message\x18\x06 \x01(\x08:\x05\x66\x61lse\x12\x18\n\tno_unions\x18\x08 \x01(\x08:\x05\x66\x61lse\x12\r\n\x05msgid\x18\t \x01(\r\x12\x1e\n\x0f\x61nonymous_oneof\x18\x0b \x01(\x08:\x05\x66\x61lse\x12\x15\n\x06proto3\x18\x0c \x01(\x08:\x05\x66\x61lse\x12#\n\x14proto3_singular_msgs\x18\x15 \x01(\x08:\x05\x66\x61lse\x12\x1d\n\x0e\x65num_to_string\x18\r \x01(\x08:\x05\x66\x61lse\x12\x1b\n\x0c\x66ixed_length\x18\x0f \x01(\x08:\x05\x66\x61lse\x12\x1a\n\x0b\x66ixed_count\x18\x10 \x01(\x08:\x05\x66\x61lse\x12\x1e\n\x0fsubmsg_callback\x18\x16 \x01(\x08:\x05\x66\x61lse\x12/\n\x0cmangle_names\x18\x11 \x01(\x0e\x32\x11.TypenameMangling:\x06M_NONE\x12(\n\x11\x63\x61llback_datatype\x18\x12 \x01(\t:\rpb_callback_t\x12\x34\n\x11\x63\x61llback_function\x18\x13 \x01(\t:\x19pb_default_field_callback\x12\x30\n\x0e\x64\x65scriptorsize\x18\x14 \x01(\x0e\x32\x0f.DescriptorSize:\x07\x44S_AUTO\x12\x1a\n\x0b\x64\x65\x66\x61ult_has\x18\x17 \x01(\x08:\x05\x66\x61lse\x12\x0f\n\x07include\x18\x18 \x03(\t\x12\x0f\n\x07\x65xclude\x18\x1a \x03(\t\x12\x0f\n\x07package\x18\x19 \x01(\t\x12\x41\n\rtype_override\x18\x1b \x01(\x0e\x32*.google.protobuf.FieldDescriptorProto.Type\x12\x19\n\x0bsort_by_tag\x18\x1c \x01(\x08:\x04true\x12.\n\rfallback_type\x18\x1d \x01(\x0e\x32\n.FieldType:\x0b\x46T_CALLBACK*i\n\tFieldType\x12\x0e\n\nFT_DEFAULT\x10\x00\x12\x0f\n\x0b\x46T_CALLBACK\x10\x01\x12\x0e\n\nFT_POINTER\x10\x04\x12\r\n\tFT_STATIC\x10\x02\x12\r\n\tFT_IGNORE\x10\x03\x12\r\n\tFT_INLINE\x10\x05*D\n\x07IntSize\x12\x0e\n\nIS_DEFAULT\x10\x00\x12\x08\n\x04IS_8\x10\x08\x12\t\n\x05IS_16\x10\x10\x12\t\n\x05IS_32\x10 \x12\t\n\x05IS_64\x10@*Z\n\x10TypenameMangling\x12\n\n\x06M_NONE\x10\x00\x12\x13\n\x0fM_STRIP_PACKAGE\x10\x01\x12\r\n\tM_FLATTEN\x10\x02\x12\x16\n\x12M_PACKAGE_INITIALS\x10\x03*E\n\x0e\x44\x65scriptorSize\x12\x0b\n\x07\x44S_AUTO\x10\x00\x12\x08\n\x04\x44S_1\x10\x01\x12\x08\n\x04\x44S_2\x10\x02\x12\x08\n\x04\x44S_4\x10\x04\x12\x08\n\x04\x44S_8\x10\x08:E\n\x0enanopb_fileopt\x12\x1c.google.protobuf.FileOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:G\n\rnanopb_msgopt\x12\x1f.google.protobuf.MessageOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:E\n\x0enanopb_enumopt\x12\x1c.google.protobuf.EnumOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptions:>\n\x06nanopb\x12\x1d.google.protobuf.FieldOptions\x18\xf2\x07 \x01(\x0b\x32\x0e.NanoPBOptionsB>\n\x18\x66i.kapsi.koti.jpa.nanopbZ\"github.com/meshtastic/go/generated') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.nanopb_pb2', _globals) if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\030fi.kapsi.koti.jpa.nanopb' + DESCRIPTOR._serialized_options = b'\n\030fi.kapsi.koti.jpa.nanopbZ\"github.com/meshtastic/go/generated' _globals['_FIELDTYPE']._serialized_start=1005 _globals['_FIELDTYPE']._serialized_end=1110 _globals['_INTSIZE']._serialized_start=1112 diff --git a/meshtastic/protobuf/portnums_pb2.py b/meshtastic/protobuf/portnums_pb2.py index 4742141..e06eb8d 100644 --- a/meshtastic/protobuf/portnums_pb2.py +++ b/meshtastic/protobuf/portnums_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\xb1\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\tALERT_APP\x10\x0b\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\x13\n\x0fPOWERSTRESS_APP\x10J\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\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\xcb\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\tALERT_APP\x10\x0b\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\x13\n\x0fPOWERSTRESS_APP\x10J\x12\x18\n\x14RETICULUM_TUNNEL_APP\x10L\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') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -22,5 +22,5 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_PORTNUM']._serialized_start=60 - _globals['_PORTNUM']._serialized_end=621 + _globals['_PORTNUM']._serialized_end=647 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/portnums_pb2.pyi b/meshtastic/protobuf/portnums_pb2.pyi index 32c5ec8..fce710a 100644 --- a/meshtastic/protobuf/portnums_pb2.pyi +++ b/meshtastic/protobuf/portnums_pb2.pyi @@ -179,6 +179,11 @@ class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy """ PowerStress based monitoring support (for automated power consumption testing) """ + RETICULUM_TUNNEL_APP: _PortNum.ValueType # 76 + """ + Reticulum Network Stack Tunnel App + ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface + """ PRIVATE_APP: _PortNum.ValueType # 256 """ Private applications should use portnums >= 256. @@ -368,6 +373,11 @@ POWERSTRESS_APP: PortNum.ValueType # 74 """ PowerStress based monitoring support (for automated power consumption testing) """ +RETICULUM_TUNNEL_APP: PortNum.ValueType # 76 +""" +Reticulum Network Stack Tunnel App +ENCODING: Fragmented RNS Packet. Handled by Meshtastic RNS interface +""" PRIVATE_APP: PortNum.ValueType # 256 """ Private applications should use portnums >= 256. diff --git a/meshtastic/protobuf/telemetry_pb2.py b/meshtastic/protobuf/telemetry_pb2.py index d246f16..28eded8 100644 --- a/meshtastic/protobuf/telemetry_pb2.py +++ b/meshtastic/protobuf/telemetry_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/telemetry.proto\x12\x13meshtastic.protobuf\"\xf3\x01\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07voltage\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12 \n\x13\x63hannel_utilization\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x18\n\x0b\x61ir_util_tx\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x1b\n\x0euptime_seconds\x18\x05 \x01(\rH\x04\x88\x01\x01\x42\x10\n\x0e_battery_levelB\n\n\x08_voltageB\x16\n\x14_channel_utilizationB\x0e\n\x0c_air_util_txB\x11\n\x0f_uptime_seconds\"\xa0\x06\n\x12\x45nvironmentMetrics\x12\x18\n\x0btemperature\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x1e\n\x11relative_humidity\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12 \n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x1b\n\x0egas_resistance\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x14\n\x07voltage\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x14\n\x07\x63urrent\x18\x06 \x01(\x02H\x05\x88\x01\x01\x12\x10\n\x03iaq\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x08 \x01(\x02H\x07\x88\x01\x01\x12\x10\n\x03lux\x18\t \x01(\x02H\x08\x88\x01\x01\x12\x16\n\twhite_lux\x18\n \x01(\x02H\t\x88\x01\x01\x12\x13\n\x06ir_lux\x18\x0b \x01(\x02H\n\x88\x01\x01\x12\x13\n\x06uv_lux\x18\x0c \x01(\x02H\x0b\x88\x01\x01\x12\x1b\n\x0ewind_direction\x18\r \x01(\rH\x0c\x88\x01\x01\x12\x17\n\nwind_speed\x18\x0e \x01(\x02H\r\x88\x01\x01\x12\x13\n\x06weight\x18\x0f \x01(\x02H\x0e\x88\x01\x01\x12\x16\n\twind_gust\x18\x10 \x01(\x02H\x0f\x88\x01\x01\x12\x16\n\twind_lull\x18\x11 \x01(\x02H\x10\x88\x01\x01\x12\x16\n\tradiation\x18\x12 \x01(\x02H\x11\x88\x01\x01\x12\x18\n\x0brainfall_1h\x18\x13 \x01(\x02H\x12\x88\x01\x01\x12\x19\n\x0crainfall_24h\x18\x14 \x01(\x02H\x13\x88\x01\x01\x42\x0e\n\x0c_temperatureB\x14\n\x12_relative_humidityB\x16\n\x14_barometric_pressureB\x11\n\x0f_gas_resistanceB\n\n\x08_voltageB\n\n\x08_currentB\x06\n\x04_iaqB\x0b\n\t_distanceB\x06\n\x04_luxB\x0c\n\n_white_luxB\t\n\x07_ir_luxB\t\n\x07_uv_luxB\x11\n\x0f_wind_directionB\r\n\x0b_wind_speedB\t\n\x07_weightB\x0c\n\n_wind_gustB\x0c\n\n_wind_lullB\x0c\n\n_radiationB\x0e\n\x0c_rainfall_1hB\x0f\n\r_rainfall_24h\"\x8a\x02\n\x0cPowerMetrics\x12\x18\n\x0b\x63h1_voltage\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x18\n\x0b\x63h1_current\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12\x18\n\x0b\x63h2_voltage\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x18\n\x0b\x63h2_current\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x18\n\x0b\x63h3_voltage\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x18\n\x0b\x63h3_current\x18\x06 \x01(\x02H\x05\x88\x01\x01\x42\x0e\n\x0c_ch1_voltageB\x0e\n\x0c_ch1_currentB\x0e\n\x0c_ch2_voltageB\x0e\n\x0c_ch2_currentB\x0e\n\x0c_ch3_voltageB\x0e\n\x0c_ch3_current\"\x85\x05\n\x11\x41irQualityMetrics\x12\x1a\n\rpm10_standard\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1a\n\rpm25_standard\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0epm100_standard\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x1f\n\x12pm10_environmental\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x1f\n\x12pm25_environmental\x18\x05 \x01(\rH\x04\x88\x01\x01\x12 \n\x13pm100_environmental\x18\x06 \x01(\rH\x05\x88\x01\x01\x12\x1b\n\x0eparticles_03um\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x1b\n\x0eparticles_05um\x18\x08 \x01(\rH\x07\x88\x01\x01\x12\x1b\n\x0eparticles_10um\x18\t \x01(\rH\x08\x88\x01\x01\x12\x1b\n\x0eparticles_25um\x18\n \x01(\rH\t\x88\x01\x01\x12\x1b\n\x0eparticles_50um\x18\x0b \x01(\rH\n\x88\x01\x01\x12\x1c\n\x0fparticles_100um\x18\x0c \x01(\rH\x0b\x88\x01\x01\x12\x10\n\x03\x63o2\x18\r \x01(\rH\x0c\x88\x01\x01\x42\x10\n\x0e_pm10_standardB\x10\n\x0e_pm25_standardB\x11\n\x0f_pm100_standardB\x15\n\x13_pm10_environmentalB\x15\n\x13_pm25_environmentalB\x16\n\x14_pm100_environmentalB\x11\n\x0f_particles_03umB\x11\n\x0f_particles_05umB\x11\n\x0f_particles_10umB\x11\n\x0f_particles_25umB\x11\n\x0f_particles_50umB\x12\n\x10_particles_100umB\x06\n\x04_co2\"\x9f\x02\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\x02\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\x02\x12\x16\n\x0enum_packets_tx\x18\x04 \x01(\r\x12\x16\n\x0enum_packets_rx\x18\x05 \x01(\r\x12\x1a\n\x12num_packets_rx_bad\x18\x06 \x01(\r\x12\x18\n\x10num_online_nodes\x18\x07 \x01(\r\x12\x17\n\x0fnum_total_nodes\x18\x08 \x01(\r\x12\x13\n\x0bnum_rx_dupe\x18\t \x01(\r\x12\x14\n\x0cnum_tx_relay\x18\n \x01(\r\x12\x1d\n\x15num_tx_relay_canceled\x18\x0b \x01(\r\"{\n\rHealthMetrics\x12\x16\n\theart_bpm\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04spO2\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x18\n\x0btemperature\x18\x03 \x01(\x02H\x02\x88\x01\x01\x42\x0c\n\n_heart_bpmB\x07\n\x05_spO2B\x0e\n\x0c_temperature\"\xa3\x03\n\tTelemetry\x12\x0c\n\x04time\x18\x01 \x01(\x07\x12<\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetricsH\x00\x12\x46\n\x13\x65nvironment_metrics\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.EnvironmentMetricsH\x00\x12\x45\n\x13\x61ir_quality_metrics\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.AirQualityMetricsH\x00\x12:\n\rpower_metrics\x18\x05 \x01(\x0b\x32!.meshtastic.protobuf.PowerMetricsH\x00\x12\x36\n\x0blocal_stats\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LocalStatsH\x00\x12<\n\x0ehealth_metrics\x18\x07 \x01(\x0b\x32\".meshtastic.protobuf.HealthMetricsH\x00\x42\t\n\x07variant\">\n\rNau7802Config\x12\x12\n\nzeroOffset\x18\x01 \x01(\x05\x12\x19\n\x11\x63\x61librationFactor\x18\x02 \x01(\x02*\xf7\x03\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\x12\x0c\n\x08RCWL9620\x10\x10\x12\t\n\x05SHT4X\x10\x11\x12\x0c\n\x08VEML7700\x10\x12\x12\x0c\n\x08MLX90632\x10\x13\x12\x0b\n\x07OPT3001\x10\x14\x12\x0c\n\x08LTR390UV\x10\x15\x12\x0e\n\nTSL25911FN\x10\x16\x12\t\n\x05\x41HT10\x10\x17\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x18\x12\x0b\n\x07NAU7802\x10\x19\x12\n\n\x06\x42MP3XX\x10\x1a\x12\x0c\n\x08ICM20948\x10\x1b\x12\x0c\n\x08MAX17048\x10\x1c\x12\x11\n\rCUSTOM_SENSOR\x10\x1d\x12\x0c\n\x08MAX30102\x10\x1e\x12\x0c\n\x08MLX90614\x10\x1f\x12\t\n\x05SCD4X\x10 \x12\x0b\n\x07RADSENS\x10!\x12\n\n\x06INA226\x10\"\x12\x10\n\x0c\x44\x46ROBOT_RAIN\x10#Bd\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#meshtastic/protobuf/telemetry.proto\x12\x13meshtastic.protobuf\"\xf3\x01\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07voltage\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12 \n\x13\x63hannel_utilization\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x18\n\x0b\x61ir_util_tx\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x1b\n\x0euptime_seconds\x18\x05 \x01(\rH\x04\x88\x01\x01\x42\x10\n\x0e_battery_levelB\n\n\x08_voltageB\x16\n\x14_channel_utilizationB\x0e\n\x0c_air_util_txB\x11\n\x0f_uptime_seconds\"\x82\x07\n\x12\x45nvironmentMetrics\x12\x18\n\x0btemperature\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x1e\n\x11relative_humidity\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12 \n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x1b\n\x0egas_resistance\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x14\n\x07voltage\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x14\n\x07\x63urrent\x18\x06 \x01(\x02H\x05\x88\x01\x01\x12\x10\n\x03iaq\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x08 \x01(\x02H\x07\x88\x01\x01\x12\x10\n\x03lux\x18\t \x01(\x02H\x08\x88\x01\x01\x12\x16\n\twhite_lux\x18\n \x01(\x02H\t\x88\x01\x01\x12\x13\n\x06ir_lux\x18\x0b \x01(\x02H\n\x88\x01\x01\x12\x13\n\x06uv_lux\x18\x0c \x01(\x02H\x0b\x88\x01\x01\x12\x1b\n\x0ewind_direction\x18\r \x01(\rH\x0c\x88\x01\x01\x12\x17\n\nwind_speed\x18\x0e \x01(\x02H\r\x88\x01\x01\x12\x13\n\x06weight\x18\x0f \x01(\x02H\x0e\x88\x01\x01\x12\x16\n\twind_gust\x18\x10 \x01(\x02H\x0f\x88\x01\x01\x12\x16\n\twind_lull\x18\x11 \x01(\x02H\x10\x88\x01\x01\x12\x16\n\tradiation\x18\x12 \x01(\x02H\x11\x88\x01\x01\x12\x18\n\x0brainfall_1h\x18\x13 \x01(\x02H\x12\x88\x01\x01\x12\x19\n\x0crainfall_24h\x18\x14 \x01(\x02H\x13\x88\x01\x01\x12\x1a\n\rsoil_moisture\x18\x15 \x01(\rH\x14\x88\x01\x01\x12\x1d\n\x10soil_temperature\x18\x16 \x01(\x02H\x15\x88\x01\x01\x42\x0e\n\x0c_temperatureB\x14\n\x12_relative_humidityB\x16\n\x14_barometric_pressureB\x11\n\x0f_gas_resistanceB\n\n\x08_voltageB\n\n\x08_currentB\x06\n\x04_iaqB\x0b\n\t_distanceB\x06\n\x04_luxB\x0c\n\n_white_luxB\t\n\x07_ir_luxB\t\n\x07_uv_luxB\x11\n\x0f_wind_directionB\r\n\x0b_wind_speedB\t\n\x07_weightB\x0c\n\n_wind_gustB\x0c\n\n_wind_lullB\x0c\n\n_radiationB\x0e\n\x0c_rainfall_1hB\x0f\n\r_rainfall_24hB\x10\n\x0e_soil_moistureB\x13\n\x11_soil_temperature\"\x8a\x02\n\x0cPowerMetrics\x12\x18\n\x0b\x63h1_voltage\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x18\n\x0b\x63h1_current\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12\x18\n\x0b\x63h2_voltage\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x18\n\x0b\x63h2_current\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x18\n\x0b\x63h3_voltage\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x18\n\x0b\x63h3_current\x18\x06 \x01(\x02H\x05\x88\x01\x01\x42\x0e\n\x0c_ch1_voltageB\x0e\n\x0c_ch1_currentB\x0e\n\x0c_ch2_voltageB\x0e\n\x0c_ch2_currentB\x0e\n\x0c_ch3_voltageB\x0e\n\x0c_ch3_current\"\x85\x05\n\x11\x41irQualityMetrics\x12\x1a\n\rpm10_standard\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1a\n\rpm25_standard\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0epm100_standard\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x1f\n\x12pm10_environmental\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x1f\n\x12pm25_environmental\x18\x05 \x01(\rH\x04\x88\x01\x01\x12 \n\x13pm100_environmental\x18\x06 \x01(\rH\x05\x88\x01\x01\x12\x1b\n\x0eparticles_03um\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x1b\n\x0eparticles_05um\x18\x08 \x01(\rH\x07\x88\x01\x01\x12\x1b\n\x0eparticles_10um\x18\t \x01(\rH\x08\x88\x01\x01\x12\x1b\n\x0eparticles_25um\x18\n \x01(\rH\t\x88\x01\x01\x12\x1b\n\x0eparticles_50um\x18\x0b \x01(\rH\n\x88\x01\x01\x12\x1c\n\x0fparticles_100um\x18\x0c \x01(\rH\x0b\x88\x01\x01\x12\x10\n\x03\x63o2\x18\r \x01(\rH\x0c\x88\x01\x01\x42\x10\n\x0e_pm10_standardB\x10\n\x0e_pm25_standardB\x11\n\x0f_pm100_standardB\x15\n\x13_pm10_environmentalB\x15\n\x13_pm25_environmentalB\x16\n\x14_pm100_environmentalB\x11\n\x0f_particles_03umB\x11\n\x0f_particles_05umB\x11\n\x0f_particles_10umB\x11\n\x0f_particles_25umB\x11\n\x0f_particles_50umB\x12\n\x10_particles_100umB\x06\n\x04_co2\"\x9f\x02\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\x02\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\x02\x12\x16\n\x0enum_packets_tx\x18\x04 \x01(\r\x12\x16\n\x0enum_packets_rx\x18\x05 \x01(\r\x12\x1a\n\x12num_packets_rx_bad\x18\x06 \x01(\r\x12\x18\n\x10num_online_nodes\x18\x07 \x01(\r\x12\x17\n\x0fnum_total_nodes\x18\x08 \x01(\r\x12\x13\n\x0bnum_rx_dupe\x18\t \x01(\r\x12\x14\n\x0cnum_tx_relay\x18\n \x01(\r\x12\x1d\n\x15num_tx_relay_canceled\x18\x0b \x01(\r\"{\n\rHealthMetrics\x12\x16\n\theart_bpm\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04spO2\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x18\n\x0btemperature\x18\x03 \x01(\x02H\x02\x88\x01\x01\x42\x0c\n\n_heart_bpmB\x07\n\x05_spO2B\x0e\n\x0c_temperature\"\xa3\x03\n\tTelemetry\x12\x0c\n\x04time\x18\x01 \x01(\x07\x12<\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetricsH\x00\x12\x46\n\x13\x65nvironment_metrics\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.EnvironmentMetricsH\x00\x12\x45\n\x13\x61ir_quality_metrics\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.AirQualityMetricsH\x00\x12:\n\rpower_metrics\x18\x05 \x01(\x0b\x32!.meshtastic.protobuf.PowerMetricsH\x00\x12\x36\n\x0blocal_stats\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LocalStatsH\x00\x12<\n\x0ehealth_metrics\x18\x07 \x01(\x0b\x32\".meshtastic.protobuf.HealthMetricsH\x00\x42\t\n\x07variant\">\n\rNau7802Config\x12\x12\n\nzeroOffset\x18\x01 \x01(\x05\x12\x19\n\x11\x63\x61librationFactor\x18\x02 \x01(\x02*\x91\x04\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\x12\x0c\n\x08RCWL9620\x10\x10\x12\t\n\x05SHT4X\x10\x11\x12\x0c\n\x08VEML7700\x10\x12\x12\x0c\n\x08MLX90632\x10\x13\x12\x0b\n\x07OPT3001\x10\x14\x12\x0c\n\x08LTR390UV\x10\x15\x12\x0e\n\nTSL25911FN\x10\x16\x12\t\n\x05\x41HT10\x10\x17\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x18\x12\x0b\n\x07NAU7802\x10\x19\x12\n\n\x06\x42MP3XX\x10\x1a\x12\x0c\n\x08ICM20948\x10\x1b\x12\x0c\n\x08MAX17048\x10\x1c\x12\x11\n\rCUSTOM_SENSOR\x10\x1d\x12\x0c\n\x08MAX30102\x10\x1e\x12\x0c\n\x08MLX90614\x10\x1f\x12\t\n\x05SCD4X\x10 \x12\x0b\n\x07RADSENS\x10!\x12\n\n\x06INA226\x10\"\x12\x10\n\x0c\x44\x46ROBOT_RAIN\x10#\x12\n\n\x06\x44PS310\x10$\x12\x0c\n\x08RAK12035\x10%Bd\n\x13\x63om.geeksville.meshB\x0fTelemetryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -21,22 +21,22 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.telemet if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\017TelemetryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _globals['_TELEMETRYSENSORTYPE']._serialized_start=2928 - _globals['_TELEMETRYSENSORTYPE']._serialized_end=3431 + _globals['_TELEMETRYSENSORTYPE']._serialized_start=3026 + _globals['_TELEMETRYSENSORTYPE']._serialized_end=3555 _globals['_DEVICEMETRICS']._serialized_start=61 _globals['_DEVICEMETRICS']._serialized_end=304 _globals['_ENVIRONMENTMETRICS']._serialized_start=307 - _globals['_ENVIRONMENTMETRICS']._serialized_end=1107 - _globals['_POWERMETRICS']._serialized_start=1110 - _globals['_POWERMETRICS']._serialized_end=1376 - _globals['_AIRQUALITYMETRICS']._serialized_start=1379 - _globals['_AIRQUALITYMETRICS']._serialized_end=2024 - _globals['_LOCALSTATS']._serialized_start=2027 - _globals['_LOCALSTATS']._serialized_end=2314 - _globals['_HEALTHMETRICS']._serialized_start=2316 - _globals['_HEALTHMETRICS']._serialized_end=2439 - _globals['_TELEMETRY']._serialized_start=2442 - _globals['_TELEMETRY']._serialized_end=2861 - _globals['_NAU7802CONFIG']._serialized_start=2863 - _globals['_NAU7802CONFIG']._serialized_end=2925 + _globals['_ENVIRONMENTMETRICS']._serialized_end=1205 + _globals['_POWERMETRICS']._serialized_start=1208 + _globals['_POWERMETRICS']._serialized_end=1474 + _globals['_AIRQUALITYMETRICS']._serialized_start=1477 + _globals['_AIRQUALITYMETRICS']._serialized_end=2122 + _globals['_LOCALSTATS']._serialized_start=2125 + _globals['_LOCALSTATS']._serialized_end=2412 + _globals['_HEALTHMETRICS']._serialized_start=2414 + _globals['_HEALTHMETRICS']._serialized_end=2537 + _globals['_TELEMETRY']._serialized_start=2540 + _globals['_TELEMETRY']._serialized_end=2959 + _globals['_NAU7802CONFIG']._serialized_start=2961 + _globals['_NAU7802CONFIG']._serialized_end=3023 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/telemetry_pb2.pyi b/meshtastic/protobuf/telemetry_pb2.pyi index 64b9270..dd91a1d 100644 --- a/meshtastic/protobuf/telemetry_pb2.pyi +++ b/meshtastic/protobuf/telemetry_pb2.pyi @@ -167,6 +167,14 @@ class _TelemetrySensorTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wra """ DFRobot Gravity tipping bucket rain gauge """ + DPS310: _TelemetrySensorType.ValueType # 36 + """ + Infineon DPS310 High accuracy pressure and temperature + """ + RAK12035: _TelemetrySensorType.ValueType # 37 + """ + RAKWireless RAK12035 Soil Moisture Sensor Module + """ class TelemetrySensorType(_TelemetrySensorType, metaclass=_TelemetrySensorTypeEnumTypeWrapper): """ @@ -317,6 +325,14 @@ DFROBOT_RAIN: TelemetrySensorType.ValueType # 35 """ DFRobot Gravity tipping bucket rain gauge """ +DPS310: TelemetrySensorType.ValueType # 36 +""" +Infineon DPS310 High accuracy pressure and temperature +""" +RAK12035: TelemetrySensorType.ValueType # 37 +""" +RAKWireless RAK12035 Soil Moisture Sensor Module +""" global___TelemetrySensorType = TelemetrySensorType @typing.final @@ -404,6 +420,8 @@ class EnvironmentMetrics(google.protobuf.message.Message): RADIATION_FIELD_NUMBER: builtins.int RAINFALL_1H_FIELD_NUMBER: builtins.int RAINFALL_24H_FIELD_NUMBER: builtins.int + SOIL_MOISTURE_FIELD_NUMBER: builtins.int + SOIL_TEMPERATURE_FIELD_NUMBER: builtins.int temperature: builtins.float """ Temperature measured @@ -486,6 +504,14 @@ class EnvironmentMetrics(google.protobuf.message.Message): """ Rainfall in the last 24 hours in mm """ + soil_moisture: builtins.int + """ + Soil moisture measured (% 1-100) + """ + soil_temperature: builtins.float + """ + Soil temperature measured (*C) + """ def __init__( self, *, @@ -509,9 +535,11 @@ class EnvironmentMetrics(google.protobuf.message.Message): radiation: builtins.float | None = ..., rainfall_1h: builtins.float | None = ..., rainfall_24h: builtins.float | None = ..., + soil_moisture: builtins.int | None = ..., + soil_temperature: builtins.float | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_barometric_pressure", b"_barometric_pressure", "_current", b"_current", "_distance", b"_distance", "_gas_resistance", b"_gas_resistance", "_iaq", b"_iaq", "_ir_lux", b"_ir_lux", "_lux", b"_lux", "_radiation", b"_radiation", "_rainfall_1h", b"_rainfall_1h", "_rainfall_24h", b"_rainfall_24h", "_relative_humidity", b"_relative_humidity", "_temperature", b"_temperature", "_uv_lux", b"_uv_lux", "_voltage", b"_voltage", "_weight", b"_weight", "_white_lux", b"_white_lux", "_wind_direction", b"_wind_direction", "_wind_gust", b"_wind_gust", "_wind_lull", b"_wind_lull", "_wind_speed", b"_wind_speed", "barometric_pressure", b"barometric_pressure", "current", b"current", "distance", b"distance", "gas_resistance", b"gas_resistance", "iaq", b"iaq", "ir_lux", b"ir_lux", "lux", b"lux", "radiation", b"radiation", "rainfall_1h", b"rainfall_1h", "rainfall_24h", b"rainfall_24h", "relative_humidity", b"relative_humidity", "temperature", b"temperature", "uv_lux", b"uv_lux", "voltage", b"voltage", "weight", b"weight", "white_lux", b"white_lux", "wind_direction", b"wind_direction", "wind_gust", b"wind_gust", "wind_lull", b"wind_lull", "wind_speed", b"wind_speed"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_barometric_pressure", b"_barometric_pressure", "_current", b"_current", "_distance", b"_distance", "_gas_resistance", b"_gas_resistance", "_iaq", b"_iaq", "_ir_lux", b"_ir_lux", "_lux", b"_lux", "_radiation", b"_radiation", "_rainfall_1h", b"_rainfall_1h", "_rainfall_24h", b"_rainfall_24h", "_relative_humidity", b"_relative_humidity", "_temperature", b"_temperature", "_uv_lux", b"_uv_lux", "_voltage", b"_voltage", "_weight", b"_weight", "_white_lux", b"_white_lux", "_wind_direction", b"_wind_direction", "_wind_gust", b"_wind_gust", "_wind_lull", b"_wind_lull", "_wind_speed", b"_wind_speed", "barometric_pressure", b"barometric_pressure", "current", b"current", "distance", b"distance", "gas_resistance", b"gas_resistance", "iaq", b"iaq", "ir_lux", b"ir_lux", "lux", b"lux", "radiation", b"radiation", "rainfall_1h", b"rainfall_1h", "rainfall_24h", b"rainfall_24h", "relative_humidity", b"relative_humidity", "temperature", b"temperature", "uv_lux", b"uv_lux", "voltage", b"voltage", "weight", b"weight", "white_lux", b"white_lux", "wind_direction", b"wind_direction", "wind_gust", b"wind_gust", "wind_lull", b"wind_lull", "wind_speed", b"wind_speed"]) -> None: ... + def HasField(self, field_name: typing.Literal["_barometric_pressure", b"_barometric_pressure", "_current", b"_current", "_distance", b"_distance", "_gas_resistance", b"_gas_resistance", "_iaq", b"_iaq", "_ir_lux", b"_ir_lux", "_lux", b"_lux", "_radiation", b"_radiation", "_rainfall_1h", b"_rainfall_1h", "_rainfall_24h", b"_rainfall_24h", "_relative_humidity", b"_relative_humidity", "_soil_moisture", b"_soil_moisture", "_soil_temperature", b"_soil_temperature", "_temperature", b"_temperature", "_uv_lux", b"_uv_lux", "_voltage", b"_voltage", "_weight", b"_weight", "_white_lux", b"_white_lux", "_wind_direction", b"_wind_direction", "_wind_gust", b"_wind_gust", "_wind_lull", b"_wind_lull", "_wind_speed", b"_wind_speed", "barometric_pressure", b"barometric_pressure", "current", b"current", "distance", b"distance", "gas_resistance", b"gas_resistance", "iaq", b"iaq", "ir_lux", b"ir_lux", "lux", b"lux", "radiation", b"radiation", "rainfall_1h", b"rainfall_1h", "rainfall_24h", b"rainfall_24h", "relative_humidity", b"relative_humidity", "soil_moisture", b"soil_moisture", "soil_temperature", b"soil_temperature", "temperature", b"temperature", "uv_lux", b"uv_lux", "voltage", b"voltage", "weight", b"weight", "white_lux", b"white_lux", "wind_direction", b"wind_direction", "wind_gust", b"wind_gust", "wind_lull", b"wind_lull", "wind_speed", b"wind_speed"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_barometric_pressure", b"_barometric_pressure", "_current", b"_current", "_distance", b"_distance", "_gas_resistance", b"_gas_resistance", "_iaq", b"_iaq", "_ir_lux", b"_ir_lux", "_lux", b"_lux", "_radiation", b"_radiation", "_rainfall_1h", b"_rainfall_1h", "_rainfall_24h", b"_rainfall_24h", "_relative_humidity", b"_relative_humidity", "_soil_moisture", b"_soil_moisture", "_soil_temperature", b"_soil_temperature", "_temperature", b"_temperature", "_uv_lux", b"_uv_lux", "_voltage", b"_voltage", "_weight", b"_weight", "_white_lux", b"_white_lux", "_wind_direction", b"_wind_direction", "_wind_gust", b"_wind_gust", "_wind_lull", b"_wind_lull", "_wind_speed", b"_wind_speed", "barometric_pressure", b"barometric_pressure", "current", b"current", "distance", b"distance", "gas_resistance", b"gas_resistance", "iaq", b"iaq", "ir_lux", b"ir_lux", "lux", b"lux", "radiation", b"radiation", "rainfall_1h", b"rainfall_1h", "rainfall_24h", b"rainfall_24h", "relative_humidity", b"relative_humidity", "soil_moisture", b"soil_moisture", "soil_temperature", b"soil_temperature", "temperature", b"temperature", "uv_lux", b"uv_lux", "voltage", b"voltage", "weight", b"weight", "white_lux", b"white_lux", "wind_direction", b"wind_direction", "wind_gust", b"wind_gust", "wind_lull", b"wind_lull", "wind_speed", b"wind_speed"]) -> None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_barometric_pressure", b"_barometric_pressure"]) -> typing.Literal["barometric_pressure"] | None: ... @typing.overload @@ -535,6 +563,10 @@ class EnvironmentMetrics(google.protobuf.message.Message): @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_relative_humidity", b"_relative_humidity"]) -> typing.Literal["relative_humidity"] | None: ... @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_soil_moisture", b"_soil_moisture"]) -> typing.Literal["soil_moisture"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_soil_temperature", b"_soil_temperature"]) -> typing.Literal["soil_temperature"] | None: ... + @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_temperature", b"_temperature"]) -> typing.Literal["temperature"] | None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_uv_lux", b"_uv_lux"]) -> typing.Literal["uv_lux"] | None: ... diff --git a/protobufs b/protobufs index 2a3a67f..f00e96f 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 2a3a67f0431926dc3f32a8b216d264daab09b9bf +Subproject commit f00e96f12da48abfa9a992f8b5546fd75a370250 From 2e8f8234311ff642631d7750ceb48a2e3e9128a4 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 6 Apr 2025 05:56:17 +0000 Subject: [PATCH 10/38] bump version to 2.6.1 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 1ab290e..83c6f77 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "meshtastic" -version = "2.6.0" +version = "2.6.1" description = "Python API & client shell for talking to Meshtastic devices" authors = ["Meshtastic Developers "] license = "GPL-3.0-only" From d4bc39153adea498c25da4475f00c7b03e6b32e5 Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Sat, 5 Apr 2025 23:01:43 -0700 Subject: [PATCH 11/38] bump to 2.6.2a0 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 83c6f77..57ba2e1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "meshtastic" -version = "2.6.1" +version = "2.6.2a0" description = "Python API & client shell for talking to Meshtastic devices" authors = ["Meshtastic Developers "] license = "GPL-3.0-only" From 2e73fe310c61d25cf00cd80f79f1a56353924040 Mon Sep 17 00:00:00 2001 From: Derek Nicol <1420397+derekn@users.noreply.github.com> Date: Mon, 14 Apr 2025 13:22:46 -0500 Subject: [PATCH 12/38] fixing tcp_interface 100% cpu usage bug (#709) --- meshtastic/tcp_interface.py | 61 ++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/meshtastic/tcp_interface.py b/meshtastic/tcp_interface.py index 66ac1f2..7f5b700 100644 --- a/meshtastic/tcp_interface.py +++ b/meshtastic/tcp_interface.py @@ -1,9 +1,11 @@ """TCPInterface class for interfacing with http endpoint """ # pylint: disable=R0917 +import contextlib import logging import socket -from typing import Optional, cast +import time +from typing import Optional from meshtastic.stream_interface import StreamInterface @@ -35,52 +37,63 @@ class TCPInterface(StreamInterface): self.socket: Optional[socket.socket] = None if connectNow: - logging.debug(f"Connecting to {hostname}") # type: ignore[str-bytes-safe] - server_address: tuple[str, int] = (hostname, portNumber) - sock: Optional[socket.socket] = socket.create_connection(server_address) - self.socket = sock + self.myConnect() else: self.socket = None - StreamInterface.__init__( - self, debugOut=debugOut, noProto=noProto, connectNow=connectNow, noNodes=noNodes - ) + super().__init__(debugOut=debugOut, noProto=noProto, connectNow=connectNow, noNodes=noNodes) def _socket_shutdown(self) -> None: """Shutdown the socket. Note: Broke out this line so the exception could be unit tested. """ - if self.socket: #mian: please check that this should be "if self.socket:" - cast(socket.socket, self.socket).shutdown(socket.SHUT_RDWR) + if self.socket is not None: + self.socket.shutdown(socket.SHUT_RDWR) def myConnect(self) -> None: """Connect to socket""" - server_address: tuple[str, int] = (self.hostname, self.portNumber) - sock: Optional[socket.socket] = socket.create_connection(server_address) - self.socket = sock + logging.debug(f"Connecting to {self.hostname}") # type: ignore[str-bytes-safe] + server_address = (self.hostname, self.portNumber) + self.socket = socket.create_connection(server_address) def close(self) -> None: """Close a connection to the device""" logging.debug("Closing TCP stream") - StreamInterface.close(self) + super().close() # Sometimes the socket read might be blocked in the reader thread. # Therefore we force the shutdown by closing the socket here - self._wantExit: bool = True - if not self.socket is None: - try: + self._wantExit = True + if self.socket is not None: + with contextlib.suppress(Exception): # Ignore errors in shutdown, because we might have a race with the server self._socket_shutdown() - except: - pass # Ignore errors in shutdown, because we might have a race with the server self.socket.close() + self.socket = None + def _writeBytes(self, b: bytes) -> None: """Write an array of bytes to our stream and flush""" - if self.socket: + if self.socket is not None: self.socket.send(b) def _readBytes(self, length) -> Optional[bytes]: """Read an array of bytes from our stream""" - if self.socket: - return self.socket.recv(length) - else: - return None + if self.socket is not None: + data = self.socket.recv(length) + # empty byte indicates a disconnected socket, + # we need to handle it to avoid an infinite loop reading from null socket + if data == b'': + logging.debug("dead socket, re-connecting") + # cleanup and reconnect socket without breaking reader thread + with contextlib.suppress(Exception): + self._socket_shutdown() + self.socket.close() + self.socket = None + time.sleep(1) + self.myConnect() + self._startConfig() + return None + return data + + # no socket, break reader thread + self._wantExit = True + return None From dfc9547ffc48f641f64de1585e0b24868dfedf08 Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Tue, 15 Apr 2025 16:03:33 -0500 Subject: [PATCH 13/38] Revert "Work around RTS/DTR serial reset issues on Windows" --- meshtastic/serial_interface.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/meshtastic/serial_interface.py b/meshtastic/serial_interface.py index 7133b39..39f2648 100644 --- a/meshtastic/serial_interface.py +++ b/meshtastic/serial_interface.py @@ -46,12 +46,7 @@ class SerialInterface(StreamInterface): logging.debug(f"Connecting to {self.devPath}") - # set port to None to prevent automatically opening - self.stream = serial.Serial( - port=None, baudrate=115200, exclusive=True, timeout=0.5, write_timeout=0 - ) - - # first we need to clear HUPCL (UNIX) or clear RTS/DTR (Windows) so the device will not reboot based on RTS and/or DTR + # first we need to set the HUPCL so the device will not reboot based on RTS and/or DTR # see https://github.com/pyserial/pyserial/issues/124 if platform.system() != "Windows": with open(self.devPath, encoding="utf8") as f: @@ -60,14 +55,10 @@ class SerialInterface(StreamInterface): termios.tcsetattr(f, termios.TCSAFLUSH, attrs) f.close() time.sleep(0.1) - else: - self.stream.rts = 0 - self.stream.dtr = 0 - - # set proper port and open now that we've worked-around RTS/DTR issues - self.stream.port = self.devPath - self.stream.open() + self.stream = serial.Serial( + self.devPath, 115200, exclusive=True, timeout=0.5, write_timeout=0 + ) self.stream.flush() # type: ignore[attr-defined] time.sleep(0.1) From d456e4ce30995210342ffe831f65681cb3140e22 Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Wed, 23 Apr 2025 09:47:13 -0700 Subject: [PATCH 14/38] protobufs: v2.6.6 --- meshtastic/protobuf/config_pb2.py | 44 ++++++++++----------- meshtastic/protobuf/config_pb2.pyi | 20 +++++++--- meshtastic/protobuf/mesh_pb2.py | 16 ++++---- meshtastic/protobuf/mesh_pb2.pyi | 56 +++++++++++++++++++++++++++ meshtastic/protobuf/telemetry_pb2.pyi | 2 +- protobufs | 2 +- 6 files changed, 102 insertions(+), 38 deletions(-) diff --git a/meshtastic/protobuf/config_pb2.py b/meshtastic/protobuf/config_pb2.py index f54e9e5..13bc31c 100644 --- a/meshtastic/protobuf/config_pb2.py +++ b/meshtastic/protobuf/config_pb2.py @@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default() from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/config.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/device_ui.proto\"\xa3(\n\x06\x43onfig\x12:\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfigH\x00\x12>\n\x08position\x18\x02 \x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfigH\x00\x12\x38\n\x05power\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfigH\x00\x12<\n\x07network\x18\x04 \x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfigH\x00\x12<\n\x07\x64isplay\x18\x05 \x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfigH\x00\x12\x36\n\x04lora\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfigH\x00\x12@\n\tbluetooth\x18\x07 \x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfigH\x00\x12>\n\x08security\x18\x08 \x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfigH\x00\x12\x42\n\nsessionkey\x18\t \x01(\x0b\x32,.meshtastic.protobuf.Config.SessionkeyConfigH\x00\x12\x38\n\tdevice_ui\x18\n \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x1a\xc7\x05\n\x0c\x44\x65viceConfig\x12;\n\x04role\x18\x01 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x1a\n\x0eserial_enabled\x18\x02 \x01(\x08\x42\x02\x18\x01\x12\x13\n\x0b\x62utton_gpio\x18\x04 \x01(\r\x12\x13\n\x0b\x62uzzer_gpio\x18\x05 \x01(\r\x12R\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32\x38.meshtastic.protobuf.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\x16\n\nis_managed\x18\t \x01(\x08\x42\x02\x18\x01\x12\x1c\n\x14\x64isable_triple_click\x18\n \x01(\x08\x12\r\n\x05tzdef\x18\x0b \x01(\t\x12\x1e\n\x16led_heartbeat_disabled\x18\x0c \x01(\x08\"\xbf\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\x15\n\rROUTER_CLIENT\x10\x03\x1a\x02\x08\x01\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\x12\x0f\n\x0bROUTER_LATE\x10\x0b\"s\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\x12\x08\n\x04NONE\x10\x04\x12\x16\n\x12\x43ORE_PORTNUMS_ONLY\x10\x05\x1a\x9a\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\x44\n\x08gps_mode\x18\r \x01(\x0e\x32\x32.meshtastic.protobuf.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\x84\x02\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\x12\x18\n\x10powermon_enables\x18 \x01(\x04\x1a\xe1\x03\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\x12K\n\x0c\x61\x64\x64ress_mode\x18\x07 \x01(\x0e\x32\x35.meshtastic.protobuf.Config.NetworkConfig.AddressMode\x12I\n\x0bipv4_config\x18\x08 \x01(\x0b\x32\x34.meshtastic.protobuf.Config.NetworkConfig.IpV4Config\x12\x16\n\x0ersyslog_server\x18\t \x01(\t\x12\x19\n\x11\x65nabled_protocols\x18\n \x01(\r\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\"4\n\rProtocolFlags\x12\x10\n\x0cNO_BROADCAST\x10\x00\x12\x11\n\rUDP_BROADCAST\x10\x01\x1a\x91\x08\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01 \x01(\r\x12Q\n\ngps_format\x18\x02 \x01(\x0e\x32=.meshtastic.protobuf.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\x45\n\x05units\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.Config.DisplayConfig.DisplayUnits\x12@\n\x04oled\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.DisplayConfig.OledType\x12J\n\x0b\x64isplaymode\x18\x08 \x01(\x0e\x32\x35.meshtastic.protobuf.Config.DisplayConfig.DisplayMode\x12\x14\n\x0cheading_bold\x18\t \x01(\x08\x12\x1d\n\x15wake_on_tap_or_motion\x18\n \x01(\x08\x12Y\n\x13\x63ompass_orientation\x18\x0b \x01(\x0e\x32<.meshtastic.protobuf.Config.DisplayConfig.CompassOrientation\x12\x15\n\ruse_12h_clock\x18\x0c \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\"\xba\x01\n\x12\x43ompassOrientation\x12\r\n\tDEGREES_0\x10\x00\x12\x0e\n\nDEGREES_90\x10\x01\x12\x0f\n\x0b\x44\x45GREES_180\x10\x02\x12\x0f\n\x0b\x44\x45GREES_270\x10\x03\x12\x16\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x12\x17\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x12\x18\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x12\x18\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\xaf\x07\n\nLoRaConfig\x12\x12\n\nuse_preset\x18\x01 \x01(\x08\x12H\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32\x32.meshtastic.protobuf.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\x41\n\x06region\x18\x07 \x01(\x0e\x32\x31.meshtastic.protobuf.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\x0fpa_fan_disabled\x18\x0f \x01(\x08\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x13\n\x0bignore_mqtt\x18h \x01(\x08\x12\x19\n\x11\x63onfig_ok_to_mqtt\x18i \x01(\x08\"\xf1\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\x12\n\n\x06PH_433\x10\x13\x12\n\n\x06PH_868\x10\x14\x12\n\n\x06PH_915\x10\x15\"\xa9\x01\n\x0bModemPreset\x12\r\n\tLONG_FAST\x10\x00\x12\r\n\tLONG_SLOW\x10\x01\x12\x16\n\x0eVERY_LONG_SLOW\x10\x02\x1a\x02\x08\x01\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\x12\x0f\n\x0bSHORT_TURBO\x10\x08\x1a\xb6\x01\n\x0f\x42luetoothConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x45\n\x04mode\x18\x02 \x01(\x0e\x32\x37.meshtastic.protobuf.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\x1a\xb6\x01\n\x0eSecurityConfig\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\x12\x13\n\x0bprivate_key\x18\x02 \x01(\x0c\x12\x11\n\tadmin_key\x18\x03 \x03(\x0c\x12\x12\n\nis_managed\x18\x04 \x01(\x08\x12\x16\n\x0eserial_enabled\x18\x05 \x01(\x08\x12\x1d\n\x15\x64\x65\x62ug_log_api_enabled\x18\x06 \x01(\x08\x12\x1d\n\x15\x61\x64min_channel_enabled\x18\x08 \x01(\x08\x1a\x12\n\x10SessionkeyConfigB\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 meshtastic/protobuf/config.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/device_ui.proto\"\xbb(\n\x06\x43onfig\x12:\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfigH\x00\x12>\n\x08position\x18\x02 \x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfigH\x00\x12\x38\n\x05power\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfigH\x00\x12<\n\x07network\x18\x04 \x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfigH\x00\x12<\n\x07\x64isplay\x18\x05 \x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfigH\x00\x12\x36\n\x04lora\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfigH\x00\x12@\n\tbluetooth\x18\x07 \x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfigH\x00\x12>\n\x08security\x18\x08 \x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfigH\x00\x12\x42\n\nsessionkey\x18\t \x01(\x0b\x32,.meshtastic.protobuf.Config.SessionkeyConfigH\x00\x12\x38\n\tdevice_ui\x18\n \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x1a\xc7\x05\n\x0c\x44\x65viceConfig\x12;\n\x04role\x18\x01 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x1a\n\x0eserial_enabled\x18\x02 \x01(\x08\x42\x02\x18\x01\x12\x13\n\x0b\x62utton_gpio\x18\x04 \x01(\r\x12\x13\n\x0b\x62uzzer_gpio\x18\x05 \x01(\r\x12R\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32\x38.meshtastic.protobuf.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\x16\n\nis_managed\x18\t \x01(\x08\x42\x02\x18\x01\x12\x1c\n\x14\x64isable_triple_click\x18\n \x01(\x08\x12\r\n\x05tzdef\x18\x0b \x01(\t\x12\x1e\n\x16led_heartbeat_disabled\x18\x0c \x01(\x08\"\xbf\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\x15\n\rROUTER_CLIENT\x10\x03\x1a\x02\x08\x01\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\x12\x0f\n\x0bROUTER_LATE\x10\x0b\"s\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\x12\x08\n\x04NONE\x10\x04\x12\x16\n\x12\x43ORE_PORTNUMS_ONLY\x10\x05\x1a\x9a\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\x44\n\x08gps_mode\x18\r \x01(\x0e\x32\x32.meshtastic.protobuf.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\x84\x02\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\x12\x18\n\x10powermon_enables\x18 \x01(\x04\x1a\xe1\x03\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\x12K\n\x0c\x61\x64\x64ress_mode\x18\x07 \x01(\x0e\x32\x35.meshtastic.protobuf.Config.NetworkConfig.AddressMode\x12I\n\x0bipv4_config\x18\x08 \x01(\x0b\x32\x34.meshtastic.protobuf.Config.NetworkConfig.IpV4Config\x12\x16\n\x0ersyslog_server\x18\t \x01(\t\x12\x19\n\x11\x65nabled_protocols\x18\n \x01(\r\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\"4\n\rProtocolFlags\x12\x10\n\x0cNO_BROADCAST\x10\x00\x12\x11\n\rUDP_BROADCAST\x10\x01\x1a\xa9\x08\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01 \x01(\r\x12Q\n\ngps_format\x18\x02 \x01(\x0e\x32=.meshtastic.protobuf.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\x45\n\x05units\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.Config.DisplayConfig.DisplayUnits\x12@\n\x04oled\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.DisplayConfig.OledType\x12J\n\x0b\x64isplaymode\x18\x08 \x01(\x0e\x32\x35.meshtastic.protobuf.Config.DisplayConfig.DisplayMode\x12\x14\n\x0cheading_bold\x18\t \x01(\x08\x12\x1d\n\x15wake_on_tap_or_motion\x18\n \x01(\x08\x12Y\n\x13\x63ompass_orientation\x18\x0b \x01(\x0e\x32<.meshtastic.protobuf.Config.DisplayConfig.CompassOrientation\x12\x15\n\ruse_12h_clock\x18\x0c \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\"e\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\x12\x16\n\x12OLED_SH1107_128_64\x10\x04\"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\"\xba\x01\n\x12\x43ompassOrientation\x12\r\n\tDEGREES_0\x10\x00\x12\x0e\n\nDEGREES_90\x10\x01\x12\x0f\n\x0b\x44\x45GREES_180\x10\x02\x12\x0f\n\x0b\x44\x45GREES_270\x10\x03\x12\x16\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x12\x17\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x12\x18\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x12\x18\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\xaf\x07\n\nLoRaConfig\x12\x12\n\nuse_preset\x18\x01 \x01(\x08\x12H\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32\x32.meshtastic.protobuf.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\x41\n\x06region\x18\x07 \x01(\x0e\x32\x31.meshtastic.protobuf.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\x0fpa_fan_disabled\x18\x0f \x01(\x08\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x13\n\x0bignore_mqtt\x18h \x01(\x08\x12\x19\n\x11\x63onfig_ok_to_mqtt\x18i \x01(\x08\"\xf1\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\x12\n\n\x06PH_433\x10\x13\x12\n\n\x06PH_868\x10\x14\x12\n\n\x06PH_915\x10\x15\"\xa9\x01\n\x0bModemPreset\x12\r\n\tLONG_FAST\x10\x00\x12\r\n\tLONG_SLOW\x10\x01\x12\x16\n\x0eVERY_LONG_SLOW\x10\x02\x1a\x02\x08\x01\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\x12\x0f\n\x0bSHORT_TURBO\x10\x08\x1a\xb6\x01\n\x0f\x42luetoothConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x45\n\x04mode\x18\x02 \x01(\x0e\x32\x37.meshtastic.protobuf.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\x1a\xb6\x01\n\x0eSecurityConfig\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\x12\x13\n\x0bprivate_key\x18\x02 \x01(\x0c\x12\x11\n\tadmin_key\x18\x03 \x03(\x0c\x12\x12\n\nis_managed\x18\x04 \x01(\x08\x12\x16\n\x0eserial_enabled\x18\x05 \x01(\x08\x12\x1d\n\x15\x64\x65\x62ug_log_api_enabled\x18\x06 \x01(\x08\x12\x1d\n\x15\x61\x64min_channel_enabled\x18\x08 \x01(\x08\x1a\x12\n\x10SessionkeyConfigB\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') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -35,7 +35,7 @@ if _descriptor._USE_C_DESCRIPTORS == False: _CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._options = None _CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._serialized_options = b'\010\001' _globals['_CONFIG']._serialized_start=95 - _globals['_CONFIG']._serialized_end=5250 + _globals['_CONFIG']._serialized_end=5274 _globals['_CONFIG_DEVICECONFIG']._serialized_start=724 _globals['_CONFIG_DEVICECONFIG']._serialized_end=1435 _globals['_CONFIG_DEVICECONFIG_ROLE']._serialized_start=1127 @@ -59,29 +59,29 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_start=2799 _globals['_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_end=2851 _globals['_CONFIG_DISPLAYCONFIG']._serialized_start=2854 - _globals['_CONFIG_DISPLAYCONFIG']._serialized_end=3895 + _globals['_CONFIG_DISPLAYCONFIG']._serialized_end=3919 _globals['_CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT']._serialized_start=3441 _globals['_CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT']._serialized_end=3518 _globals['_CONFIG_DISPLAYCONFIG_DISPLAYUNITS']._serialized_start=3520 _globals['_CONFIG_DISPLAYCONFIG_DISPLAYUNITS']._serialized_end=3560 _globals['_CONFIG_DISPLAYCONFIG_OLEDTYPE']._serialized_start=3562 - _globals['_CONFIG_DISPLAYCONFIG_OLEDTYPE']._serialized_end=3639 - _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_start=3641 - _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_end=3706 - _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=3709 - _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=3895 - _globals['_CONFIG_LORACONFIG']._serialized_start=3898 - _globals['_CONFIG_LORACONFIG']._serialized_end=4841 - _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_start=4428 - _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_end=4669 - _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_start=4672 - _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_end=4841 - _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_start=4844 - _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_end=5026 - _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=4970 - _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=5026 - _globals['_CONFIG_SECURITYCONFIG']._serialized_start=5029 - _globals['_CONFIG_SECURITYCONFIG']._serialized_end=5211 - _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_start=5213 - _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_end=5231 + _globals['_CONFIG_DISPLAYCONFIG_OLEDTYPE']._serialized_end=3663 + _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_start=3665 + _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_end=3730 + _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=3733 + _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=3919 + _globals['_CONFIG_LORACONFIG']._serialized_start=3922 + _globals['_CONFIG_LORACONFIG']._serialized_end=4865 + _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_start=4452 + _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_end=4693 + _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_start=4696 + _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_end=4865 + _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_start=4868 + _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_end=5050 + _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=4994 + _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=5050 + _globals['_CONFIG_SECURITYCONFIG']._serialized_start=5053 + _globals['_CONFIG_SECURITYCONFIG']._serialized_end=5235 + _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_start=5237 + _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_end=5255 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index de56127..8a32e8f 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -956,20 +956,24 @@ class Config(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor OLED_AUTO: Config.DisplayConfig._OledType.ValueType # 0 """ - Default / Auto + Default / Autodetect """ OLED_SSD1306: Config.DisplayConfig._OledType.ValueType # 1 """ - Default / Auto + Default / Autodetect """ OLED_SH1106: Config.DisplayConfig._OledType.ValueType # 2 """ - Default / Auto + Default / Autodetect """ OLED_SH1107: Config.DisplayConfig._OledType.ValueType # 3 """ Can not be auto detected but set by proto. Used for 128x128 screens """ + OLED_SH1107_128_64: Config.DisplayConfig._OledType.ValueType # 4 + """ + Can not be auto detected but set by proto. Used for 128x64 screens + """ class OledType(_OledType, metaclass=_OledTypeEnumTypeWrapper): """ @@ -978,20 +982,24 @@ class Config(google.protobuf.message.Message): OLED_AUTO: Config.DisplayConfig.OledType.ValueType # 0 """ - Default / Auto + Default / Autodetect """ OLED_SSD1306: Config.DisplayConfig.OledType.ValueType # 1 """ - Default / Auto + Default / Autodetect """ OLED_SH1106: Config.DisplayConfig.OledType.ValueType # 2 """ - Default / Auto + Default / Autodetect """ OLED_SH1107: Config.DisplayConfig.OledType.ValueType # 3 """ Can not be auto detected but set by proto. Used for 128x128 screens """ + OLED_SH1107_128_64: Config.DisplayConfig.OledType.ValueType # 4 + """ + Can not be auto detected but set by proto. Used for 128x64 screens + """ class _DisplayMode: ValueType = typing.NewType("ValueType", builtins.int) diff --git a/meshtastic/protobuf/mesh_pb2.py b/meshtastic/protobuf/mesh_pb2.py index 113a015..e1a81a9 100644 --- a/meshtastic/protobuf/mesh_pb2.py +++ b/meshtastic/protobuf/mesh_pb2.py @@ -20,7 +20,7 @@ from meshtastic.protobuf import xmodem_pb2 as meshtastic_dot_protobuf_dot_xmodem from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/mesh.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/xmodem.proto\x1a#meshtastic/protobuf/device_ui.proto\"\x99\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 \x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\x12@\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\'.meshtastic.protobuf.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t \x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\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\x19\n\x0cground_speed\x18\x0f \x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 \x01(\rH\x06\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\xea\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\x34\n\x08hw_model\x18\x05 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12;\n\x04role\x18\x07 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08 \x01(\x0c\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 \x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 \x03(\x05\"\xfd\x03\n\x07Routing\x12<\n\rroute_request\x18\x01 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0broute_reply\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\"\xb0\x02\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!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%B\t\n\x07variant\"\xd4\x01\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.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\x12\x15\n\x08\x62itfield\x18\t \x01(\rH\x00\x88\x01\x01\x42\x0b\n\t_bitfield\"\xbc\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x17\n\nlatitude_i\x18\x02 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x03 \x01(\x0fH\x01\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_i\"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\"\xb6\x05\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\x19.meshtastic.protobuf.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(.meshtastic.protobuf.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c \x01(\x05\x12<\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\'.meshtastic.protobuf.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\x12\x12\n\npublic_key\x18\x10 \x01(\x0c\x12\x15\n\rpki_encrypted\x18\x11 \x01(\x08\x12\x10\n\x08next_hop\x18\x12 \x01(\r\x12\x12\n\nrelay_node\x18\x13 \x01(\r\x12\x10\n\x08tx_after\x18\x14 \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\x0c\n\x08RESPONSE\x10P\x12\x08\n\x04HIGH\x10\x64\x12\t\n\x05\x41LERT\x10n\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\"\xc0\x02\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\'\n\x04user\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12/\n\x08position\x18\x03 \x01(\x0b\x32\x1d.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x42\x0c\n\n_hops_away\"t\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\x12\x11\n\tdevice_id\x18\x0c \x01(\x0c\x12\x0f\n\x07pio_env\x18\r \x01(\t\"\xc9\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\x33\n\x05level\x18\x04 \x01(\x0e\x32$.meshtastic.protobuf.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\"\xf7\x06\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12\x31\n\x06packet\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x32\n\x07my_info\x18\x03 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfoH\x00\x12\x32\n\tnode_info\x18\x04 \x01(\x0b\x32\x1d.meshtastic.protobuf.NodeInfoH\x00\x12-\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12\x34\n\nlog_record\x18\x06 \x01(\x0b\x32\x1e.meshtastic.protobuf.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 \x01(\x08H\x00\x12\x39\n\x0cmoduleConfig\x18\t \x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12/\n\x07\x63hannel\x18\n \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x37\n\x0bqueueStatus\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.QueueStatusH\x00\x12\x33\n\x0cxmodemPacket\x18\x0c \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12\x37\n\x08metadata\x18\r \x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12M\n\x16mqttClientProxyMessage\x18\x0e \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x31\n\x08\x66ileInfo\x18\x0f \x01(\x0b\x32\x1d.meshtastic.protobuf.FileInfoH\x00\x12\x45\n\x12\x63lientNotification\x18\x10 \x01(\x0b\x32\'.meshtastic.protobuf.ClientNotificationH\x00\x12=\n\x0e\x64\x65viceuiConfig\x18\x11 \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x42\x11\n\x0fpayload_variant\"\x8c\x01\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x33\n\x05level\x18\x03 \x01(\x0e\x32$.meshtastic.protobuf.LogRecord.Level\x12\x0f\n\x07message\x18\x04 \x01(\tB\x0b\n\t_reply_id\"1\n\x08\x46ileInfo\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\xb8\x02\n\x07ToRadio\x12\x31\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 \x01(\x08H\x00\x12\x33\n\x0cxmodemPacket\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12M\n\x16mqttClientProxyMessage\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x33\n\theartbeat\x18\x07 \x01(\x0b\x32\x1e.meshtastic.protobuf.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"I\n\nCompressed\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x90\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\x30\n\tneighbors\x18\x04 \x03(\x0b\x32\x1d.meshtastic.protobuf.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\"\xe9\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-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12\x34\n\x08hw_model\x18\t \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n \x01(\x08\x12\x0e\n\x06hasPKC\x18\x0b \x01(\x08\x12\x18\n\x10\x65xcluded_modules\x18\x0c \x01(\r\"\x0b\n\tHeartbeat\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"e\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x02 \x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x03 \x01(\r\x12\x15\n\rpayload_chunk\x18\x04 \x01(\x0c\"\x1f\n\rresend_chunks\x12\x0e\n\x06\x63hunks\x18\x01 \x03(\r\"\xb3\x01\n\x16\x43hunkedPayloadResponse\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x1a\n\x10request_transfer\x18\x02 \x01(\x08H\x00\x12\x19\n\x0f\x61\x63\x63\x65pt_transfer\x18\x03 \x01(\x08H\x00\x12;\n\rresend_chunks\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.resend_chunksH\x00\x42\x11\n\x0fpayload_variant*\xe7\r\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\x0b\n\x07WIPHONE\x10\x14\x12\x0e\n\nWIO_WM1110\x10\x15\x12\x0b\n\x07RAK2560\x10\x16\x12\x13\n\x0fHELTEC_HRU_3601\x10\x17\x12\x1a\n\x16HELTEC_WIRELESS_BRIDGE\x10\x18\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\x0b\n\x07UNPHONE\x10;\x12\x0c\n\x08TD_LORAC\x10<\x12\x13\n\x0f\x43\x44\x45\x42YTE_EORA_S3\x10=\x12\x0f\n\x0bTWC_MESH_V4\x10>\x12\x16\n\x12NRF52_PROMICRO_DIY\x10?\x12\x1f\n\x1bRADIOMASTER_900_BANDIT_NANO\x10@\x12\x1c\n\x18HELTEC_CAPSULE_SENSOR_V3\x10\x41\x12\x1d\n\x19HELTEC_VISION_MASTER_T190\x10\x42\x12\x1d\n\x19HELTEC_VISION_MASTER_E213\x10\x43\x12\x1d\n\x19HELTEC_VISION_MASTER_E290\x10\x44\x12\x19\n\x15HELTEC_MESH_NODE_T114\x10\x45\x12\x16\n\x12SENSECAP_INDICATOR\x10\x46\x12\x13\n\x0fTRACKER_T1000_E\x10G\x12\x0b\n\x07RAK3172\x10H\x12\n\n\x06WIO_E5\x10I\x12\x1a\n\x16RADIOMASTER_900_BANDIT\x10J\x12\x13\n\x0fME25LS01_4Y10TD\x10K\x12\x18\n\x14RP2040_FEATHER_RFM95\x10L\x12\x15\n\x11M5STACK_COREBASIC\x10M\x12\x11\n\rM5STACK_CORE2\x10N\x12\r\n\tRPI_PICO2\x10O\x12\x12\n\x0eM5STACK_CORES3\x10P\x12\x11\n\rSEEED_XIAO_S3\x10Q\x12\x0b\n\x07MS24SF1\x10R\x12\x0c\n\x08TLORA_C6\x10S\x12\x0f\n\x0bWISMESH_TAP\x10T\x12\r\n\tROUTASTIC\x10U\x12\x0c\n\x08MESH_TAB\x10V\x12\x0c\n\x08MESHLINK\x10W\x12\x12\n\x0eXIAO_NRF52_KIT\x10X\x12\x10\n\x0cTHINKNODE_M1\x10Y\x12\x10\n\x0cTHINKNODE_M2\x10Z\x12\x0f\n\x0bT_ETH_ELITE\x10[\x12\x15\n\x11HELTEC_SENSOR_HUB\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\xe9\x01*\xb4\x02\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\x12 \n\x1c\x46LASH_CORRUPTION_RECOVERABLE\x10\x0c\x12\"\n\x1e\x46LASH_CORRUPTION_UNRECOVERABLE\x10\r*\xd3\x02\n\x0f\x45xcludedModules\x12\x11\n\rEXCLUDED_NONE\x10\x00\x12\x0f\n\x0bMQTT_CONFIG\x10\x01\x12\x11\n\rSERIAL_CONFIG\x10\x02\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x04\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x08\x12\x14\n\x10RANGETEST_CONFIG\x10\x10\x12\x14\n\x10TELEMETRY_CONFIG\x10 \x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10@\x12\x11\n\x0c\x41UDIO_CONFIG\x10\x80\x01\x12\x1a\n\x15REMOTEHARDWARE_CONFIG\x10\x80\x02\x12\x18\n\x13NEIGHBORINFO_CONFIG\x10\x80\x04\x12\x1b\n\x16\x41MBIENTLIGHTING_CONFIG\x10\x80\x08\x12\x1b\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x80\x10\x12\x16\n\x11PAXCOUNTER_CONFIG\x10\x80 B_\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\x1emeshtastic/protobuf/mesh.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/xmodem.proto\x1a#meshtastic/protobuf/device_ui.proto\"\x99\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 \x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\x12@\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\'.meshtastic.protobuf.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t \x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\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\x19\n\x0cground_speed\x18\x0f \x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 \x01(\rH\x06\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\xea\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\x34\n\x08hw_model\x18\x05 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12;\n\x04role\x18\x07 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08 \x01(\x0c\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 \x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 \x03(\x05\"\xfd\x03\n\x07Routing\x12<\n\rroute_request\x18\x01 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0broute_reply\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\"\xb0\x02\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!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%B\t\n\x07variant\"\xd4\x01\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.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\x12\x15\n\x08\x62itfield\x18\t \x01(\rH\x00\x88\x01\x01\x42\x0b\n\t_bitfield\"\xbc\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x17\n\nlatitude_i\x18\x02 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x03 \x01(\x0fH\x01\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_i\"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\"\xb6\x05\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\x19.meshtastic.protobuf.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(.meshtastic.protobuf.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c \x01(\x05\x12<\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\'.meshtastic.protobuf.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\x12\x12\n\npublic_key\x18\x10 \x01(\x0c\x12\x15\n\rpki_encrypted\x18\x11 \x01(\x08\x12\x10\n\x08next_hop\x18\x12 \x01(\r\x12\x12\n\nrelay_node\x18\x13 \x01(\r\x12\x10\n\x08tx_after\x18\x14 \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\x0c\n\x08RESPONSE\x10P\x12\x08\n\x04HIGH\x10\x64\x12\t\n\x05\x41LERT\x10n\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\"\xc0\x02\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\'\n\x04user\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12/\n\x08position\x18\x03 \x01(\x0b\x32\x1d.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x42\x0c\n\n_hops_away\"t\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\x12\x11\n\tdevice_id\x18\x0c \x01(\x0c\x12\x0f\n\x07pio_env\x18\r \x01(\t\"\xc9\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\x33\n\x05level\x18\x04 \x01(\x0e\x32$.meshtastic.protobuf.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\"\xf7\x06\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12\x31\n\x06packet\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x32\n\x07my_info\x18\x03 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfoH\x00\x12\x32\n\tnode_info\x18\x04 \x01(\x0b\x32\x1d.meshtastic.protobuf.NodeInfoH\x00\x12-\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12\x34\n\nlog_record\x18\x06 \x01(\x0b\x32\x1e.meshtastic.protobuf.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 \x01(\x08H\x00\x12\x39\n\x0cmoduleConfig\x18\t \x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12/\n\x07\x63hannel\x18\n \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x37\n\x0bqueueStatus\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.QueueStatusH\x00\x12\x33\n\x0cxmodemPacket\x18\x0c \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12\x37\n\x08metadata\x18\r \x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12M\n\x16mqttClientProxyMessage\x18\x0e \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x31\n\x08\x66ileInfo\x18\x0f \x01(\x0b\x32\x1d.meshtastic.protobuf.FileInfoH\x00\x12\x45\n\x12\x63lientNotification\x18\x10 \x01(\x0b\x32\'.meshtastic.protobuf.ClientNotificationH\x00\x12=\n\x0e\x64\x65viceuiConfig\x18\x11 \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x42\x11\n\x0fpayload_variant\"\x8c\x01\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x33\n\x05level\x18\x03 \x01(\x0e\x32$.meshtastic.protobuf.LogRecord.Level\x12\x0f\n\x07message\x18\x04 \x01(\tB\x0b\n\t_reply_id\"1\n\x08\x46ileInfo\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\xb8\x02\n\x07ToRadio\x12\x31\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 \x01(\x08H\x00\x12\x33\n\x0cxmodemPacket\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12M\n\x16mqttClientProxyMessage\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x33\n\theartbeat\x18\x07 \x01(\x0b\x32\x1e.meshtastic.protobuf.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"I\n\nCompressed\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x90\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\x30\n\tneighbors\x18\x04 \x03(\x0b\x32\x1d.meshtastic.protobuf.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\"\xe9\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-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12\x34\n\x08hw_model\x18\t \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n \x01(\x08\x12\x0e\n\x06hasPKC\x18\x0b \x01(\x08\x12\x18\n\x10\x65xcluded_modules\x18\x0c \x01(\r\"\x0b\n\tHeartbeat\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"e\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x02 \x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x03 \x01(\r\x12\x15\n\rpayload_chunk\x18\x04 \x01(\x0c\"\x1f\n\rresend_chunks\x12\x0e\n\x06\x63hunks\x18\x01 \x03(\r\"\xb3\x01\n\x16\x43hunkedPayloadResponse\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x1a\n\x10request_transfer\x18\x02 \x01(\x08H\x00\x12\x19\n\x0f\x61\x63\x63\x65pt_transfer\x18\x03 \x01(\x08H\x00\x12;\n\rresend_chunks\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.resend_chunksH\x00\x42\x11\n\x0fpayload_variant*\xda\x0e\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\x0b\n\x07WIPHONE\x10\x14\x12\x0e\n\nWIO_WM1110\x10\x15\x12\x0b\n\x07RAK2560\x10\x16\x12\x13\n\x0fHELTEC_HRU_3601\x10\x17\x12\x1a\n\x16HELTEC_WIRELESS_BRIDGE\x10\x18\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\x0b\n\x07UNPHONE\x10;\x12\x0c\n\x08TD_LORAC\x10<\x12\x13\n\x0f\x43\x44\x45\x42YTE_EORA_S3\x10=\x12\x0f\n\x0bTWC_MESH_V4\x10>\x12\x16\n\x12NRF52_PROMICRO_DIY\x10?\x12\x1f\n\x1bRADIOMASTER_900_BANDIT_NANO\x10@\x12\x1c\n\x18HELTEC_CAPSULE_SENSOR_V3\x10\x41\x12\x1d\n\x19HELTEC_VISION_MASTER_T190\x10\x42\x12\x1d\n\x19HELTEC_VISION_MASTER_E213\x10\x43\x12\x1d\n\x19HELTEC_VISION_MASTER_E290\x10\x44\x12\x19\n\x15HELTEC_MESH_NODE_T114\x10\x45\x12\x16\n\x12SENSECAP_INDICATOR\x10\x46\x12\x13\n\x0fTRACKER_T1000_E\x10G\x12\x0b\n\x07RAK3172\x10H\x12\n\n\x06WIO_E5\x10I\x12\x1a\n\x16RADIOMASTER_900_BANDIT\x10J\x12\x13\n\x0fME25LS01_4Y10TD\x10K\x12\x18\n\x14RP2040_FEATHER_RFM95\x10L\x12\x15\n\x11M5STACK_COREBASIC\x10M\x12\x11\n\rM5STACK_CORE2\x10N\x12\r\n\tRPI_PICO2\x10O\x12\x12\n\x0eM5STACK_CORES3\x10P\x12\x11\n\rSEEED_XIAO_S3\x10Q\x12\x0b\n\x07MS24SF1\x10R\x12\x0c\n\x08TLORA_C6\x10S\x12\x0f\n\x0bWISMESH_TAP\x10T\x12\r\n\tROUTASTIC\x10U\x12\x0c\n\x08MESH_TAB\x10V\x12\x0c\n\x08MESHLINK\x10W\x12\x12\n\x0eXIAO_NRF52_KIT\x10X\x12\x10\n\x0cTHINKNODE_M1\x10Y\x12\x10\n\x0cTHINKNODE_M2\x10Z\x12\x0f\n\x0bT_ETH_ELITE\x10[\x12\x15\n\x11HELTEC_SENSOR_HUB\x10\\\x12\x1a\n\x16RESERVED_FRIED_CHICKEN\x10]\x12\x16\n\x12HELTEC_MESH_POCKET\x10^\x12\x14\n\x10SEEED_SOLAR_NODE\x10_\x12\x18\n\x14NOMADSTAR_METEOR_PRO\x10`\x12\r\n\tCROWPANEL\x10\x61\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\xe9\x01*\xb4\x02\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\x12 \n\x1c\x46LASH_CORRUPTION_RECOVERABLE\x10\x0c\x12\"\n\x1e\x46LASH_CORRUPTION_UNRECOVERABLE\x10\r*\x80\x03\n\x0f\x45xcludedModules\x12\x11\n\rEXCLUDED_NONE\x10\x00\x12\x0f\n\x0bMQTT_CONFIG\x10\x01\x12\x11\n\rSERIAL_CONFIG\x10\x02\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x04\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x08\x12\x14\n\x10RANGETEST_CONFIG\x10\x10\x12\x14\n\x10TELEMETRY_CONFIG\x10 \x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10@\x12\x11\n\x0c\x41UDIO_CONFIG\x10\x80\x01\x12\x1a\n\x15REMOTEHARDWARE_CONFIG\x10\x80\x02\x12\x18\n\x13NEIGHBORINFO_CONFIG\x10\x80\x04\x12\x1b\n\x16\x41MBIENTLIGHTING_CONFIG\x10\x80\x08\x12\x1b\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x80\x10\x12\x16\n\x11PAXCOUNTER_CONFIG\x10\x80 \x12\x15\n\x10\x42LUETOOTH_CONFIG\x10\x80@\x12\x14\n\x0eNETWORK_CONFIG\x10\x80\x80\x01\x42_\n\x13\x63om.geeksville.meshB\nMeshProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -33,13 +33,13 @@ if _descriptor._USE_C_DESCRIPTORS == False: _MESHPACKET.fields_by_name['delayed']._options = None _MESHPACKET.fields_by_name['delayed']._serialized_options = b'\030\001' _globals['_HARDWAREMODEL']._serialized_start=6529 - _globals['_HARDWAREMODEL']._serialized_end=8296 - _globals['_CONSTANTS']._serialized_start=8298 - _globals['_CONSTANTS']._serialized_end=8342 - _globals['_CRITICALERRORCODE']._serialized_start=8345 - _globals['_CRITICALERRORCODE']._serialized_end=8653 - _globals['_EXCLUDEDMODULES']._serialized_start=8656 - _globals['_EXCLUDEDMODULES']._serialized_end=8995 + _globals['_HARDWAREMODEL']._serialized_end=8411 + _globals['_CONSTANTS']._serialized_start=8413 + _globals['_CONSTANTS']._serialized_end=8457 + _globals['_CRITICALERRORCODE']._serialized_start=8460 + _globals['_CRITICALERRORCODE']._serialized_end=8768 + _globals['_EXCLUDEDMODULES']._serialized_start=8771 + _globals['_EXCLUDEDMODULES']._serialized_end=9155 _globals['_POSITION']._serialized_start=310 _globals['_POSITION']._serialized_end=1231 _globals['_POSITION_LOCSOURCE']._serialized_start=926 diff --git a/meshtastic/protobuf/mesh_pb2.pyi b/meshtastic/protobuf/mesh_pb2.pyi index 6d2b837..5e1f817 100644 --- a/meshtastic/protobuf/mesh_pb2.pyi +++ b/meshtastic/protobuf/mesh_pb2.pyi @@ -421,6 +421,26 @@ class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._ """ Heltec HRI-3621 industrial probe """ + RESERVED_FRIED_CHICKEN: _HardwareModel.ValueType # 93 + """ + Reserved Fried Chicken ID for future use + """ + HELTEC_MESH_POCKET: _HardwareModel.ValueType # 94 + """ + Heltec Magnetic Power Bank with Meshtastic compatible + """ + SEEED_SOLAR_NODE: _HardwareModel.ValueType # 95 + """ + Seeed Solar Node + """ + NOMADSTAR_METEOR_PRO: _HardwareModel.ValueType # 96 + """ + NomadStar Meteor Pro https://nomadstar.ch/ + """ + CROWPANEL: _HardwareModel.ValueType # 97 + """ + Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin + """ PRIVATE_HW: _HardwareModel.ValueType # 255 """ ------------------------------------------------------------------------------------------------------------------------------------------ @@ -825,6 +845,26 @@ HELTEC_SENSOR_HUB: HardwareModel.ValueType # 92 """ Heltec HRI-3621 industrial probe """ +RESERVED_FRIED_CHICKEN: HardwareModel.ValueType # 93 +""" +Reserved Fried Chicken ID for future use +""" +HELTEC_MESH_POCKET: HardwareModel.ValueType # 94 +""" +Heltec Magnetic Power Bank with Meshtastic compatible +""" +SEEED_SOLAR_NODE: HardwareModel.ValueType # 95 +""" +Seeed Solar Node +""" +NOMADSTAR_METEOR_PRO: HardwareModel.ValueType # 96 +""" +NomadStar Meteor Pro https://nomadstar.ch/ +""" +CROWPANEL: HardwareModel.ValueType # 97 +""" +Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin +""" PRIVATE_HW: HardwareModel.ValueType # 255 """ ------------------------------------------------------------------------------------------------------------------------------------------ @@ -1068,6 +1108,14 @@ class _ExcludedModulesEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper """ Paxcounter module """ + BLUETOOTH_CONFIG: _ExcludedModules.ValueType # 8192 + """ + Bluetooth config (not technically a module, but used to indicate bluetooth capabilities) + """ + NETWORK_CONFIG: _ExcludedModules.ValueType # 16384 + """ + Network config (not technically a module, but used to indicate network capabilities) + """ class ExcludedModules(_ExcludedModules, metaclass=_ExcludedModulesEnumTypeWrapper): """ @@ -1132,6 +1180,14 @@ PAXCOUNTER_CONFIG: ExcludedModules.ValueType # 4096 """ Paxcounter module """ +BLUETOOTH_CONFIG: ExcludedModules.ValueType # 8192 +""" +Bluetooth config (not technically a module, but used to indicate bluetooth capabilities) +""" +NETWORK_CONFIG: ExcludedModules.ValueType # 16384 +""" +Network config (not technically a module, but used to indicate network capabilities) +""" global___ExcludedModules = ExcludedModules @typing.final diff --git a/meshtastic/protobuf/telemetry_pb2.pyi b/meshtastic/protobuf/telemetry_pb2.pyi index dd91a1d..149b138 100644 --- a/meshtastic/protobuf/telemetry_pb2.pyi +++ b/meshtastic/protobuf/telemetry_pb2.pyi @@ -723,7 +723,7 @@ class AirQualityMetrics(google.protobuf.message.Message): """ co2: builtins.int """ - 10.0um Particle Count + CO2 concentration in ppm """ def __init__( self, diff --git a/protobufs b/protobufs index f00e96f..27fac39 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit f00e96f12da48abfa9a992f8b5546fd75a370250 +Subproject commit 27fac39141d99fe727a0a1824c5397409b1aea75 From c3973117c887c8f5854d6dd7ec63d76c35711ab0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 23 Apr 2025 16:49:59 +0000 Subject: [PATCH 15/38] bump version to 2.6.2 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 57ba2e1..55b3486 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "meshtastic" -version = "2.6.2a0" +version = "2.6.2" description = "Python API & client shell for talking to Meshtastic devices" authors = ["Meshtastic Developers "] license = "GPL-3.0-only" From 4668852b0b42ef9687d1bc0e2de00b519ef7d0ea Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Thu, 8 May 2025 15:22:27 -0700 Subject: [PATCH 16/38] Admin messages should be requesting acknowledgements --- meshtastic/node.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshtastic/node.py b/meshtastic/node.py index f8e81f6..53c91db 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -983,7 +983,7 @@ class Node: p, self.nodeNum, portNum=portnums_pb2.PortNum.ADMIN_APP, - wantAck=False, + wantAck=True, wantResponse=wantResponse, onResponse=onResponse, channelIndex=adminIndex, From 321a960c13276636d4a5e0cd19d89a10addbee8e Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Thu, 8 May 2025 15:26:47 -0700 Subject: [PATCH 17/38] protobufs: v2.6.7 --- meshtastic/protobuf/module_config_pb2.py | 44 +++++++++++------------ meshtastic/protobuf/module_config_pb2.pyi | 8 +++++ protobufs | 2 +- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/meshtastic/protobuf/module_config_pb2.py b/meshtastic/protobuf/module_config_pb2.py index cb01aed..12596fc 100644 --- a/meshtastic/protobuf/module_config_pb2.py +++ b/meshtastic/protobuf/module_config_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'meshtastic/protobuf/module_config.proto\x12\x13meshtastic.protobuf\"\xfa&\n\x0cModuleConfig\x12<\n\x04mqtt\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.ModuleConfig.MQTTConfigH\x00\x12@\n\x06serial\x18\x02 \x01(\x0b\x32..meshtastic.protobuf.ModuleConfig.SerialConfigH\x00\x12]\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32<.meshtastic.protobuf.ModuleConfig.ExternalNotificationConfigH\x00\x12M\n\rstore_forward\x18\x04 \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.StoreForwardConfigH\x00\x12G\n\nrange_test\x18\x05 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.RangeTestConfigH\x00\x12\x46\n\ttelemetry\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.TelemetryConfigH\x00\x12O\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.CannedMessageConfigH\x00\x12>\n\x05\x61udio\x18\x08 \x01(\x0b\x32-.meshtastic.protobuf.ModuleConfig.AudioConfigH\x00\x12Q\n\x0fremote_hardware\x18\t \x01(\x0b\x32\x36.meshtastic.protobuf.ModuleConfig.RemoteHardwareConfigH\x00\x12M\n\rneighbor_info\x18\n \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.NeighborInfoConfigH\x00\x12S\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.AmbientLightingConfigH\x00\x12S\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.DetectionSensorConfigH\x00\x12H\n\npaxcounter\x18\r \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.PaxcounterConfigH\x00\x1a\xb9\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\x12P\n\x13map_report_settings\x18\x0b \x01(\x0b\x32\x33.meshtastic.protobuf.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\x8b\x01\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&.meshtastic.protobuf.RemoteHardwarePin\x1aZ\n\x12NeighborInfoConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x17\n\x0fupdate_interval\x18\x02 \x01(\r\x12\x1a\n\x12transmit_over_lora\x18\x03 \x01(\x08\x1a\xa0\x03\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\x63\n\x16\x64\x65tection_trigger_type\x18\x07 \x01(\x0e\x32\x43.meshtastic.protobuf.ModuleConfig.DetectionSensorConfig.TriggerType\x12\x12\n\nuse_pullup\x18\x08 \x01(\x08\"\x88\x01\n\x0bTriggerType\x12\r\n\tLOGIC_LOW\x10\x00\x12\x0e\n\nLOGIC_HIGH\x10\x01\x12\x10\n\x0c\x46\x41LLING_EDGE\x10\x02\x12\x0f\n\x0bRISING_EDGE\x10\x03\x12\x1a\n\x16\x45ITHER_EDGE_ACTIVE_LOW\x10\x04\x12\x1b\n\x17\x45ITHER_EDGE_ACTIVE_HIGH\x10\x05\x1a\xed\x02\n\x0b\x41udioConfig\x12\x16\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x12\x0f\n\x07ptt_pin\x18\x02 \x01(\r\x12I\n\x07\x62itrate\x18\x03 \x01(\x0e\x32\x38.meshtastic.protobuf.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\x1av\n\x10PaxcounterConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1apaxcounter_update_interval\x18\x02 \x01(\r\x12\x16\n\x0ewifi_threshold\x18\x03 \x01(\x05\x12\x15\n\rble_threshold\x18\x04 \x01(\x05\x1a\x80\x05\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\x12H\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32:.meshtastic.protobuf.ModuleConfig.SerialConfig.Serial_Baud\x12\x0f\n\x07timeout\x18\x06 \x01(\r\x12H\n\x04mode\x18\x07 \x01(\x0e\x32:.meshtastic.protobuf.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\"_\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\x12\x08\n\x04WS85\x10\x06\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\x97\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\x12\x11\n\tis_server\x18\x06 \x01(\x08\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\xc9\x03\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\x12\"\n\x1ahealth_measurement_enabled\x18\x0b \x01(\x08\x12\x1e\n\x16health_update_interval\x18\x0c \x01(\r\x12\x1d\n\x15health_screen_enabled\x18\r \x01(\x08\x1a\xf1\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\x12\x62\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32\x44.meshtastic.protobuf.ModuleConfig.CannedMessageConfig.InputEventChar\x12\x63\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32\x44.meshtastic.protobuf.ModuleConfig.CannedMessageConfig.InputEventChar\x12\x65\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32\x44.meshtastic.protobuf.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\"m\n\x11RemoteHardwarePin\x12\x10\n\x08gpio_pin\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x38\n\x04type\x18\x03 \x01(\x0e\x32*.meshtastic.protobuf.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\'meshtastic/protobuf/module_config.proto\x12\x13meshtastic.protobuf\"\x89\'\n\x0cModuleConfig\x12<\n\x04mqtt\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.ModuleConfig.MQTTConfigH\x00\x12@\n\x06serial\x18\x02 \x01(\x0b\x32..meshtastic.protobuf.ModuleConfig.SerialConfigH\x00\x12]\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32<.meshtastic.protobuf.ModuleConfig.ExternalNotificationConfigH\x00\x12M\n\rstore_forward\x18\x04 \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.StoreForwardConfigH\x00\x12G\n\nrange_test\x18\x05 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.RangeTestConfigH\x00\x12\x46\n\ttelemetry\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.TelemetryConfigH\x00\x12O\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.CannedMessageConfigH\x00\x12>\n\x05\x61udio\x18\x08 \x01(\x0b\x32-.meshtastic.protobuf.ModuleConfig.AudioConfigH\x00\x12Q\n\x0fremote_hardware\x18\t \x01(\x0b\x32\x36.meshtastic.protobuf.ModuleConfig.RemoteHardwareConfigH\x00\x12M\n\rneighbor_info\x18\n \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.NeighborInfoConfigH\x00\x12S\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.AmbientLightingConfigH\x00\x12S\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.DetectionSensorConfigH\x00\x12H\n\npaxcounter\x18\r \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.PaxcounterConfigH\x00\x1a\xb9\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\x12P\n\x13map_report_settings\x18\x0b \x01(\x0b\x32\x33.meshtastic.protobuf.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\x8b\x01\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&.meshtastic.protobuf.RemoteHardwarePin\x1aZ\n\x12NeighborInfoConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x17\n\x0fupdate_interval\x18\x02 \x01(\r\x12\x1a\n\x12transmit_over_lora\x18\x03 \x01(\x08\x1a\xa0\x03\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\x63\n\x16\x64\x65tection_trigger_type\x18\x07 \x01(\x0e\x32\x43.meshtastic.protobuf.ModuleConfig.DetectionSensorConfig.TriggerType\x12\x12\n\nuse_pullup\x18\x08 \x01(\x08\"\x88\x01\n\x0bTriggerType\x12\r\n\tLOGIC_LOW\x10\x00\x12\x0e\n\nLOGIC_HIGH\x10\x01\x12\x10\n\x0c\x46\x41LLING_EDGE\x10\x02\x12\x0f\n\x0bRISING_EDGE\x10\x03\x12\x1a\n\x16\x45ITHER_EDGE_ACTIVE_LOW\x10\x04\x12\x1b\n\x17\x45ITHER_EDGE_ACTIVE_HIGH\x10\x05\x1a\xed\x02\n\x0b\x41udioConfig\x12\x16\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x12\x0f\n\x07ptt_pin\x18\x02 \x01(\r\x12I\n\x07\x62itrate\x18\x03 \x01(\x0e\x32\x38.meshtastic.protobuf.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\x1av\n\x10PaxcounterConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1apaxcounter_update_interval\x18\x02 \x01(\r\x12\x16\n\x0ewifi_threshold\x18\x03 \x01(\x05\x12\x15\n\rble_threshold\x18\x04 \x01(\x05\x1a\x8f\x05\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\x12H\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32:.meshtastic.protobuf.ModuleConfig.SerialConfig.Serial_Baud\x12\x0f\n\x07timeout\x18\x06 \x01(\r\x12H\n\x04mode\x18\x07 \x01(\x0e\x32:.meshtastic.protobuf.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\"n\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\x12\x08\n\x04WS85\x10\x06\x12\r\n\tVE_DIRECT\x10\x07\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\x97\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\x12\x11\n\tis_server\x18\x06 \x01(\x08\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\xc9\x03\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\x12\"\n\x1ahealth_measurement_enabled\x18\x0b \x01(\x08\x12\x1e\n\x16health_update_interval\x18\x0c \x01(\r\x12\x1d\n\x15health_screen_enabled\x18\r \x01(\x08\x1a\xf1\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\x12\x62\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32\x44.meshtastic.protobuf.ModuleConfig.CannedMessageConfig.InputEventChar\x12\x63\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32\x44.meshtastic.protobuf.ModuleConfig.CannedMessageConfig.InputEventChar\x12\x65\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32\x44.meshtastic.protobuf.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\"m\n\x11RemoteHardwarePin\x12\x10\n\x08gpio_pin\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x38\n\x04type\x18\x03 \x01(\x0e\x32*.meshtastic.protobuf.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') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -21,10 +21,10 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.module_ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\022ModuleConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=5164 - _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=5237 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=5179 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=5252 _globals['_MODULECONFIG']._serialized_start=65 - _globals['_MODULECONFIG']._serialized_end=5051 + _globals['_MODULECONFIG']._serialized_end=5066 _globals['_MODULECONFIG_MQTTCONFIG']._serialized_start=1080 _globals['_MODULECONFIG_MQTTCONFIG']._serialized_end=1393 _globals['_MODULECONFIG_MAPREPORTSETTINGS']._serialized_start=1395 @@ -44,25 +44,25 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['_MODULECONFIG_PAXCOUNTERCONFIG']._serialized_start=2496 _globals['_MODULECONFIG_PAXCOUNTERCONFIG']._serialized_end=2614 _globals['_MODULECONFIG_SERIALCONFIG']._serialized_start=2617 - _globals['_MODULECONFIG_SERIALCONFIG']._serialized_end=3257 + _globals['_MODULECONFIG_SERIALCONFIG']._serialized_end=3272 _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD']._serialized_start=2894 _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD']._serialized_end=3160 _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_MODE']._serialized_start=3162 - _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_MODE']._serialized_end=3257 - _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_start=3260 - _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_end=3621 - _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_start=3624 - _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_end=3775 - _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_start=3777 - _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_end=3841 - _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_start=3844 - _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_end=4301 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_start=4304 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_end=4929 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_start=4830 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_end=4929 - _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_start=4931 - _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_end=5032 - _globals['_REMOTEHARDWAREPIN']._serialized_start=5053 - _globals['_REMOTEHARDWAREPIN']._serialized_end=5162 + _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_MODE']._serialized_end=3272 + _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_start=3275 + _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_end=3636 + _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_start=3639 + _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_end=3790 + _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_start=3792 + _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_end=3856 + _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_start=3859 + _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_end=4316 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_start=4319 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_end=4944 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_start=4845 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_end=4944 + _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_start=4946 + _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_end=5047 + _globals['_REMOTEHARDWAREPIN']._serialized_start=5068 + _globals['_REMOTEHARDWAREPIN']._serialized_end=5177 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/module_config_pb2.pyi b/meshtastic/protobuf/module_config_pb2.pyi index bb6dd1c..50d05ad 100644 --- a/meshtastic/protobuf/module_config_pb2.pyi +++ b/meshtastic/protobuf/module_config_pb2.pyi @@ -554,6 +554,10 @@ class ModuleConfig(google.protobuf.message.Message): """NMEA messages specifically tailored for CalTopo""" WS85: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 6 """Ecowitt WS85 weather station""" + VE_DIRECT: ModuleConfig.SerialConfig._Serial_Mode.ValueType # 7 + """VE.Direct is a serial protocol used by Victron Energy products + https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable + """ class Serial_Mode(_Serial_Mode, metaclass=_Serial_ModeEnumTypeWrapper): """ @@ -569,6 +573,10 @@ class ModuleConfig(google.protobuf.message.Message): """NMEA messages specifically tailored for CalTopo""" WS85: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 6 """Ecowitt WS85 weather station""" + VE_DIRECT: ModuleConfig.SerialConfig.Serial_Mode.ValueType # 7 + """VE.Direct is a serial protocol used by Victron Energy products + https://beta.ivc.no/wiki/index.php/Victron_VE_Direct_DIY_Cable + """ ENABLED_FIELD_NUMBER: builtins.int ECHO_FIELD_NUMBER: builtins.int diff --git a/protobufs b/protobufs index 27fac39..078ac8d 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 27fac39141d99fe727a0a1824c5397409b1aea75 +Subproject commit 078ac8dfbe5f7533d7755cbe2ca3d08d86e5af34 From 56680f8da6b570655d081feaa9cbe3aebb32c895 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 8 May 2025 22:27:56 +0000 Subject: [PATCH 18/38] bump version to 2.6.3 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 55b3486..ad1888d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "meshtastic" -version = "2.6.2" +version = "2.6.3" description = "Python API & client shell for talking to Meshtastic devices" authors = ["Meshtastic Developers "] license = "GPL-3.0-only" From 622a435465872fd316054f1a4a7dd6d4d44bb3ec Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Thu, 8 May 2025 21:22:49 -0700 Subject: [PATCH 19/38] Add __repr__ methods to interface types and Node, for nicer printing/logging --- meshtastic/ble_interface.py | 11 +++++++++++ meshtastic/node.py | 9 +++++++++ meshtastic/serial_interface.py | 11 +++++++++++ meshtastic/tcp_interface.py | 15 +++++++++++++++ 4 files changed, 46 insertions(+) diff --git a/meshtastic/ble_interface.py b/meshtastic/ble_interface.py index 76e5dc3..5f32edf 100644 --- a/meshtastic/ble_interface.py +++ b/meshtastic/ble_interface.py @@ -83,6 +83,17 @@ class BLEInterface(MeshInterface): # Note: the on disconnected callback will call our self.close which will make us nicely wait for threads to exit self._exit_handler = atexit.register(self.client.disconnect) + def __repr__(self): + rep = f"BLEInterface(address={self.client.address if self.client else None!r}" + if self.debugOut is not None: + rep += f", debugOut={self.debugOut!r}" + if self.noProto: + rep += ", noProto=True" + if self.noNodes: + rep += ", noNodes=True" + rep += ")" + return rep + def from_num_handler(self, _, b: bytes) -> None: # pylint: disable=C0116 """Handle callbacks for fromnum notify. Note: this method does not need to be async because it is just setting a bool. diff --git a/meshtastic/node.py b/meshtastic/node.py index 53c91db..e54963c 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -42,6 +42,15 @@ class Node: self.gotResponse = None + def __repr__(self): + r = f"Node({self.iface!r}, 0x{self.nodeNum:08x}" + if self.noProto: + r += ", noProto=True" + if self._timeout.expireTimeout != 300: + r += ", timeout={self._timeout.expireTimeout!r}" + r += ")" + return r + def showChannels(self): """Show human readable description of our channels.""" print("Channels:") diff --git a/meshtastic/serial_interface.py b/meshtastic/serial_interface.py index 39f2648..7594ddf 100644 --- a/meshtastic/serial_interface.py +++ b/meshtastic/serial_interface.py @@ -66,6 +66,17 @@ class SerialInterface(StreamInterface): self, debugOut=debugOut, noProto=noProto, connectNow=connectNow, noNodes=noNodes ) + def __repr__(self): + rep = f"SerialInterface(devPath={self.devPath!r}" + if hasattr(self, 'debugOut') and self.debugOut is not None: + rep += f", debugOut={self.debugOut!r}" + if self.noProto: + rep += ", noProto=True" + if hasattr(self, 'noNodes') and self.noNodes: + rep += ", noNodes=True" + rep += ")" + return rep + def close(self) -> None: """Close a connection to the device""" if self.stream: # Stream can be null if we were already closed diff --git a/meshtastic/tcp_interface.py b/meshtastic/tcp_interface.py index 7f5b700..4263da3 100644 --- a/meshtastic/tcp_interface.py +++ b/meshtastic/tcp_interface.py @@ -43,6 +43,21 @@ class TCPInterface(StreamInterface): super().__init__(debugOut=debugOut, noProto=noProto, connectNow=connectNow, noNodes=noNodes) + def __repr__(self): + rep = f"TCPInterface({self.hostname!r}" + if self.debugOut is not None: + rep += f", debugOut={self.debugOut!r}" + if self.noProto: + rep += ", noProto=True" + if self.socket is None: + rep += ", connectNow=False" + if self.portNumber != DEFAULT_TCP_PORT: + rep += f", portNumber={self.portNumber!r}" + if self.noNodes: + rep += ", noNodes=True" + rep += ")" + return rep + def _socket_shutdown(self) -> None: """Shutdown the socket. Note: Broke out this line so the exception could be unit tested. From 23be2d2189ffce46a67f11f76522b277b845630b Mon Sep 17 00:00:00 2001 From: Crank-Git Date: Sun, 8 Jun 2025 17:45:11 -0400 Subject: [PATCH 20/38] Add validation/prevent --set-owner, --set-owner-short, and --set-ham from accepting empty or whitespace-only names. This is in relation to meshtastic#6867 firmware feature request https://github.com/meshtastic/firmware/issues/6867 --- meshtastic/__main__.py | 41 +++++++++++++++++++ meshtastic/node.py | 6 +++ meshtastic/tests/test_main.py | 76 +++++++++++++++++++++++++++++++++++ meshtastic/tests/test_node.py | 74 +++++++++++++++++++++++++++++++++- 4 files changed, 195 insertions(+), 2 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index e5a9243..f316ecf 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -342,6 +342,18 @@ def onConnected(interface): if args.set_owner or args.set_owner_short: closeNow = True waitForAckNak = True + + # Validate owner names before connecting to device + if args.set_owner is not None: + stripped_long_name = args.set_owner.strip() + if not stripped_long_name: + meshtastic.util.our_exit("ERROR: Long Name cannot be empty or contain only whitespace characters") + + if args.set_owner_short is not None: + stripped_short_name = args.set_owner_short.strip() + if not stripped_short_name: + meshtastic.util.our_exit("ERROR: Short Name cannot be empty or contain only whitespace characters") + if args.set_owner and args.set_owner_short: print(f"Setting device owner to {args.set_owner} and short name to {args.set_owner_short}") elif args.set_owner: @@ -644,11 +656,19 @@ def onConnected(interface): interface.getNode(args.dest, False, **getNode_kwargs).beginSettingsTransaction() if "owner" in configuration: + # Validate owner name before setting + owner_name = str(configuration["owner"]).strip() + if not owner_name: + meshtastic.util.our_exit("ERROR: Long Name cannot be empty or contain only whitespace characters") print(f"Setting device owner to {configuration['owner']}") waitForAckNak = True interface.getNode(args.dest, False, **getNode_kwargs).setOwner(configuration["owner"]) if "owner_short" in configuration: + # Validate owner short name before setting + owner_short_name = str(configuration["owner_short"]).strip() + if not owner_short_name: + meshtastic.util.our_exit("ERROR: Short Name cannot be empty or contain only whitespace characters") print( f"Setting device owner short to {configuration['owner_short']}" ) @@ -658,6 +678,10 @@ def onConnected(interface): ) if "ownerShort" in configuration: + # Validate owner short name before setting + owner_short_name = str(configuration["ownerShort"]).strip() + if not owner_short_name: + meshtastic.util.our_exit("ERROR: Short Name cannot be empty or contain only whitespace characters") print( f"Setting device owner short to {configuration['ownerShort']}" ) @@ -1088,6 +1112,7 @@ def export_config(interface) -> str: configObj["location"]["alt"] = alt config = MessageToDict(interface.localNode.localConfig) #checkme - Used as a dictionary here and a string below + #was used as a string here and a Dictionary above if config: # Convert inner keys to correct snake/camelCase prefs = {} @@ -1182,6 +1207,22 @@ def common(): meshtastic.util.support_info() meshtastic.util.our_exit("", 0) + # Early validation for owner names before attempting device connection + if hasattr(args, 'set_owner') and args.set_owner is not None: + stripped_long_name = args.set_owner.strip() + if not stripped_long_name: + meshtastic.util.our_exit("ERROR: Long Name cannot be empty or contain only whitespace characters") + + if hasattr(args, 'set_owner_short') and args.set_owner_short is not None: + stripped_short_name = args.set_owner_short.strip() + if not stripped_short_name: + meshtastic.util.our_exit("ERROR: Short Name cannot be empty or contain only whitespace characters") + + if hasattr(args, 'set_ham') and args.set_ham is not None: + stripped_ham_name = args.set_ham.strip() + if not stripped_ham_name: + meshtastic.util.our_exit("ERROR: Ham ID cannot be empty or contain only whitespace characters") + if have_powermon: create_power_meter() diff --git a/meshtastic/node.py b/meshtastic/node.py index e54963c..d006075 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -307,10 +307,16 @@ class Node: nChars = 4 if long_name is not None: long_name = long_name.strip() + # Validate that long_name is not empty or whitespace-only + if not long_name: + our_exit("ERROR: Long Name cannot be empty or contain only whitespace characters") p.set_owner.long_name = long_name p.set_owner.is_licensed = is_licensed if short_name is not None: short_name = short_name.strip() + # Validate that short_name is not empty or whitespace-only + if not short_name: + our_exit("ERROR: Short Name cannot be empty or contain only whitespace characters") if len(short_name) > nChars: short_name = short_name[:nChars] print(f"Maximum is 4 characters, truncated to {short_name}") diff --git a/meshtastic/tests/test_main.py b/meshtastic/tests/test_main.py index 8b70a4e..1d4040c 100644 --- a/meshtastic/tests/test_main.py +++ b/meshtastic/tests/test_main.py @@ -2713,3 +2713,79 @@ def test_remove_ignored_node(): main() mocked_node.removeIgnored.assert_called_once_with("!12345678") + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_set_owner_short_to_bob(capsys): + """Test --set-owner-short bob""" + sys.argv = ["", "--set-owner-short", "bob"] + mt_config.args = sys.argv + + iface = MagicMock(autospec=SerialInterface) + with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo: + main() + out, err = capsys.readouterr() + assert re.search(r"Connected to radio", out, re.MULTILINE) + assert re.search(r"Setting device owner short to bob", out, re.MULTILINE) + assert err == "" + mo.assert_called() + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_set_owner_whitespace_only(capsys): + """Test --set-owner with whitespace-only name""" + sys.argv = ["", "--set-owner", " "] + mt_config.args = sys.argv + + with pytest.raises(SystemExit) as excinfo: + main() + + out, err = capsys.readouterr() + assert "ERROR: Long Name cannot be empty or contain only whitespace characters" in out + assert excinfo.value.code == 1 + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_set_owner_empty_string(capsys): + """Test --set-owner with empty string""" + sys.argv = ["", "--set-owner", ""] + mt_config.args = sys.argv + + with pytest.raises(SystemExit) as excinfo: + main() + + out, err = capsys.readouterr() + assert "ERROR: Long Name cannot be empty or contain only whitespace characters" in out + assert excinfo.value.code == 1 + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_set_owner_short_whitespace_only(capsys): + """Test --set-owner-short with whitespace-only name""" + sys.argv = ["", "--set-owner-short", " "] + mt_config.args = sys.argv + + with pytest.raises(SystemExit) as excinfo: + main() + + out, err = capsys.readouterr() + assert "ERROR: Short Name cannot be empty or contain only whitespace characters" in out + assert excinfo.value.code == 1 + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_set_owner_short_empty_string(capsys): + """Test --set-owner-short with empty string""" + sys.argv = ["", "--set-owner-short", ""] + mt_config.args = sys.argv + + with pytest.raises(SystemExit) as excinfo: + main() + + out, err = capsys.readouterr() + assert "ERROR: Short Name cannot be empty or contain only whitespace characters" in out + assert excinfo.value.code == 1 diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index ffdd8ea..b1b235c 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -1254,8 +1254,7 @@ def test_requestChannels_non_localNode_starting_index(caplog): # }, # 'id': 1692918436, # 'hopLimit': 3, -# 'priority': -# 'RELIABLE', +# 'priority': 'RELIABLE', # 'raw': 'fake', # 'fromId': '!9388f81c', # 'toId': '!9388f81c' @@ -1480,6 +1479,77 @@ def test_remove_ignored(ignored): iface.sendData.assert_called_once() +@pytest.mark.unit +def test_setOwner_whitespace_only_long_name(capsys): + """Test setOwner with whitespace-only long name""" + iface = MagicMock(autospec=MeshInterface) + anode = Node(iface, 123, noProto=True) + + with pytest.raises(SystemExit) as excinfo: + anode.setOwner(long_name=" ") + + out, err = capsys.readouterr() + assert "ERROR: Long Name cannot be empty or contain only whitespace characters" in out + assert excinfo.value.code == 1 + + +@pytest.mark.unit +def test_setOwner_empty_long_name(capsys): + """Test setOwner with empty long name""" + iface = MagicMock(autospec=MeshInterface) + anode = Node(iface, 123, noProto=True) + + with pytest.raises(SystemExit) as excinfo: + anode.setOwner(long_name="") + + out, err = capsys.readouterr() + assert "ERROR: Long Name cannot be empty or contain only whitespace characters" in out + assert excinfo.value.code == 1 + + +@pytest.mark.unit +def test_setOwner_whitespace_only_short_name(capsys): + """Test setOwner with whitespace-only short name""" + iface = MagicMock(autospec=MeshInterface) + anode = Node(iface, 123, noProto=True) + + with pytest.raises(SystemExit) as excinfo: + anode.setOwner(short_name=" ") + + out, err = capsys.readouterr() + assert "ERROR: Short Name cannot be empty or contain only whitespace characters" in out + assert excinfo.value.code == 1 + + +@pytest.mark.unit +def test_setOwner_empty_short_name(capsys): + """Test setOwner with empty short name""" + iface = MagicMock(autospec=MeshInterface) + anode = Node(iface, 123, noProto=True) + + with pytest.raises(SystemExit) as excinfo: + anode.setOwner(short_name="") + + out, err = capsys.readouterr() + assert "ERROR: Short Name cannot be empty or contain only whitespace characters" in out + assert excinfo.value.code == 1 + + +@pytest.mark.unit +def test_setOwner_valid_names(caplog): + """Test setOwner with valid names""" + iface = MagicMock(autospec=MeshInterface) + anode = Node(iface, 123, noProto=True) + + with caplog.at_level(logging.DEBUG): + anode.setOwner(long_name="ValidName", short_name="VN") + + # Should not raise any exceptions and should call _sendAdmin + iface._sendAdmin.assert_called_once() + assert re.search(r'p.set_owner.long_name:ValidName:', caplog.text, re.MULTILINE) + assert re.search(r'p.set_owner.short_name:VN:', caplog.text, re.MULTILINE) + + # TODO # @pytest.mark.unitslow # def test_waitForConfig(): From aa786c7ebdc8f300db60c06e6538f50075383c64 Mon Sep 17 00:00:00 2001 From: Crank-Git Date: Sun, 8 Jun 2025 19:51:21 -0400 Subject: [PATCH 21/38] Fix linting errors and duplicate function --- meshtastic/tests/test_main.py | 64 +++++++++++++++++++++-------------- meshtastic/tests/test_node.py | 20 +++++------ 2 files changed, 48 insertions(+), 36 deletions(-) diff --git a/meshtastic/tests/test_main.py b/meshtastic/tests/test_main.py index 1d4040c..235829d 100644 --- a/meshtastic/tests/test_main.py +++ b/meshtastic/tests/test_main.py @@ -2713,24 +2713,6 @@ def test_remove_ignored_node(): main() mocked_node.removeIgnored.assert_called_once_with("!12345678") - -@pytest.mark.unit -@pytest.mark.usefixtures("reset_mt_config") -def test_main_set_owner_short_to_bob(capsys): - """Test --set-owner-short bob""" - sys.argv = ["", "--set-owner-short", "bob"] - mt_config.args = sys.argv - - iface = MagicMock(autospec=SerialInterface) - with patch("meshtastic.serial_interface.SerialInterface", return_value=iface) as mo: - main() - out, err = capsys.readouterr() - assert re.search(r"Connected to radio", out, re.MULTILINE) - assert re.search(r"Setting device owner short to bob", out, re.MULTILINE) - assert err == "" - mo.assert_called() - - @pytest.mark.unit @pytest.mark.usefixtures("reset_mt_config") def test_main_set_owner_whitespace_only(capsys): @@ -2740,8 +2722,8 @@ def test_main_set_owner_whitespace_only(capsys): with pytest.raises(SystemExit) as excinfo: main() - - out, err = capsys.readouterr() + + out, _ = capsys.readouterr() assert "ERROR: Long Name cannot be empty or contain only whitespace characters" in out assert excinfo.value.code == 1 @@ -2755,8 +2737,8 @@ def test_main_set_owner_empty_string(capsys): with pytest.raises(SystemExit) as excinfo: main() - - out, err = capsys.readouterr() + + out, _ = capsys.readouterr() assert "ERROR: Long Name cannot be empty or contain only whitespace characters" in out assert excinfo.value.code == 1 @@ -2770,8 +2752,8 @@ def test_main_set_owner_short_whitespace_only(capsys): with pytest.raises(SystemExit) as excinfo: main() - - out, err = capsys.readouterr() + + out, _ = capsys.readouterr() assert "ERROR: Short Name cannot be empty or contain only whitespace characters" in out assert excinfo.value.code == 1 @@ -2785,7 +2767,37 @@ def test_main_set_owner_short_empty_string(capsys): with pytest.raises(SystemExit) as excinfo: main() - - out, err = capsys.readouterr() + + out, _ = capsys.readouterr() assert "ERROR: Short Name cannot be empty or contain only whitespace characters" in out assert excinfo.value.code == 1 + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_set_ham_whitespace_only(capsys): + """Test --set-ham with whitespace-only name""" + sys.argv = ["", "--set-ham", " "] + mt_config.args = sys.argv + + with pytest.raises(SystemExit) as excinfo: + main() + + out, _ = capsys.readouterr() + assert "ERROR: Ham radio callsign cannot be empty or contain only whitespace characters" in out + assert excinfo.value.code == 1 + + +@pytest.mark.unit +@pytest.mark.usefixtures("reset_mt_config") +def test_main_set_ham_empty_string(capsys): + """Test --set-ham with empty string""" + sys.argv = ["", "--set-ham", ""] + mt_config.args = sys.argv + + with pytest.raises(SystemExit) as excinfo: + main() + + out, _ = capsys.readouterr() + assert "ERROR: Ham radio callsign cannot be empty or contain only whitespace characters" in out + assert excinfo.value.code == 1 diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index b1b235c..bb4e2d9 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -1487,8 +1487,8 @@ def test_setOwner_whitespace_only_long_name(capsys): with pytest.raises(SystemExit) as excinfo: anode.setOwner(long_name=" ") - - out, err = capsys.readouterr() + + out, _ = capsys.readouterr() assert "ERROR: Long Name cannot be empty or contain only whitespace characters" in out assert excinfo.value.code == 1 @@ -1501,8 +1501,8 @@ def test_setOwner_empty_long_name(capsys): with pytest.raises(SystemExit) as excinfo: anode.setOwner(long_name="") - - out, err = capsys.readouterr() + + out, _ = capsys.readouterr() assert "ERROR: Long Name cannot be empty or contain only whitespace characters" in out assert excinfo.value.code == 1 @@ -1515,8 +1515,8 @@ def test_setOwner_whitespace_only_short_name(capsys): with pytest.raises(SystemExit) as excinfo: anode.setOwner(short_name=" ") - - out, err = capsys.readouterr() + + out, _ = capsys.readouterr() assert "ERROR: Short Name cannot be empty or contain only whitespace characters" in out assert excinfo.value.code == 1 @@ -1529,8 +1529,8 @@ def test_setOwner_empty_short_name(capsys): with pytest.raises(SystemExit) as excinfo: anode.setOwner(short_name="") - - out, err = capsys.readouterr() + + out, _ = capsys.readouterr() assert "ERROR: Short Name cannot be empty or contain only whitespace characters" in out assert excinfo.value.code == 1 @@ -1540,10 +1540,10 @@ def test_setOwner_valid_names(caplog): """Test setOwner with valid names""" iface = MagicMock(autospec=MeshInterface) anode = Node(iface, 123, noProto=True) - + with caplog.at_level(logging.DEBUG): anode.setOwner(long_name="ValidName", short_name="VN") - + # Should not raise any exceptions and should call _sendAdmin iface._sendAdmin.assert_called_once() assert re.search(r'p.set_owner.long_name:ValidName:', caplog.text, re.MULTILINE) From 8a6ee5fb3540da8198661e0629af45ad58e215aa Mon Sep 17 00:00:00 2001 From: Crank-Git Date: Sun, 8 Jun 2025 20:39:26 -0400 Subject: [PATCH 22/38] fixed assertion errors by replace ham id with ham radio callsign, fixed _sendAdmin assertion --- meshtastic/__main__.py | 6 ++++-- meshtastic/tests/test_node.py | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index f316ecf..56dd29c 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -349,7 +349,7 @@ def onConnected(interface): if not stripped_long_name: meshtastic.util.our_exit("ERROR: Long Name cannot be empty or contain only whitespace characters") - if args.set_owner_short is not None: + if hasattr(args, 'set_owner_short') and args.set_owner_short is not None: stripped_short_name = args.set_owner_short.strip() if not stripped_short_name: meshtastic.util.our_exit("ERROR: Short Name cannot be empty or contain only whitespace characters") @@ -414,6 +414,8 @@ def onConnected(interface): print(" ".join(fieldNames)) if args.set_ham: + if not args.set_ham.strip(): + meshtastic.util.our_exit("ERROR: Ham radio callsign cannot be empty or contain only whitespace characters") closeNow = True print(f"Setting Ham ID to {args.set_ham} and turning off encryption") interface.getNode(args.dest, **getNode_kwargs).setOwner(args.set_ham, is_licensed=True) @@ -1221,7 +1223,7 @@ def common(): if hasattr(args, 'set_ham') and args.set_ham is not None: stripped_ham_name = args.set_ham.strip() if not stripped_ham_name: - meshtastic.util.our_exit("ERROR: Ham ID cannot be empty or contain only whitespace characters") + meshtastic.util.our_exit("ERROR: Ham radio callsign cannot be empty or contain only whitespace characters") if have_powermon: create_power_meter() diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index bb4e2d9..c5cb6b3 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -1544,8 +1544,8 @@ def test_setOwner_valid_names(caplog): with caplog.at_level(logging.DEBUG): anode.setOwner(long_name="ValidName", short_name="VN") - # Should not raise any exceptions and should call _sendAdmin - iface._sendAdmin.assert_called_once() + # Should not raise any exceptions + # Note: When noProto=True, _sendAdmin is not called as the method returns early assert re.search(r'p.set_owner.long_name:ValidName:', caplog.text, re.MULTILINE) assert re.search(r'p.set_owner.short_name:VN:', caplog.text, re.MULTILINE) From 8e48d141c85c3f053a24153217c3610b05ad303b Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Sun, 8 Jun 2025 23:32:32 -0700 Subject: [PATCH 23/38] add sleeps --- meshtastic/__main__.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index e5a9243..ee869e9 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -647,6 +647,7 @@ def onConnected(interface): print(f"Setting device owner to {configuration['owner']}") waitForAckNak = True interface.getNode(args.dest, False, **getNode_kwargs).setOwner(configuration["owner"]) + time.sleep(0.5) if "owner_short" in configuration: print( @@ -656,6 +657,7 @@ def onConnected(interface): interface.getNode(args.dest, False, **getNode_kwargs).setOwner( long_name=None, short_name=configuration["owner_short"] ) + time.sleep(0.5) if "ownerShort" in configuration: print( @@ -665,14 +667,17 @@ def onConnected(interface): interface.getNode(args.dest, False, **getNode_kwargs).setOwner( long_name=None, short_name=configuration["ownerShort"] ) + time.sleep(0.5) if "channel_url" in configuration: print("Setting channel url to", configuration["channel_url"]) interface.getNode(args.dest, **getNode_kwargs).setURL(configuration["channel_url"]) + time.sleep(0.5) if "channelUrl" in configuration: print("Setting channel url to", configuration["channelUrl"]) interface.getNode(args.dest, **getNode_kwargs).setURL(configuration["channelUrl"]) + time.sleep(0.5) if "location" in configuration: alt = 0 @@ -691,6 +696,7 @@ def onConnected(interface): print(f"Fixing longitude at {lon} degrees") print("Setting device position") interface.localNode.setFixedPosition(lat, lon, alt) + time.sleep(0.5) if "config" in configuration: localConfig = interface.getNode(args.dest, **getNode_kwargs).localConfig @@ -701,6 +707,7 @@ def onConnected(interface): interface.getNode(args.dest, **getNode_kwargs).writeConfig( meshtastic.util.camel_to_snake(section) ) + time.sleep(0.5) if "module_config" in configuration: moduleConfig = interface.getNode(args.dest, **getNode_kwargs).moduleConfig @@ -713,6 +720,7 @@ def onConnected(interface): interface.getNode(args.dest, **getNode_kwargs).writeConfig( meshtastic.util.camel_to_snake(section) ) + time.sleep(0.5) interface.getNode(args.dest, False, **getNode_kwargs).commitSettingsTransaction() print("Writing modified configuration to device") From 9281c4a335bd96e8e3c20f6e0a6f2f8b84e7e115 Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Mon, 9 Jun 2025 11:52:23 -0700 Subject: [PATCH 24/38] Correctly call self.close() in disconnected_callback for bleak (fixes #770) --- meshtastic/ble_interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshtastic/ble_interface.py b/meshtastic/ble_interface.py index 5f32edf..71b957f 100644 --- a/meshtastic/ble_interface.py +++ b/meshtastic/ble_interface.py @@ -174,7 +174,7 @@ class BLEInterface(MeshInterface): # Bleak docs recommend always doing a scan before connecting (even if we know addr) device = self.find_device(address) - client = BLEClient(device.address, disconnected_callback=lambda _: self.close) + client = BLEClient(device.address, disconnected_callback=lambda _: self.close()) client.connect() client.discover() return client From b4764d3bc369b459bd9227a1e239e9f569e23524 Mon Sep 17 00:00:00 2001 From: grleblanc Date: Mon, 9 Jun 2025 15:05:53 -0400 Subject: [PATCH 25/38] fix(util): update waitForTraceRoute reset logic --- meshtastic/util.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/meshtastic/util.py b/meshtastic/util.py index 38e51d3..760da95 100644 --- a/meshtastic/util.py +++ b/meshtastic/util.py @@ -198,9 +198,9 @@ class Timeout: self.sleepInterval: float = 0.1 self.expireTimeout: int = maxSecs - def reset(self) -> None: + def reset(self, expireTimeout=None): """Restart the waitForSet timer""" - self.expireTime = time.time() + self.expireTimeout + self.expireTime = time.time() + (self.expireTimeout if expireTimeout is None else expireTimeout) def waitForSet(self, target, attrs=()) -> bool: """Block until the specified attributes are set. Returns True if config has been received.""" @@ -225,8 +225,7 @@ class Timeout: def waitForTraceRoute(self, waitFactor, acknowledgment, attr="receivedTraceRoute") -> bool: """Block until traceroute response is received. Returns True if traceroute response has been received.""" - self.expireTimeout *= waitFactor - self.reset() + self.reset(self.expireTimout * waitFactor) while time.time() < self.expireTime: if getattr(acknowledgment, attr, None): acknowledgment.reset() From 04a0ff63226db39591cd1403732f9d890dfd2c8c Mon Sep 17 00:00:00 2001 From: grleblanc Date: Mon, 9 Jun 2025 15:50:21 -0400 Subject: [PATCH 26/38] fix(util): fix typo --- meshtastic/util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshtastic/util.py b/meshtastic/util.py index 760da95..3d76e59 100644 --- a/meshtastic/util.py +++ b/meshtastic/util.py @@ -225,7 +225,7 @@ class Timeout: def waitForTraceRoute(self, waitFactor, acknowledgment, attr="receivedTraceRoute") -> bool: """Block until traceroute response is received. Returns True if traceroute response has been received.""" - self.reset(self.expireTimout * waitFactor) + self.reset(self.expireTimeout * waitFactor) while time.time() < self.expireTime: if getattr(acknowledgment, attr, None): acknowledgment.reset() From e6750507c8d73ba4c9840e4243a1992668ee96bc Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Mon, 16 Jun 2025 12:22:31 -0700 Subject: [PATCH 27/38] protobufs: v2.6.12 --- meshtastic/protobuf/admin_pb2.py | 32 ++-- meshtastic/protobuf/admin_pb2.pyi | 188 +++++++++++++++++- meshtastic/protobuf/config_pb2.py | 100 +++++----- meshtastic/protobuf/config_pb2.pyi | 72 ++++++- meshtastic/protobuf/device_ui_pb2.py | 4 +- meshtastic/protobuf/device_ui_pb2.pyi | 8 + meshtastic/protobuf/deviceonly_pb2.py | 24 +-- meshtastic/protobuf/deviceonly_pb2.pyi | 19 +- meshtastic/protobuf/mesh_pb2.py | 140 +++++++------- meshtastic/protobuf/mesh_pb2.pyi | 221 +++++++++++++++++++++- meshtastic/protobuf/module_config_pb2.py | 82 ++++---- meshtastic/protobuf/module_config_pb2.pyi | 8 +- meshtastic/protobuf/mqtt_pb2.py | 4 +- meshtastic/protobuf/mqtt_pb2.pyi | 9 +- meshtastic/protobuf/portnums_pb2.py | 4 +- meshtastic/protobuf/portnums_pb2.pyi | 8 + meshtastic/protobuf/telemetry_pb2.py | 22 ++- meshtastic/protobuf/telemetry_pb2.pyi | 122 +++++++++++- protobufs | 2 +- 19 files changed, 857 insertions(+), 212 deletions(-) diff --git a/meshtastic/protobuf/admin_pb2.py b/meshtastic/protobuf/admin_pb2.py index 4e27d74..ecc2318 100644 --- a/meshtastic/protobuf/admin_pb2.py +++ b/meshtastic/protobuf/admin_pb2.py @@ -19,7 +19,7 @@ from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fmeshtastic/protobuf/admin.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a+meshtastic/protobuf/connection_status.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a#meshtastic/protobuf/device_ui.proto\"\x84\x18\n\x0c\x41\x64minMessage\x12\x17\n\x0fsession_passkey\x18\x65 \x01(\x0c\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12<\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12\x37\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12J\n\x12get_config_request\x18\x05 \x01(\x0e\x32,.meshtastic.protobuf.AdminMessage.ConfigTypeH\x00\x12:\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12W\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.AdminMessage.ModuleConfigTypeH\x00\x12G\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32!.meshtastic.protobuf.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\x12K\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32#.meshtastic.protobuf.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\x12\\\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32+.meshtastic.protobuf.DeviceConnectionStatusH\x00\x12:\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\".meshtastic.protobuf.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12\x65\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32\x33.meshtastic.protobuf.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\x13\n\tset_scale\x18\x17 \x01(\rH\x00\x12N\n\x12\x62\x61\x63kup_preferences\x18\x18 \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12O\n\x13restore_preferences\x18\x19 \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12U\n\x19remove_backup_preferences\x18\x1a \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12.\n\tset_owner\x18 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12\x33\n\x0bset_channel\x18! \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x31\n\nset_config\x18\" \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12>\n\x11set_module_config\x18# \x01(\x0b\x32!.meshtastic.protobuf.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\x1d.meshtastic.protobuf.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18* \x01(\x08H\x00\x12\x17\n\rset_time_only\x18+ \x01(\x07H\x00\x12\x1f\n\x15get_ui_config_request\x18, \x01(\x08H\x00\x12\x45\n\x16get_ui_config_response\x18- \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12>\n\x0fstore_ui_config\x18. \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12\x1a\n\x10set_ignored_node\x18/ \x01(\rH\x00\x12\x1d\n\x13remove_ignored_node\x18\x30 \x01(\rH\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\x1e\n\x14\x66\x61\x63tory_reset_device\x18^ \x01(\x05H\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\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x05H\x00\"\xd6\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\x12\x13\n\x0fSECURITY_CONFIG\x10\x07\x12\x15\n\x11SESSIONKEY_CONFIG\x10\x08\x12\x13\n\x0f\x44\x45VICEUI_CONFIG\x10\t\"\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\"#\n\x0e\x42\x61\x63kupLocation\x12\t\n\x05\x46LASH\x10\x00\x12\x06\n\x02SD\x10\x01\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\"o\n\x1eNodeRemoteHardwarePinsResponse\x12M\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32*.meshtastic.protobuf.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\x1fmeshtastic/protobuf/admin.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a+meshtastic/protobuf/connection_status.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a#meshtastic/protobuf/device_ui.proto\"\xa5\x1a\n\x0c\x41\x64minMessage\x12\x17\n\x0fsession_passkey\x18\x65 \x01(\x0c\x12\x1d\n\x13get_channel_request\x18\x01 \x01(\rH\x00\x12<\n\x14get_channel_response\x18\x02 \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x1b\n\x11get_owner_request\x18\x03 \x01(\x08H\x00\x12\x37\n\x12get_owner_response\x18\x04 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12J\n\x12get_config_request\x18\x05 \x01(\x0e\x32,.meshtastic.protobuf.AdminMessage.ConfigTypeH\x00\x12:\n\x13get_config_response\x18\x06 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12W\n\x19get_module_config_request\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.AdminMessage.ModuleConfigTypeH\x00\x12G\n\x1aget_module_config_response\x18\x08 \x01(\x0b\x32!.meshtastic.protobuf.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\x12K\n\x1cget_device_metadata_response\x18\r \x01(\x0b\x32#.meshtastic.protobuf.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\x12\\\n%get_device_connection_status_response\x18\x11 \x01(\x0b\x32+.meshtastic.protobuf.DeviceConnectionStatusH\x00\x12:\n\x0cset_ham_mode\x18\x12 \x01(\x0b\x32\".meshtastic.protobuf.HamParametersH\x00\x12/\n%get_node_remote_hardware_pins_request\x18\x13 \x01(\x08H\x00\x12\x65\n&get_node_remote_hardware_pins_response\x18\x14 \x01(\x0b\x32\x33.meshtastic.protobuf.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\x13\n\tset_scale\x18\x17 \x01(\rH\x00\x12N\n\x12\x62\x61\x63kup_preferences\x18\x18 \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12O\n\x13restore_preferences\x18\x19 \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12U\n\x19remove_backup_preferences\x18\x1a \x01(\x0e\x32\x30.meshtastic.protobuf.AdminMessage.BackupLocationH\x00\x12H\n\x10send_input_event\x18\x1b \x01(\x0b\x32,.meshtastic.protobuf.AdminMessage.InputEventH\x00\x12.\n\tset_owner\x18 \x01(\x0b\x32\x19.meshtastic.protobuf.UserH\x00\x12\x33\n\x0bset_channel\x18! \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x31\n\nset_config\x18\" \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12>\n\x11set_module_config\x18# \x01(\x0b\x32!.meshtastic.protobuf.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\x1d.meshtastic.protobuf.PositionH\x00\x12\x1f\n\x15remove_fixed_position\x18* \x01(\x08H\x00\x12\x17\n\rset_time_only\x18+ \x01(\x07H\x00\x12\x1f\n\x15get_ui_config_request\x18, \x01(\x08H\x00\x12\x45\n\x16get_ui_config_response\x18- \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12>\n\x0fstore_ui_config\x18. \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x12\x1a\n\x10set_ignored_node\x18/ \x01(\rH\x00\x12\x1d\n\x13remove_ignored_node\x18\x30 \x01(\rH\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\x39\n\x0b\x61\x64\x64_contact\x18\x42 \x01(\x0b\x32\".meshtastic.protobuf.SharedContactH\x00\x12\x45\n\x10key_verification\x18\x43 \x01(\x0b\x32).meshtastic.protobuf.KeyVerificationAdminH\x00\x12\x1e\n\x14\x66\x61\x63tory_reset_device\x18^ \x01(\x05H\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\x1e\n\x14\x66\x61\x63tory_reset_config\x18\x63 \x01(\x05H\x00\x12\x16\n\x0cnodedb_reset\x18\x64 \x01(\x05H\x00\x1aS\n\nInputEvent\x12\x12\n\nevent_code\x18\x01 \x01(\r\x12\x0f\n\x07kb_char\x18\x02 \x01(\r\x12\x0f\n\x07touch_x\x18\x03 \x01(\r\x12\x0f\n\x07touch_y\x18\x04 \x01(\r\"\xd6\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\x12\x13\n\x0fSECURITY_CONFIG\x10\x07\x12\x15\n\x11SESSIONKEY_CONFIG\x10\x08\x12\x13\n\x0f\x44\x45VICEUI_CONFIG\x10\t\"\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\"#\n\x0e\x42\x61\x63kupLocation\x12\t\n\x05\x46LASH\x10\x00\x12\x06\n\x02SD\x10\x01\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\"o\n\x1eNodeRemoteHardwarePinsResponse\x12M\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"a\n\rSharedContact\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\'\n\x04user\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x15\n\rshould_ignore\x18\x03 \x01(\x08\"\xa5\x02\n\x14KeyVerificationAdmin\x12K\n\x0cmessage_type\x18\x01 \x01(\x0e\x32\x35.meshtastic.protobuf.KeyVerificationAdmin.MessageType\x12\x16\n\x0eremote_nodenum\x18\x02 \x01(\r\x12\r\n\x05nonce\x18\x03 \x01(\x04\x12\x1c\n\x0fsecurity_number\x18\x04 \x01(\rH\x00\x88\x01\x01\"g\n\x0bMessageType\x12\x19\n\x15INITIATE_VERIFICATION\x10\x00\x12\x1b\n\x17PROVIDE_SECURITY_NUMBER\x10\x01\x12\r\n\tDO_VERIFY\x10\x02\x12\x11\n\rDO_NOT_VERIFY\x10\x03\x42\x12\n\x10_security_numberB`\n\x13\x63om.geeksville.meshB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -28,15 +28,23 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\013AdminProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_ADMINMESSAGE']._serialized_start=281 - _globals['_ADMINMESSAGE']._serialized_end=3357 - _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=2769 - _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=2983 - _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=2986 - _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=3301 - _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_start=3303 - _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_end=3338 - _globals['_HAMPARAMETERS']._serialized_start=3359 - _globals['_HAMPARAMETERS']._serialized_end=3450 - _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=3452 - _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=3563 + _globals['_ADMINMESSAGE']._serialized_end=3646 + _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_start=2972 + _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_end=3055 + _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=3058 + _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=3272 + _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=3275 + _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=3590 + _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_start=3592 + _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_end=3627 + _globals['_HAMPARAMETERS']._serialized_start=3648 + _globals['_HAMPARAMETERS']._serialized_end=3739 + _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=3741 + _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=3852 + _globals['_SHAREDCONTACT']._serialized_start=3854 + _globals['_SHAREDCONTACT']._serialized_end=3951 + _globals['_KEYVERIFICATIONADMIN']._serialized_start=3954 + _globals['_KEYVERIFICATIONADMIN']._serialized_end=4247 + _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_start=4124 + _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_end=4227 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/admin_pb2.pyi b/meshtastic/protobuf/admin_pb2.pyi index 9c17aa8..1f05bc6 100644 --- a/meshtastic/protobuf/admin_pb2.pyi +++ b/meshtastic/protobuf/admin_pb2.pyi @@ -270,6 +270,44 @@ class AdminMessage(google.protobuf.message.Message): Backup to the SD card """ + @typing.final + class InputEvent(google.protobuf.message.Message): + """ + Input event message to be sent to the node. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + EVENT_CODE_FIELD_NUMBER: builtins.int + KB_CHAR_FIELD_NUMBER: builtins.int + TOUCH_X_FIELD_NUMBER: builtins.int + TOUCH_Y_FIELD_NUMBER: builtins.int + event_code: builtins.int + """ + The input event code + """ + kb_char: builtins.int + """ + Keyboard character code + """ + touch_x: builtins.int + """ + The touch X coordinate + """ + touch_y: builtins.int + """ + The touch Y coordinate + """ + def __init__( + self, + *, + event_code: builtins.int = ..., + kb_char: builtins.int = ..., + touch_x: builtins.int = ..., + touch_y: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["event_code", b"event_code", "kb_char", b"kb_char", "touch_x", b"touch_x", "touch_y", b"touch_y"]) -> None: ... + SESSION_PASSKEY_FIELD_NUMBER: builtins.int GET_CHANNEL_REQUEST_FIELD_NUMBER: builtins.int GET_CHANNEL_RESPONSE_FIELD_NUMBER: builtins.int @@ -296,6 +334,7 @@ class AdminMessage(google.protobuf.message.Message): BACKUP_PREFERENCES_FIELD_NUMBER: builtins.int RESTORE_PREFERENCES_FIELD_NUMBER: builtins.int REMOVE_BACKUP_PREFERENCES_FIELD_NUMBER: builtins.int + SEND_INPUT_EVENT_FIELD_NUMBER: builtins.int SET_OWNER_FIELD_NUMBER: builtins.int SET_CHANNEL_FIELD_NUMBER: builtins.int SET_CONFIG_FIELD_NUMBER: builtins.int @@ -315,6 +354,8 @@ class AdminMessage(google.protobuf.message.Message): REMOVE_IGNORED_NODE_FIELD_NUMBER: builtins.int BEGIN_EDIT_SETTINGS_FIELD_NUMBER: builtins.int COMMIT_EDIT_SETTINGS_FIELD_NUMBER: builtins.int + ADD_CONTACT_FIELD_NUMBER: builtins.int + KEY_VERIFICATION_FIELD_NUMBER: builtins.int FACTORY_RESET_DEVICE_FIELD_NUMBER: builtins.int REBOOT_OTA_SECONDS_FIELD_NUMBER: builtins.int EXIT_SIMULATOR_FIELD_NUMBER: builtins.int @@ -526,6 +567,13 @@ class AdminMessage(google.protobuf.message.Message): Respond with the mesh's nodes with their available gpio pins for RemoteHardware module use """ + @property + def send_input_event(self) -> global___AdminMessage.InputEvent: + """ + Send an input event to the node. + This is used to trigger physical input events like button presses, touch events, etc. + """ + @property def set_owner(self) -> meshtastic.protobuf.mesh_pb2.User: """ @@ -572,6 +620,18 @@ class AdminMessage(google.protobuf.message.Message): Tell the node to store UI data persistently. """ + @property + def add_contact(self) -> global___SharedContact: + """ + Add a contact (User) to the nodedb + """ + + @property + def key_verification(self) -> global___KeyVerificationAdmin: + """ + Initiate or respond to a key verification request + """ + def __init__( self, *, @@ -601,6 +661,7 @@ class AdminMessage(google.protobuf.message.Message): backup_preferences: global___AdminMessage.BackupLocation.ValueType = ..., restore_preferences: global___AdminMessage.BackupLocation.ValueType = ..., remove_backup_preferences: global___AdminMessage.BackupLocation.ValueType = ..., + send_input_event: global___AdminMessage.InputEvent | None = ..., set_owner: meshtastic.protobuf.mesh_pb2.User | None = ..., set_channel: meshtastic.protobuf.channel_pb2.Channel | None = ..., set_config: meshtastic.protobuf.config_pb2.Config | None = ..., @@ -620,6 +681,8 @@ class AdminMessage(google.protobuf.message.Message): remove_ignored_node: builtins.int = ..., begin_edit_settings: builtins.bool = ..., commit_edit_settings: builtins.bool = ..., + add_contact: global___SharedContact | None = ..., + key_verification: global___KeyVerificationAdmin | None = ..., factory_reset_device: builtins.int = ..., reboot_ota_seconds: builtins.int = ..., exit_simulator: builtins.bool = ..., @@ -628,9 +691,9 @@ class AdminMessage(google.protobuf.message.Message): factory_reset_config: builtins.int = ..., nodedb_reset: builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["backup_preferences", b"backup_preferences", "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_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "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", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_response", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", b"remove_ignored_node", "restore_preferences", b"restore_preferences", "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_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["backup_preferences", b"backup_preferences", "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_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "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", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_response", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", b"remove_ignored_node", "restore_preferences", b"restore_preferences", "session_passkey", b"session_passkey", "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_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.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_scale", "backup_preferences", "restore_preferences", "remove_backup_preferences", "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", "set_time_only", "get_ui_config_request", "get_ui_config_response", "store_ui_config", "set_ignored_node", "remove_ignored_node", "begin_edit_settings", "commit_edit_settings", "factory_reset_device", "reboot_ota_seconds", "exit_simulator", "reboot_seconds", "shutdown_seconds", "factory_reset_config", "nodedb_reset"] | None: ... + def HasField(self, field_name: typing.Literal["add_contact", b"add_contact", "backup_preferences", b"backup_preferences", "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_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "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", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_response", "key_verification", b"key_verification", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", b"remove_ignored_node", "restore_preferences", b"restore_preferences", "send_input_event", b"send_input_event", "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_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["add_contact", b"add_contact", "backup_preferences", b"backup_preferences", "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_config", b"factory_reset_config", "factory_reset_device", b"factory_reset_device", "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", "get_ui_config_request", b"get_ui_config_request", "get_ui_config_response", b"get_ui_config_response", "key_verification", b"key_verification", "nodedb_reset", b"nodedb_reset", "payload_variant", b"payload_variant", "reboot_ota_seconds", b"reboot_ota_seconds", "reboot_seconds", b"reboot_seconds", "remove_backup_preferences", b"remove_backup_preferences", "remove_by_nodenum", b"remove_by_nodenum", "remove_favorite_node", b"remove_favorite_node", "remove_fixed_position", b"remove_fixed_position", "remove_ignored_node", b"remove_ignored_node", "restore_preferences", b"restore_preferences", "send_input_event", b"send_input_event", "session_passkey", b"session_passkey", "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_ignored_node", b"set_ignored_node", "set_module_config", b"set_module_config", "set_owner", b"set_owner", "set_ringtone_message", b"set_ringtone_message", "set_scale", b"set_scale", "set_time_only", b"set_time_only", "shutdown_seconds", b"shutdown_seconds", "store_ui_config", b"store_ui_config"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.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_scale", "backup_preferences", "restore_preferences", "remove_backup_preferences", "send_input_event", "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", "set_time_only", "get_ui_config_request", "get_ui_config_response", "store_ui_config", "set_ignored_node", "remove_ignored_node", "begin_edit_settings", "commit_edit_settings", "add_contact", "key_verification", "factory_reset_device", "reboot_ota_seconds", "exit_simulator", "reboot_seconds", "shutdown_seconds", "factory_reset_config", "nodedb_reset"] | None: ... global___AdminMessage = AdminMessage @@ -699,3 +762,122 @@ class NodeRemoteHardwarePinsResponse(google.protobuf.message.Message): def ClearField(self, field_name: typing.Literal["node_remote_hardware_pins", b"node_remote_hardware_pins"]) -> None: ... global___NodeRemoteHardwarePinsResponse = NodeRemoteHardwarePinsResponse + +@typing.final +class SharedContact(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NODE_NUM_FIELD_NUMBER: builtins.int + USER_FIELD_NUMBER: builtins.int + SHOULD_IGNORE_FIELD_NUMBER: builtins.int + node_num: builtins.int + """ + The node number of the contact + """ + should_ignore: builtins.bool + """ + Add this contact to the blocked / ignored list + """ + @property + def user(self) -> meshtastic.protobuf.mesh_pb2.User: + """ + The User of the contact + """ + + def __init__( + self, + *, + node_num: builtins.int = ..., + user: meshtastic.protobuf.mesh_pb2.User | None = ..., + should_ignore: builtins.bool = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["user", b"user"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["node_num", b"node_num", "should_ignore", b"should_ignore", "user", b"user"]) -> None: ... + +global___SharedContact = SharedContact + +@typing.final +class KeyVerificationAdmin(google.protobuf.message.Message): + """ + This message is used by a client to initiate or complete a key verification + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class _MessageType: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _MessageTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[KeyVerificationAdmin._MessageType.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + INITIATE_VERIFICATION: KeyVerificationAdmin._MessageType.ValueType # 0 + """ + This is the first stage, where a client initiates + """ + PROVIDE_SECURITY_NUMBER: KeyVerificationAdmin._MessageType.ValueType # 1 + """ + After the nonce has been returned over the mesh, the client prompts for the security number + And uses this message to provide it to the node. + """ + DO_VERIFY: KeyVerificationAdmin._MessageType.ValueType # 2 + """ + Once the user has compared the verification message, this message notifies the node. + """ + DO_NOT_VERIFY: KeyVerificationAdmin._MessageType.ValueType # 3 + """ + This is the cancel path, can be taken at any point + """ + + class MessageType(_MessageType, metaclass=_MessageTypeEnumTypeWrapper): + """ + Three stages of this request. + """ + + INITIATE_VERIFICATION: KeyVerificationAdmin.MessageType.ValueType # 0 + """ + This is the first stage, where a client initiates + """ + PROVIDE_SECURITY_NUMBER: KeyVerificationAdmin.MessageType.ValueType # 1 + """ + After the nonce has been returned over the mesh, the client prompts for the security number + And uses this message to provide it to the node. + """ + DO_VERIFY: KeyVerificationAdmin.MessageType.ValueType # 2 + """ + Once the user has compared the verification message, this message notifies the node. + """ + DO_NOT_VERIFY: KeyVerificationAdmin.MessageType.ValueType # 3 + """ + This is the cancel path, can be taken at any point + """ + + MESSAGE_TYPE_FIELD_NUMBER: builtins.int + REMOTE_NODENUM_FIELD_NUMBER: builtins.int + NONCE_FIELD_NUMBER: builtins.int + SECURITY_NUMBER_FIELD_NUMBER: builtins.int + message_type: global___KeyVerificationAdmin.MessageType.ValueType + remote_nodenum: builtins.int + """ + The nodenum we're requesting + """ + nonce: builtins.int + """ + The nonce is used to track the connection + """ + security_number: builtins.int + """ + The 4 digit code generated by the remote node, and communicated outside the mesh + """ + def __init__( + self, + *, + message_type: global___KeyVerificationAdmin.MessageType.ValueType = ..., + remote_nodenum: builtins.int = ..., + nonce: builtins.int = ..., + security_number: builtins.int | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["_security_number", b"_security_number", "security_number", b"security_number"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_security_number", b"_security_number", "message_type", b"message_type", "nonce", b"nonce", "remote_nodenum", b"remote_nodenum", "security_number", b"security_number"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["_security_number", b"_security_number"]) -> typing.Literal["security_number"] | None: ... + +global___KeyVerificationAdmin = KeyVerificationAdmin diff --git a/meshtastic/protobuf/config_pb2.py b/meshtastic/protobuf/config_pb2.py index 13bc31c..ea51ed0 100644 --- a/meshtastic/protobuf/config_pb2.py +++ b/meshtastic/protobuf/config_pb2.py @@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default() from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/config.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/device_ui.proto\"\xbb(\n\x06\x43onfig\x12:\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfigH\x00\x12>\n\x08position\x18\x02 \x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfigH\x00\x12\x38\n\x05power\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfigH\x00\x12<\n\x07network\x18\x04 \x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfigH\x00\x12<\n\x07\x64isplay\x18\x05 \x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfigH\x00\x12\x36\n\x04lora\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfigH\x00\x12@\n\tbluetooth\x18\x07 \x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfigH\x00\x12>\n\x08security\x18\x08 \x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfigH\x00\x12\x42\n\nsessionkey\x18\t \x01(\x0b\x32,.meshtastic.protobuf.Config.SessionkeyConfigH\x00\x12\x38\n\tdevice_ui\x18\n \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x1a\xc7\x05\n\x0c\x44\x65viceConfig\x12;\n\x04role\x18\x01 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x1a\n\x0eserial_enabled\x18\x02 \x01(\x08\x42\x02\x18\x01\x12\x13\n\x0b\x62utton_gpio\x18\x04 \x01(\r\x12\x13\n\x0b\x62uzzer_gpio\x18\x05 \x01(\r\x12R\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32\x38.meshtastic.protobuf.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\x16\n\nis_managed\x18\t \x01(\x08\x42\x02\x18\x01\x12\x1c\n\x14\x64isable_triple_click\x18\n \x01(\x08\x12\r\n\x05tzdef\x18\x0b \x01(\t\x12\x1e\n\x16led_heartbeat_disabled\x18\x0c \x01(\x08\"\xbf\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\x15\n\rROUTER_CLIENT\x10\x03\x1a\x02\x08\x01\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\x12\x0f\n\x0bROUTER_LATE\x10\x0b\"s\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\x12\x08\n\x04NONE\x10\x04\x12\x16\n\x12\x43ORE_PORTNUMS_ONLY\x10\x05\x1a\x9a\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\x44\n\x08gps_mode\x18\r \x01(\x0e\x32\x32.meshtastic.protobuf.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\x84\x02\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\x12\x18\n\x10powermon_enables\x18 \x01(\x04\x1a\xe1\x03\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\x12K\n\x0c\x61\x64\x64ress_mode\x18\x07 \x01(\x0e\x32\x35.meshtastic.protobuf.Config.NetworkConfig.AddressMode\x12I\n\x0bipv4_config\x18\x08 \x01(\x0b\x32\x34.meshtastic.protobuf.Config.NetworkConfig.IpV4Config\x12\x16\n\x0ersyslog_server\x18\t \x01(\t\x12\x19\n\x11\x65nabled_protocols\x18\n \x01(\r\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\"4\n\rProtocolFlags\x12\x10\n\x0cNO_BROADCAST\x10\x00\x12\x11\n\rUDP_BROADCAST\x10\x01\x1a\xa9\x08\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01 \x01(\r\x12Q\n\ngps_format\x18\x02 \x01(\x0e\x32=.meshtastic.protobuf.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\x45\n\x05units\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.Config.DisplayConfig.DisplayUnits\x12@\n\x04oled\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.DisplayConfig.OledType\x12J\n\x0b\x64isplaymode\x18\x08 \x01(\x0e\x32\x35.meshtastic.protobuf.Config.DisplayConfig.DisplayMode\x12\x14\n\x0cheading_bold\x18\t \x01(\x08\x12\x1d\n\x15wake_on_tap_or_motion\x18\n \x01(\x08\x12Y\n\x13\x63ompass_orientation\x18\x0b \x01(\x0e\x32<.meshtastic.protobuf.Config.DisplayConfig.CompassOrientation\x12\x15\n\ruse_12h_clock\x18\x0c \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\"e\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\x12\x16\n\x12OLED_SH1107_128_64\x10\x04\"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\"\xba\x01\n\x12\x43ompassOrientation\x12\r\n\tDEGREES_0\x10\x00\x12\x0e\n\nDEGREES_90\x10\x01\x12\x0f\n\x0b\x44\x45GREES_180\x10\x02\x12\x0f\n\x0b\x44\x45GREES_270\x10\x03\x12\x16\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x12\x17\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x12\x18\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x12\x18\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\xaf\x07\n\nLoRaConfig\x12\x12\n\nuse_preset\x18\x01 \x01(\x08\x12H\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32\x32.meshtastic.protobuf.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\x41\n\x06region\x18\x07 \x01(\x0e\x32\x31.meshtastic.protobuf.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\x0fpa_fan_disabled\x18\x0f \x01(\x08\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x13\n\x0bignore_mqtt\x18h \x01(\x08\x12\x19\n\x11\x63onfig_ok_to_mqtt\x18i \x01(\x08\"\xf1\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\x12\n\n\x06PH_433\x10\x13\x12\n\n\x06PH_868\x10\x14\x12\n\n\x06PH_915\x10\x15\"\xa9\x01\n\x0bModemPreset\x12\r\n\tLONG_FAST\x10\x00\x12\r\n\tLONG_SLOW\x10\x01\x12\x16\n\x0eVERY_LONG_SLOW\x10\x02\x1a\x02\x08\x01\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\x12\x0f\n\x0bSHORT_TURBO\x10\x08\x1a\xb6\x01\n\x0f\x42luetoothConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x45\n\x04mode\x18\x02 \x01(\x0e\x32\x37.meshtastic.protobuf.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\x1a\xb6\x01\n\x0eSecurityConfig\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\x12\x13\n\x0bprivate_key\x18\x02 \x01(\x0c\x12\x11\n\tadmin_key\x18\x03 \x03(\x0c\x12\x12\n\nis_managed\x18\x04 \x01(\x08\x12\x16\n\x0eserial_enabled\x18\x05 \x01(\x08\x12\x1d\n\x15\x64\x65\x62ug_log_api_enabled\x18\x06 \x01(\x08\x12\x1d\n\x15\x61\x64min_channel_enabled\x18\x08 \x01(\x08\x1a\x12\n\x10SessionkeyConfigB\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 meshtastic/protobuf/config.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/device_ui.proto\"\xf1)\n\x06\x43onfig\x12:\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfigH\x00\x12>\n\x08position\x18\x02 \x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfigH\x00\x12\x38\n\x05power\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfigH\x00\x12<\n\x07network\x18\x04 \x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfigH\x00\x12<\n\x07\x64isplay\x18\x05 \x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfigH\x00\x12\x36\n\x04lora\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfigH\x00\x12@\n\tbluetooth\x18\x07 \x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfigH\x00\x12>\n\x08security\x18\x08 \x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfigH\x00\x12\x42\n\nsessionkey\x18\t \x01(\x0b\x32,.meshtastic.protobuf.Config.SessionkeyConfigH\x00\x12\x38\n\tdevice_ui\x18\n \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x1a\xe7\x06\n\x0c\x44\x65viceConfig\x12;\n\x04role\x18\x01 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x1a\n\x0eserial_enabled\x18\x02 \x01(\x08\x42\x02\x18\x01\x12\x13\n\x0b\x62utton_gpio\x18\x04 \x01(\r\x12\x13\n\x0b\x62uzzer_gpio\x18\x05 \x01(\r\x12R\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32\x38.meshtastic.protobuf.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\x16\n\nis_managed\x18\t \x01(\x08\x42\x02\x18\x01\x12\x1c\n\x14\x64isable_triple_click\x18\n \x01(\x08\x12\r\n\x05tzdef\x18\x0b \x01(\t\x12\x1e\n\x16led_heartbeat_disabled\x18\x0c \x01(\x08\x12H\n\x0b\x62uzzer_mode\x18\r \x01(\x0e\x32\x33.meshtastic.protobuf.Config.DeviceConfig.BuzzerMode\"\xbf\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\x15\n\rROUTER_CLIENT\x10\x03\x1a\x02\x08\x01\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\x12\x0f\n\x0bROUTER_LATE\x10\x0b\"s\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\x12\x08\n\x04NONE\x10\x04\x12\x16\n\x12\x43ORE_PORTNUMS_ONLY\x10\x05\"T\n\nBuzzerMode\x12\x0f\n\x0b\x41LL_ENABLED\x10\x00\x12\x0c\n\x08\x44ISABLED\x10\x01\x12\x16\n\x12NOTIFICATIONS_ONLY\x10\x02\x12\x0f\n\x0bSYSTEM_ONLY\x10\x03\x1a\x9a\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\x44\n\x08gps_mode\x18\r \x01(\x0e\x32\x32.meshtastic.protobuf.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\x84\x02\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\x12\x18\n\x10powermon_enables\x18 \x01(\x04\x1a\xf7\x03\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\x12K\n\x0c\x61\x64\x64ress_mode\x18\x07 \x01(\x0e\x32\x35.meshtastic.protobuf.Config.NetworkConfig.AddressMode\x12I\n\x0bipv4_config\x18\x08 \x01(\x0b\x32\x34.meshtastic.protobuf.Config.NetworkConfig.IpV4Config\x12\x16\n\x0ersyslog_server\x18\t \x01(\t\x12\x19\n\x11\x65nabled_protocols\x18\n \x01(\r\x12\x14\n\x0cipv6_enabled\x18\x0b \x01(\x08\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\"4\n\rProtocolFlags\x12\x10\n\x0cNO_BROADCAST\x10\x00\x12\x11\n\rUDP_BROADCAST\x10\x01\x1a\xa9\x08\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01 \x01(\r\x12Q\n\ngps_format\x18\x02 \x01(\x0e\x32=.meshtastic.protobuf.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\x45\n\x05units\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.Config.DisplayConfig.DisplayUnits\x12@\n\x04oled\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.DisplayConfig.OledType\x12J\n\x0b\x64isplaymode\x18\x08 \x01(\x0e\x32\x35.meshtastic.protobuf.Config.DisplayConfig.DisplayMode\x12\x14\n\x0cheading_bold\x18\t \x01(\x08\x12\x1d\n\x15wake_on_tap_or_motion\x18\n \x01(\x08\x12Y\n\x13\x63ompass_orientation\x18\x0b \x01(\x0e\x32<.meshtastic.protobuf.Config.DisplayConfig.CompassOrientation\x12\x15\n\ruse_12h_clock\x18\x0c \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\"e\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\x12\x16\n\x12OLED_SH1107_128_64\x10\x04\"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\"\xba\x01\n\x12\x43ompassOrientation\x12\r\n\tDEGREES_0\x10\x00\x12\x0e\n\nDEGREES_90\x10\x01\x12\x0f\n\x0b\x44\x45GREES_180\x10\x02\x12\x0f\n\x0b\x44\x45GREES_270\x10\x03\x12\x16\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x12\x17\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x12\x18\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x12\x18\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\xaf\x07\n\nLoRaConfig\x12\x12\n\nuse_preset\x18\x01 \x01(\x08\x12H\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32\x32.meshtastic.protobuf.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\x41\n\x06region\x18\x07 \x01(\x0e\x32\x31.meshtastic.protobuf.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\x0fpa_fan_disabled\x18\x0f \x01(\x08\x12\x17\n\x0fignore_incoming\x18g \x03(\r\x12\x13\n\x0bignore_mqtt\x18h \x01(\x08\x12\x19\n\x11\x63onfig_ok_to_mqtt\x18i \x01(\x08\"\xf1\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\x12\n\n\x06PH_433\x10\x13\x12\n\n\x06PH_868\x10\x14\x12\n\n\x06PH_915\x10\x15\"\xa9\x01\n\x0bModemPreset\x12\r\n\tLONG_FAST\x10\x00\x12\r\n\tLONG_SLOW\x10\x01\x12\x16\n\x0eVERY_LONG_SLOW\x10\x02\x1a\x02\x08\x01\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\x12\x0f\n\x0bSHORT_TURBO\x10\x08\x1a\xb6\x01\n\x0f\x42luetoothConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x45\n\x04mode\x18\x02 \x01(\x0e\x32\x37.meshtastic.protobuf.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\x1a\xb6\x01\n\x0eSecurityConfig\x12\x12\n\npublic_key\x18\x01 \x01(\x0c\x12\x13\n\x0bprivate_key\x18\x02 \x01(\x0c\x12\x11\n\tadmin_key\x18\x03 \x03(\x0c\x12\x12\n\nis_managed\x18\x04 \x01(\x08\x12\x16\n\x0eserial_enabled\x18\x05 \x01(\x08\x12\x1d\n\x15\x64\x65\x62ug_log_api_enabled\x18\x06 \x01(\x08\x12\x1d\n\x15\x61\x64min_channel_enabled\x18\x08 \x01(\x08\x1a\x12\n\x10SessionkeyConfigB\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') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -35,53 +35,55 @@ if _descriptor._USE_C_DESCRIPTORS == False: _CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._options = None _CONFIG_LORACONFIG_MODEMPRESET.values_by_name["VERY_LONG_SLOW"]._serialized_options = b'\010\001' _globals['_CONFIG']._serialized_start=95 - _globals['_CONFIG']._serialized_end=5274 + _globals['_CONFIG']._serialized_end=5456 _globals['_CONFIG_DEVICECONFIG']._serialized_start=724 - _globals['_CONFIG_DEVICECONFIG']._serialized_end=1435 - _globals['_CONFIG_DEVICECONFIG_ROLE']._serialized_start=1127 - _globals['_CONFIG_DEVICECONFIG_ROLE']._serialized_end=1318 - _globals['_CONFIG_DEVICECONFIG_REBROADCASTMODE']._serialized_start=1320 - _globals['_CONFIG_DEVICECONFIG_REBROADCASTMODE']._serialized_end=1435 - _globals['_CONFIG_POSITIONCONFIG']._serialized_start=1438 - _globals['_CONFIG_POSITIONCONFIG']._serialized_end=2104 - _globals['_CONFIG_POSITIONCONFIG_POSITIONFLAGS']._serialized_start=1878 - _globals['_CONFIG_POSITIONCONFIG_POSITIONFLAGS']._serialized_end=2049 - _globals['_CONFIG_POSITIONCONFIG_GPSMODE']._serialized_start=2051 - _globals['_CONFIG_POSITIONCONFIG_GPSMODE']._serialized_end=2104 - _globals['_CONFIG_POWERCONFIG']._serialized_start=2107 - _globals['_CONFIG_POWERCONFIG']._serialized_end=2367 - _globals['_CONFIG_NETWORKCONFIG']._serialized_start=2370 - _globals['_CONFIG_NETWORKCONFIG']._serialized_end=2851 - _globals['_CONFIG_NETWORKCONFIG_IPV4CONFIG']._serialized_start=2690 - _globals['_CONFIG_NETWORKCONFIG_IPV4CONFIG']._serialized_end=2760 - _globals['_CONFIG_NETWORKCONFIG_ADDRESSMODE']._serialized_start=2762 - _globals['_CONFIG_NETWORKCONFIG_ADDRESSMODE']._serialized_end=2797 - _globals['_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_start=2799 - _globals['_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_end=2851 - _globals['_CONFIG_DISPLAYCONFIG']._serialized_start=2854 - _globals['_CONFIG_DISPLAYCONFIG']._serialized_end=3919 - _globals['_CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT']._serialized_start=3441 - _globals['_CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT']._serialized_end=3518 - _globals['_CONFIG_DISPLAYCONFIG_DISPLAYUNITS']._serialized_start=3520 - _globals['_CONFIG_DISPLAYCONFIG_DISPLAYUNITS']._serialized_end=3560 - _globals['_CONFIG_DISPLAYCONFIG_OLEDTYPE']._serialized_start=3562 - _globals['_CONFIG_DISPLAYCONFIG_OLEDTYPE']._serialized_end=3663 - _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_start=3665 - _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_end=3730 - _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=3733 - _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=3919 - _globals['_CONFIG_LORACONFIG']._serialized_start=3922 - _globals['_CONFIG_LORACONFIG']._serialized_end=4865 - _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_start=4452 - _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_end=4693 - _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_start=4696 - _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_end=4865 - _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_start=4868 - _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_end=5050 - _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=4994 - _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=5050 - _globals['_CONFIG_SECURITYCONFIG']._serialized_start=5053 - _globals['_CONFIG_SECURITYCONFIG']._serialized_end=5235 - _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_start=5237 - _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_end=5255 + _globals['_CONFIG_DEVICECONFIG']._serialized_end=1595 + _globals['_CONFIG_DEVICECONFIG_ROLE']._serialized_start=1201 + _globals['_CONFIG_DEVICECONFIG_ROLE']._serialized_end=1392 + _globals['_CONFIG_DEVICECONFIG_REBROADCASTMODE']._serialized_start=1394 + _globals['_CONFIG_DEVICECONFIG_REBROADCASTMODE']._serialized_end=1509 + _globals['_CONFIG_DEVICECONFIG_BUZZERMODE']._serialized_start=1511 + _globals['_CONFIG_DEVICECONFIG_BUZZERMODE']._serialized_end=1595 + _globals['_CONFIG_POSITIONCONFIG']._serialized_start=1598 + _globals['_CONFIG_POSITIONCONFIG']._serialized_end=2264 + _globals['_CONFIG_POSITIONCONFIG_POSITIONFLAGS']._serialized_start=2038 + _globals['_CONFIG_POSITIONCONFIG_POSITIONFLAGS']._serialized_end=2209 + _globals['_CONFIG_POSITIONCONFIG_GPSMODE']._serialized_start=2211 + _globals['_CONFIG_POSITIONCONFIG_GPSMODE']._serialized_end=2264 + _globals['_CONFIG_POWERCONFIG']._serialized_start=2267 + _globals['_CONFIG_POWERCONFIG']._serialized_end=2527 + _globals['_CONFIG_NETWORKCONFIG']._serialized_start=2530 + _globals['_CONFIG_NETWORKCONFIG']._serialized_end=3033 + _globals['_CONFIG_NETWORKCONFIG_IPV4CONFIG']._serialized_start=2872 + _globals['_CONFIG_NETWORKCONFIG_IPV4CONFIG']._serialized_end=2942 + _globals['_CONFIG_NETWORKCONFIG_ADDRESSMODE']._serialized_start=2944 + _globals['_CONFIG_NETWORKCONFIG_ADDRESSMODE']._serialized_end=2979 + _globals['_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_start=2981 + _globals['_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_end=3033 + _globals['_CONFIG_DISPLAYCONFIG']._serialized_start=3036 + _globals['_CONFIG_DISPLAYCONFIG']._serialized_end=4101 + _globals['_CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT']._serialized_start=3623 + _globals['_CONFIG_DISPLAYCONFIG_GPSCOORDINATEFORMAT']._serialized_end=3700 + _globals['_CONFIG_DISPLAYCONFIG_DISPLAYUNITS']._serialized_start=3702 + _globals['_CONFIG_DISPLAYCONFIG_DISPLAYUNITS']._serialized_end=3742 + _globals['_CONFIG_DISPLAYCONFIG_OLEDTYPE']._serialized_start=3744 + _globals['_CONFIG_DISPLAYCONFIG_OLEDTYPE']._serialized_end=3845 + _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_start=3847 + _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_end=3912 + _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=3915 + _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=4101 + _globals['_CONFIG_LORACONFIG']._serialized_start=4104 + _globals['_CONFIG_LORACONFIG']._serialized_end=5047 + _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_start=4634 + _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_end=4875 + _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_start=4878 + _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_end=5047 + _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_start=5050 + _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_end=5232 + _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=5176 + _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=5232 + _globals['_CONFIG_SECURITYCONFIG']._serialized_start=5235 + _globals['_CONFIG_SECURITYCONFIG']._serialized_end=5417 + _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_start=5419 + _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_end=5437 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index 8a32e8f..3febd65 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -272,6 +272,61 @@ class Config(google.protobuf.message.Message): Only rebroadcasts packets with standard portnums: NodeInfo, Text, Position, Telemetry, and Routing. """ + class _BuzzerMode: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _BuzzerModeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Config.DeviceConfig._BuzzerMode.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + ALL_ENABLED: Config.DeviceConfig._BuzzerMode.ValueType # 0 + """ + Default behavior. + Buzzer is enabled for all audio feedback including button presses and alerts. + """ + DISABLED: Config.DeviceConfig._BuzzerMode.ValueType # 1 + """ + Disabled. + All buzzer audio feedback is disabled. + """ + NOTIFICATIONS_ONLY: Config.DeviceConfig._BuzzerMode.ValueType # 2 + """ + Notifications Only. + Buzzer is enabled only for notifications and alerts, but not for button presses. + External notification config determines the specifics of the notification behavior. + """ + SYSTEM_ONLY: Config.DeviceConfig._BuzzerMode.ValueType # 3 + """ + Non-notification system buzzer tones only. + Buzzer is enabled only for non-notification tones such as button presses, startup, shutdown, but not for alerts. + """ + + class BuzzerMode(_BuzzerMode, metaclass=_BuzzerModeEnumTypeWrapper): + """ + Defines buzzer behavior for audio feedback + """ + + ALL_ENABLED: Config.DeviceConfig.BuzzerMode.ValueType # 0 + """ + Default behavior. + Buzzer is enabled for all audio feedback including button presses and alerts. + """ + DISABLED: Config.DeviceConfig.BuzzerMode.ValueType # 1 + """ + Disabled. + All buzzer audio feedback is disabled. + """ + NOTIFICATIONS_ONLY: Config.DeviceConfig.BuzzerMode.ValueType # 2 + """ + Notifications Only. + Buzzer is enabled only for notifications and alerts, but not for button presses. + External notification config determines the specifics of the notification behavior. + """ + SYSTEM_ONLY: Config.DeviceConfig.BuzzerMode.ValueType # 3 + """ + Non-notification system buzzer tones only. + Buzzer is enabled only for non-notification tones such as button presses, startup, shutdown, but not for alerts. + """ + ROLE_FIELD_NUMBER: builtins.int SERIAL_ENABLED_FIELD_NUMBER: builtins.int BUTTON_GPIO_FIELD_NUMBER: builtins.int @@ -283,6 +338,7 @@ class Config(google.protobuf.message.Message): DISABLE_TRIPLE_CLICK_FIELD_NUMBER: builtins.int TZDEF_FIELD_NUMBER: builtins.int LED_HEARTBEAT_DISABLED_FIELD_NUMBER: builtins.int + BUZZER_MODE_FIELD_NUMBER: builtins.int role: global___Config.DeviceConfig.Role.ValueType """ Sets the role of node @@ -333,6 +389,11 @@ class Config(google.protobuf.message.Message): """ If true, disable the default blinking LED (LED_PIN) behavior on the device """ + buzzer_mode: global___Config.DeviceConfig.BuzzerMode.ValueType + """ + Controls buzzer behavior for audio feedback + Defaults to ENABLED + """ def __init__( self, *, @@ -347,8 +408,9 @@ class Config(google.protobuf.message.Message): disable_triple_click: builtins.bool = ..., tzdef: builtins.str = ..., led_heartbeat_disabled: builtins.bool = ..., + buzzer_mode: global___Config.DeviceConfig.BuzzerMode.ValueType = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["button_gpio", b"button_gpio", "buzzer_gpio", b"buzzer_gpio", "disable_triple_click", b"disable_triple_click", "double_tap_as_button_press", b"double_tap_as_button_press", "is_managed", b"is_managed", "led_heartbeat_disabled", b"led_heartbeat_disabled", "node_info_broadcast_secs", b"node_info_broadcast_secs", "rebroadcast_mode", b"rebroadcast_mode", "role", b"role", "serial_enabled", b"serial_enabled", "tzdef", b"tzdef"]) -> None: ... + def ClearField(self, field_name: typing.Literal["button_gpio", b"button_gpio", "buzzer_gpio", b"buzzer_gpio", "buzzer_mode", b"buzzer_mode", "disable_triple_click", b"disable_triple_click", "double_tap_as_button_press", b"double_tap_as_button_press", "is_managed", b"is_managed", "led_heartbeat_disabled", b"led_heartbeat_disabled", "node_info_broadcast_secs", b"node_info_broadcast_secs", "rebroadcast_mode", b"rebroadcast_mode", "role", b"role", "serial_enabled", b"serial_enabled", "tzdef", b"tzdef"]) -> None: ... @typing.final class PositionConfig(google.protobuf.message.Message): @@ -781,6 +843,7 @@ class Config(google.protobuf.message.Message): IPV4_CONFIG_FIELD_NUMBER: builtins.int RSYSLOG_SERVER_FIELD_NUMBER: builtins.int ENABLED_PROTOCOLS_FIELD_NUMBER: builtins.int + IPV6_ENABLED_FIELD_NUMBER: builtins.int wifi_enabled: builtins.bool """ Enable WiFi (disables Bluetooth) @@ -814,6 +877,10 @@ class Config(google.protobuf.message.Message): """ Flags for enabling/disabling network protocols """ + ipv6_enabled: builtins.bool + """ + Enable/Disable ipv6 support + """ @property def ipv4_config(self) -> global___Config.NetworkConfig.IpV4Config: """ @@ -832,9 +899,10 @@ class Config(google.protobuf.message.Message): ipv4_config: global___Config.NetworkConfig.IpV4Config | None = ..., rsyslog_server: builtins.str = ..., enabled_protocols: builtins.int = ..., + ipv6_enabled: builtins.bool = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["ipv4_config", b"ipv4_config"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["address_mode", b"address_mode", "enabled_protocols", b"enabled_protocols", "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: ... + def ClearField(self, field_name: typing.Literal["address_mode", b"address_mode", "enabled_protocols", b"enabled_protocols", "eth_enabled", b"eth_enabled", "ipv4_config", b"ipv4_config", "ipv6_enabled", b"ipv6_enabled", "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.final class DisplayConfig(google.protobuf.message.Message): diff --git a/meshtastic/protobuf/device_ui_pb2.py b/meshtastic/protobuf/device_ui_pb2.py index b11c3b7..0d2cc2f 100644 --- a/meshtastic/protobuf/device_ui_pb2.py +++ b/meshtastic/protobuf/device_ui_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\"\xeb\x03\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x19\n\x11screen_brightness\x18\x02 \x01(\r\x12\x16\n\x0escreen_timeout\x18\x03 \x01(\r\x12\x13\n\x0bscreen_lock\x18\x04 \x01(\x08\x12\x15\n\rsettings_lock\x18\x05 \x01(\x08\x12\x10\n\x08pin_code\x18\x06 \x01(\r\x12)\n\x05theme\x18\x07 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x15\n\ralert_enabled\x18\x08 \x01(\x08\x12\x16\n\x0e\x62\x61nner_enabled\x18\t \x01(\x08\x12\x14\n\x0cring_tone_id\x18\n \x01(\r\x12/\n\x08language\x18\x0b \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\r \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x18\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\x12*\n\x08map_data\x18\x0f \x01(\x0b\x32\x18.meshtastic.protobuf.Map\"\xa7\x01\n\nNodeFilter\x12\x16\n\x0eunknown_switch\x18\x01 \x01(\x08\x12\x16\n\x0eoffline_switch\x18\x02 \x01(\x08\x12\x19\n\x11public_key_switch\x18\x03 \x01(\x08\x12\x11\n\thops_away\x18\x04 \x01(\x05\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x11\n\tnode_name\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\x05\"~\n\rNodeHighlight\x12\x13\n\x0b\x63hat_switch\x18\x01 \x01(\x08\x12\x17\n\x0fposition_switch\x18\x02 \x01(\x08\x12\x18\n\x10telemetry_switch\x18\x03 \x01(\x08\x12\x12\n\niaq_switch\x18\x04 \x01(\x08\x12\x11\n\tnode_name\x18\x05 \x01(\t\"=\n\x08GeoPoint\x12\x0c\n\x04zoom\x18\x01 \x01(\x05\x12\x10\n\x08latitude\x18\x02 \x01(\x05\x12\x11\n\tlongitude\x18\x03 \x01(\x05\"U\n\x03Map\x12+\n\x04home\x18\x01 \x01(\x0b\x32\x1d.meshtastic.protobuf.GeoPoint\x12\r\n\x05style\x18\x02 \x01(\t\x12\x12\n\nfollow_gps\x18\x03 \x01(\x08*%\n\x05Theme\x12\x08\n\x04\x44\x41RK\x10\x00\x12\t\n\x05LIGHT\x10\x01\x12\x07\n\x03RED\x10\x02*\x9a\x02\n\x08Language\x12\x0b\n\x07\x45NGLISH\x10\x00\x12\n\n\x06\x46RENCH\x10\x01\x12\n\n\x06GERMAN\x10\x02\x12\x0b\n\x07ITALIAN\x10\x03\x12\x0e\n\nPORTUGUESE\x10\x04\x12\x0b\n\x07SPANISH\x10\x05\x12\x0b\n\x07SWEDISH\x10\x06\x12\x0b\n\x07\x46INNISH\x10\x07\x12\n\n\x06POLISH\x10\x08\x12\x0b\n\x07TURKISH\x10\t\x12\x0b\n\x07SERBIAN\x10\n\x12\x0b\n\x07RUSSIAN\x10\x0b\x12\t\n\x05\x44UTCH\x10\x0c\x12\t\n\x05GREEK\x10\r\x12\r\n\tNORWEGIAN\x10\x0e\x12\r\n\tSLOVENIAN\x10\x0f\x12\r\n\tUKRAINIAN\x10\x10\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x63\n\x13\x63om.geeksville.meshB\x0e\x44\x65viceUIProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\"\xeb\x03\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x19\n\x11screen_brightness\x18\x02 \x01(\r\x12\x16\n\x0escreen_timeout\x18\x03 \x01(\r\x12\x13\n\x0bscreen_lock\x18\x04 \x01(\x08\x12\x15\n\rsettings_lock\x18\x05 \x01(\x08\x12\x10\n\x08pin_code\x18\x06 \x01(\r\x12)\n\x05theme\x18\x07 \x01(\x0e\x32\x1a.meshtastic.protobuf.Theme\x12\x15\n\ralert_enabled\x18\x08 \x01(\x08\x12\x16\n\x0e\x62\x61nner_enabled\x18\t \x01(\x08\x12\x14\n\x0cring_tone_id\x18\n \x01(\r\x12/\n\x08language\x18\x0b \x01(\x0e\x32\x1d.meshtastic.protobuf.Language\x12\x34\n\x0bnode_filter\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.NodeFilter\x12:\n\x0enode_highlight\x18\r \x01(\x0b\x32\".meshtastic.protobuf.NodeHighlight\x12\x18\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\x12*\n\x08map_data\x18\x0f \x01(\x0b\x32\x18.meshtastic.protobuf.Map\"\xa7\x01\n\nNodeFilter\x12\x16\n\x0eunknown_switch\x18\x01 \x01(\x08\x12\x16\n\x0eoffline_switch\x18\x02 \x01(\x08\x12\x19\n\x11public_key_switch\x18\x03 \x01(\x08\x12\x11\n\thops_away\x18\x04 \x01(\x05\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x11\n\tnode_name\x18\x06 \x01(\t\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\x05\"~\n\rNodeHighlight\x12\x13\n\x0b\x63hat_switch\x18\x01 \x01(\x08\x12\x17\n\x0fposition_switch\x18\x02 \x01(\x08\x12\x18\n\x10telemetry_switch\x18\x03 \x01(\x08\x12\x12\n\niaq_switch\x18\x04 \x01(\x08\x12\x11\n\tnode_name\x18\x05 \x01(\t\"=\n\x08GeoPoint\x12\x0c\n\x04zoom\x18\x01 \x01(\x05\x12\x10\n\x08latitude\x18\x02 \x01(\x05\x12\x11\n\tlongitude\x18\x03 \x01(\x05\"U\n\x03Map\x12+\n\x04home\x18\x01 \x01(\x0b\x32\x1d.meshtastic.protobuf.GeoPoint\x12\r\n\x05style\x18\x02 \x01(\t\x12\x12\n\nfollow_gps\x18\x03 \x01(\x08*%\n\x05Theme\x12\x08\n\x04\x44\x41RK\x10\x00\x12\t\n\x05LIGHT\x10\x01\x12\x07\n\x03RED\x10\x02*\xa9\x02\n\x08Language\x12\x0b\n\x07\x45NGLISH\x10\x00\x12\n\n\x06\x46RENCH\x10\x01\x12\n\n\x06GERMAN\x10\x02\x12\x0b\n\x07ITALIAN\x10\x03\x12\x0e\n\nPORTUGUESE\x10\x04\x12\x0b\n\x07SPANISH\x10\x05\x12\x0b\n\x07SWEDISH\x10\x06\x12\x0b\n\x07\x46INNISH\x10\x07\x12\n\n\x06POLISH\x10\x08\x12\x0b\n\x07TURKISH\x10\t\x12\x0b\n\x07SERBIAN\x10\n\x12\x0b\n\x07RUSSIAN\x10\x0b\x12\t\n\x05\x44UTCH\x10\x0c\x12\t\n\x05GREEK\x10\r\x12\r\n\tNORWEGIAN\x10\x0e\x12\r\n\tSLOVENIAN\x10\x0f\x12\r\n\tUKRAINIAN\x10\x10\x12\r\n\tBULGARIAN\x10\x11\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x63\n\x13\x63om.geeksville.meshB\x0e\x44\x65viceUIProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -24,7 +24,7 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['_THEME']._serialized_start=1002 _globals['_THEME']._serialized_end=1039 _globals['_LANGUAGE']._serialized_start=1042 - _globals['_LANGUAGE']._serialized_end=1324 + _globals['_LANGUAGE']._serialized_end=1339 _globals['_DEVICEUICONFIG']._serialized_start=61 _globals['_DEVICEUICONFIG']._serialized_end=552 _globals['_NODEFILTER']._serialized_start=555 diff --git a/meshtastic/protobuf/device_ui_pb2.pyi b/meshtastic/protobuf/device_ui_pb2.pyi index cd31d3b..554eeb5 100644 --- a/meshtastic/protobuf/device_ui_pb2.pyi +++ b/meshtastic/protobuf/device_ui_pb2.pyi @@ -126,6 +126,10 @@ class _LanguageEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumT """ Ukrainian """ + BULGARIAN: _Language.ValueType # 17 + """ + Bulgarian + """ SIMPLIFIED_CHINESE: _Language.ValueType # 30 """ Simplified Chinese (experimental) @@ -208,6 +212,10 @@ UKRAINIAN: Language.ValueType # 16 """ Ukrainian """ +BULGARIAN: Language.ValueType # 17 +""" +Bulgarian +""" SIMPLIFIED_CHINESE: Language.ValueType # 30 """ Simplified Chinese (experimental) diff --git a/meshtastic/protobuf/deviceonly_pb2.py b/meshtastic/protobuf/deviceonly_pb2.py index fdb2ad1..80f6a4f 100644 --- a/meshtastic/protobuf/deviceonly_pb2.py +++ b/meshtastic/protobuf/deviceonly_pb2.py @@ -19,7 +19,7 @@ from meshtastic.protobuf import localonly_pb2 as meshtastic_dot_protobuf_dot_loc from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/localonly.proto\x1a meshtastic/protobuf/nanopb.proto\"\x99\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\'.meshtastic.protobuf.Position.LocSource\"\xe2\x01\n\x08UserLite\x12\x13\n\x07macaddr\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x05 \x01(\x08\x12;\n\x04role\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x07 \x01(\x0c\"\xde\x02\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12+\n\x04user\x18\x02 \x01(\x0b\x32\x1d.meshtastic.protobuf.UserLite\x12\x33\n\x08position\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x10\n\x08next_hop\x18\x0c \x01(\rB\x0c\n\n_hops_away\"\xa1\x03\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x03 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x36\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x38\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x19\n\rdid_gps_reset\x18\x0b \x01(\x08\x42\x02\x18\x01\x12\x34\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12M\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"}\n\x0cNodeDatabase\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\\\n\x05nodes\x18\x02 \x03(\x0b\x32!.meshtastic.protobuf.NodeInfoLiteB*\x92?\'\x92\x01$std::vector\"N\n\x0b\x43hannelFile\x12.\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\x86\x02\n\x11\x42\x61\x63kupPreferences\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x07\x12\x30\n\x06\x63onfig\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfig\x12=\n\rmodule_config\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfig\x12\x32\n\x08\x63hannels\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.ChannelFile\x12(\n\x05owner\x18\x06 \x01(\x0b\x32\x19.meshtastic.protobuf.UserBm\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$meshtastic/protobuf/deviceonly.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/localonly.proto\x1a meshtastic/protobuf/nanopb.proto\"\x99\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\'.meshtastic.protobuf.Position.LocSource\"\x94\x02\n\x08UserLite\x12\x13\n\x07macaddr\x18\x01 \x01(\x0c\x42\x02\x18\x01\x12\x11\n\tlong_name\x18\x02 \x01(\t\x12\x12\n\nshort_name\x18\x03 \x01(\t\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x05 \x01(\x08\x12;\n\x04role\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x07 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"\xf0\x02\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12+\n\x04user\x18\x02 \x01(\x0b\x32\x1d.meshtastic.protobuf.UserLite\x12\x33\n\x08position\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x10\n\x08next_hop\x18\x0c \x01(\r\x12\x10\n\x08\x62itfield\x18\r \x01(\rB\x0c\n\n_hops_away\"\xa1\x03\n\x0b\x44\x65viceState\x12\x30\n\x07my_node\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfo\x12(\n\x05owner\x18\x03 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12\x36\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x0f\n\x07version\x18\x08 \x01(\r\x12\x38\n\x0frx_text_message\x18\x07 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x13\n\x07no_save\x18\t \x01(\x08\x42\x02\x18\x01\x12\x19\n\rdid_gps_reset\x18\x0b \x01(\x08\x42\x02\x18\x01\x12\x34\n\x0brx_waypoint\x18\x0c \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12M\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePin\"}\n\x0cNodeDatabase\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\\\n\x05nodes\x18\x02 \x03(\x0b\x32!.meshtastic.protobuf.NodeInfoLiteB*\x92?\'\x92\x01$std::vector\"N\n\x0b\x43hannelFile\x12.\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.Channel\x12\x0f\n\x07version\x18\x02 \x01(\r\"\x86\x02\n\x11\x42\x61\x63kupPreferences\x12\x0f\n\x07version\x18\x01 \x01(\r\x12\x11\n\ttimestamp\x18\x02 \x01(\x07\x12\x30\n\x06\x63onfig\x18\x03 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfig\x12=\n\rmodule_config\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfig\x12\x32\n\x08\x63hannels\x18\x05 \x01(\x0b\x32 .meshtastic.protobuf.ChannelFile\x12(\n\x05owner\x18\x06 \x01(\x0b\x32\x19.meshtastic.protobuf.UserBm\n\x13\x63om.geeksville.meshB\nDeviceOnlyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -38,15 +38,15 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['_POSITIONLITE']._serialized_start=271 _globals['_POSITIONLITE']._serialized_end=424 _globals['_USERLITE']._serialized_start=427 - _globals['_USERLITE']._serialized_end=653 - _globals['_NODEINFOLITE']._serialized_start=656 - _globals['_NODEINFOLITE']._serialized_end=1006 - _globals['_DEVICESTATE']._serialized_start=1009 - _globals['_DEVICESTATE']._serialized_end=1426 - _globals['_NODEDATABASE']._serialized_start=1428 - _globals['_NODEDATABASE']._serialized_end=1553 - _globals['_CHANNELFILE']._serialized_start=1555 - _globals['_CHANNELFILE']._serialized_end=1633 - _globals['_BACKUPPREFERENCES']._serialized_start=1636 - _globals['_BACKUPPREFERENCES']._serialized_end=1898 + _globals['_USERLITE']._serialized_end=703 + _globals['_NODEINFOLITE']._serialized_start=706 + _globals['_NODEINFOLITE']._serialized_end=1074 + _globals['_DEVICESTATE']._serialized_start=1077 + _globals['_DEVICESTATE']._serialized_end=1494 + _globals['_NODEDATABASE']._serialized_start=1496 + _globals['_NODEDATABASE']._serialized_end=1621 + _globals['_CHANNELFILE']._serialized_start=1623 + _globals['_CHANNELFILE']._serialized_end=1701 + _globals['_BACKUPPREFERENCES']._serialized_start=1704 + _globals['_BACKUPPREFERENCES']._serialized_end=1966 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/deviceonly_pb2.pyi b/meshtastic/protobuf/deviceonly_pb2.pyi index e23709d..684a7fa 100644 --- a/meshtastic/protobuf/deviceonly_pb2.pyi +++ b/meshtastic/protobuf/deviceonly_pb2.pyi @@ -79,6 +79,7 @@ class UserLite(google.protobuf.message.Message): IS_LICENSED_FIELD_NUMBER: builtins.int ROLE_FIELD_NUMBER: builtins.int PUBLIC_KEY_FIELD_NUMBER: builtins.int + IS_UNMESSAGABLE_FIELD_NUMBER: builtins.int macaddr: builtins.bytes """ This is the addr of the radio. @@ -114,6 +115,10 @@ class UserLite(google.protobuf.message.Message): The public key of the user's device. This is sent out to other nodes on the mesh to allow them to compute a shared secret key. """ + is_unmessagable: builtins.bool + """ + Whether or not the node can be messaged + """ def __init__( self, *, @@ -124,8 +129,11 @@ class UserLite(google.protobuf.message.Message): is_licensed: builtins.bool = ..., role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType = ..., public_key: builtins.bytes = ..., + is_unmessagable: builtins.bool | None = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["hw_model", b"hw_model", "is_licensed", b"is_licensed", "long_name", b"long_name", "macaddr", b"macaddr", "public_key", b"public_key", "role", b"role", "short_name", b"short_name"]) -> None: ... + def HasField(self, field_name: typing.Literal["_is_unmessagable", b"_is_unmessagable", "is_unmessagable", b"is_unmessagable"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_is_unmessagable", b"_is_unmessagable", "hw_model", b"hw_model", "is_licensed", b"is_licensed", "is_unmessagable", b"is_unmessagable", "long_name", b"long_name", "macaddr", b"macaddr", "public_key", b"public_key", "role", b"role", "short_name", b"short_name"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["_is_unmessagable", b"_is_unmessagable"]) -> typing.Literal["is_unmessagable"] | None: ... global___UserLite = UserLite @@ -145,6 +153,7 @@ class NodeInfoLite(google.protobuf.message.Message): IS_FAVORITE_FIELD_NUMBER: builtins.int IS_IGNORED_FIELD_NUMBER: builtins.int NEXT_HOP_FIELD_NUMBER: builtins.int + BITFIELD_FIELD_NUMBER: builtins.int num: builtins.int """ The node number @@ -184,6 +193,11 @@ class NodeInfoLite(google.protobuf.message.Message): """ Last byte of the node number of the node that should be used as the next hop to reach this node. """ + bitfield: builtins.int + """ + Bitfield for storing booleans. + LSB 0 is_key_manually_verified + """ @property def user(self) -> global___UserLite: """ @@ -218,9 +232,10 @@ class NodeInfoLite(google.protobuf.message.Message): is_favorite: builtins.bool = ..., is_ignored: builtins.bool = ..., next_hop: builtins.int = ..., + bitfield: builtins.int = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["_hops_away", b"_hops_away", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "position", b"position", "user", b"user"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_hops_away", b"_hops_away", "channel", b"channel", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "is_favorite", b"is_favorite", "is_ignored", b"is_ignored", "last_heard", b"last_heard", "next_hop", b"next_hop", "num", b"num", "position", b"position", "snr", b"snr", "user", b"user", "via_mqtt", b"via_mqtt"]) -> None: ... + def ClearField(self, field_name: typing.Literal["_hops_away", b"_hops_away", "bitfield", b"bitfield", "channel", b"channel", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "is_favorite", b"is_favorite", "is_ignored", b"is_ignored", "last_heard", b"last_heard", "next_hop", b"next_hop", "num", b"num", "position", b"position", "snr", b"snr", "user", b"user", "via_mqtt", b"via_mqtt"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["_hops_away", b"_hops_away"]) -> typing.Literal["hops_away"] | None: ... global___NodeInfoLite = NodeInfoLite diff --git a/meshtastic/protobuf/mesh_pb2.py b/meshtastic/protobuf/mesh_pb2.py index e1a81a9..11b6a0e 100644 --- a/meshtastic/protobuf/mesh_pb2.py +++ b/meshtastic/protobuf/mesh_pb2.py @@ -20,7 +20,7 @@ from meshtastic.protobuf import xmodem_pb2 as meshtastic_dot_protobuf_dot_xmodem from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/mesh.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/xmodem.proto\x1a#meshtastic/protobuf/device_ui.proto\"\x99\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 \x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\x12@\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\'.meshtastic.protobuf.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t \x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\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\x19\n\x0cground_speed\x18\x0f \x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 \x01(\rH\x06\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\xea\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\x34\n\x08hw_model\x18\x05 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12;\n\x04role\x18\x07 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08 \x01(\x0c\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 \x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 \x03(\x05\"\xfd\x03\n\x07Routing\x12<\n\rroute_request\x18\x01 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0broute_reply\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\"\xb0\x02\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!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%B\t\n\x07variant\"\xd4\x01\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.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\x12\x15\n\x08\x62itfield\x18\t \x01(\rH\x00\x88\x01\x01\x42\x0b\n\t_bitfield\"\xbc\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x17\n\nlatitude_i\x18\x02 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x03 \x01(\x0fH\x01\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_i\"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\"\xb6\x05\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\x19.meshtastic.protobuf.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(.meshtastic.protobuf.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c \x01(\x05\x12<\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\'.meshtastic.protobuf.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\x12\x12\n\npublic_key\x18\x10 \x01(\x0c\x12\x15\n\rpki_encrypted\x18\x11 \x01(\x08\x12\x10\n\x08next_hop\x18\x12 \x01(\r\x12\x12\n\nrelay_node\x18\x13 \x01(\r\x12\x10\n\x08tx_after\x18\x14 \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\x0c\n\x08RESPONSE\x10P\x12\x08\n\x04HIGH\x10\x64\x12\t\n\x05\x41LERT\x10n\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\"\xc0\x02\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\'\n\x04user\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12/\n\x08position\x18\x03 \x01(\x0b\x32\x1d.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x42\x0c\n\n_hops_away\"t\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\x12\x11\n\tdevice_id\x18\x0c \x01(\x0c\x12\x0f\n\x07pio_env\x18\r \x01(\t\"\xc9\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\x33\n\x05level\x18\x04 \x01(\x0e\x32$.meshtastic.protobuf.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\"\xf7\x06\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12\x31\n\x06packet\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x32\n\x07my_info\x18\x03 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfoH\x00\x12\x32\n\tnode_info\x18\x04 \x01(\x0b\x32\x1d.meshtastic.protobuf.NodeInfoH\x00\x12-\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12\x34\n\nlog_record\x18\x06 \x01(\x0b\x32\x1e.meshtastic.protobuf.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 \x01(\x08H\x00\x12\x39\n\x0cmoduleConfig\x18\t \x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12/\n\x07\x63hannel\x18\n \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x37\n\x0bqueueStatus\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.QueueStatusH\x00\x12\x33\n\x0cxmodemPacket\x18\x0c \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12\x37\n\x08metadata\x18\r \x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12M\n\x16mqttClientProxyMessage\x18\x0e \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x31\n\x08\x66ileInfo\x18\x0f \x01(\x0b\x32\x1d.meshtastic.protobuf.FileInfoH\x00\x12\x45\n\x12\x63lientNotification\x18\x10 \x01(\x0b\x32\'.meshtastic.protobuf.ClientNotificationH\x00\x12=\n\x0e\x64\x65viceuiConfig\x18\x11 \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x42\x11\n\x0fpayload_variant\"\x8c\x01\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x33\n\x05level\x18\x03 \x01(\x0e\x32$.meshtastic.protobuf.LogRecord.Level\x12\x0f\n\x07message\x18\x04 \x01(\tB\x0b\n\t_reply_id\"1\n\x08\x46ileInfo\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\xb8\x02\n\x07ToRadio\x12\x31\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 \x01(\x08H\x00\x12\x33\n\x0cxmodemPacket\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12M\n\x16mqttClientProxyMessage\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x33\n\theartbeat\x18\x07 \x01(\x0b\x32\x1e.meshtastic.protobuf.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"I\n\nCompressed\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x90\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\x30\n\tneighbors\x18\x04 \x03(\x0b\x32\x1d.meshtastic.protobuf.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\"\xe9\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-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12\x34\n\x08hw_model\x18\t \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n \x01(\x08\x12\x0e\n\x06hasPKC\x18\x0b \x01(\x08\x12\x18\n\x10\x65xcluded_modules\x18\x0c \x01(\r\"\x0b\n\tHeartbeat\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"e\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x02 \x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x03 \x01(\r\x12\x15\n\rpayload_chunk\x18\x04 \x01(\x0c\"\x1f\n\rresend_chunks\x12\x0e\n\x06\x63hunks\x18\x01 \x03(\r\"\xb3\x01\n\x16\x43hunkedPayloadResponse\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x1a\n\x10request_transfer\x18\x02 \x01(\x08H\x00\x12\x19\n\x0f\x61\x63\x63\x65pt_transfer\x18\x03 \x01(\x08H\x00\x12;\n\rresend_chunks\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.resend_chunksH\x00\x42\x11\n\x0fpayload_variant*\xda\x0e\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\x0b\n\x07WIPHONE\x10\x14\x12\x0e\n\nWIO_WM1110\x10\x15\x12\x0b\n\x07RAK2560\x10\x16\x12\x13\n\x0fHELTEC_HRU_3601\x10\x17\x12\x1a\n\x16HELTEC_WIRELESS_BRIDGE\x10\x18\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\x0b\n\x07UNPHONE\x10;\x12\x0c\n\x08TD_LORAC\x10<\x12\x13\n\x0f\x43\x44\x45\x42YTE_EORA_S3\x10=\x12\x0f\n\x0bTWC_MESH_V4\x10>\x12\x16\n\x12NRF52_PROMICRO_DIY\x10?\x12\x1f\n\x1bRADIOMASTER_900_BANDIT_NANO\x10@\x12\x1c\n\x18HELTEC_CAPSULE_SENSOR_V3\x10\x41\x12\x1d\n\x19HELTEC_VISION_MASTER_T190\x10\x42\x12\x1d\n\x19HELTEC_VISION_MASTER_E213\x10\x43\x12\x1d\n\x19HELTEC_VISION_MASTER_E290\x10\x44\x12\x19\n\x15HELTEC_MESH_NODE_T114\x10\x45\x12\x16\n\x12SENSECAP_INDICATOR\x10\x46\x12\x13\n\x0fTRACKER_T1000_E\x10G\x12\x0b\n\x07RAK3172\x10H\x12\n\n\x06WIO_E5\x10I\x12\x1a\n\x16RADIOMASTER_900_BANDIT\x10J\x12\x13\n\x0fME25LS01_4Y10TD\x10K\x12\x18\n\x14RP2040_FEATHER_RFM95\x10L\x12\x15\n\x11M5STACK_COREBASIC\x10M\x12\x11\n\rM5STACK_CORE2\x10N\x12\r\n\tRPI_PICO2\x10O\x12\x12\n\x0eM5STACK_CORES3\x10P\x12\x11\n\rSEEED_XIAO_S3\x10Q\x12\x0b\n\x07MS24SF1\x10R\x12\x0c\n\x08TLORA_C6\x10S\x12\x0f\n\x0bWISMESH_TAP\x10T\x12\r\n\tROUTASTIC\x10U\x12\x0c\n\x08MESH_TAB\x10V\x12\x0c\n\x08MESHLINK\x10W\x12\x12\n\x0eXIAO_NRF52_KIT\x10X\x12\x10\n\x0cTHINKNODE_M1\x10Y\x12\x10\n\x0cTHINKNODE_M2\x10Z\x12\x0f\n\x0bT_ETH_ELITE\x10[\x12\x15\n\x11HELTEC_SENSOR_HUB\x10\\\x12\x1a\n\x16RESERVED_FRIED_CHICKEN\x10]\x12\x16\n\x12HELTEC_MESH_POCKET\x10^\x12\x14\n\x10SEEED_SOLAR_NODE\x10_\x12\x18\n\x14NOMADSTAR_METEOR_PRO\x10`\x12\r\n\tCROWPANEL\x10\x61\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\xe9\x01*\xb4\x02\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\x12 \n\x1c\x46LASH_CORRUPTION_RECOVERABLE\x10\x0c\x12\"\n\x1e\x46LASH_CORRUPTION_UNRECOVERABLE\x10\r*\x80\x03\n\x0f\x45xcludedModules\x12\x11\n\rEXCLUDED_NONE\x10\x00\x12\x0f\n\x0bMQTT_CONFIG\x10\x01\x12\x11\n\rSERIAL_CONFIG\x10\x02\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x04\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x08\x12\x14\n\x10RANGETEST_CONFIG\x10\x10\x12\x14\n\x10TELEMETRY_CONFIG\x10 \x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10@\x12\x11\n\x0c\x41UDIO_CONFIG\x10\x80\x01\x12\x1a\n\x15REMOTEHARDWARE_CONFIG\x10\x80\x02\x12\x18\n\x13NEIGHBORINFO_CONFIG\x10\x80\x04\x12\x1b\n\x16\x41MBIENTLIGHTING_CONFIG\x10\x80\x08\x12\x1b\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x80\x10\x12\x16\n\x11PAXCOUNTER_CONFIG\x10\x80 \x12\x15\n\x10\x42LUETOOTH_CONFIG\x10\x80@\x12\x14\n\x0eNETWORK_CONFIG\x10\x80\x80\x01\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\x1emeshtastic/protobuf/mesh.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a\"meshtastic/protobuf/portnums.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/xmodem.proto\x1a#meshtastic/protobuf/device_ui.proto\"\x99\x07\n\x08Position\x12\x17\n\nlatitude_i\x18\x01 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x02 \x01(\x0fH\x01\x88\x01\x01\x12\x15\n\x08\x61ltitude\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x0c\n\x04time\x18\x04 \x01(\x07\x12@\n\x0flocation_source\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.Position.LocSource\x12@\n\x0f\x61ltitude_source\x18\x06 \x01(\x0e\x32\'.meshtastic.protobuf.Position.AltSource\x12\x11\n\ttimestamp\x18\x07 \x01(\x07\x12\x1f\n\x17timestamp_millis_adjust\x18\x08 \x01(\x05\x12\x19\n\x0c\x61ltitude_hae\x18\t \x01(\x11H\x03\x88\x01\x01\x12(\n\x1b\x61ltitude_geoidal_separation\x18\n \x01(\x11H\x04\x88\x01\x01\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\x19\n\x0cground_speed\x18\x0f \x01(\rH\x05\x88\x01\x01\x12\x19\n\x0cground_track\x18\x10 \x01(\rH\x06\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0b\n\t_altitudeB\x0f\n\r_altitude_haeB\x1e\n\x1c_altitude_geoidal_separationB\x0f\n\r_ground_speedB\x0f\n\r_ground_track\"\x9c\x02\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\x34\n\x08hw_model\x18\x05 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x13\n\x0bis_licensed\x18\x06 \x01(\x08\x12;\n\x04role\x18\x07 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x12\n\npublic_key\x18\x08 \x01(\x0c\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"Z\n\x0eRouteDiscovery\x12\r\n\x05route\x18\x01 \x03(\x07\x12\x13\n\x0bsnr_towards\x18\x02 \x03(\x05\x12\x12\n\nroute_back\x18\x03 \x03(\x07\x12\x10\n\x08snr_back\x18\x04 \x03(\x05\"\xfd\x03\n\x07Routing\x12<\n\rroute_request\x18\x01 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0broute_reply\x18\x02 \x01(\x0b\x32#.meshtastic.protobuf.RouteDiscoveryH\x00\x12:\n\x0c\x65rror_reason\x18\x03 \x01(\x0e\x32\".meshtastic.protobuf.Routing.ErrorH\x00\"\xb0\x02\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!\x12\x0e\n\nPKI_FAILED\x10\"\x12\x16\n\x12PKI_UNKNOWN_PUBKEY\x10#\x12\x19\n\x15\x41\x44MIN_BAD_SESSION_KEY\x10$\x12!\n\x1d\x41\x44MIN_PUBLIC_KEY_UNAUTHORIZED\x10%B\t\n\x07variant\"\xd4\x01\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.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\x12\x15\n\x08\x62itfield\x18\t \x01(\rH\x00\x88\x01\x01\x42\x0b\n\t_bitfield\">\n\x0fKeyVerification\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\r\n\x05hash1\x18\x02 \x01(\x0c\x12\r\n\x05hash2\x18\x03 \x01(\x0c\"\xbc\x01\n\x08Waypoint\x12\n\n\x02id\x18\x01 \x01(\r\x12\x17\n\nlatitude_i\x18\x02 \x01(\x0fH\x00\x88\x01\x01\x12\x18\n\x0blongitude_i\x18\x03 \x01(\x0fH\x01\x88\x01\x01\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\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_i\"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\"\xb6\x05\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\x19.meshtastic.protobuf.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(.meshtastic.protobuf.MeshPacket.Priority\x12\x0f\n\x07rx_rssi\x18\x0c \x01(\x05\x12<\n\x07\x64\x65layed\x18\r \x01(\x0e\x32\'.meshtastic.protobuf.MeshPacket.DelayedB\x02\x18\x01\x12\x10\n\x08via_mqtt\x18\x0e \x01(\x08\x12\x11\n\thop_start\x18\x0f \x01(\r\x12\x12\n\npublic_key\x18\x10 \x01(\x0c\x12\x15\n\rpki_encrypted\x18\x11 \x01(\x08\x12\x10\n\x08next_hop\x18\x12 \x01(\r\x12\x12\n\nrelay_node\x18\x13 \x01(\r\x12\x10\n\x08tx_after\x18\x14 \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\x0c\n\x08RESPONSE\x10P\x12\x08\n\x04HIGH\x10\x64\x12\t\n\x05\x41LERT\x10n\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\"\xe2\x02\n\x08NodeInfo\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\'\n\x04user\x18\x02 \x01(\x0b\x32\x19.meshtastic.protobuf.User\x12/\n\x08position\x18\x03 \x01(\x0b\x32\x1d.meshtastic.protobuf.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\".meshtastic.protobuf.DeviceMetrics\x12\x0f\n\x07\x63hannel\x18\x07 \x01(\r\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x16\n\thops_away\x18\t \x01(\rH\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12 \n\x18is_key_manually_verified\x18\x0c \x01(\x08\x42\x0c\n\n_hops_away\"t\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\x12\x11\n\tdevice_id\x18\x0c \x01(\x0c\x12\x0f\n\x07pio_env\x18\r \x01(\t\"\xc9\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\x33\n\x05level\x18\x04 \x01(\x0e\x32$.meshtastic.protobuf.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\"\xf7\x06\n\tFromRadio\x12\n\n\x02id\x18\x01 \x01(\r\x12\x31\n\x06packet\x18\x02 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x32\n\x07my_info\x18\x03 \x01(\x0b\x32\x1f.meshtastic.protobuf.MyNodeInfoH\x00\x12\x32\n\tnode_info\x18\x04 \x01(\x0b\x32\x1d.meshtastic.protobuf.NodeInfoH\x00\x12-\n\x06\x63onfig\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.ConfigH\x00\x12\x34\n\nlog_record\x18\x06 \x01(\x0b\x32\x1e.meshtastic.protobuf.LogRecordH\x00\x12\x1c\n\x12\x63onfig_complete_id\x18\x07 \x01(\rH\x00\x12\x12\n\x08rebooted\x18\x08 \x01(\x08H\x00\x12\x39\n\x0cmoduleConfig\x18\t \x01(\x0b\x32!.meshtastic.protobuf.ModuleConfigH\x00\x12/\n\x07\x63hannel\x18\n \x01(\x0b\x32\x1c.meshtastic.protobuf.ChannelH\x00\x12\x37\n\x0bqueueStatus\x18\x0b \x01(\x0b\x32 .meshtastic.protobuf.QueueStatusH\x00\x12\x33\n\x0cxmodemPacket\x18\x0c \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12\x37\n\x08metadata\x18\r \x01(\x0b\x32#.meshtastic.protobuf.DeviceMetadataH\x00\x12M\n\x16mqttClientProxyMessage\x18\x0e \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x31\n\x08\x66ileInfo\x18\x0f \x01(\x0b\x32\x1d.meshtastic.protobuf.FileInfoH\x00\x12\x45\n\x12\x63lientNotification\x18\x10 \x01(\x0b\x32\'.meshtastic.protobuf.ClientNotificationH\x00\x12=\n\x0e\x64\x65viceuiConfig\x18\x11 \x01(\x0b\x32#.meshtastic.protobuf.DeviceUIConfigH\x00\x42\x11\n\x0fpayload_variant\"\xb0\x04\n\x12\x43lientNotification\x12\x15\n\x08reply_id\x18\x01 \x01(\rH\x01\x88\x01\x01\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x33\n\x05level\x18\x03 \x01(\x0e\x32$.meshtastic.protobuf.LogRecord.Level\x12\x0f\n\x07message\x18\x04 \x01(\t\x12Z\n\x1ekey_verification_number_inform\x18\x0b \x01(\x0b\x32\x30.meshtastic.protobuf.KeyVerificationNumberInformH\x00\x12\\\n\x1fkey_verification_number_request\x18\x0c \x01(\x0b\x32\x31.meshtastic.protobuf.KeyVerificationNumberRequestH\x00\x12K\n\x16key_verification_final\x18\r \x01(\x0b\x32).meshtastic.protobuf.KeyVerificationFinalH\x00\x12I\n\x15\x64uplicated_public_key\x18\x0e \x01(\x0b\x32(.meshtastic.protobuf.DuplicatedPublicKeyH\x00\x12=\n\x0flow_entropy_key\x18\x0f \x01(\x0b\x32\".meshtastic.protobuf.LowEntropyKeyH\x00\x42\x11\n\x0fpayload_variantB\x0b\n\t_reply_id\"^\n\x1bKeyVerificationNumberInform\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 \x01(\t\x12\x17\n\x0fsecurity_number\x18\x03 \x01(\r\"F\n\x1cKeyVerificationNumberRequest\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 \x01(\t\"q\n\x14KeyVerificationFinal\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x17\n\x0fremote_longname\x18\x02 \x01(\t\x12\x10\n\x08isSender\x18\x03 \x01(\x08\x12\x1f\n\x17verification_characters\x18\x04 \x01(\t\"\x15\n\x13\x44uplicatedPublicKey\"\x0f\n\rLowEntropyKey\"1\n\x08\x46ileInfo\x12\x11\n\tfile_name\x18\x01 \x01(\t\x12\x12\n\nsize_bytes\x18\x02 \x01(\r\"\xb8\x02\n\x07ToRadio\x12\x31\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketH\x00\x12\x18\n\x0ewant_config_id\x18\x03 \x01(\rH\x00\x12\x14\n\ndisconnect\x18\x04 \x01(\x08H\x00\x12\x33\n\x0cxmodemPacket\x18\x05 \x01(\x0b\x32\x1b.meshtastic.protobuf.XModemH\x00\x12M\n\x16mqttClientProxyMessage\x18\x06 \x01(\x0b\x32+.meshtastic.protobuf.MqttClientProxyMessageH\x00\x12\x33\n\theartbeat\x18\x07 \x01(\x0b\x32\x1e.meshtastic.protobuf.HeartbeatH\x00\x42\x11\n\x0fpayload_variant\"I\n\nCompressed\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\"\x90\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\x30\n\tneighbors\x18\x04 \x03(\x0b\x32\x1d.meshtastic.protobuf.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\"\xe9\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-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x16\n\x0eposition_flags\x18\x08 \x01(\r\x12\x34\n\x08hw_model\x18\t \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x19\n\x11hasRemoteHardware\x18\n \x01(\x08\x12\x0e\n\x06hasPKC\x18\x0b \x01(\x08\x12\x18\n\x10\x65xcluded_modules\x18\x0c \x01(\r\"\x0b\n\tHeartbeat\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"e\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x13\n\x0b\x63hunk_count\x18\x02 \x01(\r\x12\x13\n\x0b\x63hunk_index\x18\x03 \x01(\r\x12\x15\n\rpayload_chunk\x18\x04 \x01(\x0c\"\x1f\n\rresend_chunks\x12\x0e\n\x06\x63hunks\x18\x01 \x03(\r\"\xb3\x01\n\x16\x43hunkedPayloadResponse\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x1a\n\x10request_transfer\x18\x02 \x01(\x08H\x00\x12\x19\n\x0f\x61\x63\x63\x65pt_transfer\x18\x03 \x01(\x08H\x00\x12;\n\rresend_chunks\x18\x04 \x01(\x0b\x32\".meshtastic.protobuf.resend_chunksH\x00\x42\x11\n\x0fpayload_variant*\xf7\x0f\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\x0b\n\x07WIPHONE\x10\x14\x12\x0e\n\nWIO_WM1110\x10\x15\x12\x0b\n\x07RAK2560\x10\x16\x12\x13\n\x0fHELTEC_HRU_3601\x10\x17\x12\x1a\n\x16HELTEC_WIRELESS_BRIDGE\x10\x18\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\x0b\n\x07UNPHONE\x10;\x12\x0c\n\x08TD_LORAC\x10<\x12\x13\n\x0f\x43\x44\x45\x42YTE_EORA_S3\x10=\x12\x0f\n\x0bTWC_MESH_V4\x10>\x12\x16\n\x12NRF52_PROMICRO_DIY\x10?\x12\x1f\n\x1bRADIOMASTER_900_BANDIT_NANO\x10@\x12\x1c\n\x18HELTEC_CAPSULE_SENSOR_V3\x10\x41\x12\x1d\n\x19HELTEC_VISION_MASTER_T190\x10\x42\x12\x1d\n\x19HELTEC_VISION_MASTER_E213\x10\x43\x12\x1d\n\x19HELTEC_VISION_MASTER_E290\x10\x44\x12\x19\n\x15HELTEC_MESH_NODE_T114\x10\x45\x12\x16\n\x12SENSECAP_INDICATOR\x10\x46\x12\x13\n\x0fTRACKER_T1000_E\x10G\x12\x0b\n\x07RAK3172\x10H\x12\n\n\x06WIO_E5\x10I\x12\x1a\n\x16RADIOMASTER_900_BANDIT\x10J\x12\x13\n\x0fME25LS01_4Y10TD\x10K\x12\x18\n\x14RP2040_FEATHER_RFM95\x10L\x12\x15\n\x11M5STACK_COREBASIC\x10M\x12\x11\n\rM5STACK_CORE2\x10N\x12\r\n\tRPI_PICO2\x10O\x12\x12\n\x0eM5STACK_CORES3\x10P\x12\x11\n\rSEEED_XIAO_S3\x10Q\x12\x0b\n\x07MS24SF1\x10R\x12\x0c\n\x08TLORA_C6\x10S\x12\x0f\n\x0bWISMESH_TAP\x10T\x12\r\n\tROUTASTIC\x10U\x12\x0c\n\x08MESH_TAB\x10V\x12\x0c\n\x08MESHLINK\x10W\x12\x12\n\x0eXIAO_NRF52_KIT\x10X\x12\x10\n\x0cTHINKNODE_M1\x10Y\x12\x10\n\x0cTHINKNODE_M2\x10Z\x12\x0f\n\x0bT_ETH_ELITE\x10[\x12\x15\n\x11HELTEC_SENSOR_HUB\x10\\\x12\x1a\n\x16RESERVED_FRIED_CHICKEN\x10]\x12\x16\n\x12HELTEC_MESH_POCKET\x10^\x12\x14\n\x10SEEED_SOLAR_NODE\x10_\x12\x18\n\x14NOMADSTAR_METEOR_PRO\x10`\x12\r\n\tCROWPANEL\x10\x61\x12\x0b\n\x07LINK_32\x10\x62\x12\x18\n\x14SEEED_WIO_TRACKER_L1\x10\x63\x12\x1d\n\x19SEEED_WIO_TRACKER_L1_EINK\x10\x64\x12\x14\n\x10QWANTZ_TINY_ARMS\x10\x65\x12\x0e\n\nT_DECK_PRO\x10\x66\x12\x10\n\x0cT_LORA_PAGER\x10g\x12\x1d\n\x19GAT562_MESH_TRIAL_TRACKER\x10h\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\xe9\x01*\xb4\x02\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\x12 \n\x1c\x46LASH_CORRUPTION_RECOVERABLE\x10\x0c\x12\"\n\x1e\x46LASH_CORRUPTION_UNRECOVERABLE\x10\r*\x80\x03\n\x0f\x45xcludedModules\x12\x11\n\rEXCLUDED_NONE\x10\x00\x12\x0f\n\x0bMQTT_CONFIG\x10\x01\x12\x11\n\rSERIAL_CONFIG\x10\x02\x12\x13\n\x0f\x45XTNOTIF_CONFIG\x10\x04\x12\x17\n\x13STOREFORWARD_CONFIG\x10\x08\x12\x14\n\x10RANGETEST_CONFIG\x10\x10\x12\x14\n\x10TELEMETRY_CONFIG\x10 \x12\x14\n\x10\x43\x41NNEDMSG_CONFIG\x10@\x12\x11\n\x0c\x41UDIO_CONFIG\x10\x80\x01\x12\x1a\n\x15REMOTEHARDWARE_CONFIG\x10\x80\x02\x12\x18\n\x13NEIGHBORINFO_CONFIG\x10\x80\x04\x12\x1b\n\x16\x41MBIENTLIGHTING_CONFIG\x10\x80\x08\x12\x1b\n\x16\x44\x45TECTIONSENSOR_CONFIG\x10\x80\x10\x12\x16\n\x11PAXCOUNTER_CONFIG\x10\x80 \x12\x15\n\x10\x42LUETOOTH_CONFIG\x10\x80@\x12\x14\n\x0eNETWORK_CONFIG\x10\x80\x80\x01\x42_\n\x13\x63om.geeksville.meshB\nMeshProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -32,14 +32,14 @@ if _descriptor._USE_C_DESCRIPTORS == False: _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' - _globals['_HARDWAREMODEL']._serialized_start=6529 - _globals['_HARDWAREMODEL']._serialized_end=8411 - _globals['_CONSTANTS']._serialized_start=8413 - _globals['_CONSTANTS']._serialized_end=8457 - _globals['_CRITICALERRORCODE']._serialized_start=8460 - _globals['_CRITICALERRORCODE']._serialized_end=8768 - _globals['_EXCLUDEDMODULES']._serialized_start=8771 - _globals['_EXCLUDEDMODULES']._serialized_end=9155 + _globals['_HARDWAREMODEL']._serialized_start=7420 + _globals['_HARDWAREMODEL']._serialized_end=9459 + _globals['_CONSTANTS']._serialized_start=9461 + _globals['_CONSTANTS']._serialized_end=9505 + _globals['_CRITICALERRORCODE']._serialized_start=9508 + _globals['_CRITICALERRORCODE']._serialized_end=9816 + _globals['_EXCLUDEDMODULES']._serialized_start=9819 + _globals['_EXCLUDEDMODULES']._serialized_end=10203 _globals['_POSITION']._serialized_start=310 _globals['_POSITION']._serialized_end=1231 _globals['_POSITION_LOCSOURCE']._serialized_start=926 @@ -47,59 +47,71 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['_POSITION_ALTSOURCE']._serialized_start=1006 _globals['_POSITION_ALTSOURCE']._serialized_end=1104 _globals['_USER']._serialized_start=1234 - _globals['_USER']._serialized_end=1468 - _globals['_ROUTEDISCOVERY']._serialized_start=1470 - _globals['_ROUTEDISCOVERY']._serialized_end=1560 - _globals['_ROUTING']._serialized_start=1563 - _globals['_ROUTING']._serialized_end=2072 - _globals['_ROUTING_ERROR']._serialized_start=1757 - _globals['_ROUTING_ERROR']._serialized_end=2061 - _globals['_DATA']._serialized_start=2075 - _globals['_DATA']._serialized_end=2287 - _globals['_WAYPOINT']._serialized_start=2290 - _globals['_WAYPOINT']._serialized_end=2478 - _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=2480 - _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=2588 - _globals['_MESHPACKET']._serialized_start=2591 - _globals['_MESHPACKET']._serialized_end=3285 - _globals['_MESHPACKET_PRIORITY']._serialized_start=3072 - _globals['_MESHPACKET_PRIORITY']._serialized_end=3198 - _globals['_MESHPACKET_DELAYED']._serialized_start=3200 - _globals['_MESHPACKET_DELAYED']._serialized_end=3266 - _globals['_NODEINFO']._serialized_start=3288 - _globals['_NODEINFO']._serialized_end=3608 - _globals['_MYNODEINFO']._serialized_start=3610 - _globals['_MYNODEINFO']._serialized_end=3726 - _globals['_LOGRECORD']._serialized_start=3729 - _globals['_LOGRECORD']._serialized_end=3930 - _globals['_LOGRECORD_LEVEL']._serialized_start=3842 - _globals['_LOGRECORD_LEVEL']._serialized_end=3930 - _globals['_QUEUESTATUS']._serialized_start=3932 - _globals['_QUEUESTATUS']._serialized_end=4012 - _globals['_FROMRADIO']._serialized_start=4015 - _globals['_FROMRADIO']._serialized_end=4902 - _globals['_CLIENTNOTIFICATION']._serialized_start=4905 - _globals['_CLIENTNOTIFICATION']._serialized_end=5045 - _globals['_FILEINFO']._serialized_start=5047 - _globals['_FILEINFO']._serialized_end=5096 - _globals['_TORADIO']._serialized_start=5099 - _globals['_TORADIO']._serialized_end=5411 - _globals['_COMPRESSED']._serialized_start=5413 - _globals['_COMPRESSED']._serialized_end=5486 - _globals['_NEIGHBORINFO']._serialized_start=5489 - _globals['_NEIGHBORINFO']._serialized_end=5633 - _globals['_NEIGHBOR']._serialized_start=5635 - _globals['_NEIGHBOR']._serialized_end=5735 - _globals['_DEVICEMETADATA']._serialized_start=5738 - _globals['_DEVICEMETADATA']._serialized_end=6099 - _globals['_HEARTBEAT']._serialized_start=6101 - _globals['_HEARTBEAT']._serialized_end=6112 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=6114 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=6208 - _globals['_CHUNKEDPAYLOAD']._serialized_start=6210 - _globals['_CHUNKEDPAYLOAD']._serialized_end=6311 - _globals['_RESEND_CHUNKS']._serialized_start=6313 - _globals['_RESEND_CHUNKS']._serialized_end=6344 - _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_start=6347 - _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_end=6526 + _globals['_USER']._serialized_end=1518 + _globals['_ROUTEDISCOVERY']._serialized_start=1520 + _globals['_ROUTEDISCOVERY']._serialized_end=1610 + _globals['_ROUTING']._serialized_start=1613 + _globals['_ROUTING']._serialized_end=2122 + _globals['_ROUTING_ERROR']._serialized_start=1807 + _globals['_ROUTING_ERROR']._serialized_end=2111 + _globals['_DATA']._serialized_start=2125 + _globals['_DATA']._serialized_end=2337 + _globals['_KEYVERIFICATION']._serialized_start=2339 + _globals['_KEYVERIFICATION']._serialized_end=2401 + _globals['_WAYPOINT']._serialized_start=2404 + _globals['_WAYPOINT']._serialized_end=2592 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=2594 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=2702 + _globals['_MESHPACKET']._serialized_start=2705 + _globals['_MESHPACKET']._serialized_end=3399 + _globals['_MESHPACKET_PRIORITY']._serialized_start=3186 + _globals['_MESHPACKET_PRIORITY']._serialized_end=3312 + _globals['_MESHPACKET_DELAYED']._serialized_start=3314 + _globals['_MESHPACKET_DELAYED']._serialized_end=3380 + _globals['_NODEINFO']._serialized_start=3402 + _globals['_NODEINFO']._serialized_end=3756 + _globals['_MYNODEINFO']._serialized_start=3758 + _globals['_MYNODEINFO']._serialized_end=3874 + _globals['_LOGRECORD']._serialized_start=3877 + _globals['_LOGRECORD']._serialized_end=4078 + _globals['_LOGRECORD_LEVEL']._serialized_start=3990 + _globals['_LOGRECORD_LEVEL']._serialized_end=4078 + _globals['_QUEUESTATUS']._serialized_start=4080 + _globals['_QUEUESTATUS']._serialized_end=4160 + _globals['_FROMRADIO']._serialized_start=4163 + _globals['_FROMRADIO']._serialized_end=5050 + _globals['_CLIENTNOTIFICATION']._serialized_start=5053 + _globals['_CLIENTNOTIFICATION']._serialized_end=5613 + _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_start=5615 + _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_end=5709 + _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_start=5711 + _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_end=5781 + _globals['_KEYVERIFICATIONFINAL']._serialized_start=5783 + _globals['_KEYVERIFICATIONFINAL']._serialized_end=5896 + _globals['_DUPLICATEDPUBLICKEY']._serialized_start=5898 + _globals['_DUPLICATEDPUBLICKEY']._serialized_end=5919 + _globals['_LOWENTROPYKEY']._serialized_start=5921 + _globals['_LOWENTROPYKEY']._serialized_end=5936 + _globals['_FILEINFO']._serialized_start=5938 + _globals['_FILEINFO']._serialized_end=5987 + _globals['_TORADIO']._serialized_start=5990 + _globals['_TORADIO']._serialized_end=6302 + _globals['_COMPRESSED']._serialized_start=6304 + _globals['_COMPRESSED']._serialized_end=6377 + _globals['_NEIGHBORINFO']._serialized_start=6380 + _globals['_NEIGHBORINFO']._serialized_end=6524 + _globals['_NEIGHBOR']._serialized_start=6526 + _globals['_NEIGHBOR']._serialized_end=6626 + _globals['_DEVICEMETADATA']._serialized_start=6629 + _globals['_DEVICEMETADATA']._serialized_end=6990 + _globals['_HEARTBEAT']._serialized_start=6992 + _globals['_HEARTBEAT']._serialized_end=7003 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=7005 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=7099 + _globals['_CHUNKEDPAYLOAD']._serialized_start=7101 + _globals['_CHUNKEDPAYLOAD']._serialized_end=7202 + _globals['_RESEND_CHUNKS']._serialized_start=7204 + _globals['_RESEND_CHUNKS']._serialized_end=7235 + _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_start=7238 + _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_end=7417 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/mesh_pb2.pyi b/meshtastic/protobuf/mesh_pb2.pyi index 5e1f817..7b19125 100644 --- a/meshtastic/protobuf/mesh_pb2.pyi +++ b/meshtastic/protobuf/mesh_pb2.pyi @@ -441,6 +441,34 @@ class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._ """ Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin """ + LINK_32: _HardwareModel.ValueType # 98 + """* + Lilygo LINK32 board with sensors + """ + SEEED_WIO_TRACKER_L1: _HardwareModel.ValueType # 99 + """* + Seeed Tracker L1 + """ + SEEED_WIO_TRACKER_L1_EINK: _HardwareModel.ValueType # 100 + """* + Seeed Tracker L1 EINK driver + """ + QWANTZ_TINY_ARMS: _HardwareModel.ValueType # 101 + """ + Reserved ID for future and past use + """ + T_DECK_PRO: _HardwareModel.ValueType # 102 + """* + Lilygo T-Deck Pro + """ + T_LORA_PAGER: _HardwareModel.ValueType # 103 + """* + Lilygo TLora Pager + """ + GAT562_MESH_TRIAL_TRACKER: _HardwareModel.ValueType # 104 + """* + GAT562 Mesh Trial Tracker + """ PRIVATE_HW: _HardwareModel.ValueType # 255 """ ------------------------------------------------------------------------------------------------------------------------------------------ @@ -865,6 +893,34 @@ CROWPANEL: HardwareModel.ValueType # 97 """ Elecrow CrowPanel Advance models, ESP32-S3 and TFT with SX1262 radio plugin """ +LINK_32: HardwareModel.ValueType # 98 +"""* +Lilygo LINK32 board with sensors +""" +SEEED_WIO_TRACKER_L1: HardwareModel.ValueType # 99 +"""* +Seeed Tracker L1 +""" +SEEED_WIO_TRACKER_L1_EINK: HardwareModel.ValueType # 100 +"""* +Seeed Tracker L1 EINK driver +""" +QWANTZ_TINY_ARMS: HardwareModel.ValueType # 101 +""" +Reserved ID for future and past use +""" +T_DECK_PRO: HardwareModel.ValueType # 102 +"""* +Lilygo T-Deck Pro +""" +T_LORA_PAGER: HardwareModel.ValueType # 103 +"""* +Lilygo TLora Pager +""" +GAT562_MESH_TRIAL_TRACKER: HardwareModel.ValueType # 104 +"""* +GAT562 Mesh Trial Tracker +""" PRIVATE_HW: HardwareModel.ValueType # 255 """ ------------------------------------------------------------------------------------------------------------------------------------------ @@ -1512,6 +1568,7 @@ class User(google.protobuf.message.Message): IS_LICENSED_FIELD_NUMBER: builtins.int ROLE_FIELD_NUMBER: builtins.int PUBLIC_KEY_FIELD_NUMBER: builtins.int + IS_UNMESSAGABLE_FIELD_NUMBER: builtins.int id: builtins.str """ A globally unique ID string for this user. @@ -1556,6 +1613,10 @@ class User(google.protobuf.message.Message): The public key of the user's device. This is sent out to other nodes on the mesh to allow them to compute a shared secret key. """ + is_unmessagable: builtins.bool + """ + Whether or not the node can be messaged + """ def __init__( self, *, @@ -1567,8 +1628,11 @@ class User(google.protobuf.message.Message): is_licensed: builtins.bool = ..., role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType = ..., public_key: builtins.bytes = ..., + is_unmessagable: builtins.bool | None = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["hw_model", b"hw_model", "id", b"id", "is_licensed", b"is_licensed", "long_name", b"long_name", "macaddr", b"macaddr", "public_key", b"public_key", "role", b"role", "short_name", b"short_name"]) -> None: ... + def HasField(self, field_name: typing.Literal["_is_unmessagable", b"_is_unmessagable", "is_unmessagable", b"is_unmessagable"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_is_unmessagable", b"_is_unmessagable", "hw_model", b"hw_model", "id", b"id", "is_licensed", b"is_licensed", "is_unmessagable", b"is_unmessagable", "long_name", b"long_name", "macaddr", b"macaddr", "public_key", b"public_key", "role", b"role", "short_name", b"short_name"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["_is_unmessagable", b"_is_unmessagable"]) -> typing.Literal["is_unmessagable"] | None: ... global___User = User @@ -1891,6 +1955,41 @@ class Data(google.protobuf.message.Message): global___Data = Data +@typing.final +class KeyVerification(google.protobuf.message.Message): + """ + The actual over-the-mesh message doing KeyVerification + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NONCE_FIELD_NUMBER: builtins.int + HASH1_FIELD_NUMBER: builtins.int + HASH2_FIELD_NUMBER: builtins.int + nonce: builtins.int + """ + random value Selected by the requesting node + """ + hash1: builtins.bytes + """ + The final authoritative hash, only to be sent by NodeA at the end of the handshake + """ + hash2: builtins.bytes + """ + The intermediary hash (actually derived from hash1), + sent from NodeB to NodeA in response to the initial message. + """ + def __init__( + self, + *, + nonce: builtins.int = ..., + hash1: builtins.bytes = ..., + hash2: builtins.bytes = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["hash1", b"hash1", "hash2", b"hash2", "nonce", b"nonce"]) -> None: ... + +global___KeyVerification = KeyVerification + @typing.final class Waypoint(google.protobuf.message.Message): """ @@ -2364,6 +2463,7 @@ class NodeInfo(google.protobuf.message.Message): HOPS_AWAY_FIELD_NUMBER: builtins.int IS_FAVORITE_FIELD_NUMBER: builtins.int IS_IGNORED_FIELD_NUMBER: builtins.int + IS_KEY_MANUALLY_VERIFIED_FIELD_NUMBER: builtins.int num: builtins.int """ The node number @@ -2405,6 +2505,12 @@ class NodeInfo(google.protobuf.message.Message): True if node is in our ignored list Persists between NodeDB internal clean ups """ + is_key_manually_verified: builtins.bool + """ + True if node public key has been verified. + Persists between NodeDB internal clean ups + LSB 0 of the bitfield + """ @property def user(self) -> global___User: """ @@ -2438,9 +2544,10 @@ class NodeInfo(google.protobuf.message.Message): hops_away: builtins.int | None = ..., is_favorite: builtins.bool = ..., is_ignored: builtins.bool = ..., + is_key_manually_verified: builtins.bool = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["_hops_away", b"_hops_away", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "position", b"position", "user", b"user"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_hops_away", b"_hops_away", "channel", b"channel", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "is_favorite", b"is_favorite", "is_ignored", b"is_ignored", "last_heard", b"last_heard", "num", b"num", "position", b"position", "snr", b"snr", "user", b"user", "via_mqtt", b"via_mqtt"]) -> None: ... + def ClearField(self, field_name: typing.Literal["_hops_away", b"_hops_away", "channel", b"channel", "device_metrics", b"device_metrics", "hops_away", b"hops_away", "is_favorite", b"is_favorite", "is_ignored", b"is_ignored", "is_key_manually_verified", b"is_key_manually_verified", "last_heard", b"last_heard", "num", b"num", "position", b"position", "snr", b"snr", "user", b"user", "via_mqtt", b"via_mqtt"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["_hops_away", b"_hops_away"]) -> typing.Literal["hops_away"] | None: ... global___NodeInfo = NodeInfo @@ -2812,6 +2919,11 @@ class ClientNotification(google.protobuf.message.Message): TIME_FIELD_NUMBER: builtins.int LEVEL_FIELD_NUMBER: builtins.int MESSAGE_FIELD_NUMBER: builtins.int + KEY_VERIFICATION_NUMBER_INFORM_FIELD_NUMBER: builtins.int + KEY_VERIFICATION_NUMBER_REQUEST_FIELD_NUMBER: builtins.int + KEY_VERIFICATION_FINAL_FIELD_NUMBER: builtins.int + DUPLICATED_PUBLIC_KEY_FIELD_NUMBER: builtins.int + LOW_ENTROPY_KEY_FIELD_NUMBER: builtins.int reply_id: builtins.int """ The id of the packet we're notifying in response to @@ -2828,6 +2940,16 @@ class ClientNotification(google.protobuf.message.Message): """ The message body of the notification """ + @property + def key_verification_number_inform(self) -> global___KeyVerificationNumberInform: ... + @property + def key_verification_number_request(self) -> global___KeyVerificationNumberRequest: ... + @property + def key_verification_final(self) -> global___KeyVerificationFinal: ... + @property + def duplicated_public_key(self) -> global___DuplicatedPublicKey: ... + @property + def low_entropy_key(self) -> global___LowEntropyKey: ... def __init__( self, *, @@ -2835,13 +2957,104 @@ class ClientNotification(google.protobuf.message.Message): time: builtins.int = ..., level: global___LogRecord.Level.ValueType = ..., message: builtins.str = ..., + key_verification_number_inform: global___KeyVerificationNumberInform | None = ..., + key_verification_number_request: global___KeyVerificationNumberRequest | None = ..., + key_verification_final: global___KeyVerificationFinal | None = ..., + duplicated_public_key: global___DuplicatedPublicKey | None = ..., + low_entropy_key: global___LowEntropyKey | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_reply_id", b"_reply_id", "reply_id", b"reply_id"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_reply_id", b"_reply_id", "level", b"level", "message", b"message", "reply_id", b"reply_id", "time", b"time"]) -> None: ... + def HasField(self, field_name: typing.Literal["_reply_id", b"_reply_id", "duplicated_public_key", b"duplicated_public_key", "key_verification_final", b"key_verification_final", "key_verification_number_inform", b"key_verification_number_inform", "key_verification_number_request", b"key_verification_number_request", "low_entropy_key", b"low_entropy_key", "payload_variant", b"payload_variant", "reply_id", b"reply_id"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_reply_id", b"_reply_id", "duplicated_public_key", b"duplicated_public_key", "key_verification_final", b"key_verification_final", "key_verification_number_inform", b"key_verification_number_inform", "key_verification_number_request", b"key_verification_number_request", "level", b"level", "low_entropy_key", b"low_entropy_key", "message", b"message", "payload_variant", b"payload_variant", "reply_id", b"reply_id", "time", b"time"]) -> None: ... + @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_reply_id", b"_reply_id"]) -> typing.Literal["reply_id"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["key_verification_number_inform", "key_verification_number_request", "key_verification_final", "duplicated_public_key", "low_entropy_key"] | None: ... global___ClientNotification = ClientNotification +@typing.final +class KeyVerificationNumberInform(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NONCE_FIELD_NUMBER: builtins.int + REMOTE_LONGNAME_FIELD_NUMBER: builtins.int + SECURITY_NUMBER_FIELD_NUMBER: builtins.int + nonce: builtins.int + remote_longname: builtins.str + security_number: builtins.int + def __init__( + self, + *, + nonce: builtins.int = ..., + remote_longname: builtins.str = ..., + security_number: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["nonce", b"nonce", "remote_longname", b"remote_longname", "security_number", b"security_number"]) -> None: ... + +global___KeyVerificationNumberInform = KeyVerificationNumberInform + +@typing.final +class KeyVerificationNumberRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NONCE_FIELD_NUMBER: builtins.int + REMOTE_LONGNAME_FIELD_NUMBER: builtins.int + nonce: builtins.int + remote_longname: builtins.str + def __init__( + self, + *, + nonce: builtins.int = ..., + remote_longname: builtins.str = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["nonce", b"nonce", "remote_longname", b"remote_longname"]) -> None: ... + +global___KeyVerificationNumberRequest = KeyVerificationNumberRequest + +@typing.final +class KeyVerificationFinal(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NONCE_FIELD_NUMBER: builtins.int + REMOTE_LONGNAME_FIELD_NUMBER: builtins.int + ISSENDER_FIELD_NUMBER: builtins.int + VERIFICATION_CHARACTERS_FIELD_NUMBER: builtins.int + nonce: builtins.int + remote_longname: builtins.str + isSender: builtins.bool + verification_characters: builtins.str + def __init__( + self, + *, + nonce: builtins.int = ..., + remote_longname: builtins.str = ..., + isSender: builtins.bool = ..., + verification_characters: builtins.str = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["isSender", b"isSender", "nonce", b"nonce", "remote_longname", b"remote_longname", "verification_characters", b"verification_characters"]) -> None: ... + +global___KeyVerificationFinal = KeyVerificationFinal + +@typing.final +class DuplicatedPublicKey(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___DuplicatedPublicKey = DuplicatedPublicKey + +@typing.final +class LowEntropyKey(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +global___LowEntropyKey = LowEntropyKey + @typing.final class FileInfo(google.protobuf.message.Message): """ diff --git a/meshtastic/protobuf/module_config_pb2.py b/meshtastic/protobuf/module_config_pb2.py index 12596fc..f22e8e8 100644 --- a/meshtastic/protobuf/module_config_pb2.py +++ b/meshtastic/protobuf/module_config_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'meshtastic/protobuf/module_config.proto\x12\x13meshtastic.protobuf\"\x89\'\n\x0cModuleConfig\x12<\n\x04mqtt\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.ModuleConfig.MQTTConfigH\x00\x12@\n\x06serial\x18\x02 \x01(\x0b\x32..meshtastic.protobuf.ModuleConfig.SerialConfigH\x00\x12]\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32<.meshtastic.protobuf.ModuleConfig.ExternalNotificationConfigH\x00\x12M\n\rstore_forward\x18\x04 \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.StoreForwardConfigH\x00\x12G\n\nrange_test\x18\x05 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.RangeTestConfigH\x00\x12\x46\n\ttelemetry\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.TelemetryConfigH\x00\x12O\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.CannedMessageConfigH\x00\x12>\n\x05\x61udio\x18\x08 \x01(\x0b\x32-.meshtastic.protobuf.ModuleConfig.AudioConfigH\x00\x12Q\n\x0fremote_hardware\x18\t \x01(\x0b\x32\x36.meshtastic.protobuf.ModuleConfig.RemoteHardwareConfigH\x00\x12M\n\rneighbor_info\x18\n \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.NeighborInfoConfigH\x00\x12S\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.AmbientLightingConfigH\x00\x12S\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.DetectionSensorConfigH\x00\x12H\n\npaxcounter\x18\r \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.PaxcounterConfigH\x00\x1a\xb9\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\x12P\n\x13map_report_settings\x18\x0b \x01(\x0b\x32\x33.meshtastic.protobuf.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\x8b\x01\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&.meshtastic.protobuf.RemoteHardwarePin\x1aZ\n\x12NeighborInfoConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x17\n\x0fupdate_interval\x18\x02 \x01(\r\x12\x1a\n\x12transmit_over_lora\x18\x03 \x01(\x08\x1a\xa0\x03\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\x63\n\x16\x64\x65tection_trigger_type\x18\x07 \x01(\x0e\x32\x43.meshtastic.protobuf.ModuleConfig.DetectionSensorConfig.TriggerType\x12\x12\n\nuse_pullup\x18\x08 \x01(\x08\"\x88\x01\n\x0bTriggerType\x12\r\n\tLOGIC_LOW\x10\x00\x12\x0e\n\nLOGIC_HIGH\x10\x01\x12\x10\n\x0c\x46\x41LLING_EDGE\x10\x02\x12\x0f\n\x0bRISING_EDGE\x10\x03\x12\x1a\n\x16\x45ITHER_EDGE_ACTIVE_LOW\x10\x04\x12\x1b\n\x17\x45ITHER_EDGE_ACTIVE_HIGH\x10\x05\x1a\xed\x02\n\x0b\x41udioConfig\x12\x16\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x12\x0f\n\x07ptt_pin\x18\x02 \x01(\r\x12I\n\x07\x62itrate\x18\x03 \x01(\x0e\x32\x38.meshtastic.protobuf.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\x1av\n\x10PaxcounterConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1apaxcounter_update_interval\x18\x02 \x01(\r\x12\x16\n\x0ewifi_threshold\x18\x03 \x01(\x05\x12\x15\n\rble_threshold\x18\x04 \x01(\x05\x1a\x8f\x05\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\x12H\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32:.meshtastic.protobuf.ModuleConfig.SerialConfig.Serial_Baud\x12\x0f\n\x07timeout\x18\x06 \x01(\r\x12H\n\x04mode\x18\x07 \x01(\x0e\x32:.meshtastic.protobuf.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\"n\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\x12\x08\n\x04WS85\x10\x06\x12\r\n\tVE_DIRECT\x10\x07\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\x97\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\x12\x11\n\tis_server\x18\x06 \x01(\x08\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\xc9\x03\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\x12\"\n\x1ahealth_measurement_enabled\x18\x0b \x01(\x08\x12\x1e\n\x16health_update_interval\x18\x0c \x01(\r\x12\x1d\n\x15health_screen_enabled\x18\r \x01(\x08\x1a\xf1\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\x12\x62\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32\x44.meshtastic.protobuf.ModuleConfig.CannedMessageConfig.InputEventChar\x12\x63\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32\x44.meshtastic.protobuf.ModuleConfig.CannedMessageConfig.InputEventChar\x12\x65\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32\x44.meshtastic.protobuf.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\"m\n\x11RemoteHardwarePin\x12\x10\n\x08gpio_pin\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x38\n\x04type\x18\x03 \x01(\x0e\x32*.meshtastic.protobuf.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\'meshtastic/protobuf/module_config.proto\x12\x13meshtastic.protobuf\"\xa9\'\n\x0cModuleConfig\x12<\n\x04mqtt\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.ModuleConfig.MQTTConfigH\x00\x12@\n\x06serial\x18\x02 \x01(\x0b\x32..meshtastic.protobuf.ModuleConfig.SerialConfigH\x00\x12]\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32<.meshtastic.protobuf.ModuleConfig.ExternalNotificationConfigH\x00\x12M\n\rstore_forward\x18\x04 \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.StoreForwardConfigH\x00\x12G\n\nrange_test\x18\x05 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.RangeTestConfigH\x00\x12\x46\n\ttelemetry\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.TelemetryConfigH\x00\x12O\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.CannedMessageConfigH\x00\x12>\n\x05\x61udio\x18\x08 \x01(\x0b\x32-.meshtastic.protobuf.ModuleConfig.AudioConfigH\x00\x12Q\n\x0fremote_hardware\x18\t \x01(\x0b\x32\x36.meshtastic.protobuf.ModuleConfig.RemoteHardwareConfigH\x00\x12M\n\rneighbor_info\x18\n \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.NeighborInfoConfigH\x00\x12S\n\x10\x61mbient_lighting\x18\x0b \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.AmbientLightingConfigH\x00\x12S\n\x10\x64\x65tection_sensor\x18\x0c \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.DetectionSensorConfigH\x00\x12H\n\npaxcounter\x18\r \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.PaxcounterConfigH\x00\x1a\xb9\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\x12P\n\x13map_report_settings\x18\x0b \x01(\x0b\x32\x33.meshtastic.protobuf.ModuleConfig.MapReportSettings\x1an\n\x11MapReportSettings\x12\x1d\n\x15publish_interval_secs\x18\x01 \x01(\r\x12\x1a\n\x12position_precision\x18\x02 \x01(\r\x12\x1e\n\x16should_report_location\x18\x03 \x01(\x08\x1a\x8b\x01\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&.meshtastic.protobuf.RemoteHardwarePin\x1aZ\n\x12NeighborInfoConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x17\n\x0fupdate_interval\x18\x02 \x01(\r\x12\x1a\n\x12transmit_over_lora\x18\x03 \x01(\x08\x1a\xa0\x03\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\x63\n\x16\x64\x65tection_trigger_type\x18\x07 \x01(\x0e\x32\x43.meshtastic.protobuf.ModuleConfig.DetectionSensorConfig.TriggerType\x12\x12\n\nuse_pullup\x18\x08 \x01(\x08\"\x88\x01\n\x0bTriggerType\x12\r\n\tLOGIC_LOW\x10\x00\x12\x0e\n\nLOGIC_HIGH\x10\x01\x12\x10\n\x0c\x46\x41LLING_EDGE\x10\x02\x12\x0f\n\x0bRISING_EDGE\x10\x03\x12\x1a\n\x16\x45ITHER_EDGE_ACTIVE_LOW\x10\x04\x12\x1b\n\x17\x45ITHER_EDGE_ACTIVE_HIGH\x10\x05\x1a\xed\x02\n\x0b\x41udioConfig\x12\x16\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x12\x0f\n\x07ptt_pin\x18\x02 \x01(\r\x12I\n\x07\x62itrate\x18\x03 \x01(\x0e\x32\x38.meshtastic.protobuf.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\x1av\n\x10PaxcounterConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1apaxcounter_update_interval\x18\x02 \x01(\r\x12\x16\n\x0ewifi_threshold\x18\x03 \x01(\x05\x12\x15\n\rble_threshold\x18\x04 \x01(\x05\x1a\x8f\x05\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\x12H\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32:.meshtastic.protobuf.ModuleConfig.SerialConfig.Serial_Baud\x12\x0f\n\x07timeout\x18\x06 \x01(\r\x12H\n\x04mode\x18\x07 \x01(\x0e\x32:.meshtastic.protobuf.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\"n\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\x12\x08\n\x04WS85\x10\x06\x12\r\n\tVE_DIRECT\x10\x07\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\x97\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\x12\x11\n\tis_server\x18\x06 \x01(\x08\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\xc9\x03\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\x12\"\n\x1ahealth_measurement_enabled\x18\x0b \x01(\x08\x12\x1e\n\x16health_update_interval\x18\x0c \x01(\r\x12\x1d\n\x15health_screen_enabled\x18\r \x01(\x08\x1a\xf1\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\x12\x62\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32\x44.meshtastic.protobuf.ModuleConfig.CannedMessageConfig.InputEventChar\x12\x63\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32\x44.meshtastic.protobuf.ModuleConfig.CannedMessageConfig.InputEventChar\x12\x65\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32\x44.meshtastic.protobuf.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\"m\n\x11RemoteHardwarePin\x12\x10\n\x08gpio_pin\x18\x01 \x01(\r\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x38\n\x04type\x18\x03 \x01(\x0e\x32*.meshtastic.protobuf.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') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -21,48 +21,48 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.module_ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\022ModuleConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=5179 - _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=5252 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=5211 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=5284 _globals['_MODULECONFIG']._serialized_start=65 - _globals['_MODULECONFIG']._serialized_end=5066 + _globals['_MODULECONFIG']._serialized_end=5098 _globals['_MODULECONFIG_MQTTCONFIG']._serialized_start=1080 _globals['_MODULECONFIG_MQTTCONFIG']._serialized_end=1393 _globals['_MODULECONFIG_MAPREPORTSETTINGS']._serialized_start=1395 - _globals['_MODULECONFIG_MAPREPORTSETTINGS']._serialized_end=1473 - _globals['_MODULECONFIG_REMOTEHARDWARECONFIG']._serialized_start=1476 - _globals['_MODULECONFIG_REMOTEHARDWARECONFIG']._serialized_end=1615 - _globals['_MODULECONFIG_NEIGHBORINFOCONFIG']._serialized_start=1617 - _globals['_MODULECONFIG_NEIGHBORINFOCONFIG']._serialized_end=1707 - _globals['_MODULECONFIG_DETECTIONSENSORCONFIG']._serialized_start=1710 - _globals['_MODULECONFIG_DETECTIONSENSORCONFIG']._serialized_end=2126 - _globals['_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_start=1990 - _globals['_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_end=2126 - _globals['_MODULECONFIG_AUDIOCONFIG']._serialized_start=2129 - _globals['_MODULECONFIG_AUDIOCONFIG']._serialized_end=2494 - _globals['_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD']._serialized_start=2327 - _globals['_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD']._serialized_end=2494 - _globals['_MODULECONFIG_PAXCOUNTERCONFIG']._serialized_start=2496 - _globals['_MODULECONFIG_PAXCOUNTERCONFIG']._serialized_end=2614 - _globals['_MODULECONFIG_SERIALCONFIG']._serialized_start=2617 - _globals['_MODULECONFIG_SERIALCONFIG']._serialized_end=3272 - _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD']._serialized_start=2894 - _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD']._serialized_end=3160 - _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_MODE']._serialized_start=3162 - _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_MODE']._serialized_end=3272 - _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_start=3275 - _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_end=3636 - _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_start=3639 - _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_end=3790 - _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_start=3792 - _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_end=3856 - _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_start=3859 - _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_end=4316 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_start=4319 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_end=4944 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_start=4845 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_end=4944 - _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_start=4946 - _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_end=5047 - _globals['_REMOTEHARDWAREPIN']._serialized_start=5068 - _globals['_REMOTEHARDWAREPIN']._serialized_end=5177 + _globals['_MODULECONFIG_MAPREPORTSETTINGS']._serialized_end=1505 + _globals['_MODULECONFIG_REMOTEHARDWARECONFIG']._serialized_start=1508 + _globals['_MODULECONFIG_REMOTEHARDWARECONFIG']._serialized_end=1647 + _globals['_MODULECONFIG_NEIGHBORINFOCONFIG']._serialized_start=1649 + _globals['_MODULECONFIG_NEIGHBORINFOCONFIG']._serialized_end=1739 + _globals['_MODULECONFIG_DETECTIONSENSORCONFIG']._serialized_start=1742 + _globals['_MODULECONFIG_DETECTIONSENSORCONFIG']._serialized_end=2158 + _globals['_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_start=2022 + _globals['_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_end=2158 + _globals['_MODULECONFIG_AUDIOCONFIG']._serialized_start=2161 + _globals['_MODULECONFIG_AUDIOCONFIG']._serialized_end=2526 + _globals['_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD']._serialized_start=2359 + _globals['_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD']._serialized_end=2526 + _globals['_MODULECONFIG_PAXCOUNTERCONFIG']._serialized_start=2528 + _globals['_MODULECONFIG_PAXCOUNTERCONFIG']._serialized_end=2646 + _globals['_MODULECONFIG_SERIALCONFIG']._serialized_start=2649 + _globals['_MODULECONFIG_SERIALCONFIG']._serialized_end=3304 + _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD']._serialized_start=2926 + _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD']._serialized_end=3192 + _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_MODE']._serialized_start=3194 + _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_MODE']._serialized_end=3304 + _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_start=3307 + _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_end=3668 + _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_start=3671 + _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_end=3822 + _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_start=3824 + _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_end=3888 + _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_start=3891 + _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_end=4348 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_start=4351 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_end=4976 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_start=4877 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_end=4976 + _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_start=4978 + _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_end=5079 + _globals['_REMOTEHARDWAREPIN']._serialized_start=5100 + _globals['_REMOTEHARDWAREPIN']._serialized_end=5209 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/module_config_pb2.pyi b/meshtastic/protobuf/module_config_pb2.pyi index 50d05ad..43836cc 100644 --- a/meshtastic/protobuf/module_config_pb2.pyi +++ b/meshtastic/protobuf/module_config_pb2.pyi @@ -165,6 +165,7 @@ class ModuleConfig(google.protobuf.message.Message): PUBLISH_INTERVAL_SECS_FIELD_NUMBER: builtins.int POSITION_PRECISION_FIELD_NUMBER: builtins.int + SHOULD_REPORT_LOCATION_FIELD_NUMBER: builtins.int publish_interval_secs: builtins.int """ How often we should report our info to the map (in seconds) @@ -173,13 +174,18 @@ class ModuleConfig(google.protobuf.message.Message): """ Bits of precision for the location sent (default of 32 is full precision). """ + should_report_location: builtins.bool + """ + Whether we have opted-in to report our location to the map + """ def __init__( self, *, publish_interval_secs: builtins.int = ..., position_precision: builtins.int = ..., + should_report_location: builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["position_precision", b"position_precision", "publish_interval_secs", b"publish_interval_secs"]) -> None: ... + def ClearField(self, field_name: typing.Literal["position_precision", b"position_precision", "publish_interval_secs", b"publish_interval_secs", "should_report_location", b"should_report_location"]) -> None: ... @typing.final class RemoteHardwareConfig(google.protobuf.message.Message): diff --git a/meshtastic/protobuf/mqtt_pb2.py b/meshtastic/protobuf/mqtt_pb2.py index 8286250..0b6b7e7 100644 --- a/meshtastic/protobuf/mqtt_pb2.py +++ b/meshtastic/protobuf/mqtt_pb2.py @@ -15,7 +15,7 @@ from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config from meshtastic.protobuf import mesh_pb2 as meshtastic_dot_protobuf_dot_mesh__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/mqtt.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/config.proto\x1a\x1emeshtastic/protobuf/mesh.proto\"j\n\x0fServiceEnvelope\x12/\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\t\"\xe0\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-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x18\n\x10\x66irmware_version\x18\x05 \x01(\t\x12\x41\n\x06region\x18\x06 \x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12H\n\x0cmodem_preset\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.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\x1emeshtastic/protobuf/mqtt.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/config.proto\x1a\x1emeshtastic/protobuf/mesh.proto\"j\n\x0fServiceEnvelope\x12/\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacket\x12\x12\n\nchannel_id\x18\x02 \x01(\t\x12\x12\n\ngateway_id\x18\x03 \x01(\t\"\x83\x04\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-.meshtastic.protobuf.Config.DeviceConfig.Role\x12\x34\n\x08hw_model\x18\x04 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModel\x12\x18\n\x10\x66irmware_version\x18\x05 \x01(\t\x12\x41\n\x06region\x18\x06 \x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12H\n\x0cmodem_preset\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.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(\r\x12!\n\x19has_opted_report_location\x18\x0e \x01(\x08\x42_\n\x13\x63om.geeksville.meshB\nMQTTProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -26,5 +26,5 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['_SERVICEENVELOPE']._serialized_start=121 _globals['_SERVICEENVELOPE']._serialized_end=227 _globals['_MAPREPORT']._serialized_start=230 - _globals['_MAPREPORT']._serialized_end=710 + _globals['_MAPREPORT']._serialized_end=745 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/mqtt_pb2.pyi b/meshtastic/protobuf/mqtt_pb2.pyi index 7c03e6d..597fa07 100644 --- a/meshtastic/protobuf/mqtt_pb2.pyi +++ b/meshtastic/protobuf/mqtt_pb2.pyi @@ -72,6 +72,7 @@ class MapReport(google.protobuf.message.Message): ALTITUDE_FIELD_NUMBER: builtins.int POSITION_PRECISION_FIELD_NUMBER: builtins.int NUM_ONLINE_LOCAL_NODES_FIELD_NUMBER: builtins.int + HAS_OPTED_REPORT_LOCATION_FIELD_NUMBER: builtins.int long_name: builtins.str """ A full name for this user, i.e. "Kevin Hester" @@ -126,6 +127,11 @@ class MapReport(google.protobuf.message.Message): """ Number of online nodes (heard in the last 2 hours) this node has in its list that were received locally (not via MQTT) """ + has_opted_report_location: builtins.bool + """ + User has opted in to share their location (map report) with the mqtt server + Controlled by map_report.should_report_location + """ def __init__( self, *, @@ -142,7 +148,8 @@ class MapReport(google.protobuf.message.Message): altitude: builtins.int = ..., position_precision: builtins.int = ..., num_online_local_nodes: builtins.int = ..., + has_opted_report_location: builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.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: ... + def ClearField(self, field_name: typing.Literal["altitude", b"altitude", "firmware_version", b"firmware_version", "has_default_channel", b"has_default_channel", "has_opted_report_location", b"has_opted_report_location", "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/protobuf/portnums_pb2.py b/meshtastic/protobuf/portnums_pb2.py index e06eb8d..7b83402 100644 --- a/meshtastic/protobuf/portnums_pb2.py +++ b/meshtastic/protobuf/portnums_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\xcb\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\tALERT_APP\x10\x0b\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\x13\n\x0fPOWERSTRESS_APP\x10J\x12\x18\n\x14RETICULUM_TUNNEL_APP\x10L\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\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\xe5\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\tALERT_APP\x10\x0b\x12\x18\n\x14KEY_VERIFICATION_APP\x10\x0c\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\x13\n\x0fPOWERSTRESS_APP\x10J\x12\x18\n\x14RETICULUM_TUNNEL_APP\x10L\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') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -22,5 +22,5 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_PORTNUM']._serialized_start=60 - _globals['_PORTNUM']._serialized_end=647 + _globals['_PORTNUM']._serialized_end=673 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/portnums_pb2.pyi b/meshtastic/protobuf/portnums_pb2.pyi index fce710a..2386efa 100644 --- a/meshtastic/protobuf/portnums_pb2.pyi +++ b/meshtastic/protobuf/portnums_pb2.pyi @@ -97,6 +97,10 @@ class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy """ Same as Text Message but used for critical alerts. """ + KEY_VERIFICATION_APP: _PortNum.ValueType # 12 + """ + Module/port for handling key verification requests. + """ REPLY_APP: _PortNum.ValueType # 32 """ Provides a 'ping' service that replies to any packet it receives. @@ -291,6 +295,10 @@ ALERT_APP: PortNum.ValueType # 11 """ Same as Text Message but used for critical alerts. """ +KEY_VERIFICATION_APP: PortNum.ValueType # 12 +""" +Module/port for handling key verification requests. +""" REPLY_APP: PortNum.ValueType # 32 """ Provides a 'ping' service that replies to any packet it receives. diff --git a/meshtastic/protobuf/telemetry_pb2.py b/meshtastic/protobuf/telemetry_pb2.py index 28eded8..f387555 100644 --- a/meshtastic/protobuf/telemetry_pb2.py +++ b/meshtastic/protobuf/telemetry_pb2.py @@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/telemetry.proto\x12\x13meshtastic.protobuf\"\xf3\x01\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07voltage\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12 \n\x13\x63hannel_utilization\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x18\n\x0b\x61ir_util_tx\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x1b\n\x0euptime_seconds\x18\x05 \x01(\rH\x04\x88\x01\x01\x42\x10\n\x0e_battery_levelB\n\n\x08_voltageB\x16\n\x14_channel_utilizationB\x0e\n\x0c_air_util_txB\x11\n\x0f_uptime_seconds\"\x82\x07\n\x12\x45nvironmentMetrics\x12\x18\n\x0btemperature\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x1e\n\x11relative_humidity\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12 \n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x1b\n\x0egas_resistance\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x14\n\x07voltage\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x14\n\x07\x63urrent\x18\x06 \x01(\x02H\x05\x88\x01\x01\x12\x10\n\x03iaq\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x08 \x01(\x02H\x07\x88\x01\x01\x12\x10\n\x03lux\x18\t \x01(\x02H\x08\x88\x01\x01\x12\x16\n\twhite_lux\x18\n \x01(\x02H\t\x88\x01\x01\x12\x13\n\x06ir_lux\x18\x0b \x01(\x02H\n\x88\x01\x01\x12\x13\n\x06uv_lux\x18\x0c \x01(\x02H\x0b\x88\x01\x01\x12\x1b\n\x0ewind_direction\x18\r \x01(\rH\x0c\x88\x01\x01\x12\x17\n\nwind_speed\x18\x0e \x01(\x02H\r\x88\x01\x01\x12\x13\n\x06weight\x18\x0f \x01(\x02H\x0e\x88\x01\x01\x12\x16\n\twind_gust\x18\x10 \x01(\x02H\x0f\x88\x01\x01\x12\x16\n\twind_lull\x18\x11 \x01(\x02H\x10\x88\x01\x01\x12\x16\n\tradiation\x18\x12 \x01(\x02H\x11\x88\x01\x01\x12\x18\n\x0brainfall_1h\x18\x13 \x01(\x02H\x12\x88\x01\x01\x12\x19\n\x0crainfall_24h\x18\x14 \x01(\x02H\x13\x88\x01\x01\x12\x1a\n\rsoil_moisture\x18\x15 \x01(\rH\x14\x88\x01\x01\x12\x1d\n\x10soil_temperature\x18\x16 \x01(\x02H\x15\x88\x01\x01\x42\x0e\n\x0c_temperatureB\x14\n\x12_relative_humidityB\x16\n\x14_barometric_pressureB\x11\n\x0f_gas_resistanceB\n\n\x08_voltageB\n\n\x08_currentB\x06\n\x04_iaqB\x0b\n\t_distanceB\x06\n\x04_luxB\x0c\n\n_white_luxB\t\n\x07_ir_luxB\t\n\x07_uv_luxB\x11\n\x0f_wind_directionB\r\n\x0b_wind_speedB\t\n\x07_weightB\x0c\n\n_wind_gustB\x0c\n\n_wind_lullB\x0c\n\n_radiationB\x0e\n\x0c_rainfall_1hB\x0f\n\r_rainfall_24hB\x10\n\x0e_soil_moistureB\x13\n\x11_soil_temperature\"\x8a\x02\n\x0cPowerMetrics\x12\x18\n\x0b\x63h1_voltage\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x18\n\x0b\x63h1_current\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12\x18\n\x0b\x63h2_voltage\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x18\n\x0b\x63h2_current\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x18\n\x0b\x63h3_voltage\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x18\n\x0b\x63h3_current\x18\x06 \x01(\x02H\x05\x88\x01\x01\x42\x0e\n\x0c_ch1_voltageB\x0e\n\x0c_ch1_currentB\x0e\n\x0c_ch2_voltageB\x0e\n\x0c_ch2_currentB\x0e\n\x0c_ch3_voltageB\x0e\n\x0c_ch3_current\"\x85\x05\n\x11\x41irQualityMetrics\x12\x1a\n\rpm10_standard\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1a\n\rpm25_standard\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0epm100_standard\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x1f\n\x12pm10_environmental\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x1f\n\x12pm25_environmental\x18\x05 \x01(\rH\x04\x88\x01\x01\x12 \n\x13pm100_environmental\x18\x06 \x01(\rH\x05\x88\x01\x01\x12\x1b\n\x0eparticles_03um\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x1b\n\x0eparticles_05um\x18\x08 \x01(\rH\x07\x88\x01\x01\x12\x1b\n\x0eparticles_10um\x18\t \x01(\rH\x08\x88\x01\x01\x12\x1b\n\x0eparticles_25um\x18\n \x01(\rH\t\x88\x01\x01\x12\x1b\n\x0eparticles_50um\x18\x0b \x01(\rH\n\x88\x01\x01\x12\x1c\n\x0fparticles_100um\x18\x0c \x01(\rH\x0b\x88\x01\x01\x12\x10\n\x03\x63o2\x18\r \x01(\rH\x0c\x88\x01\x01\x42\x10\n\x0e_pm10_standardB\x10\n\x0e_pm25_standardB\x11\n\x0f_pm100_standardB\x15\n\x13_pm10_environmentalB\x15\n\x13_pm25_environmentalB\x16\n\x14_pm100_environmentalB\x11\n\x0f_particles_03umB\x11\n\x0f_particles_05umB\x11\n\x0f_particles_10umB\x11\n\x0f_particles_25umB\x11\n\x0f_particles_50umB\x12\n\x10_particles_100umB\x06\n\x04_co2\"\x9f\x02\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\x02\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\x02\x12\x16\n\x0enum_packets_tx\x18\x04 \x01(\r\x12\x16\n\x0enum_packets_rx\x18\x05 \x01(\r\x12\x1a\n\x12num_packets_rx_bad\x18\x06 \x01(\r\x12\x18\n\x10num_online_nodes\x18\x07 \x01(\r\x12\x17\n\x0fnum_total_nodes\x18\x08 \x01(\r\x12\x13\n\x0bnum_rx_dupe\x18\t \x01(\r\x12\x14\n\x0cnum_tx_relay\x18\n \x01(\r\x12\x1d\n\x15num_tx_relay_canceled\x18\x0b \x01(\r\"{\n\rHealthMetrics\x12\x16\n\theart_bpm\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04spO2\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x18\n\x0btemperature\x18\x03 \x01(\x02H\x02\x88\x01\x01\x42\x0c\n\n_heart_bpmB\x07\n\x05_spO2B\x0e\n\x0c_temperature\"\xa3\x03\n\tTelemetry\x12\x0c\n\x04time\x18\x01 \x01(\x07\x12<\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetricsH\x00\x12\x46\n\x13\x65nvironment_metrics\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.EnvironmentMetricsH\x00\x12\x45\n\x13\x61ir_quality_metrics\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.AirQualityMetricsH\x00\x12:\n\rpower_metrics\x18\x05 \x01(\x0b\x32!.meshtastic.protobuf.PowerMetricsH\x00\x12\x36\n\x0blocal_stats\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LocalStatsH\x00\x12<\n\x0ehealth_metrics\x18\x07 \x01(\x0b\x32\".meshtastic.protobuf.HealthMetricsH\x00\x42\t\n\x07variant\">\n\rNau7802Config\x12\x12\n\nzeroOffset\x18\x01 \x01(\x05\x12\x19\n\x11\x63\x61librationFactor\x18\x02 \x01(\x02*\x91\x04\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\x12\x0c\n\x08RCWL9620\x10\x10\x12\t\n\x05SHT4X\x10\x11\x12\x0c\n\x08VEML7700\x10\x12\x12\x0c\n\x08MLX90632\x10\x13\x12\x0b\n\x07OPT3001\x10\x14\x12\x0c\n\x08LTR390UV\x10\x15\x12\x0e\n\nTSL25911FN\x10\x16\x12\t\n\x05\x41HT10\x10\x17\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x18\x12\x0b\n\x07NAU7802\x10\x19\x12\n\n\x06\x42MP3XX\x10\x1a\x12\x0c\n\x08ICM20948\x10\x1b\x12\x0c\n\x08MAX17048\x10\x1c\x12\x11\n\rCUSTOM_SENSOR\x10\x1d\x12\x0c\n\x08MAX30102\x10\x1e\x12\x0c\n\x08MLX90614\x10\x1f\x12\t\n\x05SCD4X\x10 \x12\x0b\n\x07RADSENS\x10!\x12\n\n\x06INA226\x10\"\x12\x10\n\x0c\x44\x46ROBOT_RAIN\x10#\x12\n\n\x06\x44PS310\x10$\x12\x0c\n\x08RAK12035\x10%Bd\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#meshtastic/protobuf/telemetry.proto\x12\x13meshtastic.protobuf\"\xf3\x01\n\rDeviceMetrics\x12\x1a\n\rbattery_level\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x14\n\x07voltage\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12 \n\x13\x63hannel_utilization\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x18\n\x0b\x61ir_util_tx\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x1b\n\x0euptime_seconds\x18\x05 \x01(\rH\x04\x88\x01\x01\x42\x10\n\x0e_battery_levelB\n\n\x08_voltageB\x16\n\x14_channel_utilizationB\x0e\n\x0c_air_util_txB\x11\n\x0f_uptime_seconds\"\x82\x07\n\x12\x45nvironmentMetrics\x12\x18\n\x0btemperature\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x1e\n\x11relative_humidity\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12 \n\x13\x62\x61rometric_pressure\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x1b\n\x0egas_resistance\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x14\n\x07voltage\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x14\n\x07\x63urrent\x18\x06 \x01(\x02H\x05\x88\x01\x01\x12\x10\n\x03iaq\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x15\n\x08\x64istance\x18\x08 \x01(\x02H\x07\x88\x01\x01\x12\x10\n\x03lux\x18\t \x01(\x02H\x08\x88\x01\x01\x12\x16\n\twhite_lux\x18\n \x01(\x02H\t\x88\x01\x01\x12\x13\n\x06ir_lux\x18\x0b \x01(\x02H\n\x88\x01\x01\x12\x13\n\x06uv_lux\x18\x0c \x01(\x02H\x0b\x88\x01\x01\x12\x1b\n\x0ewind_direction\x18\r \x01(\rH\x0c\x88\x01\x01\x12\x17\n\nwind_speed\x18\x0e \x01(\x02H\r\x88\x01\x01\x12\x13\n\x06weight\x18\x0f \x01(\x02H\x0e\x88\x01\x01\x12\x16\n\twind_gust\x18\x10 \x01(\x02H\x0f\x88\x01\x01\x12\x16\n\twind_lull\x18\x11 \x01(\x02H\x10\x88\x01\x01\x12\x16\n\tradiation\x18\x12 \x01(\x02H\x11\x88\x01\x01\x12\x18\n\x0brainfall_1h\x18\x13 \x01(\x02H\x12\x88\x01\x01\x12\x19\n\x0crainfall_24h\x18\x14 \x01(\x02H\x13\x88\x01\x01\x12\x1a\n\rsoil_moisture\x18\x15 \x01(\rH\x14\x88\x01\x01\x12\x1d\n\x10soil_temperature\x18\x16 \x01(\x02H\x15\x88\x01\x01\x42\x0e\n\x0c_temperatureB\x14\n\x12_relative_humidityB\x16\n\x14_barometric_pressureB\x11\n\x0f_gas_resistanceB\n\n\x08_voltageB\n\n\x08_currentB\x06\n\x04_iaqB\x0b\n\t_distanceB\x06\n\x04_luxB\x0c\n\n_white_luxB\t\n\x07_ir_luxB\t\n\x07_uv_luxB\x11\n\x0f_wind_directionB\r\n\x0b_wind_speedB\t\n\x07_weightB\x0c\n\n_wind_gustB\x0c\n\n_wind_lullB\x0c\n\n_radiationB\x0e\n\x0c_rainfall_1hB\x0f\n\r_rainfall_24hB\x10\n\x0e_soil_moistureB\x13\n\x11_soil_temperature\"\x8a\x02\n\x0cPowerMetrics\x12\x18\n\x0b\x63h1_voltage\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x18\n\x0b\x63h1_current\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12\x18\n\x0b\x63h2_voltage\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x18\n\x0b\x63h2_current\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x18\n\x0b\x63h3_voltage\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x18\n\x0b\x63h3_current\x18\x06 \x01(\x02H\x05\x88\x01\x01\x42\x0e\n\x0c_ch1_voltageB\x0e\n\x0c_ch1_currentB\x0e\n\x0c_ch2_voltageB\x0e\n\x0c_ch2_currentB\x0e\n\x0c_ch3_voltageB\x0e\n\x0c_ch3_current\"\x85\x05\n\x11\x41irQualityMetrics\x12\x1a\n\rpm10_standard\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x1a\n\rpm25_standard\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0epm100_standard\x18\x03 \x01(\rH\x02\x88\x01\x01\x12\x1f\n\x12pm10_environmental\x18\x04 \x01(\rH\x03\x88\x01\x01\x12\x1f\n\x12pm25_environmental\x18\x05 \x01(\rH\x04\x88\x01\x01\x12 \n\x13pm100_environmental\x18\x06 \x01(\rH\x05\x88\x01\x01\x12\x1b\n\x0eparticles_03um\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x1b\n\x0eparticles_05um\x18\x08 \x01(\rH\x07\x88\x01\x01\x12\x1b\n\x0eparticles_10um\x18\t \x01(\rH\x08\x88\x01\x01\x12\x1b\n\x0eparticles_25um\x18\n \x01(\rH\t\x88\x01\x01\x12\x1b\n\x0eparticles_50um\x18\x0b \x01(\rH\n\x88\x01\x01\x12\x1c\n\x0fparticles_100um\x18\x0c \x01(\rH\x0b\x88\x01\x01\x12\x10\n\x03\x63o2\x18\r \x01(\rH\x0c\x88\x01\x01\x42\x10\n\x0e_pm10_standardB\x10\n\x0e_pm25_standardB\x11\n\x0f_pm100_standardB\x15\n\x13_pm10_environmentalB\x15\n\x13_pm25_environmentalB\x16\n\x14_pm100_environmentalB\x11\n\x0f_particles_03umB\x11\n\x0f_particles_05umB\x11\n\x0f_particles_10umB\x11\n\x0f_particles_25umB\x11\n\x0f_particles_50umB\x12\n\x10_particles_100umB\x06\n\x04_co2\"\xd2\x02\n\nLocalStats\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x1b\n\x13\x63hannel_utilization\x18\x02 \x01(\x02\x12\x13\n\x0b\x61ir_util_tx\x18\x03 \x01(\x02\x12\x16\n\x0enum_packets_tx\x18\x04 \x01(\r\x12\x16\n\x0enum_packets_rx\x18\x05 \x01(\r\x12\x1a\n\x12num_packets_rx_bad\x18\x06 \x01(\r\x12\x18\n\x10num_online_nodes\x18\x07 \x01(\r\x12\x17\n\x0fnum_total_nodes\x18\x08 \x01(\r\x12\x13\n\x0bnum_rx_dupe\x18\t \x01(\r\x12\x14\n\x0cnum_tx_relay\x18\n \x01(\r\x12\x1d\n\x15num_tx_relay_canceled\x18\x0b \x01(\r\x12\x18\n\x10heap_total_bytes\x18\x0c \x01(\r\x12\x17\n\x0fheap_free_bytes\x18\r \x01(\r\"{\n\rHealthMetrics\x12\x16\n\theart_bpm\x18\x01 \x01(\rH\x00\x88\x01\x01\x12\x11\n\x04spO2\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x18\n\x0btemperature\x18\x03 \x01(\x02H\x02\x88\x01\x01\x42\x0c\n\n_heart_bpmB\x07\n\x05_spO2B\x0e\n\x0c_temperature\"\x91\x02\n\x0bHostMetrics\x12\x16\n\x0euptime_seconds\x18\x01 \x01(\r\x12\x15\n\rfreemem_bytes\x18\x02 \x01(\x04\x12\x17\n\x0f\x64iskfree1_bytes\x18\x03 \x01(\x04\x12\x1c\n\x0f\x64iskfree2_bytes\x18\x04 \x01(\x04H\x00\x88\x01\x01\x12\x1c\n\x0f\x64iskfree3_bytes\x18\x05 \x01(\x04H\x01\x88\x01\x01\x12\r\n\x05load1\x18\x06 \x01(\r\x12\r\n\x05load5\x18\x07 \x01(\r\x12\x0e\n\x06load15\x18\x08 \x01(\r\x12\x18\n\x0buser_string\x18\t \x01(\tH\x02\x88\x01\x01\x42\x12\n\x10_diskfree2_bytesB\x12\n\x10_diskfree3_bytesB\x0e\n\x0c_user_string\"\xdd\x03\n\tTelemetry\x12\x0c\n\x04time\x18\x01 \x01(\x07\x12<\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetricsH\x00\x12\x46\n\x13\x65nvironment_metrics\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.EnvironmentMetricsH\x00\x12\x45\n\x13\x61ir_quality_metrics\x18\x04 \x01(\x0b\x32&.meshtastic.protobuf.AirQualityMetricsH\x00\x12:\n\rpower_metrics\x18\x05 \x01(\x0b\x32!.meshtastic.protobuf.PowerMetricsH\x00\x12\x36\n\x0blocal_stats\x18\x06 \x01(\x0b\x32\x1f.meshtastic.protobuf.LocalStatsH\x00\x12<\n\x0ehealth_metrics\x18\x07 \x01(\x0b\x32\".meshtastic.protobuf.HealthMetricsH\x00\x12\x38\n\x0chost_metrics\x18\x08 \x01(\x0b\x32 .meshtastic.protobuf.HostMetricsH\x00\x42\t\n\x07variant\">\n\rNau7802Config\x12\x12\n\nzeroOffset\x18\x01 \x01(\x05\x12\x19\n\x11\x63\x61librationFactor\x18\x02 \x01(\x02*\xac\x04\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\x12\x0c\n\x08RCWL9620\x10\x10\x12\t\n\x05SHT4X\x10\x11\x12\x0c\n\x08VEML7700\x10\x12\x12\x0c\n\x08MLX90632\x10\x13\x12\x0b\n\x07OPT3001\x10\x14\x12\x0c\n\x08LTR390UV\x10\x15\x12\x0e\n\nTSL25911FN\x10\x16\x12\t\n\x05\x41HT10\x10\x17\x12\x10\n\x0c\x44\x46ROBOT_LARK\x10\x18\x12\x0b\n\x07NAU7802\x10\x19\x12\n\n\x06\x42MP3XX\x10\x1a\x12\x0c\n\x08ICM20948\x10\x1b\x12\x0c\n\x08MAX17048\x10\x1c\x12\x11\n\rCUSTOM_SENSOR\x10\x1d\x12\x0c\n\x08MAX30102\x10\x1e\x12\x0c\n\x08MLX90614\x10\x1f\x12\t\n\x05SCD4X\x10 \x12\x0b\n\x07RADSENS\x10!\x12\n\n\x06INA226\x10\"\x12\x10\n\x0c\x44\x46ROBOT_RAIN\x10#\x12\n\n\x06\x44PS310\x10$\x12\x0c\n\x08RAK12035\x10%\x12\x0c\n\x08MAX17261\x10&\x12\x0b\n\x07PCT2075\x10\'Bd\n\x13\x63om.geeksville.meshB\x0fTelemetryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -21,8 +21,8 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.telemet if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\023com.geeksville.meshB\017TelemetryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' - _globals['_TELEMETRYSENSORTYPE']._serialized_start=3026 - _globals['_TELEMETRYSENSORTYPE']._serialized_end=3555 + _globals['_TELEMETRYSENSORTYPE']._serialized_start=3411 + _globals['_TELEMETRYSENSORTYPE']._serialized_end=3967 _globals['_DEVICEMETRICS']._serialized_start=61 _globals['_DEVICEMETRICS']._serialized_end=304 _globals['_ENVIRONMENTMETRICS']._serialized_start=307 @@ -32,11 +32,13 @@ if _descriptor._USE_C_DESCRIPTORS == False: _globals['_AIRQUALITYMETRICS']._serialized_start=1477 _globals['_AIRQUALITYMETRICS']._serialized_end=2122 _globals['_LOCALSTATS']._serialized_start=2125 - _globals['_LOCALSTATS']._serialized_end=2412 - _globals['_HEALTHMETRICS']._serialized_start=2414 - _globals['_HEALTHMETRICS']._serialized_end=2537 - _globals['_TELEMETRY']._serialized_start=2540 - _globals['_TELEMETRY']._serialized_end=2959 - _globals['_NAU7802CONFIG']._serialized_start=2961 - _globals['_NAU7802CONFIG']._serialized_end=3023 + _globals['_LOCALSTATS']._serialized_end=2463 + _globals['_HEALTHMETRICS']._serialized_start=2465 + _globals['_HEALTHMETRICS']._serialized_end=2588 + _globals['_HOSTMETRICS']._serialized_start=2591 + _globals['_HOSTMETRICS']._serialized_end=2864 + _globals['_TELEMETRY']._serialized_start=2867 + _globals['_TELEMETRY']._serialized_end=3344 + _globals['_NAU7802CONFIG']._serialized_start=3346 + _globals['_NAU7802CONFIG']._serialized_end=3408 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/telemetry_pb2.pyi b/meshtastic/protobuf/telemetry_pb2.pyi index 149b138..7ecf298 100644 --- a/meshtastic/protobuf/telemetry_pb2.pyi +++ b/meshtastic/protobuf/telemetry_pb2.pyi @@ -175,6 +175,14 @@ class _TelemetrySensorTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wra """ RAKWireless RAK12035 Soil Moisture Sensor Module """ + MAX17261: _TelemetrySensorType.ValueType # 38 + """ + MAX17261 lipo battery gauge + """ + PCT2075: _TelemetrySensorType.ValueType # 39 + """ + PCT2075 Temperature Sensor + """ class TelemetrySensorType(_TelemetrySensorType, metaclass=_TelemetrySensorTypeEnumTypeWrapper): """ @@ -333,6 +341,14 @@ RAK12035: TelemetrySensorType.ValueType # 37 """ RAKWireless RAK12035 Soil Moisture Sensor Module """ +MAX17261: TelemetrySensorType.ValueType # 38 +""" +MAX17261 lipo battery gauge +""" +PCT2075: TelemetrySensorType.ValueType # 39 +""" +PCT2075 Temperature Sensor +""" global___TelemetrySensorType = TelemetrySensorType @typing.final @@ -792,6 +808,8 @@ class LocalStats(google.protobuf.message.Message): NUM_RX_DUPE_FIELD_NUMBER: builtins.int NUM_TX_RELAY_FIELD_NUMBER: builtins.int NUM_TX_RELAY_CANCELED_FIELD_NUMBER: builtins.int + HEAP_TOTAL_BYTES_FIELD_NUMBER: builtins.int + HEAP_FREE_BYTES_FIELD_NUMBER: builtins.int uptime_seconds: builtins.int """ How long the device has been running since the last reboot (in seconds) @@ -838,6 +856,14 @@ class LocalStats(google.protobuf.message.Message): Number of times we canceled a packet to be relayed, because someone else did it before us. This will always be zero for ROUTERs/REPEATERs. If this number is high, some other node(s) is/are relaying faster than you. """ + heap_total_bytes: builtins.int + """ + Number of bytes used in the heap + """ + heap_free_bytes: builtins.int + """ + Number of bytes free in the heap + """ def __init__( self, *, @@ -852,8 +878,10 @@ class LocalStats(google.protobuf.message.Message): num_rx_dupe: builtins.int = ..., num_tx_relay: builtins.int = ..., num_tx_relay_canceled: builtins.int = ..., + heap_total_bytes: builtins.int = ..., + heap_free_bytes: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["air_util_tx", b"air_util_tx", "channel_utilization", b"channel_utilization", "num_online_nodes", b"num_online_nodes", "num_packets_rx", b"num_packets_rx", "num_packets_rx_bad", b"num_packets_rx_bad", "num_packets_tx", b"num_packets_tx", "num_rx_dupe", b"num_rx_dupe", "num_total_nodes", b"num_total_nodes", "num_tx_relay", b"num_tx_relay", "num_tx_relay_canceled", b"num_tx_relay_canceled", "uptime_seconds", b"uptime_seconds"]) -> None: ... + def ClearField(self, field_name: typing.Literal["air_util_tx", b"air_util_tx", "channel_utilization", b"channel_utilization", "heap_free_bytes", b"heap_free_bytes", "heap_total_bytes", b"heap_total_bytes", "num_online_nodes", b"num_online_nodes", "num_packets_rx", b"num_packets_rx", "num_packets_rx_bad", b"num_packets_rx_bad", "num_packets_tx", b"num_packets_tx", "num_rx_dupe", b"num_rx_dupe", "num_total_nodes", b"num_total_nodes", "num_tx_relay", b"num_tx_relay", "num_tx_relay_canceled", b"num_tx_relay_canceled", "uptime_seconds", b"uptime_seconds"]) -> None: ... global___LocalStats = LocalStats @@ -898,6 +926,84 @@ class HealthMetrics(google.protobuf.message.Message): global___HealthMetrics = HealthMetrics +@typing.final +class HostMetrics(google.protobuf.message.Message): + """ + Linux host metrics + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + UPTIME_SECONDS_FIELD_NUMBER: builtins.int + FREEMEM_BYTES_FIELD_NUMBER: builtins.int + DISKFREE1_BYTES_FIELD_NUMBER: builtins.int + DISKFREE2_BYTES_FIELD_NUMBER: builtins.int + DISKFREE3_BYTES_FIELD_NUMBER: builtins.int + LOAD1_FIELD_NUMBER: builtins.int + LOAD5_FIELD_NUMBER: builtins.int + LOAD15_FIELD_NUMBER: builtins.int + USER_STRING_FIELD_NUMBER: builtins.int + uptime_seconds: builtins.int + """ + Host system uptime + """ + freemem_bytes: builtins.int + """ + Host system free memory + """ + diskfree1_bytes: builtins.int + """ + Host system disk space free for / + """ + diskfree2_bytes: builtins.int + """ + Secondary system disk space free + """ + diskfree3_bytes: builtins.int + """ + Tertiary disk space free + """ + load1: builtins.int + """ + Host system one minute load in 1/100ths + """ + load5: builtins.int + """ + Host system five minute load in 1/100ths + """ + load15: builtins.int + """ + Host system fifteen minute load in 1/100ths + """ + user_string: builtins.str + """ + Optional User-provided string for arbitrary host system information + that doesn't make sense as a dedicated entry. + """ + def __init__( + self, + *, + uptime_seconds: builtins.int = ..., + freemem_bytes: builtins.int = ..., + diskfree1_bytes: builtins.int = ..., + diskfree2_bytes: builtins.int | None = ..., + diskfree3_bytes: builtins.int | None = ..., + load1: builtins.int = ..., + load5: builtins.int = ..., + load15: builtins.int = ..., + user_string: builtins.str | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["_diskfree2_bytes", b"_diskfree2_bytes", "_diskfree3_bytes", b"_diskfree3_bytes", "_user_string", b"_user_string", "diskfree2_bytes", b"diskfree2_bytes", "diskfree3_bytes", b"diskfree3_bytes", "user_string", b"user_string"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_diskfree2_bytes", b"_diskfree2_bytes", "_diskfree3_bytes", b"_diskfree3_bytes", "_user_string", b"_user_string", "diskfree1_bytes", b"diskfree1_bytes", "diskfree2_bytes", b"diskfree2_bytes", "diskfree3_bytes", b"diskfree3_bytes", "freemem_bytes", b"freemem_bytes", "load1", b"load1", "load15", b"load15", "load5", b"load5", "uptime_seconds", b"uptime_seconds", "user_string", b"user_string"]) -> None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_diskfree2_bytes", b"_diskfree2_bytes"]) -> typing.Literal["diskfree2_bytes"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_diskfree3_bytes", b"_diskfree3_bytes"]) -> typing.Literal["diskfree3_bytes"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_user_string", b"_user_string"]) -> typing.Literal["user_string"] | None: ... + +global___HostMetrics = HostMetrics + @typing.final class Telemetry(google.protobuf.message.Message): """ @@ -913,6 +1019,7 @@ class Telemetry(google.protobuf.message.Message): POWER_METRICS_FIELD_NUMBER: builtins.int LOCAL_STATS_FIELD_NUMBER: builtins.int HEALTH_METRICS_FIELD_NUMBER: builtins.int + HOST_METRICS_FIELD_NUMBER: builtins.int time: builtins.int """ Seconds since 1970 - or 0 for unknown/unset @@ -953,6 +1060,12 @@ class Telemetry(google.protobuf.message.Message): Health telemetry metrics """ + @property + def host_metrics(self) -> global___HostMetrics: + """ + Linux host metrics + """ + def __init__( self, *, @@ -963,10 +1076,11 @@ class Telemetry(google.protobuf.message.Message): power_metrics: global___PowerMetrics | None = ..., local_stats: global___LocalStats | None = ..., health_metrics: global___HealthMetrics | None = ..., + host_metrics: global___HostMetrics | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "health_metrics", b"health_metrics", "local_stats", b"local_stats", "power_metrics", b"power_metrics", "variant", b"variant"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "health_metrics", b"health_metrics", "local_stats", b"local_stats", "power_metrics", b"power_metrics", "time", b"time", "variant", b"variant"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["variant", b"variant"]) -> typing.Literal["device_metrics", "environment_metrics", "air_quality_metrics", "power_metrics", "local_stats", "health_metrics"] | None: ... + def HasField(self, field_name: typing.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "health_metrics", b"health_metrics", "host_metrics", b"host_metrics", "local_stats", b"local_stats", "power_metrics", b"power_metrics", "variant", b"variant"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["air_quality_metrics", b"air_quality_metrics", "device_metrics", b"device_metrics", "environment_metrics", b"environment_metrics", "health_metrics", b"health_metrics", "host_metrics", b"host_metrics", "local_stats", b"local_stats", "power_metrics", b"power_metrics", "time", b"time", "variant", b"variant"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["variant", b"variant"]) -> typing.Literal["device_metrics", "environment_metrics", "air_quality_metrics", "power_metrics", "local_stats", "health_metrics", "host_metrics"] | None: ... global___Telemetry = Telemetry diff --git a/protobufs b/protobufs index 078ac8d..c758376 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 078ac8dfbe5f7533d7755cbe2ca3d08d86e5af34 +Subproject commit c758376d04cf5d3d42de24f9388836a18bae9a76 From a097161dbc396ec782b167c43e57c82bedfe0bdf Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Mon, 16 Jun 2025 12:45:14 -0700 Subject: [PATCH 28/38] Add a sendMqttClientProxyMessage helper for client proxy implementation --- meshtastic/mesh_interface.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index a3a67b7..cf9009c 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -1,6 +1,6 @@ """Mesh Interface class """ -# pylint: disable=R0917 +# pylint: disable=R0917,C0302 import collections import json @@ -477,6 +477,18 @@ class MeshInterface: # pylint: disable=R0902 priority=mesh_pb2.MeshPacket.Priority.ALERT ) + def sendMqttClientProxyMessage(self, topic: str, data: bytes): + """Send an MQTT Client Proxy message to the radio. + + Topic and data should be the MQTT topic and the message + payload from an MQTT broker, respectively.""" + prox = mesh_pb2.MqttClientProxyMessage() + prox.topic = topic + prox.data = data + toRadio = mesh_pb2.ToRadio() + toRadio.mqttClientProxyMessage.CopyFrom(prox) + self._sendToRadio(toRadio) + def sendData( self, data, From db21942244376f2ac0d1ce90317469d52dcd6df1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 23 Jun 2025 22:15:45 +0000 Subject: [PATCH 29/38] bump version to 2.6.4 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ad1888d..d60d0e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "meshtastic" -version = "2.6.3" +version = "2.6.4" description = "Python API & client shell for talking to Meshtastic devices" authors = ["Meshtastic Developers "] license = "GPL-3.0-only" From 213faa0cae0504ca5b49a03fa9a3c47c75ecca09 Mon Sep 17 00:00:00 2001 From: rcarteraz Date: Wed, 25 Jun 2025 12:23:00 -0700 Subject: [PATCH 30/38] rename and move license file --- LICENSES/GPL-3.0-only.txt => LICENSE.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSES/GPL-3.0-only.txt => LICENSE.md (100%) diff --git a/LICENSES/GPL-3.0-only.txt b/LICENSE.md similarity index 100% rename from LICENSES/GPL-3.0-only.txt rename to LICENSE.md From 795b6520692903a2a9c5207edf978bcfdc662fb2 Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Mon, 30 Jun 2025 00:03:11 -0700 Subject: [PATCH 31/38] export utf-8 --- meshtastic/__main__.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index ec75591..2474306 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -751,13 +751,24 @@ def onConnected(interface): interface.getNode(args.dest, False, **getNode_kwargs).commitSettingsTransaction() print("Writing modified configuration to device") - if args.export_config: + if args.export_config is not None: if args.dest != BROADCAST_ADDR: print("Exporting configuration of remote nodes is not supported.") return - # export the configuration (the opposite of '--configure') + closeNow = True - export_config(interface) + config_txt = export_config(interface) + + if args.export_config == "-": + # Output to stdout (preserves legacy use of `> file.yaml`) + print(config_txt) + else: + try: + with open(args.export_config, "w", encoding="utf-8") as f: + f.write(config_txt) + print(f"Exported configuration to {args.export_config}") + except Exception as e: + meshtastic.util.our_exit(f"ERROR: Failed to write config file: {e}") if args.ch_set_url: closeNow = True @@ -1160,7 +1171,6 @@ def export_config(interface) -> str: config_txt = "# start of Meshtastic configure yaml\n" #checkme - "config" (now changed to config_out) #was used as a string here and a Dictionary above config_txt += yaml.dump(configObj) - print(config_txt) return config_txt @@ -1458,10 +1468,12 @@ def addImportExportArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPar help="Specify a path to a yaml(.yml) file containing the desired settings for the connected device.", action="append", ) - group.add_argument( + parser.add_argument( "--export-config", - help="Export the configuration in yaml(.yml) format.", - action="store_true", + nargs="?", + const="-", # default to "-" if no value provided + metavar="FILE", + help="Export device config as YAML (to stdout if no file given)" ) return parser From 58fc614fb71a988239b9cbefbfdc6a2fe597e748 Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Mon, 30 Jun 2025 00:12:42 -0700 Subject: [PATCH 32/38] fix test --- meshtastic/tests/test_main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/meshtastic/tests/test_main.py b/meshtastic/tests/test_main.py index 235829d..67379c8 100644 --- a/meshtastic/tests/test_main.py +++ b/meshtastic/tests/test_main.py @@ -1738,7 +1738,8 @@ position_broadcast_smart: true fixed_position: true position_flags: 35""" export_config(mo) - out, err = capsys.readouterr() + out = export_config(mo) + err = "" # ensure we do not output this line assert not re.search(r"Connected to radio", out, re.MULTILINE) From 2fa85bac1f6fd3333e3de8ba2e3733c5ebef3022 Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Mon, 30 Jun 2025 00:21:15 -0700 Subject: [PATCH 33/38] typo --- meshtastic/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index 2474306..fb12931 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -1468,7 +1468,7 @@ def addImportExportArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPar help="Specify a path to a yaml(.yml) file containing the desired settings for the connected device.", action="append", ) - parser.add_argument( + group.add_argument( "--export-config", nargs="?", const="-", # default to "-" if no value provided From 0ae23eec7e347e9b35240f7e59ff434a5ff83d7c Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Mon, 30 Jun 2025 00:34:44 -0700 Subject: [PATCH 34/38] don't think i needed that --- meshtastic/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index fb12931..dc090af 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -751,7 +751,7 @@ def onConnected(interface): interface.getNode(args.dest, False, **getNode_kwargs).commitSettingsTransaction() print("Writing modified configuration to device") - if args.export_config is not None: + if args.export_config: if args.dest != BROADCAST_ADDR: print("Exporting configuration of remote nodes is not supported.") return From ca82e1ce2b46fd41d6592ba4ebc11a13928c8990 Mon Sep 17 00:00:00 2001 From: Cyclic3 Date: Tue, 8 Jul 2025 23:38:02 +0100 Subject: [PATCH 35/38] plumb reply_id into sendText and sendData --- meshtastic/mesh_interface.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/meshtastic/mesh_interface.py b/meshtastic/mesh_interface.py index cf9009c..e35a60b 100644 --- a/meshtastic/mesh_interface.py +++ b/meshtastic/mesh_interface.py @@ -411,7 +411,8 @@ class MeshInterface: # pylint: disable=R0902 wantResponse: bool = False, onResponse: Optional[Callable[[dict], Any]] = None, channelIndex: int = 0, - portNum: portnums_pb2.PortNum.ValueType = portnums_pb2.PortNum.TEXT_MESSAGE_APP + portNum: portnums_pb2.PortNum.ValueType = portnums_pb2.PortNum.TEXT_MESSAGE_APP, + replyId: Optional[int]=None, ): """Send a utf8 string to some other node, if the node has a display it will also be shown on the device. @@ -428,6 +429,7 @@ class MeshInterface: # pylint: disable=R0902 send an application layer response portNum -- the application portnum (similar to IP port numbers) of the destination, see portnums.proto for a list + replyId -- the ID of the message that this packet is a response to Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. @@ -441,6 +443,7 @@ class MeshInterface: # pylint: disable=R0902 wantResponse=wantResponse, onResponse=onResponse, channelIndex=channelIndex, + replyId=replyId ) @@ -451,7 +454,7 @@ class MeshInterface: # pylint: disable=R0902 onResponse: Optional[Callable[[dict], Any]] = None, channelIndex: int = 0, ): - """Send an alert text to some other node. This is similar to a text message, + """Send an alert text to some other node. This is similar to a text message, but carries a higher priority and is capable of generating special notifications on certain clients. @@ -503,6 +506,7 @@ class MeshInterface: # pylint: disable=R0902 pkiEncrypted: Optional[bool]=False, publicKey: Optional[bytes]=None, priority: mesh_pb2.MeshPacket.Priority.ValueType=mesh_pb2.MeshPacket.Priority.RELIABLE, + replyId: Optional[int]=None, ): # pylint: disable=R0913 """Send a data packet to some other node @@ -527,6 +531,7 @@ class MeshInterface: # pylint: disable=R0902 will implicitly be true. channelIndex -- channel number to use hopLimit -- hop limit to use + replyId -- the ID of the message that this packet is a response to Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. @@ -554,6 +559,8 @@ class MeshInterface: # pylint: disable=R0902 meshPacket.decoded.portnum = portNum meshPacket.decoded.want_response = wantResponse meshPacket.id = self._generatePacketId() + if replyId is not None: + meshPacket.decoded.reply_id = replyId if priority is not None: meshPacket.priority = priority @@ -884,7 +891,7 @@ class MeshInterface: # pylint: disable=R0902 Send a waypoint deletion packet to some other node (normally a broadcast) NB: The id must be the waypoint's id and not the id of the packet creation. - + Returns the sent packet. The id field will be populated in this packet and can be used to track future message acks/naks. """ From d633f8c895c73776c506dda0e3359aa21314b4d4 Mon Sep 17 00:00:00 2001 From: flockofsparrows Date: Wed, 9 Jul 2025 16:23:21 -0400 Subject: [PATCH 36/38] Add seeed xiao esp32s3 to supported devices --- meshtastic/supported_device.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/meshtastic/supported_device.py b/meshtastic/supported_device.py index 8f491fb..e5c8271 100755 --- a/meshtastic/supported_device.py +++ b/meshtastic/supported_device.py @@ -207,6 +207,18 @@ nano_g1 = SupportedDevice( usb_product_id_in_hex="55d4", ) +seeed_xiao_s3 = SupportedDevice( + name = "Seeed Xiao ESP32-S3", + version = "", + for_firmware="seeed-xiao-esp32s3", + baseport_on_linux="ttyACM", + baseport_on_mac="cu.usbmodem", + usb_vendor_id_in_hex="2886", + usb_product_id_in_hex="0059", +) + + + supported_devices = [ tbeam_v0_7, tbeam_v1_1, @@ -226,4 +238,5 @@ supported_devices = [ rak4631_19003, rak11200, nano_g1, + seeed_xiao_s3, ] From e60c8ea105c9c88083dedac31ea4f649a4459767 Mon Sep 17 00:00:00 2001 From: Tom Fifield Date: Thu, 17 Jul 2025 10:49:23 +1000 Subject: [PATCH 37/38] Add check for poetry install to regen-protobufs.sh This was failing in the CI because the poetry was not initialized. --- bin/regen-protobufs.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bin/regen-protobufs.sh b/bin/regen-protobufs.sh index c7a1cb4..23def7b 100755 --- a/bin/regen-protobufs.sh +++ b/bin/regen-protobufs.sh @@ -6,6 +6,12 @@ set -e #gsed -i 's/import "\//import ".\//g' ./protobufs/meshtastic/* #gsed -i 's/package meshtastic;//g' ./protobufs/meshtastic/* +POETRYDIR=$(poetry env info --path) + +if [[ -z "${POETRYDIR}" ]]; then + poetry install +fi + # protoc looks for mypy plugin in the python path source $(poetry env info --path)/bin/activate From 167044907d386f43306d030bf8167b5a3e28f25c Mon Sep 17 00:00:00 2001 From: Ian McEwen Date: Wed, 16 Jul 2025 19:16:16 -0700 Subject: [PATCH 38/38] for some reason pylint likes this better --- meshtastic/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index ec75591..2a010e0 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -3,7 +3,7 @@ # We just hit the 1600 line limit for main.py, but I currently have a huge set of powermon/structured logging changes # later we can have a separate changelist to refactor main.py into smaller files -# pylint: disable=too-many-lines +# pylint: disable=R0917,C0302 from typing import List, Optional, Union from types import ModuleType