diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c6f6a2315..2d8c40389 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,6 +9,7 @@ on: pull_request: branches: - master + merge_group: jobs: validate: diff --git a/.github/workflows/container-build.yaml b/.github/workflows/container-build.yaml index 08cd17af6..f948e2249 100644 --- a/.github/workflows/container-build.yaml +++ b/.github/workflows/container-build.yaml @@ -9,6 +9,7 @@ on: pull_request: branches: - master + merge_group: env: REGISTRY: ghcr.io @@ -42,7 +43,7 @@ jobs: uses: docker/setup-buildx-action@v3 - name: Login to Container registry - if: github.event_name != 'pull_request' + if: github.event_name == 'push' uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} @@ -72,7 +73,7 @@ jobs: platforms: linux/amd64,linux/arm64 context: . file: ${{ matrix.container }} - push: ${{ github.event_name != 'pull_request' }} + push: ${{ github.event_name == 'push' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha diff --git a/bin/inject_nanopb_options.py b/bin/inject_nanopb_options.py index 38df902b5..e53b622eb 100644 --- a/bin/inject_nanopb_options.py +++ b/bin/inject_nanopb_options.py @@ -21,11 +21,18 @@ import re import sys from pathlib import Path -from typing import Any, Dict, List, Tuple +from typing import Any, Dict, List, Optional, Tuple # IntSize enum values from nanopb.proto INT_SIZE_ENUM = {8: "IS_8", 16: "IS_16", 32: "IS_32", 64: "IS_64"} +# FieldType enum names from nanopb.proto. Only FT_IGNORE carries meaning for a +# Python client (the firmware omits the field entirely); the rest describe C +# storage class, but are passed through so the descriptor mirrors the .options. +FIELD_TYPE_ENUM = frozenset( + {"FT_DEFAULT", "FT_CALLBACK", "FT_POINTER", "FT_STATIC", "FT_IGNORE", "FT_INLINE"} +) + # Options that are valid proto FieldOptions and useful outside of C code generation. # We skip C-only options (anonymous_oneof, no_unions, skip_message, packed_struct, # packed_enum, mangle_names, callback_datatype, callback_function, descriptorsize, @@ -36,6 +43,7 @@ "max_length", "max_count", "int_size", + "type", "fixed_length", "fixed_count", "long_names", @@ -122,6 +130,10 @@ def format_nanopb_opts(opts: Dict[str, Any]) -> str: if k == "int_size": enum_val = INT_SIZE_ENUM.get(v, f"IS_{v}") parts.append(f"(nanopb).int_size = {enum_val}") + elif k == "type": + if v not in FIELD_TYPE_ENUM: + raise ValueError(f"unknown nanopb field type {v!r}") + parts.append(f"(nanopb).type = {v}") elif isinstance(v, bool): parts.append(f"(nanopb).{k} = {'true' if v else 'false'}") else: @@ -151,6 +163,21 @@ def inject_into_proto( ) -> str: """Inject nanopb field options into a proto file's text content. + Handles field declarations whose options block spans multiple lines, as + the upstream field_metadata/enum_value_metadata annotations often do: + + string tzdef = 11 [(meshtastic.field_metadata) = { + label: "Time Zone" + description: "POSIX timezone definition string" + }]; + + Such a declaration is completed by joining its lines; when nanopb options + apply it is rewritten collapsed onto a single line with the options + appended to the existing block. Declarations carrying a trailing '//' + comment after the ';' keep the comment. Multi-line enum value + declarations are passed through unchanged but still collected, so their + braces are not mistaken for scope closers. + Adds an import for nanopb.proto if not already present. Returns the modified content. """ @@ -181,27 +208,132 @@ def inject_into_proto( context_stack: List[Tuple[str, str]] = [] # ('message'|'oneof'|'enum', name) result: List[str] = [] import_added = nanopb_already_imported + # Lines of a multi-line field declaration, None outside one + pending: Optional[List[str]] = None - # Patterns for proto structural elements + # Patterns for proto structural elements. Only a brace that is alone on + # its line closes a message/oneof/enum/extend body: the '}' in '}];' + # ends a multi-line options block, not the enclosing scope. message_re = re.compile(r"^(\s*)message\s+(\w+)\s*\{") oneof_re = re.compile(r"^(\s*)oneof\s+(\w+)\s*\{") enum_re = re.compile(r"^(\s*)enum\s+(\w+)\s*\{") - close_re = re.compile(r"^\s*\}") - - # Pattern for field declarations: - # indent [optional|repeated] type name = number [options] ; - # We exclude map<> fields (different syntax, nanopb handles them differently) - # and enum value lines (no type keyword before the name). - field_re = re.compile( + extend_re = re.compile(r"^\s*extend\s+([\w.]+)\s*\{") + close_re = re.compile(r"^\s*\}\s*(?://.*)?$") + opener_re = re.compile(r"^\s*(?:message|oneof|enum|extend)\s+[\w.]+\s*\{") + + # Lines that look field-shaped but are not field declarations (e.g. + # 'option foo = 5;'); checked before treating a line as a field. + non_field_re = re.compile(r"^\s*(?:option|reserved|extensions|extend|group)\b") + + # The head of an enum value declaration inside an enum body: + # NAME = number, with a multi-line options block + enum_value_head_re = re.compile(r"^(\s*)(\w+)\s*=\s*-?\d+\s*\[") + + # The head of a field declaration: + # indent [optional|repeated] type name = number + # We exclude map<> fields (different syntax, nanopb handles them + # differently) and enum value lines (no type keyword before the name). + field_head_re = re.compile( r"^(\s*)" # (1) indent r"(optional\s+|repeated\s+)?" # (2) optional qualifier r"([\w.]+)\s+" # (3) field type (possibly qualified like google.protobuf.Any) r"(\w+)\s*" # (4) field name r"=\s*(\d+)" # (5) field number - r"(?:\s*\[([^\]]*)\])?" # (6) existing options, without brackets - r"\s*;" # trailing semicolon ) + def in_enum() -> bool: + return bool(context_stack) and context_stack[-1][0] == "enum" + + def applicable_options(fname: str) -> Dict[str, Any]: + """Collect the nanopb options for a field with this name (wildcard < specific).""" + extra: Dict[str, Any] = {} + + # 1. Wildcard: any field with this name in this proto file + if fname in wildcard: + extra.update(wildcard[fname]) + + # 2. Specific: check all keys whose last element is fname and whose + # preceding path matches the current message context + for key, opts in specific.items(): + if key[-1] == fname: + msg_path = key[:-1] + if message_path_matches(context_stack, msg_path): + extra.update(opts) + break + + return extra + + def split_decl(text: str) -> Tuple[Optional[str], str]: + """Split text at the ';' that terminates a field/enum-value declaration. + + The terminating ';' is the first one at bracket depth 0 outside string + literals, so ';' inside options blocks, message literals, strings and + text-format separators is not mistaken for the end. Returns + (declaration, trailing) with the ';' included in declaration and + trailing holding any whitespace/comment after it, or (None, text) when + text holds no complete declaration (e.g. the options block continues + on later lines, or a '//' comment precedes the terminator). + """ + in_string = False + escape = False + depth = 0 + i = 0 + n = len(text) + while i < n: + ch = text[i] + if in_string: + if escape: + escape = False + elif ch == "\\": + escape = True + elif ch == '"': + in_string = False + elif ch == '"': + in_string = True + elif ch in "[{": + depth += 1 + elif ch in "]}": + depth -= 1 + if depth < 0: + return None, text + elif ch == "/" and i + 1 < n and text[i + 1] == "/": + # Line comment: nothing after it can terminate the declaration + break + elif ch == ";" and depth == 0: + return text[: i + 1], text[i + 1 :] + i += 1 + return None, text + + def rewrite_field_decl(decl: str) -> Optional[str]: + """Inject nanopb options into one complete field declaration. + + decl may span multiple physical lines collapsed onto one, in which + case the result is a single-line declaration. Returns None when no + options apply, so the caller keeps the original text. + """ + if in_enum(): + return None + m = field_head_re.match(decl) + if not m: + return None + indent, qualifier, ftype, fname, fnum = m.groups() + tail = decl[m.end():].strip() + if not tail.endswith(";"): + return None + extra = applicable_options(fname) + if not extra: + return None + body = tail[:-1].rstrip() # options block, without the trailing ';' + nanopb_str = format_nanopb_opts(extra) + if body.startswith("[") and body.endswith("]"): + existing = body[1:-1].rstrip() + opts_block = f"[{existing}, {nanopb_str}]" if existing else f"[{nanopb_str}]" + else: + opts_block = f"[{nanopb_str}]" + qual = (qualifier or "").rstrip() + sep = " " if qual else "" + return f"{indent}{qual}{sep}{ftype} {fname} = {fnum} {opts_block};" + for i, line in enumerate(lines): # Insert nanopb import right after the last existing import line. # Only do this when there IS an existing import (last_import_idx >= 0); @@ -210,6 +342,33 @@ def inject_into_proto( result.append(f'import "{nanopb_import_path}";') import_added = True + # --- Inside a multi-line declaration: accumulate its lines --- + # Applies to field declarations and enum value declarations; the + # latter are emitted unchanged but must still be collected so their + # braces ('}' on its own line inside the options block) are not + # mistaken for scope closers. + if pending is not None: + if opener_re.match(line): + # A new scope inside a declaration means it was malformed: + # flush it unchanged and process this line anew. + result.extend(pending) + pending = None + else: + pending.append(line) + joined = " ".join(part.strip() for part in pending) + decl, trailing = split_decl(joined) + if decl is not None: + # Complete multi-line declaration (decl is balanced by + # construction: split_decl ends it at a depth-0 ';') + indent = pending[0][: len(pending[0]) - len(pending[0].lstrip())] + rewritten = rewrite_field_decl(f"{indent}{decl}") + if rewritten is not None: + result.append(rewritten + trailing) + else: + result.extend(pending) + pending = None + continue + # --- Track message/oneof/enum nesting --- m = message_re.match(line) if m: @@ -229,53 +388,48 @@ def inject_into_proto( result.append(line) continue + m = extend_re.match(line) + if m: + # extend blocks are tracked only so their closing brace pops + # symmetrically; message_path_matches ignores non-message frames + context_stack.append(("extend", m.group(1))) + result.append(line) + continue + if close_re.match(line) and context_stack: context_stack.pop() result.append(line) continue - # Skip field injection inside enum bodies (enum values look like fields - # but should not have nanopb options added) - in_enum = bool(context_stack) and context_stack[-1][0] == "enum" - # --- Try to match and modify a field declaration --- - m = field_re.match(line) - if m and not in_enum: - indent = m.group(1) - qualifier = m.group(2) or "" - ftype = m.group(3) - fname = m.group(4) - fnum = m.group(5) - existing_opts = m.group(6) or "" - - # Collect applicable nanopb options (wildcard < specific) - extra: Dict[str, Any] = {} - - # 1. Wildcard: any field with this name in this proto file - if fname in wildcard: - extra.update(wildcard[fname]) - - # 2. Specific: check all keys whose last element is fname and whose - # preceding path matches the current message context - for key, opts in specific.items(): - if key[-1] == fname: - msg_path = key[:-1] - if message_path_matches(context_stack, msg_path): - extra.update(opts) - break - - if extra: - nanopb_str = format_nanopb_opts(extra) - if existing_opts.strip(): - opts_block = f"[{existing_opts}, {nanopb_str}]" - else: - opts_block = f"[{nanopb_str}]" - qual = qualifier.rstrip() - sep = " " if qual else "" - line = f"{indent}{qual}{sep}{ftype} {fname} = {fnum} {opts_block};" - + if not non_field_re.match(line): + if field_head_re.match(line): + decl, trailing = split_decl(line) + if decl is not None: + # Complete single-line declaration, possibly with a + # trailing comment after the ';' + rewritten = rewrite_field_decl(decl) + if rewritten is not None: + line = rewritten + trailing + elif "[" in line: + # Options block starts here but continues on later lines + pending = [line] + continue + elif ( + in_enum() + and enum_value_head_re.match(line) + and split_decl(line)[0] is None + ): + # Multi-line enum value declaration: collect it so its braces + # do not corrupt the context stack (it is never rewritten) + pending = [line] + continue result.append(line) + # A declaration still pending at end-of-input was malformed: keep its lines + if pending is not None: + result.extend(pending) + # Edge case: if there were no import lines, add nanopb import after syntax line if not import_added: for i, line in enumerate(result): diff --git a/bin/regen-protobufs.sh b/bin/regen-protobufs.sh index 70df9e2e1..956b008ad 100755 --- a/bin/regen-protobufs.sh +++ b/bin/regen-protobufs.sh @@ -44,6 +44,13 @@ $SEDCMD 's/^package meshtastic;/package meshtastic.protobuf;/' "${INDIR}/"*.prot # fix the imports to match $SEDCMD 's/^import "meshtastic\//import "meshtastic\/protobuf\//' "${INDIR}/"*.proto +# Requalify custom option references, e.g. (meshtastic.field_metadata) and +# (meshtastic.enum_value_metadata) (see meshtastic/field_metadata.proto), to +# the renamed package so protoc can resolve them. Option references are always +# parenthesized with a lowercase-initial name; type references and URLs in +# comments (meshtastic.GeoPoint, meshtastic.org) do not match this pattern. +$SEDCMD 's/\(meshtastic\.([a-z][a-zA-Z0-9_]*)\)/(meshtastic.protobuf.\1)/g' "${INDIR}/"*.proto + $SEDCMD 's/^import "nanopb.proto"/import "meshtastic\/protobuf\/nanopb.proto"/' "${INDIR}/"*.proto # Inject nanopb .options constraints as inline proto field options so that diff --git a/meshtastic/protobuf/admin_pb2.py b/meshtastic/protobuf/admin_pb2.py index 7f82d0dcf..18f6d6731 100644 --- a/meshtastic/protobuf/admin_pb2.py +++ b/meshtastic/protobuf/admin_pb2.py @@ -20,7 +20,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__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#meshtastic/protobuf/device_ui.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a meshtastic/protobuf/nanopb.proto\"\xf0\x1d\n\x0c\x41\x64minMessage\x12\x1e\n\x0fsession_passkey\x18\x65 \x01(\x0c\x42\x05\x92?\x02\x08\x08\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=\n+get_canned_message_module_messages_response\x18\x0b \x01(\tB\x06\x92?\x03\x08\xc9\x01H\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\'\n\x15get_ringtone_response\x18\x0f \x01(\tB\x06\x92?\x03\x08\xe7\x01H\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%\n\x13\x64\x65lete_file_request\x18\x16 \x01(\tB\x06\x92?\x03\x08\xc9\x01H\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\x34\n\"set_canned_message_module_messages\x18$ \x01(\tB\x06\x92?\x03\x08\xc9\x01H\x00\x12&\n\x14set_ringtone_message\x18% \x01(\tB\x06\x92?\x03\x08\xe7\x01H\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\x1b\n\x11toggle_muted_node\x18\x31 \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 \n\x12reboot_ota_seconds\x18_ \x01(\x05\x42\x02\x18\x01H\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(\x08H\x00\x12\x41\n\x0bota_request\x18\x66 \x01(\x0b\x32*.meshtastic.protobuf.AdminMessage.OTAEventH\x00\x12:\n\rsensor_config\x18g \x01(\x0b\x32!.meshtastic.protobuf.SensorConfigH\x00\x12:\n\rlockdown_auth\x18h \x01(\x0b\x32!.meshtastic.protobuf.LockdownAuthH\x00\x1ao\n\nInputEvent\x12\x19\n\nevent_code\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x16\n\x07kb_char\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x16\n\x07touch_x\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\x12\x16\n\x07touch_y\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10\x1aZ\n\x08OTAEvent\x12\x35\n\x0freboot_ota_mode\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.OTAMode\x12\x17\n\x08ota_hash\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \"\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\"\x83\x03\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\x12\x18\n\x14STATUSMESSAGE_CONFIG\x10\r\x12\x1c\n\x18TRAFFICMANAGEMENT_CONFIG\x10\x0e\x12\x0e\n\nTAK_CONFIG\x10\x0f\"#\n\x0e\x42\x61\x63kupLocation\x12\t\n\x05\x46LASH\x10\x00\x12\x06\n\x02SD\x10\x01\x42\x11\n\x0fpayload_variant\"o\n\x0cLockdownAuth\x12\x19\n\npassphrase\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x17\n\x0f\x62oots_remaining\x18\x02 \x01(\r\x12\x19\n\x11valid_until_epoch\x18\x03 \x01(\r\x12\x10\n\x08lock_now\x18\x04 \x01(\x08\"i\n\rHamParameters\x12\x18\n\tcall_sign\x18\x01 \x01(\tB\x05\x92?\x02\x08\x08\x12\x10\n\x08tx_power\x18\x02 \x01(\x05\x12\x11\n\tfrequency\x18\x03 \x01(\x02\x12\x19\n\nshort_name\x18\x04 \x01(\tB\x05\x92?\x02\x08\x05\"v\n\x1eNodeRemoteHardwarePinsResponse\x12T\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePinB\x05\x92?\x02\x10\x10\"|\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\x12\x19\n\x11manually_verified\x18\x04 \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_number\"\xf2\x01\n\x0cSensorConfig\x12\x37\n\x0cscd4x_config\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.SCD4X_config\x12\x37\n\x0csen5x_config\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SEN5X_config\x12\x37\n\x0cscd30_config\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.SCD30_config\x12\x37\n\x0cshtxx_config\x18\x04 \x01(\x0b\x32!.meshtastic.protobuf.SHTXX_config\"\xe2\x02\n\x0cSCD4X_config\x12\x14\n\x07set_asc\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12 \n\x13set_target_co2_conc\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x0fset_temperature\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x19\n\x0cset_altitude\x18\x04 \x01(\rH\x03\x88\x01\x01\x12!\n\x14set_ambient_pressure\x18\x05 \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rfactory_reset\x18\x06 \x01(\x08H\x05\x88\x01\x01\x12\x1b\n\x0eset_power_mode\x18\x07 \x01(\x08H\x06\x88\x01\x01\x42\n\n\x08_set_ascB\x16\n\x14_set_target_co2_concB\x12\n\x10_set_temperatureB\x0f\n\r_set_altitudeB\x17\n\x15_set_ambient_pressureB\x10\n\x0e_factory_resetB\x11\n\x0f_set_power_mode\"v\n\x0cSEN5X_config\x12\x1c\n\x0fset_temperature\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x1e\n\x11set_one_shot_mode\x18\x02 \x01(\x08H\x01\x88\x01\x01\x42\x12\n\x10_set_temperatureB\x14\n\x12_set_one_shot_mode\"\xb4\x02\n\x0cSCD30_config\x12\x14\n\x07set_asc\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12 \n\x13set_target_co2_conc\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x0fset_temperature\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x19\n\x0cset_altitude\x18\x04 \x01(\rH\x03\x88\x01\x01\x12%\n\x18set_measurement_interval\x18\x05 \x01(\rH\x04\x88\x01\x01\x12\x17\n\nsoft_reset\x18\x06 \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_set_ascB\x16\n\x14_set_target_co2_concB\x12\n\x10_set_temperatureB\x0f\n\r_set_altitudeB\x1b\n\x19_set_measurement_intervalB\r\n\x0b_soft_reset\":\n\x0cSHTXX_config\x12\x19\n\x0cset_accuracy\x18\x01 \x01(\rH\x00\x88\x01\x01\x42\x0f\n\r_set_accuracy*7\n\x07OTAMode\x12\x11\n\rNO_REBOOT_OTA\x10\x00\x12\x0b\n\x07OTA_BLE\x10\x01\x12\x0c\n\x08OTA_WIFI\x10\x02\x42\x61\n\x14org.meshtastic.protoB\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#meshtastic/protobuf/device_ui.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a\'meshtastic/protobuf/module_config.proto\x1a meshtastic/protobuf/nanopb.proto\"\x87\x1e\n\x0c\x41\x64minMessage\x12\x1e\n\x0fsession_passkey\x18\x65 \x01(\x0c\x42\x05\x92?\x02\x08\x08\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=\n+get_canned_message_module_messages_response\x18\x0b \x01(\tB\x06\x92?\x03\x08\xc9\x01H\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\'\n\x15get_ringtone_response\x18\x0f \x01(\tB\x06\x92?\x03\x08\xe7\x01H\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%\n\x13\x64\x65lete_file_request\x18\x16 \x01(\tB\x06\x92?\x03\x08\xc9\x01H\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\x34\n\"set_canned_message_module_messages\x18$ \x01(\tB\x06\x92?\x03\x08\xc9\x01H\x00\x12&\n\x14set_ringtone_message\x18% \x01(\tB\x06\x92?\x03\x08\xe7\x01H\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\x1b\n\x11toggle_muted_node\x18\x31 \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 \n\x12reboot_ota_seconds\x18_ \x01(\x05\x42\x02\x18\x01H\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(\x08H\x00\x12\x41\n\x0bota_request\x18\x66 \x01(\x0b\x32*.meshtastic.protobuf.AdminMessage.OTAEventH\x00\x12:\n\rsensor_config\x18g \x01(\x0b\x32!.meshtastic.protobuf.SensorConfigH\x00\x12:\n\rlockdown_auth\x18h \x01(\x0b\x32!.meshtastic.protobuf.LockdownAuthH\x00\x1ao\n\nInputEvent\x12\x19\n\nevent_code\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x16\n\x07kb_char\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x16\n\x07touch_x\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\x12\x16\n\x07touch_y\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10\x1aZ\n\x08OTAEvent\x12\x35\n\x0freboot_ota_mode\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.OTAMode\x12\x17\n\x08ota_hash\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \"\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\"\x9a\x03\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\x12\x18\n\x14STATUSMESSAGE_CONFIG\x10\r\x12\x1c\n\x18TRAFFICMANAGEMENT_CONFIG\x10\x0e\x12\x0e\n\nTAK_CONFIG\x10\x0f\x12\x15\n\x11MESHBEACON_CONFIG\x10\x10\"#\n\x0e\x42\x61\x63kupLocation\x12\t\n\x05\x46LASH\x10\x00\x12\x06\n\x02SD\x10\x01\x42\x11\n\x0fpayload_variant\"\x9d\x01\n\x0cLockdownAuth\x12\x19\n\npassphrase\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x17\n\x0f\x62oots_remaining\x18\x02 \x01(\r\x12\x19\n\x11valid_until_epoch\x18\x03 \x01(\r\x12\x10\n\x08lock_now\x18\x04 \x01(\x08\x12\x1b\n\x13max_session_seconds\x18\x05 \x01(\r\x12\x0f\n\x07\x64isable\x18\x06 \x01(\x08\"\x83\x01\n\rHamParameters\x12\x18\n\tcall_sign\x18\x01 \x01(\tB\x05\x92?\x02\x08\x08\x12\x10\n\x08tx_power\x18\x02 \x01(\x05\x12\x11\n\tfrequency\x18\x03 \x01(\x02\x12\x19\n\nshort_name\x18\x04 \x01(\tB\x05\x92?\x02\x08\x05\x12\x18\n\tlong_name\x18\x05 \x01(\tB\x05\x92?\x02\x08\x0f\"v\n\x1eNodeRemoteHardwarePinsResponse\x12T\n\x19node_remote_hardware_pins\x18\x01 \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePinB\x05\x92?\x02\x10\x10\"|\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\x12\x19\n\x11manually_verified\x18\x04 \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_number\"\xa1\x03\n\x0cSensorConfig\x12\x37\n\x0cscd4x_config\x18\x01 \x01(\x0b\x32!.meshtastic.protobuf.SCD4X_config\x12\x37\n\x0csen5x_config\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.SEN5X_config\x12\x37\n\x0cscd30_config\x18\x03 \x01(\x0b\x32!.meshtastic.protobuf.SCD30_config\x12\x37\n\x0cshtxx_config\x18\x04 \x01(\x0b\x32!.meshtastic.protobuf.SHTXX_config\x12\x39\n\rds248x_config\x18\x05 \x01(\x0b\x32\".meshtastic.protobuf.DS248X_config\x12\x37\n\x0csen6x_config\x18\x06 \x01(\x0b\x32!.meshtastic.protobuf.SEN6X_config\x12\x39\n\ras3935_config\x18\x07 \x01(\x0b\x32\".meshtastic.protobuf.AS3935_config\"\xe2\x02\n\x0cSCD4X_config\x12\x14\n\x07set_asc\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12 \n\x13set_target_co2_conc\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x0fset_temperature\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x19\n\x0cset_altitude\x18\x04 \x01(\rH\x03\x88\x01\x01\x12!\n\x14set_ambient_pressure\x18\x05 \x01(\rH\x04\x88\x01\x01\x12\x1a\n\rfactory_reset\x18\x06 \x01(\x08H\x05\x88\x01\x01\x12\x1b\n\x0eset_power_mode\x18\x07 \x01(\x08H\x06\x88\x01\x01\x42\n\n\x08_set_ascB\x16\n\x14_set_target_co2_concB\x12\n\x10_set_temperatureB\x0f\n\r_set_altitudeB\x17\n\x15_set_ambient_pressureB\x10\n\x0e_factory_resetB\x11\n\x0f_set_power_mode\"\xae\x01\n\x0cSEN5X_config\x12\x1c\n\x0fset_temperature\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x1e\n\x11set_one_shot_mode\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12\x1f\n\x12start_fan_cleaning\x18\x03 \x01(\x08H\x02\x88\x01\x01\x42\x12\n\x10_set_temperatureB\x14\n\x12_set_one_shot_modeB\x15\n\x13_start_fan_cleaning\"\xa0\x03\n\x0cSEN6X_config\x12\x1c\n\x0fset_temperature\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x1e\n\x11set_one_shot_mode\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12\x1f\n\x12start_fan_cleaning\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12\x14\n\x07set_asc\x18\x04 \x01(\x08H\x03\x88\x01\x01\x12 \n\x13set_target_co2_conc\x18\x05 \x01(\rH\x04\x88\x01\x01\x12\x19\n\x0cset_altitude\x18\x06 \x01(\rH\x05\x88\x01\x01\x12!\n\x14set_ambient_pressure\x18\x07 \x01(\rH\x06\x88\x01\x01\x12\x1a\n\rfactory_reset\x18\x08 \x01(\x08H\x07\x88\x01\x01\x42\x12\n\x10_set_temperatureB\x14\n\x12_set_one_shot_modeB\x15\n\x13_start_fan_cleaningB\n\n\x08_set_ascB\x16\n\x14_set_target_co2_concB\x0f\n\r_set_altitudeB\x17\n\x15_set_ambient_pressureB\x10\n\x0e_factory_reset\"\xb4\x02\n\x0cSCD30_config\x12\x14\n\x07set_asc\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12 \n\x13set_target_co2_conc\x18\x02 \x01(\rH\x01\x88\x01\x01\x12\x1c\n\x0fset_temperature\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x19\n\x0cset_altitude\x18\x04 \x01(\rH\x03\x88\x01\x01\x12%\n\x18set_measurement_interval\x18\x05 \x01(\rH\x04\x88\x01\x01\x12\x17\n\nsoft_reset\x18\x06 \x01(\x08H\x05\x88\x01\x01\x42\n\n\x08_set_ascB\x16\n\x14_set_target_co2_concB\x12\n\x10_set_temperatureB\x0f\n\r_set_altitudeB\x1b\n\x19_set_measurement_intervalB\r\n\x0b_soft_reset\":\n\x0cSHTXX_config\x12\x19\n\x0cset_accuracy\x18\x01 \x01(\rH\x00\x88\x01\x01\x42\x0f\n\r_set_accuracy\"S\n\rDS248X_config\x12%\n\x18main_temperature_channel\x18\x01 \x01(\rH\x00\x88\x01\x01\x42\x1b\n\x19_main_temperature_channel\"E\n\rAS3935_config\x12\x1e\n\x11set_tuning_cap_pf\x18\x01 \x01(\rH\x00\x88\x01\x01\x42\x14\n\x12_set_tuning_cap_pf*7\n\x07OTAMode\x12\x11\n\rNO_REBOOT_OTA\x10\x00\x12\x0b\n\x07OTA_BLE\x10\x01\x12\x0c\n\x08OTA_WIFI\x10\x02\x42\x61\n\x14org.meshtastic.protoB\x0b\x41\x64minProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -58,12 +58,14 @@ _HAMPARAMETERS.fields_by_name['call_sign']._serialized_options = b'\222?\002\010\010' _HAMPARAMETERS.fields_by_name['short_name']._options = None _HAMPARAMETERS.fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' + _HAMPARAMETERS.fields_by_name['long_name']._options = None + _HAMPARAMETERS.fields_by_name['long_name']._serialized_options = b'\222?\002\010\017' _NODEREMOTEHARDWAREPINSRESPONSE.fields_by_name['node_remote_hardware_pins']._options = None _NODEREMOTEHARDWAREPINSRESPONSE.fields_by_name['node_remote_hardware_pins']._serialized_options = b'\222?\002\020\020' - _globals['_OTAMODE']._serialized_start=5996 - _globals['_OTAMODE']._serialized_end=6051 + _globals['_OTAMODE']._serialized_start=6900 + _globals['_OTAMODE']._serialized_end=6955 _globals['_ADMINMESSAGE']._serialized_start=315 - _globals['_ADMINMESSAGE']._serialized_end=4139 + _globals['_ADMINMESSAGE']._serialized_end=4162 _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_start=3273 _globals['_ADMINMESSAGE_INPUTEVENT']._serialized_end=3384 _globals['_ADMINMESSAGE_OTAEVENT']._serialized_start=3386 @@ -71,29 +73,35 @@ _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_start=3479 _globals['_ADMINMESSAGE_CONFIGTYPE']._serialized_end=3693 _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_start=3696 - _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=4083 - _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_start=4085 - _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_end=4120 - _globals['_LOCKDOWNAUTH']._serialized_start=4141 - _globals['_LOCKDOWNAUTH']._serialized_end=4252 - _globals['_HAMPARAMETERS']._serialized_start=4254 - _globals['_HAMPARAMETERS']._serialized_end=4359 - _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=4361 - _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=4479 - _globals['_SHAREDCONTACT']._serialized_start=4481 - _globals['_SHAREDCONTACT']._serialized_end=4605 - _globals['_KEYVERIFICATIONADMIN']._serialized_start=4608 - _globals['_KEYVERIFICATIONADMIN']._serialized_end=4901 - _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_start=4778 - _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_end=4881 - _globals['_SENSORCONFIG']._serialized_start=4904 - _globals['_SENSORCONFIG']._serialized_end=5146 - _globals['_SCD4X_CONFIG']._serialized_start=5149 - _globals['_SCD4X_CONFIG']._serialized_end=5503 - _globals['_SEN5X_CONFIG']._serialized_start=5505 - _globals['_SEN5X_CONFIG']._serialized_end=5623 - _globals['_SCD30_CONFIG']._serialized_start=5626 - _globals['_SCD30_CONFIG']._serialized_end=5934 - _globals['_SHTXX_CONFIG']._serialized_start=5936 - _globals['_SHTXX_CONFIG']._serialized_end=5994 + _globals['_ADMINMESSAGE_MODULECONFIGTYPE']._serialized_end=4106 + _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_start=4108 + _globals['_ADMINMESSAGE_BACKUPLOCATION']._serialized_end=4143 + _globals['_LOCKDOWNAUTH']._serialized_start=4165 + _globals['_LOCKDOWNAUTH']._serialized_end=4322 + _globals['_HAMPARAMETERS']._serialized_start=4325 + _globals['_HAMPARAMETERS']._serialized_end=4456 + _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_start=4458 + _globals['_NODEREMOTEHARDWAREPINSRESPONSE']._serialized_end=4576 + _globals['_SHAREDCONTACT']._serialized_start=4578 + _globals['_SHAREDCONTACT']._serialized_end=4702 + _globals['_KEYVERIFICATIONADMIN']._serialized_start=4705 + _globals['_KEYVERIFICATIONADMIN']._serialized_end=4998 + _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_start=4875 + _globals['_KEYVERIFICATIONADMIN_MESSAGETYPE']._serialized_end=4978 + _globals['_SENSORCONFIG']._serialized_start=5001 + _globals['_SENSORCONFIG']._serialized_end=5418 + _globals['_SCD4X_CONFIG']._serialized_start=5421 + _globals['_SCD4X_CONFIG']._serialized_end=5775 + _globals['_SEN5X_CONFIG']._serialized_start=5778 + _globals['_SEN5X_CONFIG']._serialized_end=5952 + _globals['_SEN6X_CONFIG']._serialized_start=5955 + _globals['_SEN6X_CONFIG']._serialized_end=6371 + _globals['_SCD30_CONFIG']._serialized_start=6374 + _globals['_SCD30_CONFIG']._serialized_end=6682 + _globals['_SHTXX_CONFIG']._serialized_start=6684 + _globals['_SHTXX_CONFIG']._serialized_end=6742 + _globals['_DS248X_CONFIG']._serialized_start=6744 + _globals['_DS248X_CONFIG']._serialized_end=6827 + _globals['_AS3935_CONFIG']._serialized_start=6829 + _globals['_AS3935_CONFIG']._serialized_end=6898 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/admin_pb2.pyi b/meshtastic/protobuf/admin_pb2.pyi index d7fb2c7de..92395f38b 100644 --- a/meshtastic/protobuf/admin_pb2.pyi +++ b/meshtastic/protobuf/admin_pb2.pyi @@ -236,6 +236,10 @@ class AdminMessage(google.protobuf.message.Message): """ TAK module config """ + MESHBEACON_CONFIG: AdminMessage._ModuleConfigType.ValueType # 16 + """ + Mesh Beacon module config + """ class ModuleConfigType(_ModuleConfigType, metaclass=_ModuleConfigTypeEnumTypeWrapper): """ @@ -306,6 +310,10 @@ class AdminMessage(google.protobuf.message.Message): """ TAK module config """ + MESHBEACON_CONFIG: AdminMessage.ModuleConfigType.ValueType # 16 + """ + Mesh Beacon module config + """ class _BackupLocation: ValueType = typing.NewType("ValueType", builtins.int) @@ -851,6 +859,8 @@ class LockdownAuth(google.protobuf.message.Message): BOOTS_REMAINING_FIELD_NUMBER: builtins.int VALID_UNTIL_EPOCH_FIELD_NUMBER: builtins.int LOCK_NOW_FIELD_NUMBER: builtins.int + MAX_SESSION_SECONDS_FIELD_NUMBER: builtins.int + DISABLE_FIELD_NUMBER: builtins.int passphrase: builtins.bytes """ Passphrase bytes (1-32). Empty when lock_now is true. @@ -876,6 +886,67 @@ class LockdownAuth(google.protobuf.message.Message): connection-level admin authorization, and reboot the device into the locked state. Always honoured regardless of current lock state. """ + max_session_seconds: builtins.int + """ + Optional per-boot uptime cap on the unlocked session, in seconds. + 0 = unlimited (token-only enforcement, suitable for unattended + tower / infrastructure nodes). + + When non-zero, the firmware arms an uptime timer at unlock. On + each expiry, while there is still boot-count budget, the firmware + decrements the on-flash boot count in place, revokes per- + connection admin auth (clients must re-authenticate to see + content), re-engages the screen lock, and re-arms the timer + without rebooting. Mesh routing keeps running across session + boundaries; only when the boot-count budget reaches zero does + the device hard-lock and reboot. + + Total exposure ceiling = ((resolved boot count) + 1) * max_session_seconds. + The +1 accounts for the initial passphrase-unlocked session + itself, since boots_remaining is the number of subsequent + session rolls (each consuming one boot from the rollback ledger). + The resolved boot count is the value the firmware writes into the + token at unlock time: the client-supplied boots_remaining when + non-zero, otherwise the firmware default (TOKEN_DEFAULT_BOOTS). + Note that boots_remaining == 0 in this message means "use firmware + default", NOT "zero boots" - a client computing the ceiling for + display should mirror that resolution rather than multiplying the + raw request value. + + The cap is persisted in the token, so it survives token-based + auto-unlock across reboots. Explicit operator Lock Now still + deletes the token and forces passphrase re-entry. + + Uses millis() (CPU uptime), not wall-clock time, so the cap is + immune to GPS spoofing, RTC backup-battery removal, and Faraday + cage isolation - none of those move the uptime counter. The only + way to reset the session clock is a reboot, which costs a boot + from the on-flash, HMAC-bound counter. + """ + disable: builtins.bool + """ + Disable lockdown mode. Requires a valid passphrase in the same + message (the device must prove the operator owns it before + reverting at-rest encryption). On success the firmware decrypts + every stored config / channel / nodedb file back to plaintext, + removes the wrapped DEK, unlock token, monotonic-counter, and + backoff files, and reboots out of lockdown. + + This is the inverse of the provision/unlock path: it is how the + client app's "lockdown mode" toggle returns a device to normal + operation. + + NOT reversed by this operation: APPROTECT. Once the debug port + lockout has been burned (on silicon where it is effective) it is + permanent - disabling lockdown decrypts your data and removes the + access gates, but the SWD/JTAG port stays locked for the life of + the device (recoverable only via a full chip erase over a debug + probe, which destroys all data). Clients should make this + irreversibility clear at the moment lockdown is first enabled. + + When true the passphrase field is still required; boots_remaining, + valid_until_epoch, max_session_seconds, and lock_now are ignored. + """ def __init__( self, *, @@ -883,8 +954,10 @@ class LockdownAuth(google.protobuf.message.Message): boots_remaining: builtins.int = ..., valid_until_epoch: builtins.int = ..., lock_now: builtins.bool = ..., + max_session_seconds: builtins.int = ..., + disable: builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["boots_remaining", b"boots_remaining", "lock_now", b"lock_now", "passphrase", b"passphrase", "valid_until_epoch", b"valid_until_epoch"]) -> None: ... + def ClearField(self, field_name: typing.Literal["boots_remaining", b"boots_remaining", "disable", b"disable", "lock_now", b"lock_now", "max_session_seconds", b"max_session_seconds", "passphrase", b"passphrase", "valid_until_epoch", b"valid_until_epoch"]) -> None: ... global___LockdownAuth = LockdownAuth @@ -900,6 +973,7 @@ class HamParameters(google.protobuf.message.Message): TX_POWER_FIELD_NUMBER: builtins.int FREQUENCY_FIELD_NUMBER: builtins.int SHORT_NAME_FIELD_NUMBER: builtins.int + LONG_NAME_FIELD_NUMBER: builtins.int call_sign: builtins.str """ Amateur radio call sign, eg. KD2ABC @@ -918,6 +992,11 @@ class HamParameters(google.protobuf.message.Message): """ Optional short name of user """ + long_name: builtins.str + """ + Optional long name of user + Appended to callsign + """ def __init__( self, *, @@ -925,8 +1004,9 @@ class HamParameters(google.protobuf.message.Message): tx_power: builtins.int = ..., frequency: builtins.float = ..., short_name: builtins.str = ..., + long_name: builtins.str = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["call_sign", b"call_sign", "frequency", b"frequency", "short_name", b"short_name", "tx_power", b"tx_power"]) -> None: ... + def ClearField(self, field_name: typing.Literal["call_sign", b"call_sign", "frequency", b"frequency", "long_name", b"long_name", "short_name", b"short_name", "tx_power", b"tx_power"]) -> None: ... global___HamParameters = HamParameters @@ -1087,6 +1167,9 @@ class SensorConfig(google.protobuf.message.Message): SEN5X_CONFIG_FIELD_NUMBER: builtins.int SCD30_CONFIG_FIELD_NUMBER: builtins.int SHTXX_CONFIG_FIELD_NUMBER: builtins.int + DS248X_CONFIG_FIELD_NUMBER: builtins.int + SEN6X_CONFIG_FIELD_NUMBER: builtins.int + AS3935_CONFIG_FIELD_NUMBER: builtins.int @property def scd4x_config(self) -> global___SCD4X_config: """ @@ -1111,6 +1194,24 @@ class SensorConfig(google.protobuf.message.Message): SHTXX temperature and relative humidity sensor configuration """ + @property + def ds248x_config(self) -> global___DS248X_config: + """ + DS248X-800 temperature sensor configuration + """ + + @property + def sen6x_config(self) -> global___SEN6X_config: + """ + SEN6X PM/RHT/VOC/NOx/CO2/HCHO Sensor configuration + """ + + @property + def as3935_config(self) -> global___AS3935_config: + """ + AS3935 lightning sensor configuration + """ + def __init__( self, *, @@ -1118,9 +1219,12 @@ class SensorConfig(google.protobuf.message.Message): sen5x_config: global___SEN5X_config | None = ..., scd30_config: global___SCD30_config | None = ..., shtxx_config: global___SHTXX_config | None = ..., + ds248x_config: global___DS248X_config | None = ..., + sen6x_config: global___SEN6X_config | None = ..., + as3935_config: global___AS3935_config | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["scd30_config", b"scd30_config", "scd4x_config", b"scd4x_config", "sen5x_config", b"sen5x_config", "shtxx_config", b"shtxx_config"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["scd30_config", b"scd30_config", "scd4x_config", b"scd4x_config", "sen5x_config", b"sen5x_config", "shtxx_config", b"shtxx_config"]) -> None: ... + def HasField(self, field_name: typing.Literal["as3935_config", b"as3935_config", "ds248x_config", b"ds248x_config", "scd30_config", b"scd30_config", "scd4x_config", b"scd4x_config", "sen5x_config", b"sen5x_config", "sen6x_config", b"sen6x_config", "shtxx_config", b"shtxx_config"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["as3935_config", b"as3935_config", "ds248x_config", b"ds248x_config", "scd30_config", b"scd30_config", "scd4x_config", b"scd4x_config", "sen5x_config", b"sen5x_config", "sen6x_config", b"sen6x_config", "shtxx_config", b"shtxx_config"]) -> None: ... global___SensorConfig = SensorConfig @@ -1199,6 +1303,7 @@ class SEN5X_config(google.protobuf.message.Message): SET_TEMPERATURE_FIELD_NUMBER: builtins.int SET_ONE_SHOT_MODE_FIELD_NUMBER: builtins.int + START_FAN_CLEANING_FIELD_NUMBER: builtins.int set_temperature: builtins.float """ Reference temperature in degC @@ -1207,21 +1312,105 @@ class SEN5X_config(google.protobuf.message.Message): """ One-shot mode (true for low power - one-shot mode, false for normal - continuous mode) """ + start_fan_cleaning: builtins.bool + """ + Trigger a fan cleaning cycle + """ def __init__( self, *, set_temperature: builtins.float | None = ..., set_one_shot_mode: builtins.bool | None = ..., + start_fan_cleaning: builtins.bool | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_set_one_shot_mode", b"_set_one_shot_mode", "_set_temperature", b"_set_temperature", "set_one_shot_mode", b"set_one_shot_mode", "set_temperature", b"set_temperature"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_set_one_shot_mode", b"_set_one_shot_mode", "_set_temperature", b"_set_temperature", "set_one_shot_mode", b"set_one_shot_mode", "set_temperature", b"set_temperature"]) -> None: ... + def HasField(self, field_name: typing.Literal["_set_one_shot_mode", b"_set_one_shot_mode", "_set_temperature", b"_set_temperature", "_start_fan_cleaning", b"_start_fan_cleaning", "set_one_shot_mode", b"set_one_shot_mode", "set_temperature", b"set_temperature", "start_fan_cleaning", b"start_fan_cleaning"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_set_one_shot_mode", b"_set_one_shot_mode", "_set_temperature", b"_set_temperature", "_start_fan_cleaning", b"_start_fan_cleaning", "set_one_shot_mode", b"set_one_shot_mode", "set_temperature", b"set_temperature", "start_fan_cleaning", b"start_fan_cleaning"]) -> None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_set_one_shot_mode", b"_set_one_shot_mode"]) -> typing.Literal["set_one_shot_mode"] | None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_set_temperature", b"_set_temperature"]) -> typing.Literal["set_temperature"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_start_fan_cleaning", b"_start_fan_cleaning"]) -> typing.Literal["start_fan_cleaning"] | None: ... global___SEN5X_config = SEN5X_config +@typing.final +class SEN6X_config(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SET_TEMPERATURE_FIELD_NUMBER: builtins.int + SET_ONE_SHOT_MODE_FIELD_NUMBER: builtins.int + START_FAN_CLEANING_FIELD_NUMBER: builtins.int + SET_ASC_FIELD_NUMBER: builtins.int + SET_TARGET_CO2_CONC_FIELD_NUMBER: builtins.int + SET_ALTITUDE_FIELD_NUMBER: builtins.int + SET_AMBIENT_PRESSURE_FIELD_NUMBER: builtins.int + FACTORY_RESET_FIELD_NUMBER: builtins.int + set_temperature: builtins.float + """ + Reference temperature in degC + """ + set_one_shot_mode: builtins.bool + """ + One-shot mode (true for low power - one-shot mode, false for normal - continuous mode) + """ + start_fan_cleaning: builtins.bool + """ + Trigger a fan cleaning cycle + """ + set_asc: builtins.bool + """ + Set Automatic self-calibration enabled (CO2-capable variants only: SEN63C, SEN66, SEN69C) + """ + set_target_co2_conc: builtins.int + """ + Recalibration target CO2 concentration in ppm (FRC only), CO2-capable variants only + """ + set_altitude: builtins.int + """ + Altitude of sensor in meters above sea level. 0 - 3000m (overrides ambient pressure), CO2-capable variants only + """ + set_ambient_pressure: builtins.int + """ + Sensor ambient pressure in Pa. 70000 - 120000 Pa (overrides altitude), CO2-capable variants only + """ + factory_reset: builtins.bool + """ + Perform a factory reset of the CO2 sensor's calibration, CO2-capable variants only + """ + def __init__( + self, + *, + set_temperature: builtins.float | None = ..., + set_one_shot_mode: builtins.bool | None = ..., + start_fan_cleaning: builtins.bool | None = ..., + set_asc: builtins.bool | None = ..., + set_target_co2_conc: builtins.int | None = ..., + set_altitude: builtins.int | None = ..., + set_ambient_pressure: builtins.int | None = ..., + factory_reset: builtins.bool | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["_factory_reset", b"_factory_reset", "_set_altitude", b"_set_altitude", "_set_ambient_pressure", b"_set_ambient_pressure", "_set_asc", b"_set_asc", "_set_one_shot_mode", b"_set_one_shot_mode", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "_start_fan_cleaning", b"_start_fan_cleaning", "factory_reset", b"factory_reset", "set_altitude", b"set_altitude", "set_ambient_pressure", b"set_ambient_pressure", "set_asc", b"set_asc", "set_one_shot_mode", b"set_one_shot_mode", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature", "start_fan_cleaning", b"start_fan_cleaning"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_factory_reset", b"_factory_reset", "_set_altitude", b"_set_altitude", "_set_ambient_pressure", b"_set_ambient_pressure", "_set_asc", b"_set_asc", "_set_one_shot_mode", b"_set_one_shot_mode", "_set_target_co2_conc", b"_set_target_co2_conc", "_set_temperature", b"_set_temperature", "_start_fan_cleaning", b"_start_fan_cleaning", "factory_reset", b"factory_reset", "set_altitude", b"set_altitude", "set_ambient_pressure", b"set_ambient_pressure", "set_asc", b"set_asc", "set_one_shot_mode", b"set_one_shot_mode", "set_target_co2_conc", b"set_target_co2_conc", "set_temperature", b"set_temperature", "start_fan_cleaning", b"start_fan_cleaning"]) -> None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_factory_reset", b"_factory_reset"]) -> typing.Literal["factory_reset"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_set_altitude", b"_set_altitude"]) -> typing.Literal["set_altitude"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_set_ambient_pressure", b"_set_ambient_pressure"]) -> typing.Literal["set_ambient_pressure"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_set_asc", b"_set_asc"]) -> typing.Literal["set_asc"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_set_one_shot_mode", b"_set_one_shot_mode"]) -> typing.Literal["set_one_shot_mode"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_set_target_co2_conc", b"_set_target_co2_conc"]) -> typing.Literal["set_target_co2_conc"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_set_temperature", b"_set_temperature"]) -> typing.Literal["set_temperature"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_start_fan_cleaning", b"_start_fan_cleaning"]) -> typing.Literal["start_fan_cleaning"] | None: ... + +global___SEN6X_config = SEN6X_config + @typing.final class SCD30_config(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -1302,3 +1491,44 @@ class SHTXX_config(google.protobuf.message.Message): def WhichOneof(self, oneof_group: typing.Literal["_set_accuracy", b"_set_accuracy"]) -> typing.Literal["set_accuracy"] | None: ... global___SHTXX_config = SHTXX_config + +@typing.final +class DS248X_config(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MAIN_TEMPERATURE_CHANNEL_FIELD_NUMBER: builtins.int + main_temperature_channel: builtins.int + """ + Main channel for temperature reporting (0-7) + """ + def __init__( + self, + *, + main_temperature_channel: builtins.int | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["_main_temperature_channel", b"_main_temperature_channel", "main_temperature_channel", b"main_temperature_channel"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_main_temperature_channel", b"_main_temperature_channel", "main_temperature_channel", b"main_temperature_channel"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["_main_temperature_channel", b"_main_temperature_channel"]) -> typing.Literal["main_temperature_channel"] | None: ... + +global___DS248X_config = DS248X_config + +@typing.final +class AS3935_config(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SET_TUNING_CAP_PF_FIELD_NUMBER: builtins.int + set_tuning_cap_pf: builtins.int + """ + Antenna tuning capacitance in pF, 0 to 120 in steps of 8. The antenna tank must + resonate within 3.5% of 500kHz; the correct trim is specific to the sensor board. + """ + def __init__( + self, + *, + set_tuning_cap_pf: builtins.int | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["_set_tuning_cap_pf", b"_set_tuning_cap_pf", "set_tuning_cap_pf", b"set_tuning_cap_pf"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_set_tuning_cap_pf", b"_set_tuning_cap_pf", "set_tuning_cap_pf", b"set_tuning_cap_pf"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["_set_tuning_cap_pf", b"_set_tuning_cap_pf"]) -> typing.Literal["set_tuning_cap_pf"] | None: ... + +global___AS3935_config = AS3935_config diff --git a/meshtastic/protobuf/atak_pb2.py b/meshtastic/protobuf/atak_pb2.py index 7f6edb529..933ba5f4e 100644 --- a/meshtastic/protobuf/atak_pb2.py +++ b/meshtastic/protobuf/atak_pb2.py @@ -11,10 +11,11 @@ _sym_db = _symbol_database.Default() +from meshtastic.protobuf import field_metadata_pb2 as meshtastic_dot_protobuf_dot_field__metadata__pb2 from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/atak.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xad\x02\n\tTAKPacket\x12\x15\n\ris_compressed\x18\x01 \x01(\x08\x12-\n\x07\x63ontact\x18\x02 \x01(\x0b\x32\x1c.meshtastic.protobuf.Contact\x12)\n\x05group\x18\x03 \x01(\x0b\x32\x1a.meshtastic.protobuf.Group\x12+\n\x06status\x18\x04 \x01(\x0b\x32\x1b.meshtastic.protobuf.Status\x12\'\n\x03pli\x18\x05 \x01(\x0b\x32\x18.meshtastic.protobuf.PLIH\x00\x12,\n\x04\x63hat\x18\x06 \x01(\x0b\x32\x1c.meshtastic.protobuf.GeoChatH\x00\x12\x18\n\x06\x64\x65tail\x18\x07 \x01(\x0c\x42\x06\x92?\x03\x08\xdc\x01H\x00\x42\x11\n\x0fpayload_variant\"\x9a\x03\n\x07GeoChat\x12\x17\n\x07message\x18\x01 \x01(\tB\x06\x92?\x03\x08\xc8\x01\x12\x16\n\x02to\x18\x02 \x01(\tB\x05\x92?\x02\x08xH\x00\x88\x01\x01\x12\x1f\n\x0bto_callsign\x18\x03 \x01(\tB\x05\x92?\x02\x08xH\x01\x88\x01\x01\x12\x1e\n\x0freceipt_for_uid\x18\x04 \x01(\tB\x05\x92?\x02\x08\x30\x12>\n\x0creceipt_type\x18\x05 \x01(\x0e\x32(.meshtastic.protobuf.GeoChat.ReceiptType\x12\x11\n\x04lang\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07room_id\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x1d\n\x10voice_profile_id\x18\x08 \x01(\tH\x04\x88\x01\x01\"T\n\x0bReceiptType\x12\x14\n\x10ReceiptType_None\x10\x00\x12\x19\n\x15ReceiptType_Delivered\x10\x01\x12\x14\n\x10ReceiptType_Read\x10\x02\x42\x05\n\x03_toB\x0e\n\x0c_to_callsignB\x07\n\x05_langB\n\n\x08_room_idB\x13\n\x11_voice_profile_id\"_\n\x05Group\x12-\n\x04role\x18\x01 \x01(\x0e\x32\x1f.meshtastic.protobuf.MemberRole\x12\'\n\x04team\x18\x02 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\" \n\x06Status\x12\x16\n\x07\x62\x61ttery\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\"B\n\x07\x43ontact\x12\x17\n\x08\x63\x61llsign\x18\x01 \x01(\tB\x05\x92?\x02\x08x\x12\x1e\n\x0f\x64\x65vice_callsign\x18\x02 \x01(\tB\x05\x92?\x02\x08x\"f\n\x03PLI\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\r\n\x05speed\x18\x04 \x01(\r\x12\x15\n\x06\x63ourse\x18\x05 \x01(\rB\x05\x92?\x02\x38\x10\"\xe1\x01\n\rAircraftTrack\x12\x13\n\x04icao\x18\x01 \x01(\tB\x05\x92?\x02\x08\x08\x12\x1b\n\x0cregistration\x18\x02 \x01(\tB\x05\x92?\x02\x08\x10\x12\x15\n\x06\x66light\x18\x03 \x01(\tB\x05\x92?\x02\x08\x10\x12\x1c\n\raircraft_type\x18\x04 \x01(\tB\x05\x92?\x02\x08\x08\x12\x15\n\x06squawk\x18\x05 \x01(\rB\x05\x92?\x02\x38\x10\x12\x17\n\x08\x63\x61tegory\x18\x06 \x01(\tB\x05\x92?\x02\x08\x04\x12\x10\n\x08rssi_x10\x18\x07 \x01(\x11\x12\x0b\n\x03gps\x18\x08 \x01(\x08\x12\x1a\n\x0b\x63ot_host_id\x18\t \x01(\tB\x05\x92?\x02\x08@\"E\n\x0b\x43otGeoPoint\x12\x1a\n\x0blat_delta_i\x18\x01 \x01(\x11\x42\x05\x92?\x02\x38 \x12\x1a\n\x0blon_delta_i\x18\x02 \x01(\x11\x42\x05\x92?\x02\x38 \"\xb8\x07\n\nDrawnShape\x12\x32\n\x04kind\x18\x01 \x01(\x0e\x32$.meshtastic.protobuf.DrawnShape.Kind\x12\x38\n\x05style\x18\x02 \x01(\x0e\x32).meshtastic.protobuf.DrawnShape.StyleMode\x12\x17\n\x08major_cm\x18\x03 \x01(\rB\x05\x92?\x02\x38 \x12\x17\n\x08minor_cm\x18\x04 \x01(\rB\x05\x92?\x02\x38 \x12\x18\n\tangle_deg\x18\x05 \x01(\rB\x05\x92?\x02\x38\x10\x12/\n\x0cstroke_color\x18\x06 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x13\n\x0bstroke_argb\x18\x07 \x01(\x07\x12 \n\x11stroke_weight_x10\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\x12-\n\nfill_color\x18\t \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x11\n\tfill_argb\x18\n \x01(\x07\x12\x11\n\tlabels_on\x18\x0b \x01(\x08\x12\x19\n\x11vertex_lat_deltas\x18\x12 \x03(\x11\x12\x19\n\x11vertex_lon_deltas\x18\x13 \x03(\x11\x12\x11\n\ttruncated\x18\r \x01(\x08\x12#\n\x14\x62ullseye_distance_dm\x18\x0e \x01(\rB\x05\x92?\x02\x38 \x12#\n\x14\x62ullseye_bearing_ref\x18\x0f \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x0e\x62ullseye_flags\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1f\n\x10\x62ullseye_uid_ref\x18\x11 \x01(\tB\x05\x92?\x02\x08\x30\"\xe2\x01\n\x04Kind\x12\x14\n\x10Kind_Unspecified\x10\x00\x12\x0f\n\x0bKind_Circle\x10\x01\x12\x12\n\x0eKind_Rectangle\x10\x02\x12\x11\n\rKind_Freeform\x10\x03\x12\x15\n\x11Kind_Telestration\x10\x04\x12\x10\n\x0cKind_Polygon\x10\x05\x12\x16\n\x12Kind_RangingCircle\x10\x06\x12\x11\n\rKind_Bullseye\x10\x07\x12\x10\n\x0cKind_Ellipse\x10\x08\x12\x12\n\x0eKind_Vehicle2D\x10\t\x12\x12\n\x0eKind_Vehicle3D\x10\n\"u\n\tStyleMode\x12\x19\n\x15StyleMode_Unspecified\x10\x00\x12\x18\n\x14StyleMode_StrokeOnly\x10\x01\x12\x16\n\x12StyleMode_FillOnly\x10\x02\x12\x1b\n\x17StyleMode_StrokeAndFill\x10\x03J\x04\x08\x0c\x10\r\"\x93\x04\n\x06Marker\x12.\n\x04kind\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.Marker.Kind\x12(\n\x05\x63olor\x18\x02 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x12\n\ncolor_argb\x18\x03 \x01(\x07\x12\x11\n\treadiness\x18\x04 \x01(\x08\x12\x19\n\nparent_uid\x18\x05 \x01(\tB\x05\x92?\x02\x08\x30\x12\x1a\n\x0bparent_type\x18\x06 \x01(\tB\x05\x92?\x02\x08\x18\x12\x1e\n\x0fparent_callsign\x18\x07 \x01(\tB\x05\x92?\x02\x08\x18\x12\x16\n\x07iconset\x18\x08 \x01(\tB\x05\x92?\x02\x08P\"\x98\x02\n\x04Kind\x12\x14\n\x10Kind_Unspecified\x10\x00\x12\r\n\tKind_Spot\x10\x01\x12\x11\n\rKind_Waypoint\x10\x02\x12\x13\n\x0fKind_Checkpoint\x10\x03\x12\x15\n\x11Kind_SelfPosition\x10\x04\x12\x13\n\x0fKind_Symbol2525\x10\x05\x12\x10\n\x0cKind_SpotMap\x10\x06\x12\x13\n\x0fKind_CustomIcon\x10\x07\x12\x12\n\x0eKind_GoToPoint\x10\x08\x12\x15\n\x11Kind_InitialPoint\x10\t\x12\x15\n\x11Kind_ContactPoint\x10\n\x12\x18\n\x14Kind_ObservationPost\x10\x0b\x12\x14\n\x10Kind_ImageMarker\x10\x0c\"\xfc\x01\n\x0fRangeAndBearing\x12\x30\n\x06\x61nchor\x18\x01 \x01(\x0b\x32 .meshtastic.protobuf.CotGeoPoint\x12\x19\n\nanchor_uid\x18\x02 \x01(\tB\x05\x92?\x02\x08\x30\x12\x17\n\x08range_cm\x18\x03 \x01(\rB\x05\x92?\x02\x38 \x12\x1b\n\x0c\x62\x65\x61ring_cdeg\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10\x12/\n\x0cstroke_color\x18\x05 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x13\n\x0bstroke_argb\x18\x06 \x01(\x07\x12 \n\x11stroke_weight_x10\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\"\xd2\x04\n\x05Route\x12\x31\n\x06method\x18\x01 \x01(\x0e\x32!.meshtastic.protobuf.Route.Method\x12\x37\n\tdirection\x18\x02 \x01(\x0e\x32$.meshtastic.protobuf.Route.Direction\x12\x15\n\x06prefix\x18\x03 \x01(\tB\x05\x92?\x02\x08\x08\x12 \n\x11stroke_weight_x10\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10\x12\x35\n\x05links\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.Route.LinkB\x05\x92?\x02\x10\x10\x12\x11\n\ttruncated\x18\x06 \x01(\x08\x1a~\n\x04Link\x12/\n\x05point\x18\x01 \x01(\x0b\x32 .meshtastic.protobuf.CotGeoPoint\x12\x12\n\x03uid\x18\x02 \x01(\tB\x05\x92?\x02\x08\x30\x12\x17\n\x08\x63\x61llsign\x18\x03 \x01(\tB\x05\x92?\x02\x08\x10\x12\x18\n\tlink_type\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\"\x87\x01\n\x06Method\x12\x16\n\x12Method_Unspecified\x10\x00\x12\x12\n\x0eMethod_Driving\x10\x01\x12\x12\n\x0eMethod_Walking\x10\x02\x12\x11\n\rMethod_Flying\x10\x03\x12\x13\n\x0fMethod_Swimming\x10\x04\x12\x15\n\x11Method_Watercraft\x10\x05\"P\n\tDirection\x12\x19\n\x15\x44irection_Unspecified\x10\x00\x12\x13\n\x0f\x44irection_Infil\x10\x01\x12\x13\n\x0f\x44irection_Exfil\x10\x02\"\xce\x0b\n\rCasevacReport\x12\x41\n\nprecedence\x18\x01 \x01(\x0e\x32-.meshtastic.protobuf.CasevacReport.Precedence\x12\x1e\n\x0f\x65quipment_flags\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1e\n\x0flitter_patients\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\"\n\x13\x61mbulatory_patients\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x08security\x18\x05 \x01(\x0e\x32+.meshtastic.protobuf.CasevacReport.Security\x12\x42\n\x0bhlz_marking\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.CasevacReport.HlzMarking\x12\x1a\n\x0bzone_marker\x18\x07 \x01(\tB\x05\x92?\x02\x08\x10\x12\x1a\n\x0bus_military\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1a\n\x0bus_civilian\x18\t \x01(\rB\x05\x92?\x02\x38\x08\x12\x1e\n\x0fnon_us_military\x18\n \x01(\rB\x05\x92?\x02\x38\x08\x12\x1e\n\x0fnon_us_civilian\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x12\n\x03\x65pw\x18\x0c \x01(\rB\x05\x92?\x02\x38\x08\x12\x14\n\x05\x63hild\x18\r \x01(\rB\x05\x92?\x02\x38\x08\x12\x1c\n\rterrain_flags\x18\x0e \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\tfrequency\x18\x0f \x01(\tB\x05\x92?\x02\x08\x10\x12\r\n\x05title\x18\x10 \x01(\t\x12\x17\n\x0fmedline_remarks\x18\x11 \x01(\t\x12\x14\n\x0curgent_count\x18\x12 \x01(\r\x12\x1d\n\x15urgent_surgical_count\x18\x13 \x01(\r\x12\x16\n\x0epriority_count\x18\x14 \x01(\r\x12\x15\n\rroutine_count\x18\x15 \x01(\r\x12\x19\n\x11\x63onvenience_count\x18\x16 \x01(\r\x12\x18\n\x10\x65quipment_detail\x18\x17 \x01(\t\x12\x1c\n\x14zone_protected_coord\x18\x18 \x01(\t\x12\x19\n\x11terrain_slope_dir\x18\x19 \x01(\t\x12\x1c\n\x14terrain_other_detail\x18\x1a \x01(\t\x12\x11\n\tmarked_by\x18\x1b \x01(\t\x12\x11\n\tobstacles\x18\x1c \x01(\t\x12\x16\n\x0ewinds_are_from\x18\x1d \x01(\t\x12\x12\n\nfriendlies\x18\x1e \x01(\t\x12\r\n\x05\x65nemy\x18\x1f \x01(\t\x12\x13\n\x0bhlz_remarks\x18 \x01(\t\x12.\n\x05zmist\x18! \x03(\x0b\x32\x1f.meshtastic.protobuf.ZMistEntry\"\xab\x01\n\nPrecedence\x12\x1a\n\x16Precedence_Unspecified\x10\x00\x12\x15\n\x11Precedence_Urgent\x10\x01\x12\x1d\n\x19Precedence_UrgentSurgical\x10\x02\x12\x17\n\x13Precedence_Priority\x10\x03\x12\x16\n\x12Precedence_Routine\x10\x04\x12\x1a\n\x16Precedence_Convenience\x10\x05\"\x9b\x01\n\nHlzMarking\x12\x1a\n\x16HlzMarking_Unspecified\x10\x00\x12\x15\n\x11HlzMarking_Panels\x10\x01\x12\x19\n\x15HlzMarking_PyroSignal\x10\x02\x12\x14\n\x10HlzMarking_Smoke\x10\x03\x12\x13\n\x0fHlzMarking_None\x10\x04\x12\x14\n\x10HlzMarking_Other\x10\x05\"\x92\x01\n\x08Security\x12\x18\n\x14Security_Unspecified\x10\x00\x12\x14\n\x10Security_NoEnemy\x10\x01\x12\x1a\n\x16Security_PossibleEnemy\x10\x02\x12\x18\n\x14Security_EnemyInArea\x10\x03\x12 \n\x1cSecurity_EnemyInArmedContact\x10\x04\"R\n\nZMistEntry\x12\r\n\x05title\x18\x01 \x01(\t\x12\t\n\x01z\x18\x02 \x01(\t\x12\t\n\x01m\x18\x03 \x01(\t\x12\t\n\x01i\x18\x04 \x01(\t\x12\t\n\x01s\x18\x05 \x01(\t\x12\t\n\x01t\x18\x06 \x01(\t\"\xa4\x02\n\x0e\x45mergencyAlert\x12\x36\n\x04type\x18\x01 \x01(\x0e\x32(.meshtastic.protobuf.EmergencyAlert.Type\x12\x1c\n\rauthoring_uid\x18\x02 \x01(\tB\x05\x92?\x02\x08\x30\x12#\n\x14\x63\x61ncel_reference_uid\x18\x03 \x01(\tB\x05\x92?\x02\x08\x30\"\x96\x01\n\x04Type\x12\x14\n\x10Type_Unspecified\x10\x00\x12\x11\n\rType_Alert911\x10\x01\x12\x14\n\x10Type_RingTheBell\x10\x02\x12\x12\n\x0eType_InContact\x10\x03\x12\x19\n\x15Type_GeoFenceBreached\x10\x04\x12\x0f\n\x0bType_Custom\x10\x05\x12\x0f\n\x0bType_Cancel\x10\x06\"\xf4\x03\n\x0bTaskRequest\x12\x18\n\ttask_type\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\ntarget_uid\x18\x02 \x01(\tB\x05\x92?\x02\x08 \x12\x1b\n\x0c\x61ssignee_uid\x18\x03 \x01(\tB\x05\x92?\x02\x08 \x12;\n\x08priority\x18\x04 \x01(\x0e\x32).meshtastic.protobuf.TaskRequest.Priority\x12\x37\n\x06status\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.TaskRequest.Status\x12\x13\n\x04note\x18\x06 \x01(\tB\x05\x92?\x02\x08\x30\"u\n\x08Priority\x12\x18\n\x14Priority_Unspecified\x10\x00\x12\x10\n\x0cPriority_Low\x10\x01\x12\x13\n\x0fPriority_Normal\x10\x02\x12\x11\n\rPriority_High\x10\x03\x12\x15\n\x11Priority_Critical\x10\x04\"\x90\x01\n\x06Status\x12\x16\n\x12Status_Unspecified\x10\x00\x12\x12\n\x0eStatus_Pending\x10\x01\x12\x17\n\x13Status_Acknowledged\x10\x02\x12\x15\n\x11Status_InProgress\x10\x03\x12\x14\n\x10Status_Completed\x10\x04\x12\x14\n\x10Status_Cancelled\x10\x05\"`\n\x0eTAKEnvironment\x12\x19\n\x11temperature_c_x10\x18\x01 \x01(\x11\x12\x1a\n\x12wind_direction_deg\x18\x02 \x01(\r\x12\x17\n\x0fwind_speed_cm_s\x18\x03 \x01(\r\"\x96\x03\n\tSensorFov\x12\x37\n\x04type\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.SensorFov.SensorType\x12\x13\n\x0b\x61zimuth_deg\x18\x02 \x01(\r\x12\x14\n\x07range_m\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x1a\n\x12\x66ov_horizontal_deg\x18\x04 \x01(\r\x12\x18\n\x10\x66ov_vertical_deg\x18\x05 \x01(\r\x12\x15\n\relevation_deg\x18\x06 \x01(\x11\x12\x10\n\x08roll_deg\x18\x07 \x01(\x11\x12\r\n\x05model\x18\x08 \x01(\t\"\xaa\x01\n\nSensorType\x12\x1a\n\x16SensorType_Unspecified\x10\x00\x12\x15\n\x11SensorType_Camera\x10\x01\x12\x16\n\x12SensorType_Thermal\x10\x02\x12\x14\n\x10SensorType_Laser\x10\x03\x12\x12\n\x0eSensorType_Nvg\x10\x04\x12\x11\n\rSensorType_Rf\x10\x05\x12\x14\n\x10SensorType_Other\x10\x06\x42\n\n\x08_range_m\"U\n\x0eTakTalkMessage\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x13\n\x0b\x63hatroom_id\x18\x02 \x01(\t\x12\x0c\n\x04lang\x18\x03 \x01(\t\x12\x12\n\nfrom_voice\x18\x04 \x01(\x08\"h\n\x0fTakTalkRoomData\x12\x1b\n\x0fsender_callsign\x18\x01 \x01(\tB\x02\x18\x01\x12\x0f\n\x07room_id\x18\x02 \x01(\t\x12\x11\n\troom_name\x18\x03 \x01(\t\x12\x14\n\x0cparticipants\x18\x04 \x03(\t\"\x1e\n\x05Marti\x12\x15\n\rdest_callsign\x18\x01 \x03(\t\"\xb0\x0c\n\x0bTAKPacketV2\x12\x31\n\x0b\x63ot_type_id\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.CotType\x12(\n\x03how\x18\x02 \x01(\x0e\x32\x1b.meshtastic.protobuf.CotHow\x12\x17\n\x08\x63\x61llsign\x18\x03 \x01(\tB\x05\x92?\x02\x08x\x12\'\n\x04team\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12-\n\x04role\x18\x05 \x01(\x0e\x32\x1f.meshtastic.protobuf.MemberRole\x12\x12\n\nlatitude_i\x18\x06 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x07 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x08 \x01(\x11\x12\r\n\x05speed\x18\t \x01(\r\x12\x15\n\x06\x63ourse\x18\n \x01(\rB\x05\x92?\x02\x38\x10\x12\x16\n\x07\x62\x61ttery\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x34\n\x07geo_src\x18\x0c \x01(\x0e\x32#.meshtastic.protobuf.GeoPointSource\x12\x34\n\x07\x61lt_src\x18\r \x01(\x0e\x32#.meshtastic.protobuf.GeoPointSource\x12\x12\n\x03uid\x18\x0e \x01(\tB\x05\x92?\x02\x08\x30\x12\x1e\n\x0f\x64\x65vice_callsign\x18\x0f \x01(\tB\x05\x92?\x02\x08x\x12\x1c\n\rstale_seconds\x18\x10 \x01(\rB\x05\x92?\x02\x38\x10\x12\x1a\n\x0btak_version\x18\x11 \x01(\tB\x05\x92?\x02\x08@\x12\x19\n\ntak_device\x18\x12 \x01(\tB\x05\x92?\x02\x08 \x12\x1b\n\x0ctak_platform\x18\x13 \x01(\tB\x05\x92?\x02\x08 \x12\x15\n\x06tak_os\x18\x14 \x01(\tB\x05\x92?\x02\x08\x10\x12\x17\n\x08\x65ndpoint\x18\x15 \x01(\tB\x05\x92?\x02\x08 \x12\x14\n\x05phone\x18\x16 \x01(\tB\x05\x92?\x02\x08\x14\x12\x1b\n\x0c\x63ot_type_str\x18\x17 \x01(\tB\x05\x92?\x02\x08 \x12\x0f\n\x07remarks\x18\x18 \x01(\t\x12=\n\x0b\x65nvironment\x18\x19 \x01(\x0b\x32#.meshtastic.protobuf.TAKEnvironmentH\x01\x88\x01\x01\x12\x37\n\nsensor_fov\x18\x1a \x01(\x0b\x32\x1e.meshtastic.protobuf.SensorFovH\x02\x88\x01\x01\x12.\n\x05marti\x18\x1d \x01(\x0b\x32\x1a.meshtastic.protobuf.MartiH\x03\x88\x01\x01\x12,\n\x04\x63hat\x18\x1f \x01(\x0b\x32\x1c.meshtastic.protobuf.GeoChatH\x00\x12\x36\n\x08\x61ircraft\x18 \x01(\x0b\x32\".meshtastic.protobuf.AircraftTrackH\x00\x12\x1c\n\nraw_detail\x18! \x01(\x0c\x42\x06\x92?\x03\x08\xdc\x01H\x00\x12\x30\n\x05shape\x18\" \x01(\x0b\x32\x1f.meshtastic.protobuf.DrawnShapeH\x00\x12-\n\x06marker\x18# \x01(\x0b\x32\x1b.meshtastic.protobuf.MarkerH\x00\x12\x33\n\x03rab\x18$ \x01(\x0b\x32$.meshtastic.protobuf.RangeAndBearingH\x00\x12+\n\x05route\x18% \x01(\x0b\x32\x1a.meshtastic.protobuf.RouteH\x00\x12\x35\n\x07\x63\x61sevac\x18& \x01(\x0b\x32\".meshtastic.protobuf.CasevacReportH\x00\x12\x38\n\temergency\x18\' \x01(\x0b\x32#.meshtastic.protobuf.EmergencyAlertH\x00\x12\x30\n\x04task\x18( \x01(\x0b\x32 .meshtastic.protobuf.TaskRequestH\x00\x12\x36\n\x07taktalk\x18) \x01(\x0b\x32#.meshtastic.protobuf.TakTalkMessageH\x00\x12<\n\x0ctaktalk_room\x18* \x01(\x0b\x32$.meshtastic.protobuf.TakTalkRoomDataH\x00\x42\x11\n\x0fpayload_variantB\x0e\n\x0c_environmentB\r\n\x0b_sensor_fovB\x08\n\x06_martiJ\x04\x08\x1b\x10\x1cJ\x04\x08\x1c\x10\x1dJ\x04\x08\x1e\x10\x1f*\xc0\x01\n\x04Team\x12\x14\n\x10Unspecifed_Color\x10\x00\x12\t\n\x05White\x10\x01\x12\n\n\x06Yellow\x10\x02\x12\n\n\x06Orange\x10\x03\x12\x0b\n\x07Magenta\x10\x04\x12\x07\n\x03Red\x10\x05\x12\n\n\x06Maroon\x10\x06\x12\n\n\x06Purple\x10\x07\x12\r\n\tDark_Blue\x10\x08\x12\x08\n\x04\x42lue\x10\t\x12\x08\n\x04\x43yan\x10\n\x12\x08\n\x04Teal\x10\x0b\x12\t\n\x05Green\x10\x0c\x12\x0e\n\nDark_Green\x10\r\x12\t\n\x05\x42rown\x10\x0e*\x7f\n\nMemberRole\x12\x0e\n\nUnspecifed\x10\x00\x12\x0e\n\nTeamMember\x10\x01\x12\x0c\n\x08TeamLead\x10\x02\x12\x06\n\x02HQ\x10\x03\x12\n\n\x06Sniper\x10\x04\x12\t\n\x05Medic\x10\x05\x12\x13\n\x0f\x46orwardObserver\x10\x06\x12\x07\n\x03RTO\x10\x07\x12\x06\n\x02K9\x10\x08*\x96\x01\n\x06\x43otHow\x12\x16\n\x12\x43otHow_Unspecified\x10\x00\x12\x0e\n\nCotHow_h_e\x10\x01\x12\x0e\n\nCotHow_m_g\x10\x02\x12\x14\n\x10\x43otHow_h_g_i_g_o\x10\x03\x12\x0e\n\nCotHow_m_r\x10\x04\x12\x0e\n\nCotHow_m_f\x10\x05\x12\x0e\n\nCotHow_m_p\x10\x06\x12\x0e\n\nCotHow_m_s\x10\x07*\x83\x17\n\x07\x43otType\x12\x11\n\rCotType_Other\x10\x00\x12\x15\n\x11\x43otType_a_f_G_U_C\x10\x01\x12\x17\n\x13\x43otType_a_f_G_U_C_I\x10\x02\x12\x15\n\x11\x43otType_a_n_A_C_F\x10\x03\x12\x15\n\x11\x43otType_a_n_A_C_H\x10\x04\x12\x13\n\x0f\x43otType_a_n_A_C\x10\x05\x12\x15\n\x11\x43otType_a_f_A_M_H\x10\x06\x12\x13\n\x0f\x43otType_a_f_A_M\x10\x07\x12\x17\n\x13\x43otType_a_f_A_M_F_F\x10\x08\x12\x17\n\x13\x43otType_a_f_A_M_H_A\x10\t\x12\x19\n\x15\x43otType_a_f_A_M_H_U_M\x10\n\x12\x17\n\x13\x43otType_a_h_A_M_F_F\x10\x0b\x12\x17\n\x13\x43otType_a_h_A_M_H_A\x10\x0c\x12\x13\n\x0f\x43otType_a_u_A_C\x10\r\x12\x13\n\x0f\x43otType_t_x_d_d\x10\x0e\x12\x17\n\x13\x43otType_a_f_G_E_S_E\x10\x0f\x12\x17\n\x13\x43otType_a_f_G_E_V_C\x10\x10\x12\x11\n\rCotType_a_f_S\x10\x11\x12\x15\n\x11\x43otType_a_f_A_M_F\x10\x12\x12\x19\n\x15\x43otType_a_f_A_M_F_C_H\x10\x13\x12\x19\n\x15\x43otType_a_f_A_M_F_U_L\x10\x14\x12\x17\n\x13\x43otType_a_f_A_M_F_L\x10\x15\x12\x17\n\x13\x43otType_a_f_A_M_F_P\x10\x16\x12\x15\n\x11\x43otType_a_f_A_C_H\x10\x17\x12\x17\n\x13\x43otType_a_n_A_M_F_Q\x10\x18\x12\x11\n\rCotType_b_t_f\x10\x19\x12\x15\n\x11\x43otType_b_r_f_h_c\x10\x1a\x12\x15\n\x11\x43otType_b_a_o_pan\x10\x1b\x12\x15\n\x11\x43otType_b_a_o_opn\x10\x1c\x12\x15\n\x11\x43otType_b_a_o_can\x10\x1d\x12\x15\n\x11\x43otType_b_a_o_tbl\x10\x1e\x12\x11\n\rCotType_b_a_g\x10\x1f\x12\x11\n\rCotType_a_f_G\x10 \x12\x13\n\x0f\x43otType_a_f_G_U\x10!\x12\x11\n\rCotType_a_h_G\x10\"\x12\x11\n\rCotType_a_u_G\x10#\x12\x11\n\rCotType_a_n_G\x10$\x12\x11\n\rCotType_b_m_r\x10%\x12\x13\n\x0f\x43otType_b_m_p_w\x10&\x12\x17\n\x13\x43otType_b_m_p_s_p_i\x10\'\x12\x11\n\rCotType_u_d_f\x10(\x12\x11\n\rCotType_u_d_r\x10)\x12\x13\n\x0f\x43otType_u_d_c_c\x10*\x12\x12\n\x0e\x43otType_u_rb_a\x10+\x12\x11\n\rCotType_a_h_A\x10,\x12\x11\n\rCotType_a_u_A\x10-\x12\x17\n\x13\x43otType_a_f_A_M_H_Q\x10.\x12\x15\n\x11\x43otType_a_f_A_C_F\x10/\x12\x13\n\x0f\x43otType_a_f_A_C\x10\x30\x12\x15\n\x11\x43otType_a_f_A_C_L\x10\x31\x12\x11\n\rCotType_a_f_A\x10\x32\x12\x17\n\x13\x43otType_a_f_A_M_H_C\x10\x33\x12\x17\n\x13\x43otType_a_n_A_M_F_F\x10\x34\x12\x15\n\x11\x43otType_a_u_A_C_F\x10\x35\x12\x1b\n\x17\x43otType_a_f_G_U_C_F_T_A\x10\x36\x12\x19\n\x15\x43otType_a_f_G_U_C_V_S\x10\x37\x12\x19\n\x15\x43otType_a_f_G_U_C_R_X\x10\x38\x12\x19\n\x15\x43otType_a_f_G_U_C_I_Z\x10\x39\x12\x1b\n\x17\x43otType_a_f_G_U_C_E_C_W\x10:\x12\x19\n\x15\x43otType_a_f_G_U_C_I_L\x10;\x12\x19\n\x15\x43otType_a_f_G_U_C_R_O\x10<\x12\x19\n\x15\x43otType_a_f_G_U_C_R_V\x10=\x12\x15\n\x11\x43otType_a_f_G_U_H\x10>\x12\x1b\n\x17\x43otType_a_f_G_U_U_M_S_E\x10?\x12\x19\n\x15\x43otType_a_f_G_U_S_M_C\x10@\x12\x15\n\x11\x43otType_a_f_G_E_S\x10\x41\x12\x13\n\x0f\x43otType_a_f_G_E\x10\x42\x12\x19\n\x15\x43otType_a_f_G_E_V_C_U\x10\x43\x12\x1a\n\x16\x43otType_a_f_G_E_V_C_ps\x10\x44\x12\x15\n\x11\x43otType_a_u_G_E_V\x10\x45\x12\x17\n\x13\x43otType_a_f_S_N_N_R\x10\x46\x12\x13\n\x0f\x43otType_a_f_F_B\x10G\x12\x19\n\x15\x43otType_b_m_p_s_p_loc\x10H\x12\x11\n\rCotType_b_i_v\x10I\x12\x13\n\x0f\x43otType_b_f_t_r\x10J\x12\x13\n\x0f\x43otType_b_f_t_a\x10K\x12\x13\n\x0f\x43otType_u_d_f_m\x10L\x12\x11\n\rCotType_u_d_p\x10M\x12\x15\n\x11\x43otType_b_m_p_s_m\x10N\x12\x13\n\x0f\x43otType_b_m_p_c\x10O\x12\x15\n\x11\x43otType_u_r_b_c_c\x10P\x12\x1a\n\x16\x43otType_u_r_b_bullseye\x10Q\x12\x17\n\x13\x43otType_a_f_G_E_V_A\x10R\x12\x11\n\rCotType_a_n_A\x10S\x12\x17\n\x13\x43otType_a_u_G_U_C_F\x10T\x12\x17\n\x13\x43otType_a_n_G_U_C_F\x10U\x12\x17\n\x13\x43otType_a_h_G_U_C_F\x10V\x12\x17\n\x13\x43otType_a_f_G_U_C_F\x10W\x12\x13\n\x0f\x43otType_a_u_G_I\x10X\x12\x13\n\x0f\x43otType_a_n_G_I\x10Y\x12\x13\n\x0f\x43otType_a_h_G_I\x10Z\x12\x13\n\x0f\x43otType_a_f_G_I\x10[\x12\x17\n\x13\x43otType_a_u_G_E_X_M\x10\\\x12\x17\n\x13\x43otType_a_n_G_E_X_M\x10]\x12\x17\n\x13\x43otType_a_h_G_E_X_M\x10^\x12\x17\n\x13\x43otType_a_f_G_E_X_M\x10_\x12\x11\n\rCotType_a_u_S\x10`\x12\x11\n\rCotType_a_n_S\x10\x61\x12\x11\n\rCotType_a_h_S\x10\x62\x12\x19\n\x15\x43otType_a_u_G_U_C_I_d\x10\x63\x12\x19\n\x15\x43otType_a_n_G_U_C_I_d\x10\x64\x12\x19\n\x15\x43otType_a_h_G_U_C_I_d\x10\x65\x12\x19\n\x15\x43otType_a_f_G_U_C_I_d\x10\x66\x12\x19\n\x15\x43otType_a_u_G_E_V_A_T\x10g\x12\x19\n\x15\x43otType_a_n_G_E_V_A_T\x10h\x12\x19\n\x15\x43otType_a_h_G_E_V_A_T\x10i\x12\x19\n\x15\x43otType_a_f_G_E_V_A_T\x10j\x12\x17\n\x13\x43otType_a_u_G_U_C_I\x10k\x12\x17\n\x13\x43otType_a_n_G_U_C_I\x10l\x12\x17\n\x13\x43otType_a_h_G_U_C_I\x10m\x12\x15\n\x11\x43otType_a_n_G_E_V\x10n\x12\x15\n\x11\x43otType_a_h_G_E_V\x10o\x12\x15\n\x11\x43otType_a_f_G_E_V\x10p\x12\x18\n\x14\x43otType_b_m_p_w_GOTO\x10q\x12\x16\n\x12\x43otType_b_m_p_c_ip\x10r\x12\x16\n\x12\x43otType_b_m_p_c_cp\x10s\x12\x18\n\x14\x43otType_b_m_p_s_p_op\x10t\x12\x11\n\rCotType_u_d_v\x10u\x12\x13\n\x0f\x43otType_u_d_v_m\x10v\x12\x13\n\x0f\x43otType_u_d_c_e\x10w\x12\x13\n\x0f\x43otType_b_i_x_i\x10x\x12\x13\n\x0f\x43otType_b_t_f_d\x10y\x12\x13\n\x0f\x43otType_b_t_f_r\x10z\x12\x13\n\x0f\x43otType_b_a_o_c\x10{\x12\x0f\n\x0b\x43otType_t_s\x10|\x12\x11\n\rCotType_m_t_t\x10}\x12\r\n\tCotType_y\x10~*}\n\x0eGeoPointSource\x12\x1e\n\x1aGeoPointSource_Unspecified\x10\x00\x12\x16\n\x12GeoPointSource_GPS\x10\x01\x12\x17\n\x13GeoPointSource_USER\x10\x02\x12\x1a\n\x16GeoPointSource_NETWORK\x10\x03\x42`\n\x14org.meshtastic.protoB\nATAKProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1emeshtastic/protobuf/atak.proto\x12\x13meshtastic.protobuf\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xad\x02\n\tTAKPacket\x12\x15\n\ris_compressed\x18\x01 \x01(\x08\x12-\n\x07\x63ontact\x18\x02 \x01(\x0b\x32\x1c.meshtastic.protobuf.Contact\x12)\n\x05group\x18\x03 \x01(\x0b\x32\x1a.meshtastic.protobuf.Group\x12+\n\x06status\x18\x04 \x01(\x0b\x32\x1b.meshtastic.protobuf.Status\x12\'\n\x03pli\x18\x05 \x01(\x0b\x32\x18.meshtastic.protobuf.PLIH\x00\x12,\n\x04\x63hat\x18\x06 \x01(\x0b\x32\x1c.meshtastic.protobuf.GeoChatH\x00\x12\x18\n\x06\x64\x65tail\x18\x07 \x01(\x0c\x42\x06\x92?\x03\x08\xdc\x01H\x00\x42\x11\n\x0fpayload_variant\"\x9a\x03\n\x07GeoChat\x12\x17\n\x07message\x18\x01 \x01(\tB\x06\x92?\x03\x08\xc8\x01\x12\x16\n\x02to\x18\x02 \x01(\tB\x05\x92?\x02\x08xH\x00\x88\x01\x01\x12\x1f\n\x0bto_callsign\x18\x03 \x01(\tB\x05\x92?\x02\x08xH\x01\x88\x01\x01\x12\x1e\n\x0freceipt_for_uid\x18\x04 \x01(\tB\x05\x92?\x02\x08\x30\x12>\n\x0creceipt_type\x18\x05 \x01(\x0e\x32(.meshtastic.protobuf.GeoChat.ReceiptType\x12\x11\n\x04lang\x18\x06 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07room_id\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x1d\n\x10voice_profile_id\x18\x08 \x01(\tH\x04\x88\x01\x01\"T\n\x0bReceiptType\x12\x14\n\x10ReceiptType_None\x10\x00\x12\x19\n\x15ReceiptType_Delivered\x10\x01\x12\x14\n\x10ReceiptType_Read\x10\x02\x42\x05\n\x03_toB\x0e\n\x0c_to_callsignB\x07\n\x05_langB\n\n\x08_room_idB\x13\n\x11_voice_profile_id\"_\n\x05Group\x12-\n\x04role\x18\x01 \x01(\x0e\x32\x1f.meshtastic.protobuf.MemberRole\x12\'\n\x04team\x18\x02 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\" \n\x06Status\x12\x16\n\x07\x62\x61ttery\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\"B\n\x07\x43ontact\x12\x17\n\x08\x63\x61llsign\x18\x01 \x01(\tB\x05\x92?\x02\x08x\x12\x1e\n\x0f\x64\x65vice_callsign\x18\x02 \x01(\tB\x05\x92?\x02\x08x\"f\n\x03PLI\x12\x12\n\nlatitude_i\x18\x01 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x02 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x03 \x01(\x05\x12\r\n\x05speed\x18\x04 \x01(\r\x12\x15\n\x06\x63ourse\x18\x05 \x01(\rB\x05\x92?\x02\x38\x10\"\xe1\x01\n\rAircraftTrack\x12\x13\n\x04icao\x18\x01 \x01(\tB\x05\x92?\x02\x08\x08\x12\x1b\n\x0cregistration\x18\x02 \x01(\tB\x05\x92?\x02\x08\x10\x12\x15\n\x06\x66light\x18\x03 \x01(\tB\x05\x92?\x02\x08\x10\x12\x1c\n\raircraft_type\x18\x04 \x01(\tB\x05\x92?\x02\x08\x08\x12\x15\n\x06squawk\x18\x05 \x01(\rB\x05\x92?\x02\x38\x10\x12\x17\n\x08\x63\x61tegory\x18\x06 \x01(\tB\x05\x92?\x02\x08\x04\x12\x10\n\x08rssi_x10\x18\x07 \x01(\x11\x12\x0b\n\x03gps\x18\x08 \x01(\x08\x12\x1a\n\x0b\x63ot_host_id\x18\t \x01(\tB\x05\x92?\x02\x08@\"E\n\x0b\x43otGeoPoint\x12\x1a\n\x0blat_delta_i\x18\x01 \x01(\x11\x42\x05\x92?\x02\x38 \x12\x1a\n\x0blon_delta_i\x18\x02 \x01(\x11\x42\x05\x92?\x02\x38 \"\xb8\x07\n\nDrawnShape\x12\x32\n\x04kind\x18\x01 \x01(\x0e\x32$.meshtastic.protobuf.DrawnShape.Kind\x12\x38\n\x05style\x18\x02 \x01(\x0e\x32).meshtastic.protobuf.DrawnShape.StyleMode\x12\x17\n\x08major_cm\x18\x03 \x01(\rB\x05\x92?\x02\x38 \x12\x17\n\x08minor_cm\x18\x04 \x01(\rB\x05\x92?\x02\x38 \x12\x18\n\tangle_deg\x18\x05 \x01(\rB\x05\x92?\x02\x38\x10\x12/\n\x0cstroke_color\x18\x06 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x13\n\x0bstroke_argb\x18\x07 \x01(\x07\x12 \n\x11stroke_weight_x10\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\x12-\n\nfill_color\x18\t \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x11\n\tfill_argb\x18\n \x01(\x07\x12\x11\n\tlabels_on\x18\x0b \x01(\x08\x12\x19\n\x11vertex_lat_deltas\x18\x12 \x03(\x11\x12\x19\n\x11vertex_lon_deltas\x18\x13 \x03(\x11\x12\x11\n\ttruncated\x18\r \x01(\x08\x12#\n\x14\x62ullseye_distance_dm\x18\x0e \x01(\rB\x05\x92?\x02\x38 \x12#\n\x14\x62ullseye_bearing_ref\x18\x0f \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x0e\x62ullseye_flags\x18\x10 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1f\n\x10\x62ullseye_uid_ref\x18\x11 \x01(\tB\x05\x92?\x02\x08\x30\"\xe2\x01\n\x04Kind\x12\x14\n\x10Kind_Unspecified\x10\x00\x12\x0f\n\x0bKind_Circle\x10\x01\x12\x12\n\x0eKind_Rectangle\x10\x02\x12\x11\n\rKind_Freeform\x10\x03\x12\x15\n\x11Kind_Telestration\x10\x04\x12\x10\n\x0cKind_Polygon\x10\x05\x12\x16\n\x12Kind_RangingCircle\x10\x06\x12\x11\n\rKind_Bullseye\x10\x07\x12\x10\n\x0cKind_Ellipse\x10\x08\x12\x12\n\x0eKind_Vehicle2D\x10\t\x12\x12\n\x0eKind_Vehicle3D\x10\n\"u\n\tStyleMode\x12\x19\n\x15StyleMode_Unspecified\x10\x00\x12\x18\n\x14StyleMode_StrokeOnly\x10\x01\x12\x16\n\x12StyleMode_FillOnly\x10\x02\x12\x1b\n\x17StyleMode_StrokeAndFill\x10\x03J\x04\x08\x0c\x10\r\"\x93\x04\n\x06Marker\x12.\n\x04kind\x18\x01 \x01(\x0e\x32 .meshtastic.protobuf.Marker.Kind\x12(\n\x05\x63olor\x18\x02 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x12\n\ncolor_argb\x18\x03 \x01(\x07\x12\x11\n\treadiness\x18\x04 \x01(\x08\x12\x19\n\nparent_uid\x18\x05 \x01(\tB\x05\x92?\x02\x08\x30\x12\x1a\n\x0bparent_type\x18\x06 \x01(\tB\x05\x92?\x02\x08\x18\x12\x1e\n\x0fparent_callsign\x18\x07 \x01(\tB\x05\x92?\x02\x08\x18\x12\x16\n\x07iconset\x18\x08 \x01(\tB\x05\x92?\x02\x08P\"\x98\x02\n\x04Kind\x12\x14\n\x10Kind_Unspecified\x10\x00\x12\r\n\tKind_Spot\x10\x01\x12\x11\n\rKind_Waypoint\x10\x02\x12\x13\n\x0fKind_Checkpoint\x10\x03\x12\x15\n\x11Kind_SelfPosition\x10\x04\x12\x13\n\x0fKind_Symbol2525\x10\x05\x12\x10\n\x0cKind_SpotMap\x10\x06\x12\x13\n\x0fKind_CustomIcon\x10\x07\x12\x12\n\x0eKind_GoToPoint\x10\x08\x12\x15\n\x11Kind_InitialPoint\x10\t\x12\x15\n\x11Kind_ContactPoint\x10\n\x12\x18\n\x14Kind_ObservationPost\x10\x0b\x12\x14\n\x10Kind_ImageMarker\x10\x0c\"\xfc\x01\n\x0fRangeAndBearing\x12\x30\n\x06\x61nchor\x18\x01 \x01(\x0b\x32 .meshtastic.protobuf.CotGeoPoint\x12\x19\n\nanchor_uid\x18\x02 \x01(\tB\x05\x92?\x02\x08\x30\x12\x17\n\x08range_cm\x18\x03 \x01(\rB\x05\x92?\x02\x38 \x12\x1b\n\x0c\x62\x65\x61ring_cdeg\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10\x12/\n\x0cstroke_color\x18\x05 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12\x13\n\x0bstroke_argb\x18\x06 \x01(\x07\x12 \n\x11stroke_weight_x10\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\"\xd2\x04\n\x05Route\x12\x31\n\x06method\x18\x01 \x01(\x0e\x32!.meshtastic.protobuf.Route.Method\x12\x37\n\tdirection\x18\x02 \x01(\x0e\x32$.meshtastic.protobuf.Route.Direction\x12\x15\n\x06prefix\x18\x03 \x01(\tB\x05\x92?\x02\x08\x08\x12 \n\x11stroke_weight_x10\x18\x04 \x01(\rB\x05\x92?\x02\x38\x10\x12\x35\n\x05links\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.Route.LinkB\x05\x92?\x02\x10\x10\x12\x11\n\ttruncated\x18\x06 \x01(\x08\x1a~\n\x04Link\x12/\n\x05point\x18\x01 \x01(\x0b\x32 .meshtastic.protobuf.CotGeoPoint\x12\x12\n\x03uid\x18\x02 \x01(\tB\x05\x92?\x02\x08\x30\x12\x17\n\x08\x63\x61llsign\x18\x03 \x01(\tB\x05\x92?\x02\x08\x10\x12\x18\n\tlink_type\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\"\x87\x01\n\x06Method\x12\x16\n\x12Method_Unspecified\x10\x00\x12\x12\n\x0eMethod_Driving\x10\x01\x12\x12\n\x0eMethod_Walking\x10\x02\x12\x11\n\rMethod_Flying\x10\x03\x12\x13\n\x0fMethod_Swimming\x10\x04\x12\x15\n\x11Method_Watercraft\x10\x05\"P\n\tDirection\x12\x19\n\x15\x44irection_Unspecified\x10\x00\x12\x13\n\x0f\x44irection_Infil\x10\x01\x12\x13\n\x0f\x44irection_Exfil\x10\x02\"\xce\x0b\n\rCasevacReport\x12\x41\n\nprecedence\x18\x01 \x01(\x0e\x32-.meshtastic.protobuf.CasevacReport.Precedence\x12\x1e\n\x0f\x65quipment_flags\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1e\n\x0flitter_patients\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\"\n\x13\x61mbulatory_patients\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12=\n\x08security\x18\x05 \x01(\x0e\x32+.meshtastic.protobuf.CasevacReport.Security\x12\x42\n\x0bhlz_marking\x18\x06 \x01(\x0e\x32-.meshtastic.protobuf.CasevacReport.HlzMarking\x12\x1a\n\x0bzone_marker\x18\x07 \x01(\tB\x05\x92?\x02\x08\x10\x12\x1a\n\x0bus_military\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1a\n\x0bus_civilian\x18\t \x01(\rB\x05\x92?\x02\x38\x08\x12\x1e\n\x0fnon_us_military\x18\n \x01(\rB\x05\x92?\x02\x38\x08\x12\x1e\n\x0fnon_us_civilian\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x12\n\x03\x65pw\x18\x0c \x01(\rB\x05\x92?\x02\x38\x08\x12\x14\n\x05\x63hild\x18\r \x01(\rB\x05\x92?\x02\x38\x08\x12\x1c\n\rterrain_flags\x18\x0e \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\tfrequency\x18\x0f \x01(\tB\x05\x92?\x02\x08\x10\x12\r\n\x05title\x18\x10 \x01(\t\x12\x17\n\x0fmedline_remarks\x18\x11 \x01(\t\x12\x14\n\x0curgent_count\x18\x12 \x01(\r\x12\x1d\n\x15urgent_surgical_count\x18\x13 \x01(\r\x12\x16\n\x0epriority_count\x18\x14 \x01(\r\x12\x15\n\rroutine_count\x18\x15 \x01(\r\x12\x19\n\x11\x63onvenience_count\x18\x16 \x01(\r\x12\x18\n\x10\x65quipment_detail\x18\x17 \x01(\t\x12\x1c\n\x14zone_protected_coord\x18\x18 \x01(\t\x12\x19\n\x11terrain_slope_dir\x18\x19 \x01(\t\x12\x1c\n\x14terrain_other_detail\x18\x1a \x01(\t\x12\x11\n\tmarked_by\x18\x1b \x01(\t\x12\x11\n\tobstacles\x18\x1c \x01(\t\x12\x16\n\x0ewinds_are_from\x18\x1d \x01(\t\x12\x12\n\nfriendlies\x18\x1e \x01(\t\x12\r\n\x05\x65nemy\x18\x1f \x01(\t\x12\x13\n\x0bhlz_remarks\x18 \x01(\t\x12.\n\x05zmist\x18! \x03(\x0b\x32\x1f.meshtastic.protobuf.ZMistEntry\"\xab\x01\n\nPrecedence\x12\x1a\n\x16Precedence_Unspecified\x10\x00\x12\x15\n\x11Precedence_Urgent\x10\x01\x12\x1d\n\x19Precedence_UrgentSurgical\x10\x02\x12\x17\n\x13Precedence_Priority\x10\x03\x12\x16\n\x12Precedence_Routine\x10\x04\x12\x1a\n\x16Precedence_Convenience\x10\x05\"\x9b\x01\n\nHlzMarking\x12\x1a\n\x16HlzMarking_Unspecified\x10\x00\x12\x15\n\x11HlzMarking_Panels\x10\x01\x12\x19\n\x15HlzMarking_PyroSignal\x10\x02\x12\x14\n\x10HlzMarking_Smoke\x10\x03\x12\x13\n\x0fHlzMarking_None\x10\x04\x12\x14\n\x10HlzMarking_Other\x10\x05\"\x92\x01\n\x08Security\x12\x18\n\x14Security_Unspecified\x10\x00\x12\x14\n\x10Security_NoEnemy\x10\x01\x12\x1a\n\x16Security_PossibleEnemy\x10\x02\x12\x18\n\x14Security_EnemyInArea\x10\x03\x12 \n\x1cSecurity_EnemyInArmedContact\x10\x04\"R\n\nZMistEntry\x12\r\n\x05title\x18\x01 \x01(\t\x12\t\n\x01z\x18\x02 \x01(\t\x12\t\n\x01m\x18\x03 \x01(\t\x12\t\n\x01i\x18\x04 \x01(\t\x12\t\n\x01s\x18\x05 \x01(\t\x12\t\n\x01t\x18\x06 \x01(\t\"\xa4\x02\n\x0e\x45mergencyAlert\x12\x36\n\x04type\x18\x01 \x01(\x0e\x32(.meshtastic.protobuf.EmergencyAlert.Type\x12\x1c\n\rauthoring_uid\x18\x02 \x01(\tB\x05\x92?\x02\x08\x30\x12#\n\x14\x63\x61ncel_reference_uid\x18\x03 \x01(\tB\x05\x92?\x02\x08\x30\"\x96\x01\n\x04Type\x12\x14\n\x10Type_Unspecified\x10\x00\x12\x11\n\rType_Alert911\x10\x01\x12\x14\n\x10Type_RingTheBell\x10\x02\x12\x12\n\x0eType_InContact\x10\x03\x12\x19\n\x15Type_GeoFenceBreached\x10\x04\x12\x0f\n\x0bType_Custom\x10\x05\x12\x0f\n\x0bType_Cancel\x10\x06\"\xf4\x03\n\x0bTaskRequest\x12\x18\n\ttask_type\x18\x01 \x01(\tB\x05\x92?\x02\x08\x0c\x12\x19\n\ntarget_uid\x18\x02 \x01(\tB\x05\x92?\x02\x08 \x12\x1b\n\x0c\x61ssignee_uid\x18\x03 \x01(\tB\x05\x92?\x02\x08 \x12;\n\x08priority\x18\x04 \x01(\x0e\x32).meshtastic.protobuf.TaskRequest.Priority\x12\x37\n\x06status\x18\x05 \x01(\x0e\x32\'.meshtastic.protobuf.TaskRequest.Status\x12\x13\n\x04note\x18\x06 \x01(\tB\x05\x92?\x02\x08\x30\"u\n\x08Priority\x12\x18\n\x14Priority_Unspecified\x10\x00\x12\x10\n\x0cPriority_Low\x10\x01\x12\x13\n\x0fPriority_Normal\x10\x02\x12\x11\n\rPriority_High\x10\x03\x12\x15\n\x11Priority_Critical\x10\x04\"\x90\x01\n\x06Status\x12\x16\n\x12Status_Unspecified\x10\x00\x12\x12\n\x0eStatus_Pending\x10\x01\x12\x17\n\x13Status_Acknowledged\x10\x02\x12\x15\n\x11Status_InProgress\x10\x03\x12\x14\n\x10Status_Completed\x10\x04\x12\x14\n\x10Status_Cancelled\x10\x05\"`\n\x0eTAKEnvironment\x12\x19\n\x11temperature_c_x10\x18\x01 \x01(\x11\x12\x1a\n\x12wind_direction_deg\x18\x02 \x01(\r\x12\x17\n\x0fwind_speed_cm_s\x18\x03 \x01(\r\"\x96\x03\n\tSensorFov\x12\x37\n\x04type\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.SensorFov.SensorType\x12\x13\n\x0b\x61zimuth_deg\x18\x02 \x01(\r\x12\x14\n\x07range_m\x18\x03 \x01(\rH\x00\x88\x01\x01\x12\x1a\n\x12\x66ov_horizontal_deg\x18\x04 \x01(\r\x12\x18\n\x10\x66ov_vertical_deg\x18\x05 \x01(\r\x12\x15\n\relevation_deg\x18\x06 \x01(\x11\x12\x10\n\x08roll_deg\x18\x07 \x01(\x11\x12\r\n\x05model\x18\x08 \x01(\t\"\xaa\x01\n\nSensorType\x12\x1a\n\x16SensorType_Unspecified\x10\x00\x12\x15\n\x11SensorType_Camera\x10\x01\x12\x16\n\x12SensorType_Thermal\x10\x02\x12\x14\n\x10SensorType_Laser\x10\x03\x12\x12\n\x0eSensorType_Nvg\x10\x04\x12\x11\n\rSensorType_Rf\x10\x05\x12\x14\n\x10SensorType_Other\x10\x06\x42\n\n\x08_range_m\"U\n\x0eTakTalkMessage\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x13\n\x0b\x63hatroom_id\x18\x02 \x01(\t\x12\x0c\n\x04lang\x18\x03 \x01(\t\x12\x12\n\nfrom_voice\x18\x04 \x01(\x08\"h\n\x0fTakTalkRoomData\x12\x1b\n\x0fsender_callsign\x18\x01 \x01(\tB\x02\x18\x01\x12\x0f\n\x07room_id\x18\x02 \x01(\t\x12\x11\n\troom_name\x18\x03 \x01(\t\x12\x14\n\x0cparticipants\x18\x04 \x03(\t\"\x1e\n\x05Marti\x12\x15\n\rdest_callsign\x18\x01 \x03(\t\"\xb0\x0c\n\x0bTAKPacketV2\x12\x31\n\x0b\x63ot_type_id\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.CotType\x12(\n\x03how\x18\x02 \x01(\x0e\x32\x1b.meshtastic.protobuf.CotHow\x12\x17\n\x08\x63\x61llsign\x18\x03 \x01(\tB\x05\x92?\x02\x08x\x12\'\n\x04team\x18\x04 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12-\n\x04role\x18\x05 \x01(\x0e\x32\x1f.meshtastic.protobuf.MemberRole\x12\x12\n\nlatitude_i\x18\x06 \x01(\x0f\x12\x13\n\x0blongitude_i\x18\x07 \x01(\x0f\x12\x10\n\x08\x61ltitude\x18\x08 \x01(\x11\x12\r\n\x05speed\x18\t \x01(\r\x12\x15\n\x06\x63ourse\x18\n \x01(\rB\x05\x92?\x02\x38\x10\x12\x16\n\x07\x62\x61ttery\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x12\x34\n\x07geo_src\x18\x0c \x01(\x0e\x32#.meshtastic.protobuf.GeoPointSource\x12\x34\n\x07\x61lt_src\x18\r \x01(\x0e\x32#.meshtastic.protobuf.GeoPointSource\x12\x12\n\x03uid\x18\x0e \x01(\tB\x05\x92?\x02\x08\x30\x12\x1e\n\x0f\x64\x65vice_callsign\x18\x0f \x01(\tB\x05\x92?\x02\x08x\x12\x1c\n\rstale_seconds\x18\x10 \x01(\rB\x05\x92?\x02\x38\x10\x12\x1a\n\x0btak_version\x18\x11 \x01(\tB\x05\x92?\x02\x08@\x12\x19\n\ntak_device\x18\x12 \x01(\tB\x05\x92?\x02\x08 \x12\x1b\n\x0ctak_platform\x18\x13 \x01(\tB\x05\x92?\x02\x08 \x12\x15\n\x06tak_os\x18\x14 \x01(\tB\x05\x92?\x02\x08\x10\x12\x17\n\x08\x65ndpoint\x18\x15 \x01(\tB\x05\x92?\x02\x08 \x12\x14\n\x05phone\x18\x16 \x01(\tB\x05\x92?\x02\x08\x14\x12\x1b\n\x0c\x63ot_type_str\x18\x17 \x01(\tB\x05\x92?\x02\x08 \x12\x0f\n\x07remarks\x18\x18 \x01(\t\x12=\n\x0b\x65nvironment\x18\x19 \x01(\x0b\x32#.meshtastic.protobuf.TAKEnvironmentH\x01\x88\x01\x01\x12\x37\n\nsensor_fov\x18\x1a \x01(\x0b\x32\x1e.meshtastic.protobuf.SensorFovH\x02\x88\x01\x01\x12.\n\x05marti\x18\x1d \x01(\x0b\x32\x1a.meshtastic.protobuf.MartiH\x03\x88\x01\x01\x12,\n\x04\x63hat\x18\x1f \x01(\x0b\x32\x1c.meshtastic.protobuf.GeoChatH\x00\x12\x36\n\x08\x61ircraft\x18 \x01(\x0b\x32\".meshtastic.protobuf.AircraftTrackH\x00\x12\x1c\n\nraw_detail\x18! \x01(\x0c\x42\x06\x92?\x03\x08\xdc\x01H\x00\x12\x30\n\x05shape\x18\" \x01(\x0b\x32\x1f.meshtastic.protobuf.DrawnShapeH\x00\x12-\n\x06marker\x18# \x01(\x0b\x32\x1b.meshtastic.protobuf.MarkerH\x00\x12\x33\n\x03rab\x18$ \x01(\x0b\x32$.meshtastic.protobuf.RangeAndBearingH\x00\x12+\n\x05route\x18% \x01(\x0b\x32\x1a.meshtastic.protobuf.RouteH\x00\x12\x35\n\x07\x63\x61sevac\x18& \x01(\x0b\x32\".meshtastic.protobuf.CasevacReportH\x00\x12\x38\n\temergency\x18\' \x01(\x0b\x32#.meshtastic.protobuf.EmergencyAlertH\x00\x12\x30\n\x04task\x18( \x01(\x0b\x32 .meshtastic.protobuf.TaskRequestH\x00\x12\x36\n\x07taktalk\x18) \x01(\x0b\x32#.meshtastic.protobuf.TakTalkMessageH\x00\x12<\n\x0ctaktalk_room\x18* \x01(\x0b\x32$.meshtastic.protobuf.TakTalkRoomDataH\x00\x42\x11\n\x0fpayload_variantB\x0e\n\x0c_environmentB\r\n\x0b_sensor_fovB\x08\n\x06_martiJ\x04\x08\x1b\x10\x1cJ\x04\x08\x1c\x10\x1dJ\x04\x08\x1e\x10\x1f*\x96\x03\n\x04Team\x12*\n\x10Unspecifed_Color\x10\x00\x1a\x14\xca\xf3\x18\x10:\x0e\x44\x65\x66\x61ult (Cyan)\x12\x16\n\x05White\x10\x01\x1a\x0b\xca\xf3\x18\x07:\x05White\x12\x18\n\x06Yellow\x10\x02\x1a\x0c\xca\xf3\x18\x08:\x06Yellow\x12\x18\n\x06Orange\x10\x03\x1a\x0c\xca\xf3\x18\x08:\x06Orange\x12\x1a\n\x07Magenta\x10\x04\x1a\r\xca\xf3\x18\t:\x07Magenta\x12\x12\n\x03Red\x10\x05\x1a\t\xca\xf3\x18\x05:\x03Red\x12\x18\n\x06Maroon\x10\x06\x1a\x0c\xca\xf3\x18\x08:\x06Maroon\x12\x18\n\x06Purple\x10\x07\x1a\x0c\xca\xf3\x18\x08:\x06Purple\x12\x1e\n\tDark_Blue\x10\x08\x1a\x0f\xca\xf3\x18\x0b:\tDark Blue\x12\x14\n\x04\x42lue\x10\t\x1a\n\xca\xf3\x18\x06:\x04\x42lue\x12\x14\n\x04\x43yan\x10\n\x1a\n\xca\xf3\x18\x06:\x04\x43yan\x12\x14\n\x04Teal\x10\x0b\x1a\n\xca\xf3\x18\x06:\x04Teal\x12\x16\n\x05Green\x10\x0c\x1a\x0b\xca\xf3\x18\x07:\x05Green\x12 \n\nDark_Green\x10\r\x1a\x10\xca\xf3\x18\x0c:\nDark Green\x12\x16\n\x05\x42rown\x10\x0e\x1a\x0b\xca\xf3\x18\x07:\x05\x42rown*\x92\x02\n\nMemberRole\x12+\n\nUnspecifed\x10\x00\x1a\x1b\xca\xf3\x18\x17:\x15\x44\x65\x66\x61ult (Team Member)\x12!\n\nTeamMember\x10\x01\x1a\x11\xca\xf3\x18\r:\x0bTeam Member\x12\x1d\n\x08TeamLead\x10\x02\x1a\x0f\xca\xf3\x18\x0b:\tTeam Lead\x12\x10\n\x02HQ\x10\x03\x1a\x08\xca\xf3\x18\x04:\x02HQ\x12\x18\n\x06Sniper\x10\x04\x1a\x0c\xca\xf3\x18\x08:\x06Sniper\x12\x16\n\x05Medic\x10\x05\x1a\x0b\xca\xf3\x18\x07:\x05Medic\x12+\n\x0f\x46orwardObserver\x10\x06\x1a\x16\xca\xf3\x18\x12:\x10\x46orward Observer\x12\x12\n\x03RTO\x10\x07\x1a\t\xca\xf3\x18\x05:\x03RTO\x12\x10\n\x02K9\x10\x08\x1a\x08\xca\xf3\x18\x04:\x02K9*\x96\x01\n\x06\x43otHow\x12\x16\n\x12\x43otHow_Unspecified\x10\x00\x12\x0e\n\nCotHow_h_e\x10\x01\x12\x0e\n\nCotHow_m_g\x10\x02\x12\x14\n\x10\x43otHow_h_g_i_g_o\x10\x03\x12\x0e\n\nCotHow_m_r\x10\x04\x12\x0e\n\nCotHow_m_f\x10\x05\x12\x0e\n\nCotHow_m_p\x10\x06\x12\x0e\n\nCotHow_m_s\x10\x07*\x83\x17\n\x07\x43otType\x12\x11\n\rCotType_Other\x10\x00\x12\x15\n\x11\x43otType_a_f_G_U_C\x10\x01\x12\x17\n\x13\x43otType_a_f_G_U_C_I\x10\x02\x12\x15\n\x11\x43otType_a_n_A_C_F\x10\x03\x12\x15\n\x11\x43otType_a_n_A_C_H\x10\x04\x12\x13\n\x0f\x43otType_a_n_A_C\x10\x05\x12\x15\n\x11\x43otType_a_f_A_M_H\x10\x06\x12\x13\n\x0f\x43otType_a_f_A_M\x10\x07\x12\x17\n\x13\x43otType_a_f_A_M_F_F\x10\x08\x12\x17\n\x13\x43otType_a_f_A_M_H_A\x10\t\x12\x19\n\x15\x43otType_a_f_A_M_H_U_M\x10\n\x12\x17\n\x13\x43otType_a_h_A_M_F_F\x10\x0b\x12\x17\n\x13\x43otType_a_h_A_M_H_A\x10\x0c\x12\x13\n\x0f\x43otType_a_u_A_C\x10\r\x12\x13\n\x0f\x43otType_t_x_d_d\x10\x0e\x12\x17\n\x13\x43otType_a_f_G_E_S_E\x10\x0f\x12\x17\n\x13\x43otType_a_f_G_E_V_C\x10\x10\x12\x11\n\rCotType_a_f_S\x10\x11\x12\x15\n\x11\x43otType_a_f_A_M_F\x10\x12\x12\x19\n\x15\x43otType_a_f_A_M_F_C_H\x10\x13\x12\x19\n\x15\x43otType_a_f_A_M_F_U_L\x10\x14\x12\x17\n\x13\x43otType_a_f_A_M_F_L\x10\x15\x12\x17\n\x13\x43otType_a_f_A_M_F_P\x10\x16\x12\x15\n\x11\x43otType_a_f_A_C_H\x10\x17\x12\x17\n\x13\x43otType_a_n_A_M_F_Q\x10\x18\x12\x11\n\rCotType_b_t_f\x10\x19\x12\x15\n\x11\x43otType_b_r_f_h_c\x10\x1a\x12\x15\n\x11\x43otType_b_a_o_pan\x10\x1b\x12\x15\n\x11\x43otType_b_a_o_opn\x10\x1c\x12\x15\n\x11\x43otType_b_a_o_can\x10\x1d\x12\x15\n\x11\x43otType_b_a_o_tbl\x10\x1e\x12\x11\n\rCotType_b_a_g\x10\x1f\x12\x11\n\rCotType_a_f_G\x10 \x12\x13\n\x0f\x43otType_a_f_G_U\x10!\x12\x11\n\rCotType_a_h_G\x10\"\x12\x11\n\rCotType_a_u_G\x10#\x12\x11\n\rCotType_a_n_G\x10$\x12\x11\n\rCotType_b_m_r\x10%\x12\x13\n\x0f\x43otType_b_m_p_w\x10&\x12\x17\n\x13\x43otType_b_m_p_s_p_i\x10\'\x12\x11\n\rCotType_u_d_f\x10(\x12\x11\n\rCotType_u_d_r\x10)\x12\x13\n\x0f\x43otType_u_d_c_c\x10*\x12\x12\n\x0e\x43otType_u_rb_a\x10+\x12\x11\n\rCotType_a_h_A\x10,\x12\x11\n\rCotType_a_u_A\x10-\x12\x17\n\x13\x43otType_a_f_A_M_H_Q\x10.\x12\x15\n\x11\x43otType_a_f_A_C_F\x10/\x12\x13\n\x0f\x43otType_a_f_A_C\x10\x30\x12\x15\n\x11\x43otType_a_f_A_C_L\x10\x31\x12\x11\n\rCotType_a_f_A\x10\x32\x12\x17\n\x13\x43otType_a_f_A_M_H_C\x10\x33\x12\x17\n\x13\x43otType_a_n_A_M_F_F\x10\x34\x12\x15\n\x11\x43otType_a_u_A_C_F\x10\x35\x12\x1b\n\x17\x43otType_a_f_G_U_C_F_T_A\x10\x36\x12\x19\n\x15\x43otType_a_f_G_U_C_V_S\x10\x37\x12\x19\n\x15\x43otType_a_f_G_U_C_R_X\x10\x38\x12\x19\n\x15\x43otType_a_f_G_U_C_I_Z\x10\x39\x12\x1b\n\x17\x43otType_a_f_G_U_C_E_C_W\x10:\x12\x19\n\x15\x43otType_a_f_G_U_C_I_L\x10;\x12\x19\n\x15\x43otType_a_f_G_U_C_R_O\x10<\x12\x19\n\x15\x43otType_a_f_G_U_C_R_V\x10=\x12\x15\n\x11\x43otType_a_f_G_U_H\x10>\x12\x1b\n\x17\x43otType_a_f_G_U_U_M_S_E\x10?\x12\x19\n\x15\x43otType_a_f_G_U_S_M_C\x10@\x12\x15\n\x11\x43otType_a_f_G_E_S\x10\x41\x12\x13\n\x0f\x43otType_a_f_G_E\x10\x42\x12\x19\n\x15\x43otType_a_f_G_E_V_C_U\x10\x43\x12\x1a\n\x16\x43otType_a_f_G_E_V_C_ps\x10\x44\x12\x15\n\x11\x43otType_a_u_G_E_V\x10\x45\x12\x17\n\x13\x43otType_a_f_S_N_N_R\x10\x46\x12\x13\n\x0f\x43otType_a_f_F_B\x10G\x12\x19\n\x15\x43otType_b_m_p_s_p_loc\x10H\x12\x11\n\rCotType_b_i_v\x10I\x12\x13\n\x0f\x43otType_b_f_t_r\x10J\x12\x13\n\x0f\x43otType_b_f_t_a\x10K\x12\x13\n\x0f\x43otType_u_d_f_m\x10L\x12\x11\n\rCotType_u_d_p\x10M\x12\x15\n\x11\x43otType_b_m_p_s_m\x10N\x12\x13\n\x0f\x43otType_b_m_p_c\x10O\x12\x15\n\x11\x43otType_u_r_b_c_c\x10P\x12\x1a\n\x16\x43otType_u_r_b_bullseye\x10Q\x12\x17\n\x13\x43otType_a_f_G_E_V_A\x10R\x12\x11\n\rCotType_a_n_A\x10S\x12\x17\n\x13\x43otType_a_u_G_U_C_F\x10T\x12\x17\n\x13\x43otType_a_n_G_U_C_F\x10U\x12\x17\n\x13\x43otType_a_h_G_U_C_F\x10V\x12\x17\n\x13\x43otType_a_f_G_U_C_F\x10W\x12\x13\n\x0f\x43otType_a_u_G_I\x10X\x12\x13\n\x0f\x43otType_a_n_G_I\x10Y\x12\x13\n\x0f\x43otType_a_h_G_I\x10Z\x12\x13\n\x0f\x43otType_a_f_G_I\x10[\x12\x17\n\x13\x43otType_a_u_G_E_X_M\x10\\\x12\x17\n\x13\x43otType_a_n_G_E_X_M\x10]\x12\x17\n\x13\x43otType_a_h_G_E_X_M\x10^\x12\x17\n\x13\x43otType_a_f_G_E_X_M\x10_\x12\x11\n\rCotType_a_u_S\x10`\x12\x11\n\rCotType_a_n_S\x10\x61\x12\x11\n\rCotType_a_h_S\x10\x62\x12\x19\n\x15\x43otType_a_u_G_U_C_I_d\x10\x63\x12\x19\n\x15\x43otType_a_n_G_U_C_I_d\x10\x64\x12\x19\n\x15\x43otType_a_h_G_U_C_I_d\x10\x65\x12\x19\n\x15\x43otType_a_f_G_U_C_I_d\x10\x66\x12\x19\n\x15\x43otType_a_u_G_E_V_A_T\x10g\x12\x19\n\x15\x43otType_a_n_G_E_V_A_T\x10h\x12\x19\n\x15\x43otType_a_h_G_E_V_A_T\x10i\x12\x19\n\x15\x43otType_a_f_G_E_V_A_T\x10j\x12\x17\n\x13\x43otType_a_u_G_U_C_I\x10k\x12\x17\n\x13\x43otType_a_n_G_U_C_I\x10l\x12\x17\n\x13\x43otType_a_h_G_U_C_I\x10m\x12\x15\n\x11\x43otType_a_n_G_E_V\x10n\x12\x15\n\x11\x43otType_a_h_G_E_V\x10o\x12\x15\n\x11\x43otType_a_f_G_E_V\x10p\x12\x18\n\x14\x43otType_b_m_p_w_GOTO\x10q\x12\x16\n\x12\x43otType_b_m_p_c_ip\x10r\x12\x16\n\x12\x43otType_b_m_p_c_cp\x10s\x12\x18\n\x14\x43otType_b_m_p_s_p_op\x10t\x12\x11\n\rCotType_u_d_v\x10u\x12\x13\n\x0f\x43otType_u_d_v_m\x10v\x12\x13\n\x0f\x43otType_u_d_c_e\x10w\x12\x13\n\x0f\x43otType_b_i_x_i\x10x\x12\x13\n\x0f\x43otType_b_t_f_d\x10y\x12\x13\n\x0f\x43otType_b_t_f_r\x10z\x12\x13\n\x0f\x43otType_b_a_o_c\x10{\x12\x0f\n\x0b\x43otType_t_s\x10|\x12\x11\n\rCotType_m_t_t\x10}\x12\r\n\tCotType_y\x10~*}\n\x0eGeoPointSource\x12\x1e\n\x1aGeoPointSource_Unspecified\x10\x00\x12\x16\n\x12GeoPointSource_GPS\x10\x01\x12\x17\n\x13GeoPointSource_USER\x10\x02\x12\x1a\n\x16GeoPointSource_NETWORK\x10\x03\x42`\n\x14org.meshtastic.protoB\nATAKProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -22,6 +23,54 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nATAKProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _TEAM.values_by_name["Unspecifed_Color"]._options = None + _TEAM.values_by_name["Unspecifed_Color"]._serialized_options = b'\312\363\030\020:\016Default (Cyan)' + _TEAM.values_by_name["White"]._options = None + _TEAM.values_by_name["White"]._serialized_options = b'\312\363\030\007:\005White' + _TEAM.values_by_name["Yellow"]._options = None + _TEAM.values_by_name["Yellow"]._serialized_options = b'\312\363\030\010:\006Yellow' + _TEAM.values_by_name["Orange"]._options = None + _TEAM.values_by_name["Orange"]._serialized_options = b'\312\363\030\010:\006Orange' + _TEAM.values_by_name["Magenta"]._options = None + _TEAM.values_by_name["Magenta"]._serialized_options = b'\312\363\030\t:\007Magenta' + _TEAM.values_by_name["Red"]._options = None + _TEAM.values_by_name["Red"]._serialized_options = b'\312\363\030\005:\003Red' + _TEAM.values_by_name["Maroon"]._options = None + _TEAM.values_by_name["Maroon"]._serialized_options = b'\312\363\030\010:\006Maroon' + _TEAM.values_by_name["Purple"]._options = None + _TEAM.values_by_name["Purple"]._serialized_options = b'\312\363\030\010:\006Purple' + _TEAM.values_by_name["Dark_Blue"]._options = None + _TEAM.values_by_name["Dark_Blue"]._serialized_options = b'\312\363\030\013:\tDark Blue' + _TEAM.values_by_name["Blue"]._options = None + _TEAM.values_by_name["Blue"]._serialized_options = b'\312\363\030\006:\004Blue' + _TEAM.values_by_name["Cyan"]._options = None + _TEAM.values_by_name["Cyan"]._serialized_options = b'\312\363\030\006:\004Cyan' + _TEAM.values_by_name["Teal"]._options = None + _TEAM.values_by_name["Teal"]._serialized_options = b'\312\363\030\006:\004Teal' + _TEAM.values_by_name["Green"]._options = None + _TEAM.values_by_name["Green"]._serialized_options = b'\312\363\030\007:\005Green' + _TEAM.values_by_name["Dark_Green"]._options = None + _TEAM.values_by_name["Dark_Green"]._serialized_options = b'\312\363\030\014:\nDark Green' + _TEAM.values_by_name["Brown"]._options = None + _TEAM.values_by_name["Brown"]._serialized_options = b'\312\363\030\007:\005Brown' + _MEMBERROLE.values_by_name["Unspecifed"]._options = None + _MEMBERROLE.values_by_name["Unspecifed"]._serialized_options = b'\312\363\030\027:\025Default (Team Member)' + _MEMBERROLE.values_by_name["TeamMember"]._options = None + _MEMBERROLE.values_by_name["TeamMember"]._serialized_options = b'\312\363\030\r:\013Team Member' + _MEMBERROLE.values_by_name["TeamLead"]._options = None + _MEMBERROLE.values_by_name["TeamLead"]._serialized_options = b'\312\363\030\013:\tTeam Lead' + _MEMBERROLE.values_by_name["HQ"]._options = None + _MEMBERROLE.values_by_name["HQ"]._serialized_options = b'\312\363\030\004:\002HQ' + _MEMBERROLE.values_by_name["Sniper"]._options = None + _MEMBERROLE.values_by_name["Sniper"]._serialized_options = b'\312\363\030\010:\006Sniper' + _MEMBERROLE.values_by_name["Medic"]._options = None + _MEMBERROLE.values_by_name["Medic"]._serialized_options = b'\312\363\030\007:\005Medic' + _MEMBERROLE.values_by_name["ForwardObserver"]._options = None + _MEMBERROLE.values_by_name["ForwardObserver"]._serialized_options = b'\312\363\030\022:\020Forward Observer' + _MEMBERROLE.values_by_name["RTO"]._options = None + _MEMBERROLE.values_by_name["RTO"]._serialized_options = b'\312\363\030\005:\003RTO' + _MEMBERROLE.values_by_name["K9"]._options = None + _MEMBERROLE.values_by_name["K9"]._serialized_options = b'\312\363\030\004:\002K9' _TAKPACKET.fields_by_name['detail']._options = None _TAKPACKET.fields_by_name['detail']._serialized_options = b'\222?\003\010\334\001' _GEOCHAT.fields_by_name['message']._options = None @@ -168,86 +217,86 @@ _TAKPACKETV2.fields_by_name['cot_type_str']._serialized_options = b'\222?\002\010 ' _TAKPACKETV2.fields_by_name['raw_detail']._options = None _TAKPACKETV2.fields_by_name['raw_detail']._serialized_options = b'\222?\003\010\334\001' - _globals['_TEAM']._serialized_start=8440 - _globals['_TEAM']._serialized_end=8632 - _globals['_MEMBERROLE']._serialized_start=8634 - _globals['_MEMBERROLE']._serialized_end=8761 - _globals['_COTHOW']._serialized_start=8764 - _globals['_COTHOW']._serialized_end=8914 - _globals['_COTTYPE']._serialized_start=8917 - _globals['_COTTYPE']._serialized_end=11864 - _globals['_GEOPOINTSOURCE']._serialized_start=11866 - _globals['_GEOPOINTSOURCE']._serialized_end=11991 - _globals['_TAKPACKET']._serialized_start=90 - _globals['_TAKPACKET']._serialized_end=391 - _globals['_GEOCHAT']._serialized_start=394 - _globals['_GEOCHAT']._serialized_end=804 - _globals['_GEOCHAT_RECEIPTTYPE']._serialized_start=655 - _globals['_GEOCHAT_RECEIPTTYPE']._serialized_end=739 - _globals['_GROUP']._serialized_start=806 - _globals['_GROUP']._serialized_end=901 - _globals['_STATUS']._serialized_start=903 - _globals['_STATUS']._serialized_end=935 - _globals['_CONTACT']._serialized_start=937 - _globals['_CONTACT']._serialized_end=1003 - _globals['_PLI']._serialized_start=1005 - _globals['_PLI']._serialized_end=1107 - _globals['_AIRCRAFTTRACK']._serialized_start=1110 - _globals['_AIRCRAFTTRACK']._serialized_end=1335 - _globals['_COTGEOPOINT']._serialized_start=1337 - _globals['_COTGEOPOINT']._serialized_end=1406 - _globals['_DRAWNSHAPE']._serialized_start=1409 - _globals['_DRAWNSHAPE']._serialized_end=2361 - _globals['_DRAWNSHAPE_KIND']._serialized_start=2010 - _globals['_DRAWNSHAPE_KIND']._serialized_end=2236 - _globals['_DRAWNSHAPE_STYLEMODE']._serialized_start=2238 - _globals['_DRAWNSHAPE_STYLEMODE']._serialized_end=2355 - _globals['_MARKER']._serialized_start=2364 - _globals['_MARKER']._serialized_end=2895 - _globals['_MARKER_KIND']._serialized_start=2615 - _globals['_MARKER_KIND']._serialized_end=2895 - _globals['_RANGEANDBEARING']._serialized_start=2898 - _globals['_RANGEANDBEARING']._serialized_end=3150 - _globals['_ROUTE']._serialized_start=3153 - _globals['_ROUTE']._serialized_end=3747 - _globals['_ROUTE_LINK']._serialized_start=3401 - _globals['_ROUTE_LINK']._serialized_end=3527 - _globals['_ROUTE_METHOD']._serialized_start=3530 - _globals['_ROUTE_METHOD']._serialized_end=3665 - _globals['_ROUTE_DIRECTION']._serialized_start=3667 - _globals['_ROUTE_DIRECTION']._serialized_end=3747 - _globals['_CASEVACREPORT']._serialized_start=3750 - _globals['_CASEVACREPORT']._serialized_end=5236 - _globals['_CASEVACREPORT_PRECEDENCE']._serialized_start=4758 - _globals['_CASEVACREPORT_PRECEDENCE']._serialized_end=4929 - _globals['_CASEVACREPORT_HLZMARKING']._serialized_start=4932 - _globals['_CASEVACREPORT_HLZMARKING']._serialized_end=5087 - _globals['_CASEVACREPORT_SECURITY']._serialized_start=5090 - _globals['_CASEVACREPORT_SECURITY']._serialized_end=5236 - _globals['_ZMISTENTRY']._serialized_start=5238 - _globals['_ZMISTENTRY']._serialized_end=5320 - _globals['_EMERGENCYALERT']._serialized_start=5323 - _globals['_EMERGENCYALERT']._serialized_end=5615 - _globals['_EMERGENCYALERT_TYPE']._serialized_start=5465 - _globals['_EMERGENCYALERT_TYPE']._serialized_end=5615 - _globals['_TASKREQUEST']._serialized_start=5618 - _globals['_TASKREQUEST']._serialized_end=6118 - _globals['_TASKREQUEST_PRIORITY']._serialized_start=5854 - _globals['_TASKREQUEST_PRIORITY']._serialized_end=5971 - _globals['_TASKREQUEST_STATUS']._serialized_start=5974 - _globals['_TASKREQUEST_STATUS']._serialized_end=6118 - _globals['_TAKENVIRONMENT']._serialized_start=6120 - _globals['_TAKENVIRONMENT']._serialized_end=6216 - _globals['_SENSORFOV']._serialized_start=6219 - _globals['_SENSORFOV']._serialized_end=6625 - _globals['_SENSORFOV_SENSORTYPE']._serialized_start=6443 - _globals['_SENSORFOV_SENSORTYPE']._serialized_end=6613 - _globals['_TAKTALKMESSAGE']._serialized_start=6627 - _globals['_TAKTALKMESSAGE']._serialized_end=6712 - _globals['_TAKTALKROOMDATA']._serialized_start=6714 - _globals['_TAKTALKROOMDATA']._serialized_end=6818 - _globals['_MARTI']._serialized_start=6820 - _globals['_MARTI']._serialized_end=6850 - _globals['_TAKPACKETV2']._serialized_start=6853 - _globals['_TAKPACKETV2']._serialized_end=8437 + _globals['_TEAM']._serialized_start=8482 + _globals['_TEAM']._serialized_end=8888 + _globals['_MEMBERROLE']._serialized_start=8891 + _globals['_MEMBERROLE']._serialized_end=9165 + _globals['_COTHOW']._serialized_start=9168 + _globals['_COTHOW']._serialized_end=9318 + _globals['_COTTYPE']._serialized_start=9321 + _globals['_COTTYPE']._serialized_end=12268 + _globals['_GEOPOINTSOURCE']._serialized_start=12270 + _globals['_GEOPOINTSOURCE']._serialized_end=12395 + _globals['_TAKPACKET']._serialized_start=132 + _globals['_TAKPACKET']._serialized_end=433 + _globals['_GEOCHAT']._serialized_start=436 + _globals['_GEOCHAT']._serialized_end=846 + _globals['_GEOCHAT_RECEIPTTYPE']._serialized_start=697 + _globals['_GEOCHAT_RECEIPTTYPE']._serialized_end=781 + _globals['_GROUP']._serialized_start=848 + _globals['_GROUP']._serialized_end=943 + _globals['_STATUS']._serialized_start=945 + _globals['_STATUS']._serialized_end=977 + _globals['_CONTACT']._serialized_start=979 + _globals['_CONTACT']._serialized_end=1045 + _globals['_PLI']._serialized_start=1047 + _globals['_PLI']._serialized_end=1149 + _globals['_AIRCRAFTTRACK']._serialized_start=1152 + _globals['_AIRCRAFTTRACK']._serialized_end=1377 + _globals['_COTGEOPOINT']._serialized_start=1379 + _globals['_COTGEOPOINT']._serialized_end=1448 + _globals['_DRAWNSHAPE']._serialized_start=1451 + _globals['_DRAWNSHAPE']._serialized_end=2403 + _globals['_DRAWNSHAPE_KIND']._serialized_start=2052 + _globals['_DRAWNSHAPE_KIND']._serialized_end=2278 + _globals['_DRAWNSHAPE_STYLEMODE']._serialized_start=2280 + _globals['_DRAWNSHAPE_STYLEMODE']._serialized_end=2397 + _globals['_MARKER']._serialized_start=2406 + _globals['_MARKER']._serialized_end=2937 + _globals['_MARKER_KIND']._serialized_start=2657 + _globals['_MARKER_KIND']._serialized_end=2937 + _globals['_RANGEANDBEARING']._serialized_start=2940 + _globals['_RANGEANDBEARING']._serialized_end=3192 + _globals['_ROUTE']._serialized_start=3195 + _globals['_ROUTE']._serialized_end=3789 + _globals['_ROUTE_LINK']._serialized_start=3443 + _globals['_ROUTE_LINK']._serialized_end=3569 + _globals['_ROUTE_METHOD']._serialized_start=3572 + _globals['_ROUTE_METHOD']._serialized_end=3707 + _globals['_ROUTE_DIRECTION']._serialized_start=3709 + _globals['_ROUTE_DIRECTION']._serialized_end=3789 + _globals['_CASEVACREPORT']._serialized_start=3792 + _globals['_CASEVACREPORT']._serialized_end=5278 + _globals['_CASEVACREPORT_PRECEDENCE']._serialized_start=4800 + _globals['_CASEVACREPORT_PRECEDENCE']._serialized_end=4971 + _globals['_CASEVACREPORT_HLZMARKING']._serialized_start=4974 + _globals['_CASEVACREPORT_HLZMARKING']._serialized_end=5129 + _globals['_CASEVACREPORT_SECURITY']._serialized_start=5132 + _globals['_CASEVACREPORT_SECURITY']._serialized_end=5278 + _globals['_ZMISTENTRY']._serialized_start=5280 + _globals['_ZMISTENTRY']._serialized_end=5362 + _globals['_EMERGENCYALERT']._serialized_start=5365 + _globals['_EMERGENCYALERT']._serialized_end=5657 + _globals['_EMERGENCYALERT_TYPE']._serialized_start=5507 + _globals['_EMERGENCYALERT_TYPE']._serialized_end=5657 + _globals['_TASKREQUEST']._serialized_start=5660 + _globals['_TASKREQUEST']._serialized_end=6160 + _globals['_TASKREQUEST_PRIORITY']._serialized_start=5896 + _globals['_TASKREQUEST_PRIORITY']._serialized_end=6013 + _globals['_TASKREQUEST_STATUS']._serialized_start=6016 + _globals['_TASKREQUEST_STATUS']._serialized_end=6160 + _globals['_TAKENVIRONMENT']._serialized_start=6162 + _globals['_TAKENVIRONMENT']._serialized_end=6258 + _globals['_SENSORFOV']._serialized_start=6261 + _globals['_SENSORFOV']._serialized_end=6667 + _globals['_SENSORFOV_SENSORTYPE']._serialized_start=6485 + _globals['_SENSORFOV_SENSORTYPE']._serialized_end=6655 + _globals['_TAKTALKMESSAGE']._serialized_start=6669 + _globals['_TAKTALKMESSAGE']._serialized_end=6754 + _globals['_TAKTALKROOMDATA']._serialized_start=6756 + _globals['_TAKTALKROOMDATA']._serialized_end=6860 + _globals['_MARTI']._serialized_start=6862 + _globals['_MARTI']._serialized_end=6892 + _globals['_TAKPACKETV2']._serialized_start=6895 + _globals['_TAKPACKETV2']._serialized_end=8479 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/atak_pb2.pyi b/meshtastic/protobuf/atak_pb2.pyi index 6fab8638f..75f72bb87 100644 --- a/meshtastic/protobuf/atak_pb2.pyi +++ b/meshtastic/protobuf/atak_pb2.pyi @@ -810,7 +810,7 @@ class _CotTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy CotType_m_t_t: _CotType.ValueType # 125 """-- TAKTALK plugin shapes -- CoT types unique to the TAKTALK ATAK plugin. Note `y-` has a literal - trailing dash and no second atom — that's the wire format ATAK emits + trailing dash and no second atom - that's the wire format ATAK emits for TAKTALK room broadcasts. The CotType enum encodes the literal string verbatim (CotType_y -> "y-") so receivers reconstruct the original event type byte-for-byte without consulting cot_type_str. @@ -824,7 +824,7 @@ class _CotTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy y-: TAKTALK room/membership broadcast. Payload carried via the TakTalkRoomData typed variant (sender_callsign, room_id, room_name, participants). The CoT type literally has a trailing dash and no - second atom — not a typo. + second atom - not a typo. """ class CotType(_CotType, metaclass=_CotTypeEnumTypeWrapper): @@ -1323,7 +1323,7 @@ TaskRequest typed variant. CotType_m_t_t: CotType.ValueType # 125 """-- TAKTALK plugin shapes -- CoT types unique to the TAKTALK ATAK plugin. Note `y-` has a literal -trailing dash and no second atom — that's the wire format ATAK emits +trailing dash and no second atom - that's the wire format ATAK emits for TAKTALK room broadcasts. The CotType enum encodes the literal string verbatim (CotType_y -> "y-") so receivers reconstruct the original event type byte-for-byte without consulting cot_type_str. @@ -1337,7 +1337,7 @@ CotType_y: CotType.ValueType # 126 y-: TAKTALK room/membership broadcast. Payload carried via the TakTalkRoomData typed variant (sender_callsign, room_id, room_name, participants). The CoT type literally has a trailing dash and no -second atom — not a typo. +second atom - not a typo. """ global___CotType = CotType @@ -1808,10 +1808,10 @@ class CotGeoPoint(google.protobuf.message.Message): hundred meters of the anchor has per-vertex deltas in the ±10^4 range. Under sint32+zigzag those encode as 2 bytes each (tag+varint), versus the 4 bytes that sfixed32 would always require. At 32 vertices that is ~128 - bytes of savings — the difference between fitting under the LoRa MTU or + bytes of savings - the difference between fitting under the LoRa MTU or not. Absolute coordinates (values ~10^9) would cost sint32 varint 5 bytes per field, which is why TAKPacketV2's top-level latitude_i / longitude_i - stay sfixed32 — only small values win with sint32. + stay sfixed32 - only small values win with sint32. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -1896,7 +1896,7 @@ class DrawnShape(google.protobuf.message.Message): Kind_Ellipse: DrawnShape._Kind.ValueType # 8 """ u-d-c-e: Ellipse with distinct major/minor axes (same storage as - Kind_Circle — uses major_cm/minor_cm/angle_deg — but receivers + Kind_Circle - uses major_cm/minor_cm/angle_deg - but receivers render it as a non-circular ellipse rather than a round circle). """ Kind_Vehicle2D: DrawnShape._Kind.ValueType # 9 @@ -1951,7 +1951,7 @@ class DrawnShape(google.protobuf.message.Message): Kind_Ellipse: DrawnShape.Kind.ValueType # 8 """ u-d-c-e: Ellipse with distinct major/minor axes (same storage as - Kind_Circle — uses major_cm/minor_cm/angle_deg — but receivers + Kind_Circle - uses major_cm/minor_cm/angle_deg - but receivers render it as a non-circular ellipse rather than a round circle). """ Kind_Vehicle2D: DrawnShape.Kind.ValueType # 9 @@ -1973,7 +1973,7 @@ class DrawnShape(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor StyleMode_Unspecified: DrawnShape._StyleMode.ValueType # 0 """ - Unspecified — receiver infers from which color fields are non-zero. + Unspecified - receiver infers from which color fields are non-zero. """ StyleMode_StrokeOnly: DrawnShape._StyleMode.ValueType # 1 """ @@ -2005,7 +2005,7 @@ class DrawnShape(google.protobuf.message.Message): StyleMode_Unspecified: DrawnShape.StyleMode.ValueType # 0 """ - Unspecified — receiver infers from which color fields are non-zero. + Unspecified - receiver infers from which color fields are non-zero. """ StyleMode_StrokeOnly: DrawnShape.StyleMode.ValueType # 1 """ @@ -2171,7 +2171,7 @@ class Marker(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor Kind_Unspecified: Marker._Kind.ValueType # 0 """ - Unspecified — fall back to TAKPacketV2.cot_type_id + Unspecified - fall back to TAKPacketV2.cot_type_id """ Kind_Spot: Marker._Kind.ValueType # 1 """ @@ -2233,7 +2233,7 @@ class Marker(google.protobuf.message.Message): Kind_Unspecified: Marker.Kind.ValueType # 0 """ - Unspecified — fall back to TAKPacketV2.cot_type_id + Unspecified - fall back to TAKPacketV2.cot_type_id """ Kind_Spot: Marker.Kind.ValueType # 1 """ @@ -2357,7 +2357,7 @@ class RangeAndBearing(google.protobuf.message.Message): Covers CoT type u-rb-a. The anchor position is on TAKPacketV2.latitude_i/longitude_i; the target endpoint is carried as a - CotGeoPoint — same delta-from-anchor encoding used by DrawnShape.vertices + CotGeoPoint - same delta-from-anchor encoding used by DrawnShape.vertices so a self-anchored RAB (common case) encodes in zero bytes. """ @@ -2795,6 +2795,7 @@ class CasevacReport(google.protobuf.message.Message): non_us_military: builtins.int non_us_civilian: builtins.int epw: builtins.int + """enemy prisoner of war""" child: builtins.int terrain_flags: builtins.int """ @@ -2812,7 +2813,7 @@ class CasevacReport(google.protobuf.message.Message): "Victor 6"). Capped tight in options. """ title: builtins.str - """--- v2.x medline extensions (tags 16–33) -------------------------------- + """--- v2.x medline extensions (tags 16-33) -------------------------------- Fields 16+ cost a 2-byte tag instead of 1 byte, but they're usually sparse so the on-wire delta is modest when most stay unset. A fully @@ -2829,14 +2830,14 @@ class CasevacReport(google.protobuf.message.Message): """ medline_remarks: builtins.str """ - Primary medline free-text — the single most clinically important line + Primary medline free-text - the single most clinically important line on a MEDLINE form (e.g. "2 urgent litter patients, smoke on approach"). MUST be preserved under MTU pressure as long as any casevac is sent. """ urgent_count: builtins.int """ Line 3 (newer ATAK format): patient counts by precedence level. - Coexists with the enum-style `precedence` field (tag 1) — older ATAK + Coexists with the enum-style `precedence` field (tag 1) - older ATAK emits a single enum, newer ATAK emits these counts, and both can be set simultaneously. Senders populate whichever style(s) the source XML had; receivers prefer counts when non-zero. @@ -2905,7 +2906,7 @@ class CasevacReport(google.protobuf.message.Message): def zmist(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ZMistEntry]: """ Per-patient clinical records. Each entry is one patient's ZMIST card - (Zap number / Mechanism / Injuries / Signs / Treatment). Repeatable — + (Zap number / Mechanism / Injuries / Signs / Treatment). Repeatable - a mass-casualty event can carry 1-6 entries in practice, limited by the 237 B LoRa MTU. """ @@ -2954,7 +2955,7 @@ global___CasevacReport = CasevacReport @typing.final class ZMistEntry(google.protobuf.message.Message): """ - Per-patient clinical summary record — one entry per patient in a CASEVAC. + Per-patient clinical summary record - one entry per patient in a CASEVAC. Maps directly to ATAK's child element inside . All fields are optional free-text; senders populate what they have. """ @@ -2973,7 +2974,7 @@ class ZMistEntry(google.protobuf.message.Message): """ z: builtins.str """ - Zap number — unique patient tracking ID (often a terse code like + Zap number - unique patient tracking ID (often a terse code like "Gunshot" or a serial). """ m: builtins.str @@ -3094,7 +3095,7 @@ class TaskRequest(google.protobuf.message.Message): creation time; the fields below carry structured metadata the raw-detail fallback currently loses. - Fields are deliberately lean — this variant is closer to the MTU ceiling + Fields are deliberately lean - this variant is closer to the MTU ceiling than the others, so every string is capped in options. """ @@ -3196,7 +3197,7 @@ class TAKEnvironment(google.protobuf.message.Message): """ Weather annotation from CoT detail element. - Attaches to any TAKPacketV2 regardless of payload_variant — an Aircraft, + Attaches to any TAKPacketV2 regardless of payload_variant - an Aircraft, PLI, or Marker can all carry observed conditions at the emitting station. ATAK-CIV ships an XSD for but no dedicated handler, so the element round-trips through the generic detail pipeline; this message @@ -3205,7 +3206,7 @@ class TAKEnvironment(google.protobuf.message.Message): Target wire cost: ~6-8 bytes compressed with a fully populated instance. Named `TAKEnvironment` (not just `Environment`) because the bare name - collides with `SwiftUI.Environment` — every SwiftUI view in a consuming + collides with `SwiftUI.Environment` - every SwiftUI view in a consuming iOS app uses the `@Environment` property wrapper, and importing the generated proto module would make `Environment` ambiguous in every one of those files. The `TAK` prefix matches the convention used by the @@ -3258,7 +3259,7 @@ class SensorFov(google.protobuf.message.Message): The receiving ATAK client restores those from its own defaults, same as every other CoT carried over Meshtastic today. - Attaches to any TAKPacketV2 — a PLI with a sensor on the operator's head, + Attaches to any TAKPacketV2 - a PLI with a sensor on the operator's head, an Aircraft with a FLIR turret, a Marker dropped on a UAV. Target wire cost: ~7-14 bytes compressed (dominated by model string). """ @@ -3322,7 +3323,7 @@ class SensorFov(google.protobuf.message.Message): range_m: builtins.int """ Maximum range of the cone in meters. - Optional — if unset, receivers should use the ATAK-CIV default of 100m. + Optional - if unset, receivers should use the ATAK-CIV default of 100m. """ fov_horizontal_deg: builtins.int """ @@ -3332,7 +3333,7 @@ class SensorFov(google.protobuf.message.Message): fov_vertical_deg: builtins.int """ Vertical field of view in whole degrees. ATAK-CIV default is 45°. - Optional — a value of 0 means "not set / use horizontal FOV". + Optional - a value of 0 means "not set / use horizontal FOV". """ elevation_deg: builtins.int """ @@ -3342,12 +3343,12 @@ class SensorFov(google.protobuf.message.Message): roll_deg: builtins.int """ Roll (camera tilt) in whole degrees, -180 to +180. - Optional — use 0 if the sensor doesn't track roll. + Optional - use 0 if the sensor doesn't track roll. """ model: builtins.str """ Free-form device model identifier, e.g. "FLIR-Boson-640", "SEEK". - Optional — empty string means "unknown model" (ATAK-CIV default). + Optional - empty string means "unknown model" (ATAK-CIV default). """ def __init__( self, @@ -3373,7 +3374,7 @@ class TakTalkMessage(google.protobuf.message.Message): TAKTALK chat message payload (CoT type m-t-t). TAKTALK is an ATAK plugin for voice + text team messaging. The voice - audio stream goes over UDP/RTP and is NOT carried by the mesh — only + audio stream goes over UDP/RTP and is NOT carried by the mesh - only the text envelope (this message) is. `from_voice` marks messages sent via push-to-talk speech-to-text so receivers can render a mic icon next to the text. @@ -3435,7 +3436,7 @@ class TakTalkRoomData(google.protobuf.message.Message): Announces a TAKTALK chatroom's friendly name and roster so peers can resolve room UUIDs (used in TakTalkMessage.chatroom_id and GeoChat.room_id) to a display name and participant list. Not a chat - message itself — these events are emitted by TAKTALK when rooms are + message itself - these events are emitted by TAKTALK when rooms are created or memberships change. """ @@ -3511,7 +3512,7 @@ class Marti(google.protobuf.message.Message): primary-vs-cc distinction the same way ATAK does. If dest_callsign is [TAKPacketV2.callsign] (self-addressed, unusual but - legal — e.g. ATAK echoing back to its own room), the builder still emits + legal - e.g. ATAK echoing back to its own room), the builder still emits the element so loopback shapes round-trip cleanly. """ @@ -3693,7 +3694,7 @@ class TAKPacketV2(google.protobuf.message.Message): """--- Sensor / environment annotations ---------------------------------- Both fields are OPTIONAL and attach to any payload_variant. They - describe observed conditions at the emitting station — a PLI with + describe observed conditions at the emitting station - a PLI with environment data, an Aircraft with a sensor cone, a Marker with both. Absent by default; presence is signaled by the message being non-null. diff --git a/meshtastic/protobuf/channel_pb2.py b/meshtastic/protobuf/channel_pb2.py index a2bc3154d..76eb834b3 100644 --- a/meshtastic/protobuf/channel_pb2.py +++ b/meshtastic/protobuf/channel_pb2.py @@ -14,7 +14,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!meshtastic/protobuf/channel.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xcf\x01\n\x0f\x43hannelSettings\x12\x17\n\x0b\x63hannel_num\x18\x01 \x01(\rB\x02\x18\x01\x12\x12\n\x03psk\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x13\n\x04name\x18\x03 \x01(\tB\x05\x92?\x02\x08\x0c\x12\n\n\x02id\x18\x04 \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x05 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x06 \x01(\x08\x12<\n\x0fmodule_settings\x18\x07 \x01(\x0b\x32#.meshtastic.protobuf.ModuleSettings\">\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\x12\x10\n\x08is_muted\x18\x02 \x01(\x08\"\xba\x01\n\x07\x43hannel\x12\x14\n\x05index\x18\x01 \x01(\x05\x42\x05\x92?\x02\x38\x08\x12\x36\n\x08settings\x18\x02 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12/\n\x04role\x18\x03 \x01(\x0e\x32!.meshtastic.protobuf.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42\x63\n\x14org.meshtastic.protoB\rChannelProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n!meshtastic/protobuf/channel.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xe1\x01\n\x0f\x43hannelSettings\x12\x17\n\x0b\x63hannel_num\x18\x01 \x01(\rB\x02\x18\x01\x12\x12\n\x03psk\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x13\n\x04name\x18\x03 \x01(\tB\x05\x92?\x02\x08\x0c\x12\n\n\x02id\x18\x04 \x01(\x07\x12\x16\n\x0euplink_enabled\x18\x05 \x01(\x08\x12\x18\n\x10\x64ownlink_enabled\x18\x06 \x01(\x08\x12<\n\x0fmodule_settings\x18\x07 \x01(\x0b\x32#.meshtastic.protobuf.ModuleSettings\x12\x10\n\x08use_aead\x18\x08 \x01(\x08\">\n\x0eModuleSettings\x12\x1a\n\x12position_precision\x18\x01 \x01(\r\x12\x10\n\x08is_muted\x18\x02 \x01(\x08\"\xba\x01\n\x07\x43hannel\x12\x14\n\x05index\x18\x01 \x01(\x05\x42\x05\x92?\x02\x38\x08\x12\x36\n\x08settings\x18\x02 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12/\n\x04role\x18\x03 \x01(\x0e\x32!.meshtastic.protobuf.Channel.Role\"0\n\x04Role\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07PRIMARY\x10\x01\x12\r\n\tSECONDARY\x10\x02\x42\x63\n\x14org.meshtastic.protoB\rChannelProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -31,11 +31,11 @@ _CHANNEL.fields_by_name['index']._options = None _CHANNEL.fields_by_name['index']._serialized_options = b'\222?\0028\010' _globals['_CHANNELSETTINGS']._serialized_start=93 - _globals['_CHANNELSETTINGS']._serialized_end=300 - _globals['_MODULESETTINGS']._serialized_start=302 - _globals['_MODULESETTINGS']._serialized_end=364 - _globals['_CHANNEL']._serialized_start=367 - _globals['_CHANNEL']._serialized_end=553 - _globals['_CHANNEL_ROLE']._serialized_start=505 - _globals['_CHANNEL_ROLE']._serialized_end=553 + _globals['_CHANNELSETTINGS']._serialized_end=318 + _globals['_MODULESETTINGS']._serialized_start=320 + _globals['_MODULESETTINGS']._serialized_end=382 + _globals['_CHANNEL']._serialized_start=385 + _globals['_CHANNEL']._serialized_end=571 + _globals['_CHANNEL_ROLE']._serialized_start=523 + _globals['_CHANNEL_ROLE']._serialized_end=571 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/channel_pb2.pyi b/meshtastic/protobuf/channel_pb2.pyi index 5c43d3413..01db545e8 100644 --- a/meshtastic/protobuf/channel_pb2.pyi +++ b/meshtastic/protobuf/channel_pb2.pyi @@ -46,6 +46,7 @@ class ChannelSettings(google.protobuf.message.Message): UPLINK_ENABLED_FIELD_NUMBER: builtins.int DOWNLINK_ENABLED_FIELD_NUMBER: builtins.int MODULE_SETTINGS_FIELD_NUMBER: builtins.int + USE_AEAD_FIELD_NUMBER: builtins.int channel_num: builtins.int """ Deprecated in favor of LoraConfig.channel_num @@ -96,6 +97,14 @@ class ChannelSettings(google.protobuf.message.Message): """ If true, messages seen on the internet will be forwarded to the local mesh. """ + use_aead: builtins.bool + """ + Enable authenticated encryption (AES-CCM) for this channel. + When true, messages include a 12-byte authentication tag that prevents + forgery and bit-flipping attacks. All nodes on the channel must have + this enabled - unauthenticated (AES-CTR) packets are rejected. + Experimental. Default: false (standard AES-CTR encryption). + """ @property def module_settings(self) -> global___ModuleSettings: """ @@ -112,9 +121,10 @@ class ChannelSettings(google.protobuf.message.Message): uplink_enabled: builtins.bool = ..., downlink_enabled: builtins.bool = ..., module_settings: global___ModuleSettings | None = ..., + use_aead: builtins.bool = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["module_settings", b"module_settings"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["channel_num", b"channel_num", "downlink_enabled", b"downlink_enabled", "id", b"id", "module_settings", b"module_settings", "name", b"name", "psk", b"psk", "uplink_enabled", b"uplink_enabled"]) -> None: ... + def ClearField(self, field_name: typing.Literal["channel_num", b"channel_num", "downlink_enabled", b"downlink_enabled", "id", b"id", "module_settings", b"module_settings", "name", b"name", "psk", b"psk", "uplink_enabled", b"uplink_enabled", "use_aead", b"use_aead"]) -> None: ... global___ChannelSettings = ChannelSettings diff --git a/meshtastic/protobuf/clientonly_pb2.py b/meshtastic/protobuf/clientonly_pb2.py index cc68e42bb..0f25e756b 100644 --- a/meshtastic/protobuf/clientonly_pb2.py +++ b/meshtastic/protobuf/clientonly_pb2.py @@ -16,7 +16,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/clientonly.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/localonly.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a meshtastic/protobuf/nanopb.proto\"\xe2\x03\n\rDeviceProfile\x12\x1d\n\tlong_name\x18\x01 \x01(\tB\x05\x92?\x02\x08(H\x00\x88\x01\x01\x12\x1e\n\nshort_name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x05H\x01\x88\x01\x01\x12\x18\n\x0b\x63hannel_url\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x35\n\x06\x63onfig\x18\x04 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfigH\x03\x88\x01\x01\x12\x42\n\rmodule_config\x18\x05 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfigH\x04\x88\x01\x01\x12:\n\x0e\x66ixed_position\x18\x06 \x01(\x0b\x32\x1d.meshtastic.protobuf.PositionH\x05\x88\x01\x01\x12\x1d\n\x08ringtone\x18\x07 \x01(\tB\x06\x92?\x03\x08\xe7\x01H\x06\x88\x01\x01\x12$\n\x0f\x63\x61nned_messages\x18\x08 \x01(\tB\x06\x92?\x03\x08\xc9\x01H\x07\x88\x01\x01\x42\x0c\n\n_long_nameB\r\n\x0b_short_nameB\x0e\n\x0c_channel_urlB\t\n\x07_configB\x10\n\x0e_module_configB\x11\n\x0f_fixed_positionB\x0b\n\t_ringtoneB\x12\n\x10_canned_messagesBf\n\x14org.meshtastic.protoB\x10\x43lientOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$meshtastic/protobuf/clientonly.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/localonly.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a meshtastic/protobuf/nanopb.proto\"\xbe\x04\n\rDeviceProfile\x12\x1d\n\tlong_name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x19H\x00\x88\x01\x01\x12\x1e\n\nshort_name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x05H\x01\x88\x01\x01\x12\x18\n\x0b\x63hannel_url\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x35\n\x06\x63onfig\x18\x04 \x01(\x0b\x32 .meshtastic.protobuf.LocalConfigH\x03\x88\x01\x01\x12\x42\n\rmodule_config\x18\x05 \x01(\x0b\x32&.meshtastic.protobuf.LocalModuleConfigH\x04\x88\x01\x01\x12:\n\x0e\x66ixed_position\x18\x06 \x01(\x0b\x32\x1d.meshtastic.protobuf.PositionH\x05\x88\x01\x01\x12\x1d\n\x08ringtone\x18\x07 \x01(\tB\x06\x92?\x03\x08\xe7\x01H\x06\x88\x01\x01\x12$\n\x0f\x63\x61nned_messages\x18\x08 \x01(\tB\x06\x92?\x03\x08\xc9\x01H\x07\x88\x01\x01\x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x08\x88\x01\x01\x12\x18\n\x0bis_licensed\x18\n \x01(\x08H\t\x88\x01\x01\x42\x0c\n\n_long_nameB\r\n\x0b_short_nameB\x0e\n\x0c_channel_urlB\t\n\x07_configB\x10\n\x0e_module_configB\x11\n\x0f_fixed_positionB\x0b\n\t_ringtoneB\x12\n\x10_canned_messagesB\x12\n\x10_is_unmessagableB\x0e\n\x0c_is_licensedBf\n\x14org.meshtastic.protoB\x10\x43lientOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -25,7 +25,7 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020ClientOnlyProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _DEVICEPROFILE.fields_by_name['long_name']._options = None - _DEVICEPROFILE.fields_by_name['long_name']._serialized_options = b'\222?\002\010(' + _DEVICEPROFILE.fields_by_name['long_name']._serialized_options = b'\222?\002\010\031' _DEVICEPROFILE.fields_by_name['short_name']._options = None _DEVICEPROFILE.fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' _DEVICEPROFILE.fields_by_name['ringtone']._options = None @@ -33,5 +33,5 @@ _DEVICEPROFILE.fields_by_name['canned_messages']._options = None _DEVICEPROFILE.fields_by_name['canned_messages']._serialized_options = b'\222?\003\010\311\001' _globals['_DEVICEPROFILE']._serialized_start=165 - _globals['_DEVICEPROFILE']._serialized_end=647 + _globals['_DEVICEPROFILE']._serialized_end=739 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/clientonly_pb2.pyi b/meshtastic/protobuf/clientonly_pb2.pyi index 78725be0f..3938d8f65 100644 --- a/meshtastic/protobuf/clientonly_pb2.pyi +++ b/meshtastic/protobuf/clientonly_pb2.pyi @@ -29,6 +29,8 @@ class DeviceProfile(google.protobuf.message.Message): FIXED_POSITION_FIELD_NUMBER: builtins.int RINGTONE_FIELD_NUMBER: builtins.int CANNED_MESSAGES_FIELD_NUMBER: builtins.int + IS_UNMESSAGABLE_FIELD_NUMBER: builtins.int + IS_LICENSED_FIELD_NUMBER: builtins.int long_name: builtins.str """ Long name for the node @@ -49,6 +51,14 @@ class DeviceProfile(google.protobuf.message.Message): """ Predefined messages for CannedMessage """ + is_unmessagable: builtins.bool + """ + Is the node unmessagable + """ + is_licensed: builtins.bool + """ + Is this node in licensed user mode + """ @property def config(self) -> meshtastic.protobuf.localonly_pb2.LocalConfig: """ @@ -78,9 +88,11 @@ class DeviceProfile(google.protobuf.message.Message): fixed_position: meshtastic.protobuf.mesh_pb2.Position | None = ..., ringtone: builtins.str | None = ..., canned_messages: builtins.str | None = ..., + is_unmessagable: builtins.bool | None = ..., + is_licensed: builtins.bool | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_canned_messages", b"_canned_messages", "_channel_url", b"_channel_url", "_config", b"_config", "_fixed_position", b"_fixed_position", "_long_name", b"_long_name", "_module_config", b"_module_config", "_ringtone", b"_ringtone", "_short_name", b"_short_name", "canned_messages", b"canned_messages", "channel_url", b"channel_url", "config", b"config", "fixed_position", b"fixed_position", "long_name", b"long_name", "module_config", b"module_config", "ringtone", b"ringtone", "short_name", b"short_name"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_canned_messages", b"_canned_messages", "_channel_url", b"_channel_url", "_config", b"_config", "_fixed_position", b"_fixed_position", "_long_name", b"_long_name", "_module_config", b"_module_config", "_ringtone", b"_ringtone", "_short_name", b"_short_name", "canned_messages", b"canned_messages", "channel_url", b"channel_url", "config", b"config", "fixed_position", b"fixed_position", "long_name", b"long_name", "module_config", b"module_config", "ringtone", b"ringtone", "short_name", b"short_name"]) -> None: ... + def HasField(self, field_name: typing.Literal["_canned_messages", b"_canned_messages", "_channel_url", b"_channel_url", "_config", b"_config", "_fixed_position", b"_fixed_position", "_is_licensed", b"_is_licensed", "_is_unmessagable", b"_is_unmessagable", "_long_name", b"_long_name", "_module_config", b"_module_config", "_ringtone", b"_ringtone", "_short_name", b"_short_name", "canned_messages", b"canned_messages", "channel_url", b"channel_url", "config", b"config", "fixed_position", b"fixed_position", "is_licensed", b"is_licensed", "is_unmessagable", b"is_unmessagable", "long_name", b"long_name", "module_config", b"module_config", "ringtone", b"ringtone", "short_name", b"short_name"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_canned_messages", b"_canned_messages", "_channel_url", b"_channel_url", "_config", b"_config", "_fixed_position", b"_fixed_position", "_is_licensed", b"_is_licensed", "_is_unmessagable", b"_is_unmessagable", "_long_name", b"_long_name", "_module_config", b"_module_config", "_ringtone", b"_ringtone", "_short_name", b"_short_name", "canned_messages", b"canned_messages", "channel_url", b"channel_url", "config", b"config", "fixed_position", b"fixed_position", "is_licensed", b"is_licensed", "is_unmessagable", b"is_unmessagable", "long_name", b"long_name", "module_config", b"module_config", "ringtone", b"ringtone", "short_name", b"short_name"]) -> None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_canned_messages", b"_canned_messages"]) -> typing.Literal["canned_messages"] | None: ... @typing.overload @@ -90,6 +102,10 @@ class DeviceProfile(google.protobuf.message.Message): @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_fixed_position", b"_fixed_position"]) -> typing.Literal["fixed_position"] | None: ... @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_is_licensed", b"_is_licensed"]) -> typing.Literal["is_licensed"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_is_unmessagable", b"_is_unmessagable"]) -> typing.Literal["is_unmessagable"] | None: ... + @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_long_name", b"_long_name"]) -> typing.Literal["long_name"] | None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_module_config", b"_module_config"]) -> typing.Literal["module_config"] | None: ... diff --git a/meshtastic/protobuf/config_pb2.py b/meshtastic/protobuf/config_pb2.py index b483c5759..c1ba64d3e 100644 --- a/meshtastic/protobuf/config_pb2.py +++ b/meshtastic/protobuf/config_pb2.py @@ -12,10 +12,11 @@ from meshtastic.protobuf import device_ui_pb2 as meshtastic_dot_protobuf_dot_device__ui__pb2 +from meshtastic.protobuf import field_metadata_pb2 as meshtastic_dot_protobuf_dot_field__metadata__pb2 from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n meshtastic/protobuf/config.proto\x12\x13meshtastic.protobuf\x1a#meshtastic/protobuf/device_ui.proto\x1a meshtastic/protobuf/nanopb.proto\"\xd6.\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\x9f\x07\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\x14\n\x05tzdef\x18\x0b \x01(\tB\x05\x92?\x02\x08\x41\x12\x1e\n\x16led_heartbeat_disabled\x18\x0c \x01(\x08\x12O\n\x0b\x62uzzer_mode\x18\r \x01(\x0e\x32\x33.meshtastic.protobuf.Config.DeviceConfig.BuzzerModeB\x05\x92?\x02\x38\x08\"\xd4\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\x10\n\x08REPEATER\x10\x04\x1a\x02\x08\x01\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\x12\x0f\n\x0b\x43LIENT_BASE\x10\x0c\"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\"i\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\x12\x13\n\x0f\x44IRECT_MSG_ONLY\x10\x04\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\x8b\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(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18 \x01(\x04\x1a\x93\x04\n\rNetworkConfig\x12\x14\n\x0cwifi_enabled\x18\x01 \x01(\x08\x12\x18\n\twifi_ssid\x18\x03 \x01(\tB\x05\x92?\x02\x08!\x12\x17\n\x08wifi_psk\x18\x04 \x01(\tB\x05\x92?\x02\x08\x41\x12\x19\n\nntp_server\x18\x05 \x01(\tB\x05\x92?\x02\x08!\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\x1d\n\x0ersyslog_server\x18\t \x01(\tB\x05\x92?\x02\x08!\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\xef\x08\n\rDisplayConfig\x12\x16\n\x0escreen_on_secs\x18\x01 \x01(\r\x12_\n\ngps_format\x18\x02 \x01(\x0e\x32G.meshtastic.protobuf.Config.DisplayConfig.DeprecatedGpsCoordinateFormatB\x02\x18\x01\x12!\n\x19\x61uto_screen_carousel_secs\x18\x03 \x01(\r\x12\x1d\n\x11\x63ompass_north_top\x18\x04 \x01(\x08\x42\x02\x18\x01\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\x12\x1a\n\x12use_long_node_name\x18\r \x01(\x08\x12\x1e\n\x16\x65nable_message_bubbles\x18\x0e \x01(\x08\"+\n\x1d\x44\x65precatedGpsCoordinateFormat\x12\n\n\x06UNUSED\x10\x00\"(\n\x0c\x44isplayUnits\x12\n\n\x06METRIC\x10\x00\x12\x0c\n\x08IMPERIAL\x10\x01\"\x7f\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\x17\n\x13OLED_SH1107_128_128\x10\x04\x12\x17\n\x13OLED_SH1107_ROTATED\x10\x05\"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\xdc\n\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\x18\n\tbandwidth\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\x12\x15\n\rspread_factor\x18\x04 \x01(\r\x12\x1a\n\x0b\x63oding_rate\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\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\x17\n\x08tx_power\x18\n \x01(\x05\x42\x05\x92?\x02\x38\x08\x12\x1a\n\x0b\x63hannel_num\x18\x0b \x01(\rB\x05\x92?\x02\x38\x10\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\x1e\n\x0fignore_incoming\x18g \x03(\rB\x05\x92?\x02\x10\x03\x12\x13\n\x0bignore_mqtt\x18h \x01(\x08\x12\x19\n\x11\x63onfig_ok_to_mqtt\x18i \x01(\x08\x12I\n\x0c\x66\x65m_lna_mode\x18j \x01(\x0e\x32\x33.meshtastic.protobuf.Config.LoRaConfig.FEM_LNA_Mode\x12\x17\n\x0fserial_hal_only\x18k \x01(\x08\"\x87\x03\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\x12\x0b\n\x07\x41NZ_433\x10\x16\x12\n\n\x06KZ_433\x10\x17\x12\n\n\x06KZ_863\x10\x18\x12\n\n\x06NP_865\x10\x19\x12\n\n\x06\x42R_902\x10\x1a\x12\x0b\n\x07ITU1_2M\x10\x1b\x12\x0b\n\x07ITU2_2M\x10\x1c\x12\n\n\x06\x45U_866\x10\x1d\x12\n\n\x06\x45U_874\x10\x1e\x12\n\n\x06\x45U_917\x10\x1f\x12\x0c\n\x08\x45U_N_868\x10 \x12\x0b\n\x07ITU3_2M\x10!\"\xfd\x01\n\x0bModemPreset\x12\r\n\tLONG_FAST\x10\x00\x12\x11\n\tLONG_SLOW\x10\x01\x1a\x02\x08\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\x12\x0e\n\nLONG_TURBO\x10\t\x12\r\n\tLITE_FAST\x10\n\x12\r\n\tLITE_SLOW\x10\x0b\x12\x0f\n\x0bNARROW_FAST\x10\x0c\x12\x0f\n\x0bNARROW_SLOW\x10\r\":\n\x0c\x46\x45M_LNA_Mode\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07\x45NABLED\x10\x01\x12\x0f\n\x0bNOT_PRESENT\x10\x02\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\xcd\x01\n\x0eSecurityConfig\x12\x19\n\npublic_key\x18\x01 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\x0bprivate_key\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\tadmin_key\x18\x03 \x03(\x0c\x42\x07\x92?\x04\x08 \x10\x03\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_variantBb\n\x14org.meshtastic.protoB\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\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb3\x85\x01\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\xb4\x1e\n\x0c\x44\x65viceConfig\x12N\n\x04role\x18\x01 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.RoleB\x11\xca\xf3\x18\r:\x0b\x44\x65vice Role\x12\x1a\n\x0eserial_enabled\x18\x02 \x01(\x08\x42\x02\x18\x01\x12u\n\x0b\x62utton_gpio\x18\x04 \x01(\rB`\xca\xf3\x18\\:\x0b\x42utton GPIOBMGPIO pin for the user button, can be remapped on boards with multiple buttons\x12\x43\n\x0b\x62uzzer_gpio\x18\x05 \x01(\rB.\xca\xf3\x18*:\x0b\x42uzzer GPIOB\x1bGPIO pin for the PWM buzzer\x12j\n\x10rebroadcast_mode\x18\x06 \x01(\x0e\x32\x38.meshtastic.protobuf.Config.DeviceConfig.RebroadcastModeB\x16\xca\xf3\x18\x12:\x10Rebroadcast Mode\x12\x85\x01\n\x18node_info_broadcast_secs\x18\x07 \x01(\rBc\xca\xf3\x18_*\x01s:\x1cNode Info Broadcast IntervalB\n position_broadcast_smart_enabled\x18\x02 \x01(\x08\x42\x14\xca\xf3\x18\x10:\x0eSmart Position\x12\xb2\x01\n\x0e\x66ixed_position\x18\x03 \x01(\x08\x42\x99\x01\xca\xf3\x18\x94\x01:\x0e\x46ixed PositionB\x81\x01The last known latitude, longitude and altitude are broadcast over the mesh on the position interval, rather than a live GPS fix.\x12\x17\n\x0bgps_enabled\x18\x04 \x01(\x08\x42\x02\x18\x01\x12^\n\x13gps_update_interval\x18\x05 \x01(\rBA\xca\xf3\x18=*\x01s:\x0fUpdate IntervalB\'How often to try to get a GPS position.\x12\x1c\n\x10gps_attempt_time\x18\x06 \x01(\rB\x02\x18\x01\x12j\n\x0eposition_flags\x18\x07 \x01(\rBR\xca\xf3\x18N:\x0ePosition FlagsB\n\x07rx_gpio\x18\x08 \x01(\rB-\xca\xf3\x18)\x08\x01:\x10GPS Receive GPIOB\x13GPIO pin for GPS RX\x12?\n\x07tx_gpio\x18\t \x01(\rB.\xca\xf3\x18*\x08\x01:\x11GPS Transmit GPIOB\x13GPIO pin for GPS TX\x12\x94\x01\n broadcast_smart_minimum_distance\x18\n \x01(\rBj\xca\xf3\x18\x66*\x01m:\x10Minimum DistanceBOThe minimum change in distance before a smart position broadcast is considered.\x12\xa0\x01\n%broadcast_smart_minimum_interval_secs\x18\x0b \x01(\rBq\xca\xf3\x18m*\x01s:\x10Minimum IntervalBVThe shortest interval between position updates once the minimum distance has been met.\x12\x41\n\x0bgps_en_gpio\x18\x0c \x01(\rB,\xca\xf3\x18(\x08\x01:\x0bGPS EN GPIOB\x17GPIO pin for GPS enable\x12T\n\x08gps_mode\x18\r \x01(\x0e\x32\x32.meshtastic.protobuf.Config.PositionConfig.GpsModeB\x0e\xca\xf3\x18\n:\x08GPS Mode\"\xdc\x04\n\rPositionFlags\x12\t\n\x05UNSET\x10\x00\x12\x63\n\x08\x41LTITUDE\x10\x01\x1aU\xca\xf3\x18Q:\x08\x41ltitudeBEInclude an altitude value in position reports, when one is available.\x12\x32\n\x0c\x41LTITUDE_MSL\x10\x02\x1a \xca\xf3\x18\x1c:\x1a\x41ltitude is Mean Sea Level\x12\x39\n\x12GEOIDAL_SEPARATION\x10\x04\x1a!\xca\xf3\x18\x1d:\x1b\x41ltitude Geoidal Separation\x12U\n\x03\x44OP\x10\x08\x1aL\xca\xf3\x18H:\x03\x44OPBAInclude the dilution of precision value. PDOP is used by default.\x12`\n\x05HVDOP\x10\x10\x1aU\xca\xf3\x18Q:\x0bHDOP / VDOPBBIf DOP is set, send separate HDOP and VDOP values instead of PDOP.\x12)\n\tSATINVIEW\x10 \x1a\x1a\xca\xf3\x18\x16:\x14Number of satellites\x12!\n\x06SEQ_NO\x10@\x1a\x15\xca\xf3\x18\x11:\x0fSequence number\x12\x1f\n\tTIMESTAMP\x10\x80\x01\x1a\x0f\xca\xf3\x18\x0b:\tTimestamp\x12#\n\x07HEADING\x10\x80\x02\x1a\x15\xca\xf3\x18\x11:\x0fVehicle heading\x12\x1f\n\x05SPEED\x10\x80\x04\x1a\x13\xca\xf3\x18\x0f:\rVehicle speed\"g\n\x07GpsMode\x12\x1c\n\x08\x44ISABLED\x10\x00\x1a\x0e\xca\xf3\x18\n:\x08\x44isabled\x12\x1a\n\x07\x45NABLED\x10\x01\x1a\r\xca\xf3\x18\t:\x07\x45nabled\x12\"\n\x0bNOT_PRESENT\x10\x02\x1a\x11\xca\xf3\x18\r:\x0bNot Present\x1a\xbf\x05\n\x0bPowerConfig\x12\x98\x02\n\x0fis_power_saving\x18\x01 \x01(\x08\x42\xfe\x01\xca\xf3\x18\xf9\x01:\x0cPower SavingB\xe8\x01Will 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.\x12\xa0\x01\n\x1eon_battery_shutdown_after_secs\x18\x02 \x01(\rBx\xca\xf3\x18t*\x01s:\x16Shutdown on Power LossBWHow long after external power is removed before the device powers off. Zero to disable.\x12\x33\n\x17\x61\x64\x63_multiplier_override\x18\x03 \x01(\x02\x42\x12\xca\xf3\x18\x0e:\x0c\x41\x44\x43 Override\x12>\n\x13wait_bluetooth_secs\x18\x04 \x01(\rB!\xca\xf3\x18\x1d:\x1bWait for Bluetooth Duration\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(\rB\x05\x92?\x02\x38\x08\x12\x18\n\x10powermon_enables\x18 \x01(\x04\x1a\xe9\x08\n\rNetworkConfig\x12i\n\x0cwifi_enabled\x18\x01 \x01(\x08\x42S\xca\xf3\x18O:\x0cWiFi EnabledB?Enabling WiFi will disable the bluetooth connection to the app.\x12\x43\n\twifi_ssid\x18\x03 \x01(\tB0\x92?\x02\x08!\xca\xf3\x18\':\x04SSIDB\x1fWiFi network name to connect to\x12G\n\x08wifi_psk\x18\x04 \x01(\tB5\x92?\x02\x08\x41\xca\xf3\x18,:\x08PasswordB WiFi password for authentication\x12\x62\n\nntp_server\x18\x05 \x01(\tBN\x92?\x02\x08!\xca\xf3\x18\x45:\nNTP ServerB7NTP server address. Defaults to meshtastic.pool.ntp.org\x12p\n\x0b\x65th_enabled\x18\x06 \x01(\x08\x42[\xca\xf3\x18W:\x10\x45thernet EnabledBCEnabling Ethernet will disable the bluetooth connection to the app.\x12_\n\x0c\x61\x64\x64ress_mode\x18\x07 \x01(\x0e\x32\x35.meshtastic.protobuf.Config.NetworkConfig.AddressModeB\x12\xca\xf3\x18\x0e:\x0c\x41\x64\x64ress Mode\x12I\n\x0bipv4_config\x18\x08 \x01(\x0b\x32\x34.meshtastic.protobuf.Config.NetworkConfig.IpV4Config\x12\x31\n\x0ersyslog_server\x18\t \x01(\tB\x19\x92?\x02\x08!\xca\xf3\x18\x10:\x0eRsyslog Server\x12v\n\x11\x65nabled_protocols\x18\n \x01(\rB[\xca\xf3\x18W:\x11\x45nabled ProtocolsB;Enable broadcasting packets via UDP over the local network.R\x05\x32.6.0\x12\"\n\x0cipv6_enabled\x18\x0b \x01(\x08\x42\x0c\xca\xf3\x18\x08R\x06\x32.7.16\x1ax\n\nIpV4Config\x12\x14\n\x02ip\x18\x01 \x01(\x07\x42\x08\xca\xf3\x18\x04:\x02IP\x12\x1e\n\x07gateway\x18\x02 \x01(\x07\x42\r\xca\xf3\x18\t:\x07Gateway\x12\x1c\n\x06subnet\x18\x03 \x01(\x07\x42\x0c\xca\xf3\x18\x08:\x06Subnet\x12\x16\n\x03\x64ns\x18\x04 \x01(\x07\x42\t\xca\xf3\x18\x05:\x03\x44NS\"=\n\x0b\x41\x64\x64ressMode\x12\x14\n\x04\x44HCP\x10\x00\x1a\n\xca\xf3\x18\x06:\x04\x44HCP\x12\x18\n\x06STATIC\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06Static\"U\n\rProtocolFlags\x12\x1c\n\x0cNO_BROADCAST\x10\x00\x1a\n\xca\xf3\x18\x06:\x04None\x12&\n\rUDP_BROADCAST\x10\x01\x1a\x13\xca\xf3\x18\x0f:\rUDP Broadcast\x1a\xb8\x13\n\rDisplayConfig\x12\x89\x01\n\x0escreen_on_secs\x18\x01 \x01(\rBq\xca\xf3\x18m*\x01s:\rScreen on forBYHow long the screen remains on after the user button is pressed or messages are received.\x12k\n\ngps_format\x18\x02 \x01(\x0e\x32G.meshtastic.protobuf.Config.DisplayConfig.DeprecatedGpsCoordinateFormatB\x0e\x18\x01\xca\xf3\x18\x08Z\x06\x32.7.10\x12\x8e\x01\n\x19\x61uto_screen_carousel_secs\x18\x03 \x01(\rBk\xca\xf3\x18g*\x01s:\x11\x43\x61rousel IntervalBOAutomatically moves to the next screen page, like a carousel, on this interval.\x12\x8e\x01\n\x11\x63ompass_north_top\x18\x04 \x01(\x08\x42s\x18\x01\xca\xf3\x18m:\x12\x41lways point northBPThe compass heading on the screen outside of the circle will always point north.Z\x05\x32.7.1\x12>\n\x0b\x66lip_screen\x18\x05 \x01(\x08\x42)\xca\xf3\x18%:\x0b\x46lip ScreenB\x16\x46lip screen vertically\x12}\n\x05units\x18\x06 \x01(\x0e\x32\x36.meshtastic.protobuf.Config.DisplayConfig.DisplayUnitsB6\xca\xf3\x18\x32:\rDisplay UnitsB!Units shown on the device screen.\x12|\n\x04oled\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.DisplayConfig.OledTypeB:\xca\xf3\x18\x36:\tOLED TypeB)Override automatic OLED screen detection.\x12\x7f\n\x0b\x64isplaymode\x18\x08 \x01(\x0e\x32\x35.meshtastic.protobuf.Config.DisplayConfig.DisplayModeB3\xca\xf3\x18/:\x0c\x44isplay ModeB\x1fOverride default screen layout.\x12N\n\x0cheading_bold\x18\t \x01(\x08\x42\x38\xca\xf3\x18\x34:\x0c\x42old HeadingB$Bold the heading text on the screen.\x12z\n\x15wake_on_tap_or_motion\x18\n \x01(\x08\x42[\xca\xf3\x18W:\x1cWake Screen on tap or motionB7Requires that there be an accelerometer on your device.\x12\xc0\x01\n\x13\x63ompass_orientation\x18\x0b \x01(\x0e\x32<.meshtastic.protobuf.Config.DisplayConfig.CompassOrientationBe\xca\xf3\x18\x61:\x13\x43ompass OrientationBJIndicates how to rotate or invert the compass output for accurate display.\x12\\\n\ruse_12h_clock\x18\x0c \x01(\x08\x42\x45\xca\xf3\x18\x41:\r12 Hour ClockB(Sets the screen clock format to 12-hour.R\x06\x32.5.22\x12(\n\x12use_long_node_name\x18\r \x01(\x08\x42\x0c\xca\xf3\x18\x08R\x06\x32.7.13\x12,\n\x16\x65nable_message_bubbles\x18\x0e \x01(\x08\x42\x0c\xca\xf3\x18\x08R\x06\x32.7.19\"+\n\x1d\x44\x65precatedGpsCoordinateFormat\x12\n\n\x06UNUSED\x10\x00\"F\n\x0c\x44isplayUnits\x12\x18\n\x06METRIC\x10\x00\x1a\x0c\xca\xf3\x18\x08:\x06Metric\x12\x1c\n\x08IMPERIAL\x10\x01\x1a\x0e\xca\xf3\x18\n:\x08Imperial\"\xf7\x01\n\x08OledType\x12)\n\tOLED_AUTO\x10\x00\x1a\x1a\xca\xf3\x18\x16:\x14\x44\x65tect Automatically\x12 \n\x0cOLED_SSD1306\x10\x01\x1a\x0e\xca\xf3\x18\n:\x08SSD 1306\x12\x1e\n\x0bOLED_SH1106\x10\x02\x1a\r\xca\xf3\x18\t:\x07SH 1106\x12\x1e\n\x0bOLED_SH1107\x10\x03\x1a\r\xca\xf3\x18\t:\x07SH 1107\x12.\n\x13OLED_SH1107_128_128\x10\x04\x1a\x15\xca\xf3\x18\x11:\x0fSH 1107 128x128\x12.\n\x13OLED_SH1107_ROTATED\x10\x05\x1a\x15\xca\xf3\x18\x11:\x0fSH 1107 Rotated\"\xd6\x01\n\x0b\x44isplayMode\x12/\n\x07\x44\x45\x46\x41ULT\x10\x00\x1a\"\xca\xf3\x18\x1e:\x1c\x44\x65\x66\x61ult 128x64 screen layout\x12\x32\n\x08TWOCOLOR\x10\x01\x1a$\xca\xf3\x18 :\x1eOptimized for 2 color displays\x12\x38\n\x08INVERTED\x10\x02\x1a*\xca\xf3\x18&:$Inverted top bar for 2 Color display\x12(\n\x05\x43OLOR\x10\x03\x1a\x1d\xca\xf3\x18\x19:\x17TFT Full Color Displays\"\xc0\x02\n\x12\x43ompassOrientation\x12\x18\n\tDEGREES_0\x10\x00\x1a\t\xca\xf3\x18\x05:\x03\x30\xc2\xb0\x12\x1a\n\nDEGREES_90\x10\x01\x1a\n\xca\xf3\x18\x06:\x04\x39\x30\xc2\xb0\x12\x1c\n\x0b\x44\x45GREES_180\x10\x02\x1a\x0b\xca\xf3\x18\x07:\x05\x31\x38\x30\xc2\xb0\x12\x1c\n\x0b\x44\x45GREES_270\x10\x03\x1a\x0b\xca\xf3\x18\x07:\x05\x32\x37\x30\xc2\xb0\x12*\n\x12\x44\x45GREES_0_INVERTED\x10\x04\x1a\x12\xca\xf3\x18\x0e:\x0c\x30\xc2\xb0 Inverted\x12,\n\x13\x44\x45GREES_90_INVERTED\x10\x05\x1a\x13\xca\xf3\x18\x0f:\r90\xc2\xb0 Inverted\x12.\n\x14\x44\x45GREES_180_INVERTED\x10\x06\x1a\x14\xca\xf3\x18\x10:\x0e\x31\x38\x30\xc2\xb0 Inverted\x12.\n\x14\x44\x45GREES_270_INVERTED\x10\x07\x1a\x14\xca\xf3\x18\x10:\x0e\x32\x37\x30\xc2\xb0 Inverted\x1a\xb8!\n\nLoRaConfig\x12\x80\x01\n\nuse_preset\x18\x01 \x01(\x08\x42l\xca\xf3\x18h:\nUse PresetBZUse the modem preset settings instead of a manual bandwidth, spread factor and coding rate\x12W\n\x0cmodem_preset\x18\x02 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPresetB\r\xca\xf3\x18\t:\x07Presets\x12,\n\tbandwidth\x18\x03 \x01(\rB\x19\x92?\x02\x38\x10\xca\xf3\x18\x10*\x03kHz:\tBandwidth\x12u\n\rspread_factor\x18\x04 \x01(\rB^\xca\xf3\x18Z\x19\x00\x00\x00\x00\x00\x00\x14@!\x00\x00\x00\x00\x00\x00(@:\rSpread FactorB7Number of chirps per symbol, as 2 raised to this value.\x12\xa8\x01\n\x0b\x63oding_rate\x18\x05 \x01(\rB\x92\x01\x92?\x02\x38\x08\xca\xf3\x18\x88\x01:\x0b\x43oding RateByError-correction redundancy, as the denominator of 4/n. Higher values survive noisier links but make every packet longer.\x12\x18\n\x10\x66requency_offset\x18\x06 \x01(\x02\x12\x80\x01\n\x06region\x18\x07 \x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCodeB=\xca\xf3\x18\x39:\x06RegionB/The region where you will be using your radios.\x12\x9d\x01\n\thop_limit\x18\x08 \x01(\rB\x89\x01\xca\xf3\x18\x84\x01\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00\x1c@:\tHop LimitBIHow many times a message may be repeated before it stops being forwarded.J\x1ahops|ttl|range|rebroadcast\x12\x84\x01\n\ntx_enabled\x18\t \x01(\x08\x42p\xca\xf3\x18l:\x10Transmit EnabledBXAllow the LoRa radio to transmit. Turn off while hot-swapping antennas or bench testing.\x12\xd8\x01\n\x08tx_power\x18\n \x01(\x05\x42\xc5\x01\x92?\x02\x38\x08\xca\xf3\x18\xbb\x01\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00>@*\x03\x64\x42m:\x0eTransmit PowerBxRadio transmit power. Leave at zero to use the highest level legal for the region, which is what most radios should use.J\x18tx|power|dbm|output|gain\x12\xe5\x01\n\x0b\x63hannel_num\x18\x0b \x01(\rB\xcf\x01\x92?\x02\x38\x10\xca\xf3\x18\xc5\x01:\x0e\x46requency SlotB\xb2\x01Your node\xe2\x80\x99s operating frequency is calculated based on the region, modem preset, and this field. When 0, the slot is automatically calculated based on the primary channel name.\x12\x36\n\x13override_duty_cycle\x18\x0c \x01(\x08\x42\x19\xca\xf3\x18\x15:\x13Override Duty Cycle\x12i\n\x16sx126x_rx_boosted_gain\x18\r \x01(\x08\x42I\xca\xf3\x18\x45:\x0fRX Boosted GainB2Enable RX boosted gain mode on SX126X based radios\x12\x34\n\x12override_frequency\x18\x0e \x01(\x02\x42\x18\xca\xf3\x18\x14:\x12\x46requency Override\x12.\n\x0fpa_fan_disabled\x18\x0f \x01(\x08\x42\x15\xca\xf3\x18\x11:\x0fPA Fan Disabled\x12\x33\n\x0fignore_incoming\x18g \x03(\rB\x1a\x92?\x02\x10\x03\xca\xf3\x18\x11:\x0fIgnore Incoming\x12y\n\x0bignore_mqtt\x18h \x01(\x08\x42\x64\xca\xf3\x18`:\x0bIgnore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.\x12+\n\x11\x63onfig_ok_to_mqtt\x18i \x01(\x08\x42\x10\xca\xf3\x18\x0c:\nOk to MQTT\x12W\n\x0c\x66\x65m_lna_mode\x18j \x01(\x0e\x32\x33.meshtastic.protobuf.Config.LoRaConfig.FEM_LNA_ModeB\x0c\xca\xf3\x18\x08R\x06\x32.7.20\x12\x17\n\x0fserial_hal_only\x18k \x01(\x08\"\x86\x0b\n\nRegionCode\x12$\n\x05UNSET\x10\x00\x1a\x19\xca\xf3\x18\x15:\x13Please set a region\x12\x1b\n\x02US\x10\x01\x1a\x13\xca\xf3\x18\x0f:\rUnited States\x12\'\n\x06\x45U_433\x10\x02\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 433MHz\x12\'\n\x06\x45U_868\x10\x03\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 868MHz\x12\x13\n\x02\x43N\x10\x04\x1a\x0b\xca\xf3\x18\x07:\x05\x43hina\x12\x13\n\x02JP\x10\x05\x1a\x0b\xca\xf3\x18\x07:\x05Japan\x12&\n\x03\x41NZ\x10\x06\x1a\x1d\xca\xf3\x18\x19:\x17\x41ustralia / New Zealand\x12\x13\n\x02KR\x10\x07\x1a\x0b\xca\xf3\x18\x07:\x05Korea\x12\x14\n\x02TW\x10\x08\x1a\x0c\xca\xf3\x18\x08:\x06Taiwan\x12\x14\n\x02RU\x10\t\x1a\x0c\xca\xf3\x18\x08:\x06Russia\x12\x13\n\x02IN\x10\n\x1a\x0b\xca\xf3\x18\x07:\x05India\x12$\n\x06NZ_865\x10\x0b\x1a\x18\xca\xf3\x18\x14:\x12New Zealand 865MHz\x12\x16\n\x02TH\x10\x0c\x1a\x0e\xca\xf3\x18\n:\x08Thailand\x12\x1a\n\x07LORA_24\x10\r\x1a\r\xca\xf3\x18\t:\x07\x32.4 Ghz\x12 \n\x06UA_433\x10\x0e\x1a\x14\xca\xf3\x18\x10:\x0eUkraine 433MHz\x12\"\n\x06UA_868\x10\x0f\x1a\x16\x08\x01\xca\xf3\x18\x10:\x0eUkraine 868MHz\x12!\n\x06MY_433\x10\x10\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 433MHz\x12!\n\x06MY_919\x10\x11\x1a\x15\xca\xf3\x18\x11:\x0fMalaysia 919MHz\x12\"\n\x06SG_923\x10\x12\x1a\x16\xca\xf3\x18\x12:\x10Singapore 923MHz\x12$\n\x06PH_433\x10\x13\x1a\x18\xca\xf3\x18\x14:\x12Philippines 433MHz\x12$\n\x06PH_868\x10\x14\x1a\x18\xca\xf3\x18\x14:\x12Philippines 868MHz\x12$\n\x06PH_915\x10\x15\x1a\x18\xca\xf3\x18\x14:\x12Philippines 915MHz\x12\x31\n\x07\x41NZ_433\x10\x16\x1a$\xca\xf3\x18 :\x1e\x41ustralia / New Zealand 433MHz\x12#\n\x06KZ_433\x10\x17\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 433MHz\x12#\n\x06KZ_863\x10\x18\x1a\x17\xca\xf3\x18\x13:\x11Kazakhstan 863MHz\x12\x1e\n\x06NP_865\x10\x19\x1a\x12\xca\xf3\x18\x0e:\x0cNepal 865MHz\x12\x1f\n\x06\x42R_902\x10\x1a\x1a\x13\xca\xf3\x18\x0f:\rBrazil 902MHz\x12,\n\x07ITU1_2M\x10\x1b\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 1 / Amateur 2m\x12,\n\x07ITU2_2M\x10\x1c\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 2 / Amateur 2m\x12\'\n\x06\x45U_866\x10\x1d\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 866MHz\x12\'\n\x06\x45U_874\x10\x1e\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 874MHz\x12\'\n\x06\x45U_917\x10\x1f\x1a\x1b\xca\xf3\x18\x17:\x15\x45uropean Union 917MHz\x12\x32\n\x08\x45U_N_868\x10 \x1a$\xca\xf3\x18 :\x1e\x45uropean Union 868MHz (Narrow)\x12,\n\x07ITU3_2M\x10!\x1a\x1f\xca\xf3\x18\x1b:\x19ITU Region 3 / Amateur 2m\x12\x30\n\tITU1_70CM\x10\"\x1a!\xca\xf3\x18\x1d:\x1bITU Region 1 / Amateur 70cm\x12\x30\n\tITU2_70CM\x10#\x1a!\xca\xf3\x18\x1d:\x1bITU Region 2 / Amateur 70cm\x12\x30\n\tITU3_70CM\x10$\x1a!\xca\xf3\x18\x1d:\x1bITU Region 3 / Amateur 70cm\x12\x32\n\nITU2_125CM\x10%\x1a\"\xca\xf3\x18\x1e:\x1cITU Region 2 / Amateur 1.25m\"\xd9\x05\n\x0bModemPreset\x12\x38\n\tLONG_FAST\x10\x00\x1a)\xca\xf3\x18%:\x11Long Range - FastJ\x10longfast|default\x12(\n\tLONG_SLOW\x10\x01\x1a\x19\x08\x01\xca\xf3\x18\x13:\x11Long Range - Slow\x12\x32\n\x0eVERY_LONG_SLOW\x10\x02\x1a\x1e\x08\x01\xca\xf3\x18\x18:\x16Very Long Range - Slow\x12*\n\x0bMEDIUM_SLOW\x10\x03\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Slow\x12*\n\x0bMEDIUM_FAST\x10\x04\x1a\x19\xca\xf3\x18\x15:\x13Medium Range - Fast\x12(\n\nSHORT_SLOW\x10\x05\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Slow\x12(\n\nSHORT_FAST\x10\x06\x1a\x18\xca\xf3\x18\x14:\x12Short Range - Fast\x12.\n\rLONG_MODERATE\x10\x07\x1a\x1b\xca\xf3\x18\x17:\x15Long Range - Moderate\x12*\n\x0bSHORT_TURBO\x10\x08\x1a\x19\xca\xf3\x18\x15:\x13Short Range - Turbo\x12(\n\nLONG_TURBO\x10\t\x1a\x18\xca\xf3\x18\x14:\x12Long Range - Turbo\x12 \n\tLITE_FAST\x10\n\x1a\x11\xca\xf3\x18\r:\x0bLite - Fast\x12 \n\tLITE_SLOW\x10\x0b\x1a\x11\xca\xf3\x18\r:\x0bLite - Slow\x12$\n\x0bNARROW_FAST\x10\x0c\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Fast\x12$\n\x0bNARROW_SLOW\x10\r\x1a\x13\xca\xf3\x18\x0f:\rNarrow - Slow\x12 \n\tTINY_FAST\x10\x0e\x1a\x11\xca\xf3\x18\r:\x0bTiny - Fast\x12 \n\tTINY_SLOW\x10\x0f\x1a\x11\xca\xf3\x18\r:\x0bTiny - Slow\x12,\n\x0cMEDIUM_TURBO\x10\x10\x1a\x1a\xca\xf3\x18\x16:\x14Medium Range - Turbo\":\n\x0c\x46\x45M_LNA_Mode\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07\x45NABLED\x10\x01\x12\x0f\n\x0bNOT_PRESENT\x10\x02\x1a\xbb\x03\n\x0f\x42luetoothConfig\x12H\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x37\xca\xf3\x18\x33:\x11\x42luetooth EnabledB\x1e\x45nable Bluetooth on the device\x12u\n\x04mode\x18\x02 \x01(\x0e\x32\x37.meshtastic.protobuf.Config.BluetoothConfig.PairingModeB.\xca\xf3\x18*:\x0cPairing ModeB\x1a\x42luetooth pairing strategy\x12o\n\tfixed_pin\x18\x03 \x01(\rB\\\xca\xf3\x18X:\tFixed PinBKFixed PIN for Bluetooth pairing. Used when pairing mode is set to fixed PIN\"v\n\x0bPairingMode\x12 \n\nRANDOM_PIN\x10\x00\x1a\x10\xca\xf3\x18\x0c:\nRandom Pin\x12\x1e\n\tFIXED_PIN\x10\x01\x1a\x0f\xca\xf3\x18\x0b:\tFixed Pin\x12%\n\x06NO_PIN\x10\x02\x1a\x19\xca\xf3\x18\x15:\x13No PIN (Just Works)\x1a\xdc\x0b\n\x0eSecurityConfig\x12\xa1\x01\n\npublic_key\x18\x01 \x01(\x0c\x42\x8c\x01\x92?\x02\x08 \xca\xf3\x18\x82\x01:\nPublic KeyBtGenerated from your private key and sent out to other nodes on the mesh to allow them to compute a shared secret key\x12]\n\x0bprivate_key\x18\x02 \x01(\x0c\x42H\x92?\x02\x08 \xca\xf3\x18?:\x0bPrivate KeyB0Used to create a shared key with a remote device\x12h\n\tadmin_key\x18\x03 \x03(\x0c\x42U\x92?\x04\x08 \x10\x03\xca\xf3\x18J:\tAdmin KeyB=The public key authorized to send admin messages to this node\x12\x8d\x01\n\nis_managed\x18\x04 \x01(\x08\x42y\xca\xf3\x18u:\x0eManaged DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.\x12Q\n\x0eserial_enabled\x18\x05 \x01(\x08\x42\x39\xca\xf3\x18\x35:\x0eSerial ConsoleB#Serial Console over the Stream API.\x12\x95\x01\n\x15\x64\x65\x62ug_log_api_enabled\x18\x06 \x01(\x08\x42v\xca\xf3\x18r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.\x12\x1d\n\x15\x61\x64min_channel_enabled\x18\x08 \x01(\x08\x12n\n\x17packet_signature_policy\x18\t \x01(\x0e\x32@.meshtastic.protobuf.Config.SecurityConfig.PacketSignaturePolicyB\x0b\xca\xf3\x18\x07R\x05\x32.8.0\"\xd2\x04\n\x15PacketSignaturePolicy\x12\xc5\x01\n\"PACKET_SIGNATURE_POLICY_COMPATIBLE\x10\x00\x1a\x9c\x01\xca\xf3\x18\x97\x01:\x1c\x43ompatible - Accept UnsignedBwAccept unsigned traffic for maximum compatibility. A signature that can be checked and is wrong still drops the packet.\x12\xac\x01\n PACKET_SIGNATURE_POLICY_BALANCED\x10\x01\x1a\x85\x01\xca\xf3\x18\x80\x01:\x1f\x42\x61lanced - Prefer AuthenticatedB]Prefer authenticated packets, but still accept unsigned traffic from nodes not known to sign.\x12\xc1\x01\n\x1ePACKET_SIGNATURE_POLICY_STRICT\x10\x02\x1a\x9c\x01\xca\xf3\x18\x97\x01:\x1fStrict - Require AuthenticationBtAccept only packets with a verified signature or successful PKI decryption. Packets from older nodes may be ignored.\x1a\x12\n\x10SessionkeyConfigB\x11\n\x0fpayload_variantBb\n\x14org.meshtastic.protoB\x0c\x43onfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -23,108 +24,464 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\014ConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT"]._options = None + _CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT"]._serialized_options = b'\312\363\0308:\006ClientB.App connected or stand alone messaging device.' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_MUTE"]._options = None + _CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_MUTE"]._serialized_options = b'\312\363\030G:\013Client MuteB8Device that does not forward packets from other devices.' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER"]._options = None + _CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER"]._serialized_options = b'\312\363\030\236\001:\006RouterB\223\001Infrastructure node on a tower or mountain top only. Not to be used for roofs or mobile nodes. Needs exceptional coverage. Visible in Nodes list.' _CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_CLIENT"]._options = None - _CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_CLIENT"]._serialized_options = b'\010\001' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_CLIENT"]._serialized_options = b'\010\001\312\363\030\017:\rRouter Client' _CONFIG_DEVICECONFIG_ROLE.values_by_name["REPEATER"]._options = None - _CONFIG_DEVICECONFIG_ROLE.values_by_name["REPEATER"]._serialized_options = b'\010\001' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["REPEATER"]._serialized_options = b'\010\001\312\363\030\235\001:\010RepeaterB\220\001Deprecated infrastructure role that creates gaps in the mesh rebroadcast chain. Switch this node to a Router-based role (Router or Router Late).' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["TRACKER"]._options = None + _CONFIG_DEVICECONFIG_ROLE.values_by_name["TRACKER"]._serialized_options = b'\312\363\0307:\007TrackerB,Broadcasts GPS position packets as priority.' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["SENSOR"]._options = None + _CONFIG_DEVICECONFIG_ROLE.values_by_name["SENSOR"]._serialized_options = b'\312\363\0303:\006SensorB)Broadcasts telemetry packets as priority.' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK"]._options = None + _CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK"]._serialized_options = b'\312\363\030K:\003TAKBDOptimized for ATAK system communication, reduces routine broadcasts.' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_HIDDEN"]._options = None + _CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_HIDDEN"]._serialized_options = b'\312\363\030T:\rClient HiddenBCDevice that only broadcasts as needed for stealth or power savings.' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["LOST_AND_FOUND"]._options = None + _CONFIG_DEVICECONFIG_ROLE.values_by_name["LOST_AND_FOUND"]._serialized_options = b'\312\363\030q:\016Lost and FoundB_Broadcasts location as message to default channel regularly for to assist with device recovery.' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK_TRACKER"]._options = None + _CONFIG_DEVICECONFIG_ROLE.values_by_name["TAK_TRACKER"]._serialized_options = b'\312\363\030S:\013TAK TrackerBDEnables automatic TAK PLI broadcasts and reduces routine broadcasts.' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_LATE"]._options = None + _CONFIG_DEVICECONFIG_ROLE.values_by_name["ROUTER_LATE"]._serialized_options = b'\312\363\030\245\001:\013Router LateB\225\001Infrastructure node that always rebroadcasts packets once but only after all other modes. Visible in Nodes list. Not a good choice for rooftop nodes.' + _CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_BASE"]._options = None + _CONFIG_DEVICECONFIG_ROLE.values_by_name["CLIENT_BASE"]._serialized_options = b'\312\363\030p:\013Client BaseBaUsed for rooftop nodes to distribute messages more widely from multiple nearby client mute nodes.' + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL"]._options = None + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL"]._serialized_options = b'\312\363\030|:\003AllBuRebroadcast any observed message, if it was on our private channel or from another channel with the same lora params.' + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL_SKIP_DECODING"]._options = None + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["ALL_SKIP_DECODING"]._serialized_options = b'\312\363\030\303\001:\021All Skip DecodingB\255\001Same as behavior as ALL but skips packet decoding and simply rebroadcasts them. Only available in Repeater role. Setting this on any other roles will result in ALL behavior.' + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["LOCAL_ONLY"]._options = None + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["LOCAL_ONLY"]._serialized_options = b'\312\363\030\267\001:\nLocal OnlyB\250\001Ignores observed messages from foreign meshes that are open or those which it cannot decrypt. Only rebroadcasts message on the nodes local primary / secondary channels.' + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["KNOWN_ONLY"]._options = None + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["KNOWN_ONLY"]._serialized_options = b'\312\363\030\262\001:\nKnown OnlyB\243\001Ignores observed messages from foreign meshes like Local Only, but takes it step further by also ignoring messages from nodes not already in the node\'s known list.' + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["NONE"]._options = None + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["NONE"]._serialized_options = b'\312\363\030\202\001:\004NoneBzOnly permitted for SENSOR, TRACKER and TAK_TRACKER roles, this will inhibit all rebroadcasts, not unlike CLIENT_MUTE role.' + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["CORE_PORTNUMS_ONLY"]._options = None + _CONFIG_DEVICECONFIG_REBROADCASTMODE.values_by_name["CORE_PORTNUMS_ONLY"]._serialized_options = b'\312\363\030y:\022Core Portnums OnlyBcOnly rebroadcasts packets from the core portnums: NodeInfo, Text, Position, Telemetry, and Routing.' + _CONFIG_DEVICECONFIG.fields_by_name['role']._options = None + _CONFIG_DEVICECONFIG.fields_by_name['role']._serialized_options = b'\312\363\030\r:\013Device Role' _CONFIG_DEVICECONFIG.fields_by_name['serial_enabled']._options = None _CONFIG_DEVICECONFIG.fields_by_name['serial_enabled']._serialized_options = b'\030\001' + _CONFIG_DEVICECONFIG.fields_by_name['button_gpio']._options = None + _CONFIG_DEVICECONFIG.fields_by_name['button_gpio']._serialized_options = b'\312\363\030\\:\013Button GPIOBMGPIO pin for the user button, can be remapped on boards with multiple buttons' + _CONFIG_DEVICECONFIG.fields_by_name['buzzer_gpio']._options = None + _CONFIG_DEVICECONFIG.fields_by_name['buzzer_gpio']._serialized_options = b'\312\363\030*:\013Buzzer GPIOB\033GPIO pin for the PWM buzzer' + _CONFIG_DEVICECONFIG.fields_by_name['rebroadcast_mode']._options = None + _CONFIG_DEVICECONFIG.fields_by_name['rebroadcast_mode']._serialized_options = b'\312\363\030\022:\020Rebroadcast Mode' + _CONFIG_DEVICECONFIG.fields_by_name['node_info_broadcast_secs']._options = None + _CONFIG_DEVICECONFIG.fields_by_name['node_info_broadcast_secs']._serialized_options = b'\312\363\030_*\001s:\034Node Info Broadcast IntervalB@*\003dBm:\016Transmit PowerBxRadio transmit power. Leave at zero to use the highest level legal for the region, which is what most radios should use.J\030tx|power|dbm|output|gain' _CONFIG_LORACONFIG.fields_by_name['channel_num']._options = None - _CONFIG_LORACONFIG.fields_by_name['channel_num']._serialized_options = b'\222?\0028\020' + _CONFIG_LORACONFIG.fields_by_name['channel_num']._serialized_options = b'\222?\0028\020\312\363\030\305\001:\016Frequency SlotB\262\001Your node\342\200\231s operating frequency is calculated based on the region, modem preset, and this field. When 0, the slot is automatically calculated based on the primary channel name.' + _CONFIG_LORACONFIG.fields_by_name['override_duty_cycle']._options = None + _CONFIG_LORACONFIG.fields_by_name['override_duty_cycle']._serialized_options = b'\312\363\030\025:\023Override Duty Cycle' + _CONFIG_LORACONFIG.fields_by_name['sx126x_rx_boosted_gain']._options = None + _CONFIG_LORACONFIG.fields_by_name['sx126x_rx_boosted_gain']._serialized_options = b'\312\363\030E:\017RX Boosted GainB2Enable RX boosted gain mode on SX126X based radios' + _CONFIG_LORACONFIG.fields_by_name['override_frequency']._options = None + _CONFIG_LORACONFIG.fields_by_name['override_frequency']._serialized_options = b'\312\363\030\024:\022Frequency Override' + _CONFIG_LORACONFIG.fields_by_name['pa_fan_disabled']._options = None + _CONFIG_LORACONFIG.fields_by_name['pa_fan_disabled']._serialized_options = b'\312\363\030\021:\017PA Fan Disabled' _CONFIG_LORACONFIG.fields_by_name['ignore_incoming']._options = None - _CONFIG_LORACONFIG.fields_by_name['ignore_incoming']._serialized_options = b'\222?\002\020\003' + _CONFIG_LORACONFIG.fields_by_name['ignore_incoming']._serialized_options = b'\222?\002\020\003\312\363\030\021:\017Ignore Incoming' + _CONFIG_LORACONFIG.fields_by_name['ignore_mqtt']._options = None + _CONFIG_LORACONFIG.fields_by_name['ignore_mqtt']._serialized_options = b'\312\363\030`:\013Ignore MQTTBQIgnore packets received over LoRa that travelled via MQTT anywhere on their path.' + _CONFIG_LORACONFIG.fields_by_name['config_ok_to_mqtt']._options = None + _CONFIG_LORACONFIG.fields_by_name['config_ok_to_mqtt']._serialized_options = b'\312\363\030\014:\nOk to MQTT' + _CONFIG_LORACONFIG.fields_by_name['fem_lna_mode']._options = None + _CONFIG_LORACONFIG.fields_by_name['fem_lna_mode']._serialized_options = b'\312\363\030\010R\0062.7.20' + _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["RANDOM_PIN"]._options = None + _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["RANDOM_PIN"]._serialized_options = b'\312\363\030\014:\nRandom Pin' + _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["FIXED_PIN"]._options = None + _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["FIXED_PIN"]._serialized_options = b'\312\363\030\013:\tFixed Pin' + _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["NO_PIN"]._options = None + _CONFIG_BLUETOOTHCONFIG_PAIRINGMODE.values_by_name["NO_PIN"]._serialized_options = b'\312\363\030\025:\023No PIN (Just Works)' + _CONFIG_BLUETOOTHCONFIG.fields_by_name['enabled']._options = None + _CONFIG_BLUETOOTHCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\0303:\021Bluetooth EnabledB\036Enable Bluetooth on the device' + _CONFIG_BLUETOOTHCONFIG.fields_by_name['mode']._options = None + _CONFIG_BLUETOOTHCONFIG.fields_by_name['mode']._serialized_options = b'\312\363\030*:\014Pairing ModeB\032Bluetooth pairing strategy' + _CONFIG_BLUETOOTHCONFIG.fields_by_name['fixed_pin']._options = None + _CONFIG_BLUETOOTHCONFIG.fields_by_name['fixed_pin']._serialized_options = b'\312\363\030X:\tFixed PinBKFixed PIN for Bluetooth pairing. Used when pairing mode is set to fixed PIN' + _CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_COMPATIBLE"]._options = None + _CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_COMPATIBLE"]._serialized_options = b'\312\363\030\227\001:\034Compatible - Accept UnsignedBwAccept unsigned traffic for maximum compatibility. A signature that can be checked and is wrong still drops the packet.' + _CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_BALANCED"]._options = None + _CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_BALANCED"]._serialized_options = b'\312\363\030\200\001:\037Balanced - Prefer AuthenticatedB]Prefer authenticated packets, but still accept unsigned traffic from nodes not known to sign.' + _CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_STRICT"]._options = None + _CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY.values_by_name["PACKET_SIGNATURE_POLICY_STRICT"]._serialized_options = b'\312\363\030\227\001:\037Strict - Require AuthenticationBtAccept only packets with a verified signature or successful PKI decryption. Packets from older nodes may be ignored.' _CONFIG_SECURITYCONFIG.fields_by_name['public_key']._options = None - _CONFIG_SECURITYCONFIG.fields_by_name['public_key']._serialized_options = b'\222?\002\010 ' + _CONFIG_SECURITYCONFIG.fields_by_name['public_key']._serialized_options = b'\222?\002\010 \312\363\030\202\001:\nPublic KeyBtGenerated from your private key and sent out to other nodes on the mesh to allow them to compute a shared secret key' _CONFIG_SECURITYCONFIG.fields_by_name['private_key']._options = None - _CONFIG_SECURITYCONFIG.fields_by_name['private_key']._serialized_options = b'\222?\002\010 ' + _CONFIG_SECURITYCONFIG.fields_by_name['private_key']._serialized_options = b'\222?\002\010 \312\363\030?:\013Private KeyB0Used to create a shared key with a remote device' _CONFIG_SECURITYCONFIG.fields_by_name['admin_key']._options = None - _CONFIG_SECURITYCONFIG.fields_by_name['admin_key']._serialized_options = b'\222?\004\010 \020\003' - _globals['_CONFIG']._serialized_start=129 - _globals['_CONFIG']._serialized_end=6103 - _globals['_CONFIG_DEVICECONFIG']._serialized_start=758 - _globals['_CONFIG_DEVICECONFIG']._serialized_end=1685 - _globals['_CONFIG_DEVICECONFIG_ROLE']._serialized_start=1249 - _globals['_CONFIG_DEVICECONFIG_ROLE']._serialized_end=1461 - _globals['_CONFIG_DEVICECONFIG_REBROADCASTMODE']._serialized_start=1463 - _globals['_CONFIG_DEVICECONFIG_REBROADCASTMODE']._serialized_end=1578 - _globals['_CONFIG_DEVICECONFIG_BUZZERMODE']._serialized_start=1580 - _globals['_CONFIG_DEVICECONFIG_BUZZERMODE']._serialized_end=1685 - _globals['_CONFIG_POSITIONCONFIG']._serialized_start=1688 - _globals['_CONFIG_POSITIONCONFIG']._serialized_end=2354 - _globals['_CONFIG_POSITIONCONFIG_POSITIONFLAGS']._serialized_start=2128 - _globals['_CONFIG_POSITIONCONFIG_POSITIONFLAGS']._serialized_end=2299 - _globals['_CONFIG_POSITIONCONFIG_GPSMODE']._serialized_start=2301 - _globals['_CONFIG_POSITIONCONFIG_GPSMODE']._serialized_end=2354 - _globals['_CONFIG_POWERCONFIG']._serialized_start=2357 - _globals['_CONFIG_POWERCONFIG']._serialized_end=2624 - _globals['_CONFIG_NETWORKCONFIG']._serialized_start=2627 - _globals['_CONFIG_NETWORKCONFIG']._serialized_end=3158 - _globals['_CONFIG_NETWORKCONFIG_IPV4CONFIG']._serialized_start=2997 - _globals['_CONFIG_NETWORKCONFIG_IPV4CONFIG']._serialized_end=3067 - _globals['_CONFIG_NETWORKCONFIG_ADDRESSMODE']._serialized_start=3069 - _globals['_CONFIG_NETWORKCONFIG_ADDRESSMODE']._serialized_end=3104 - _globals['_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_start=3106 - _globals['_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_end=3158 - _globals['_CONFIG_DISPLAYCONFIG']._serialized_start=3161 - _globals['_CONFIG_DISPLAYCONFIG']._serialized_end=4296 - _globals['_CONFIG_DISPLAYCONFIG_DEPRECATEDGPSCOORDINATEFORMAT']._serialized_start=3826 - _globals['_CONFIG_DISPLAYCONFIG_DEPRECATEDGPSCOORDINATEFORMAT']._serialized_end=3869 - _globals['_CONFIG_DISPLAYCONFIG_DISPLAYUNITS']._serialized_start=3871 - _globals['_CONFIG_DISPLAYCONFIG_DISPLAYUNITS']._serialized_end=3911 - _globals['_CONFIG_DISPLAYCONFIG_OLEDTYPE']._serialized_start=3913 - _globals['_CONFIG_DISPLAYCONFIG_OLEDTYPE']._serialized_end=4040 - _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_start=4042 - _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_end=4107 - _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=4110 - _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=4296 - _globals['_CONFIG_LORACONFIG']._serialized_start=4299 - _globals['_CONFIG_LORACONFIG']._serialized_end=5671 - _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_start=4964 - _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_end=5355 - _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_start=5358 - _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_end=5611 - _globals['_CONFIG_LORACONFIG_FEM_LNA_MODE']._serialized_start=5613 - _globals['_CONFIG_LORACONFIG_FEM_LNA_MODE']._serialized_end=5671 - _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_start=5674 - _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_end=5856 - _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=5800 - _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=5856 - _globals['_CONFIG_SECURITYCONFIG']._serialized_start=5859 - _globals['_CONFIG_SECURITYCONFIG']._serialized_end=6064 - _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_start=6066 - _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_end=6084 + _CONFIG_SECURITYCONFIG.fields_by_name['admin_key']._serialized_options = b'\222?\004\010 \020\003\312\363\030J:\tAdmin KeyB=The public key authorized to send admin messages to this node' + _CONFIG_SECURITYCONFIG.fields_by_name['is_managed']._options = None + _CONFIG_SECURITYCONFIG.fields_by_name['is_managed']._serialized_options = b'\312\363\030u:\016Managed DeviceBcDevice is managed by a mesh administrator, the user is unable to access any of the device settings.' + _CONFIG_SECURITYCONFIG.fields_by_name['serial_enabled']._options = None + _CONFIG_SECURITYCONFIG.fields_by_name['serial_enabled']._serialized_options = b'\312\363\0305:\016Serial ConsoleB#Serial Console over the Stream API.' + _CONFIG_SECURITYCONFIG.fields_by_name['debug_log_api_enabled']._options = None + _CONFIG_SECURITYCONFIG.fields_by_name['debug_log_api_enabled']._serialized_options = b'\312\363\030r:\nDebug LogsBdOutput live debug logging over serial, view and export position-redacted device logs over Bluetooth.' + _CONFIG_SECURITYCONFIG.fields_by_name['packet_signature_policy']._options = None + _CONFIG_SECURITYCONFIG.fields_by_name['packet_signature_policy']._serialized_options = b'\312\363\030\007R\0052.8.0' + _globals['_CONFIG']._serialized_start=172 + _globals['_CONFIG']._serialized_end=17247 + _globals['_CONFIG_DEVICECONFIG']._serialized_start=801 + _globals['_CONFIG_DEVICECONFIG']._serialized_end=4693 + _globals['_CONFIG_DEVICECONFIG_ROLE']._serialized_start=1994 + _globals['_CONFIG_DEVICECONFIG_ROLE']._serialized_end=3486 + _globals['_CONFIG_DEVICECONFIG_REBROADCASTMODE']._serialized_start=3489 + _globals['_CONFIG_DEVICECONFIG_REBROADCASTMODE']._serialized_end=4586 + _globals['_CONFIG_DEVICECONFIG_BUZZERMODE']._serialized_start=4588 + _globals['_CONFIG_DEVICECONFIG_BUZZERMODE']._serialized_end=4693 + _globals['_CONFIG_POSITIONCONFIG']._serialized_start=4696 + _globals['_CONFIG_POSITIONCONFIG']._serialized_end=6647 + _globals['_CONFIG_POSITIONCONFIG_POSITIONFLAGS']._serialized_start=5938 + _globals['_CONFIG_POSITIONCONFIG_POSITIONFLAGS']._serialized_end=6542 + _globals['_CONFIG_POSITIONCONFIG_GPSMODE']._serialized_start=6544 + _globals['_CONFIG_POSITIONCONFIG_GPSMODE']._serialized_end=6647 + _globals['_CONFIG_POWERCONFIG']._serialized_start=6650 + _globals['_CONFIG_POWERCONFIG']._serialized_end=7353 + _globals['_CONFIG_NETWORKCONFIG']._serialized_start=7356 + _globals['_CONFIG_NETWORKCONFIG']._serialized_end=8485 + _globals['_CONFIG_NETWORKCONFIG_IPV4CONFIG']._serialized_start=8215 + _globals['_CONFIG_NETWORKCONFIG_IPV4CONFIG']._serialized_end=8335 + _globals['_CONFIG_NETWORKCONFIG_ADDRESSMODE']._serialized_start=8337 + _globals['_CONFIG_NETWORKCONFIG_ADDRESSMODE']._serialized_end=8398 + _globals['_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_start=8400 + _globals['_CONFIG_NETWORKCONFIG_PROTOCOLFLAGS']._serialized_end=8485 + _globals['_CONFIG_DISPLAYCONFIG']._serialized_start=8488 + _globals['_CONFIG_DISPLAYCONFIG']._serialized_end=10976 + _globals['_CONFIG_DISPLAYCONFIG_DEPRECATEDGPSCOORDINATEFORMAT']._serialized_start=10071 + _globals['_CONFIG_DISPLAYCONFIG_DEPRECATEDGPSCOORDINATEFORMAT']._serialized_end=10114 + _globals['_CONFIG_DISPLAYCONFIG_DISPLAYUNITS']._serialized_start=10116 + _globals['_CONFIG_DISPLAYCONFIG_DISPLAYUNITS']._serialized_end=10186 + _globals['_CONFIG_DISPLAYCONFIG_OLEDTYPE']._serialized_start=10189 + _globals['_CONFIG_DISPLAYCONFIG_OLEDTYPE']._serialized_end=10436 + _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_start=10439 + _globals['_CONFIG_DISPLAYCONFIG_DISPLAYMODE']._serialized_end=10653 + _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_start=10656 + _globals['_CONFIG_DISPLAYCONFIG_COMPASSORIENTATION']._serialized_end=10976 + _globals['_CONFIG_LORACONFIG']._serialized_start=10979 + _globals['_CONFIG_LORACONFIG']._serialized_end=15259 + _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_start=13053 + _globals['_CONFIG_LORACONFIG_REGIONCODE']._serialized_end=14467 + _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_start=14470 + _globals['_CONFIG_LORACONFIG_MODEMPRESET']._serialized_end=15199 + _globals['_CONFIG_LORACONFIG_FEM_LNA_MODE']._serialized_start=15201 + _globals['_CONFIG_LORACONFIG_FEM_LNA_MODE']._serialized_end=15259 + _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_start=15262 + _globals['_CONFIG_BLUETOOTHCONFIG']._serialized_end=15705 + _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_start=15587 + _globals['_CONFIG_BLUETOOTHCONFIG_PAIRINGMODE']._serialized_end=15705 + _globals['_CONFIG_SECURITYCONFIG']._serialized_start=15708 + _globals['_CONFIG_SECURITYCONFIG']._serialized_end=17208 + _globals['_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_start=16614 + _globals['_CONFIG_SECURITYCONFIG_PACKETSIGNATUREPOLICY']._serialized_end=17208 + _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_start=17210 + _globals['_CONFIG_SESSIONKEYCONFIG']._serialized_end=17228 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/config_pb2.pyi b/meshtastic/protobuf/config_pb2.pyi index a6feaf73e..dda77f3ea 100644 --- a/meshtastic/protobuf/config_pb2.pyi +++ b/meshtastic/protobuf/config_pb2.pyi @@ -950,7 +950,8 @@ class Config(google.protobuf.message.Message): class DeprecatedGpsCoordinateFormat(_DeprecatedGpsCoordinateFormat, metaclass=_DeprecatedGpsCoordinateFormatEnumTypeWrapper): """ - Deprecated in 2.7.4: Unused + Unused. Kept so the deprecated gps_format field still has a type; when + firmware stopped reading that field is recorded on the field itself. """ UNUSED: Config.DisplayConfig.DeprecatedGpsCoordinateFormat.ValueType # 0 @@ -1180,7 +1181,6 @@ class Config(google.protobuf.message.Message): """ gps_format: global___Config.DisplayConfig.DeprecatedGpsCoordinateFormat.ValueType """ - Deprecated in 2.7.4: Unused How the GPS coordinates are formatted on the OLED screen. """ auto_screen_carousel_secs: builtins.int @@ -1402,6 +1402,27 @@ class Config(google.protobuf.message.Message): """ ITU Region 3 Amateur Radio 2m band (144-148 MHz) """ + ITU1_70CM: Config.LoRaConfig._RegionCode.ValueType # 34 + """ + ITU Region 1 Amateur Radio 70cm band (430-440 MHz) + """ + ITU2_70CM: Config.LoRaConfig._RegionCode.ValueType # 35 + """ + ITU Region 2 Amateur Radio 70cm band (420-450 MHz) + Note: Some countries do not allocate 420-430 MHz or 440-450 MHz. + Check local law! + """ + ITU3_70CM: Config.LoRaConfig._RegionCode.ValueType # 36 + """ + ITU Region 3 Amateur Radio 70cm band (430-450 MHz) + Note: Some countries do not allocate 440-450 MHz. Check local law! + """ + ITU2_125CM: Config.LoRaConfig._RegionCode.ValueType # 37 + """ + ITU Region 2 Amateur Radio 1.25m '125cm' band (220-225 MHz) + Note: Some countries do not allocate 220-222 MHz (Ex: USA/Canada). + Check local law! + """ class RegionCode(_RegionCode, metaclass=_RegionCodeEnumTypeWrapper): ... UNSET: Config.LoRaConfig.RegionCode.ValueType # 0 @@ -1537,6 +1558,27 @@ class Config(google.protobuf.message.Message): """ ITU Region 3 Amateur Radio 2m band (144-148 MHz) """ + ITU1_70CM: Config.LoRaConfig.RegionCode.ValueType # 34 + """ + ITU Region 1 Amateur Radio 70cm band (430-440 MHz) + """ + ITU2_70CM: Config.LoRaConfig.RegionCode.ValueType # 35 + """ + ITU Region 2 Amateur Radio 70cm band (420-450 MHz) + Note: Some countries do not allocate 420-430 MHz or 440-450 MHz. + Check local law! + """ + ITU3_70CM: Config.LoRaConfig.RegionCode.ValueType # 36 + """ + ITU Region 3 Amateur Radio 70cm band (430-450 MHz) + Note: Some countries do not allocate 440-450 MHz. Check local law! + """ + ITU2_125CM: Config.LoRaConfig.RegionCode.ValueType # 37 + """ + ITU Region 2 Amateur Radio 1.25m '125cm' band (220-225 MHz) + Note: Some countries do not allocate 220-222 MHz (Ex: USA/Canada). + Check local law! + """ class _ModemPreset: ValueType = typing.NewType("ValueType", builtins.int) @@ -1614,6 +1656,30 @@ class Config(google.protobuf.message.Message): Moderate range preset optimized for EU 868MHz band with 62.5kHz bandwidth. Comparable link budget and data rate to LONG_FAST. """ + TINY_FAST: Config.LoRaConfig._ModemPreset.ValueType # 14 + """ + Tiny Fast + Preset optimized for compliance with Amateur Radio restrictions with 20kHz bandwidth. + Many regions limit data transmission bandwidth in lower amateur bands (2 Meter). + Note: TCXO with tight tolerances (±5 ppm or better) is *absolutely required* at these narrow bandwidths. + Only compatible with SX127x and SX126x chipsets. + Comparable link budget and data rate to LONG_FAST. + """ + TINY_SLOW: Config.LoRaConfig._ModemPreset.ValueType # 15 + """ + Tiny Slow + Preset optimized for compliance with Amateur Radio restrictions with 20kHz bandwidth. + Many regions limit data transmission bandwidth in lower amateur bands (2 Meter). + Note: TCXO with tight tolerances (±5 ppm or better) is *absolutely required* at these narrow bandwidths. + Only compatible with SX127x and SX126x chipsets. + Comparable link budget and data rate to LONG_MODERATE. + """ + MEDIUM_TURBO: Config.LoRaConfig._ModemPreset.ValueType # 16 + """ + Medium Range - Turbo + This preset performs similarly to MEDIUM_FAST, but with 500kHz bandwidth. + It is not legal to use in all regions due to this wider bandwidth. + """ class ModemPreset(_ModemPreset, metaclass=_ModemPresetEnumTypeWrapper): """ @@ -1691,6 +1757,30 @@ class Config(google.protobuf.message.Message): Moderate range preset optimized for EU 868MHz band with 62.5kHz bandwidth. Comparable link budget and data rate to LONG_FAST. """ + TINY_FAST: Config.LoRaConfig.ModemPreset.ValueType # 14 + """ + Tiny Fast + Preset optimized for compliance with Amateur Radio restrictions with 20kHz bandwidth. + Many regions limit data transmission bandwidth in lower amateur bands (2 Meter). + Note: TCXO with tight tolerances (±5 ppm or better) is *absolutely required* at these narrow bandwidths. + Only compatible with SX127x and SX126x chipsets. + Comparable link budget and data rate to LONG_FAST. + """ + TINY_SLOW: Config.LoRaConfig.ModemPreset.ValueType # 15 + """ + Tiny Slow + Preset optimized for compliance with Amateur Radio restrictions with 20kHz bandwidth. + Many regions limit data transmission bandwidth in lower amateur bands (2 Meter). + Note: TCXO with tight tolerances (±5 ppm or better) is *absolutely required* at these narrow bandwidths. + Only compatible with SX127x and SX126x chipsets. + Comparable link budget and data rate to LONG_MODERATE. + """ + MEDIUM_TURBO: Config.LoRaConfig.ModemPreset.ValueType # 16 + """ + Medium Range - Turbo + This preset performs similarly to MEDIUM_FAST, but with 500kHz bandwidth. + It is not legal to use in all regions due to this wider bandwidth. + """ class _FEM_LNA_Mode: ValueType = typing.NewType("ValueType", builtins.int) @@ -1747,8 +1837,10 @@ class Config(google.protobuf.message.Message): SERIAL_HAL_ONLY_FIELD_NUMBER: builtins.int use_preset: builtins.bool """ - When enabled, the `modem_preset` fields will be adhered to, else the `bandwidth`/`spread_factor`/`coding_rate` - will be taked from their respective manually defined fields + When enabled, the `modem_preset` sets the bandwidth and spread factor, and the + `bandwidth`/`spread_factor` fields are ignored. `coding_rate` is the exception: + see that field. When disabled, all three are taken from their respective + manually defined fields. """ modem_preset: global___Config.LoRaConfig.ModemPreset.ValueType """ @@ -1756,23 +1848,40 @@ class Config(google.protobuf.message.Message): As a heuristic: If bandwidth is specified, do not use modem_config. Because protobufs take ZERO space when the value is zero this works out nicely. This value is replaced by bandwidth/spread_factor/coding_rate. + The one exception is `coding_rate`, which can raise the preset's coding rate + without moving off the preset; see that field. If you'd like to experiment with other options add them to MeshRadio.cpp in the device code. """ bandwidth: builtins.int """ - Bandwidth in MHz + Bandwidth in kHz Certain bandwidth numbers are 'special' and will be converted to the - appropriate floating point value: 31 -> 31.25MHz + appropriate floating point value: 31 -> 31.25kHz """ spread_factor: builtins.int """ - A number from 7 to 12. + A number from 5 to 12, which the firmware clamps to that range. Indicates number of chirps per symbol as 1< google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.bytes]: """ @@ -2000,8 +2157,9 @@ class Config(google.protobuf.message.Message): serial_enabled: builtins.bool = ..., debug_log_api_enabled: builtins.bool = ..., admin_channel_enabled: builtins.bool = ..., + packet_signature_policy: global___Config.SecurityConfig.PacketSignaturePolicy.ValueType = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["admin_channel_enabled", b"admin_channel_enabled", "admin_key", b"admin_key", "debug_log_api_enabled", b"debug_log_api_enabled", "is_managed", b"is_managed", "private_key", b"private_key", "public_key", b"public_key", "serial_enabled", b"serial_enabled"]) -> None: ... + def ClearField(self, field_name: typing.Literal["admin_channel_enabled", b"admin_channel_enabled", "admin_key", b"admin_key", "debug_log_api_enabled", b"debug_log_api_enabled", "is_managed", b"is_managed", "packet_signature_policy", b"packet_signature_policy", "private_key", b"private_key", "public_key", b"public_key", "serial_enabled", b"serial_enabled"]) -> None: ... @typing.final class SessionkeyConfig(google.protobuf.message.Message): diff --git a/meshtastic/protobuf/device_ui_pb2.py b/meshtastic/protobuf/device_ui_pb2.py index 54a8f6cab..bfb3c09e5 100644 --- a/meshtastic/protobuf/device_ui_pb2.py +++ b/meshtastic/protobuf/device_ui_pb2.py @@ -14,7 +14,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/device_ui.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xa9\x06\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12 \n\x11screen_brightness\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x0escreen_timeout\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\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\x1b\n\x0cring_tone_id\x18\n \x01(\rB\x05\x92?\x02\x38\x08\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\x1f\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\x42\x05\x92?\x02\x08\x10\x12*\n\x08map_data\x18\x0f \x01(\x0b\x32\x18.meshtastic.protobuf.Map\x12=\n\x0c\x63ompass_mode\x18\x10 \x01(\x0e\x32 .meshtastic.protobuf.CompassModeB\x05\x92?\x02\x38\x08\x12\x18\n\x10screen_rgb_color\x18\x11 \x01(\r\x12\x1b\n\x13is_clockface_analog\x18\x12 \x01(\x08\x12R\n\ngps_format\x18\x13 \x01(\x0e\x32\x37.meshtastic.protobuf.DeviceUIConfig.GpsCoordinateFormatB\x05\x92?\x02\x38\x08\"V\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\x12\x07\n\x03MLS\x10\x06\"\xbc\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\x18\n\thops_away\x18\x04 \x01(\x05\x42\x05\x92?\x02\x38\x08\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x18\n\tnode_name\x18\x06 \x01(\tB\x05\x92?\x02\x08\x10\x12\x16\n\x07\x63hannel\x18\x07 \x01(\x05\x42\x05\x92?\x02\x38\x08\"\x85\x01\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\x18\n\tnode_name\x18\x05 \x01(\tB\x05\x92?\x02\x08\x10\"D\n\x08GeoPoint\x12\x13\n\x04zoom\x18\x01 \x01(\x05\x42\x05\x92?\x02\x38\x08\x12\x10\n\x08latitude\x18\x02 \x01(\x05\x12\x11\n\tlongitude\x18\x03 \x01(\x05\"\\\n\x03Map\x12+\n\x04home\x18\x01 \x01(\x0b\x32\x1d.meshtastic.protobuf.GeoPoint\x12\x14\n\x05style\x18\x02 \x01(\tB\x05\x92?\x02\x08\x14\x12\x12\n\nfollow_gps\x18\x03 \x01(\x08*>\n\x0b\x43ompassMode\x12\x0b\n\x07\x44YNAMIC\x10\x00\x12\x0e\n\nFIXED_RING\x10\x01\x12\x12\n\x0e\x46REEZE_HEADING\x10\x02*%\n\x05Theme\x12\x08\n\x04\x44\x41RK\x10\x00\x12\t\n\x05LIGHT\x10\x01\x12\x07\n\x03RED\x10\x02*\xc0\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\t\n\x05\x43ZECH\x10\x12\x12\n\n\x06\x44\x41NISH\x10\x13\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x64\n\x14org.meshtastic.protoB\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\x1a meshtastic/protobuf/nanopb.proto\"\xa9\x06\n\x0e\x44\x65viceUIConfig\x12\x0f\n\x07version\x18\x01 \x01(\r\x12 \n\x11screen_brightness\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\x0escreen_timeout\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\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\x1b\n\x0cring_tone_id\x18\n \x01(\rB\x05\x92?\x02\x38\x08\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\x1f\n\x10\x63\x61libration_data\x18\x0e \x01(\x0c\x42\x05\x92?\x02\x08\x10\x12*\n\x08map_data\x18\x0f \x01(\x0b\x32\x18.meshtastic.protobuf.Map\x12=\n\x0c\x63ompass_mode\x18\x10 \x01(\x0e\x32 .meshtastic.protobuf.CompassModeB\x05\x92?\x02\x38\x08\x12\x18\n\x10screen_rgb_color\x18\x11 \x01(\r\x12\x1b\n\x13is_clockface_analog\x18\x12 \x01(\x08\x12R\n\ngps_format\x18\x13 \x01(\x0e\x32\x37.meshtastic.protobuf.DeviceUIConfig.GpsCoordinateFormatB\x05\x92?\x02\x38\x08\"V\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\x12\x07\n\x03MLS\x10\x06\"\xbc\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\x18\n\thops_away\x18\x04 \x01(\x05\x42\x05\x92?\x02\x38\x08\x12\x17\n\x0fposition_switch\x18\x05 \x01(\x08\x12\x18\n\tnode_name\x18\x06 \x01(\tB\x05\x92?\x02\x08\x10\x12\x16\n\x07\x63hannel\x18\x07 \x01(\x05\x42\x05\x92?\x02\x38\x08\"\x85\x01\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\x18\n\tnode_name\x18\x05 \x01(\tB\x05\x92?\x02\x08\x10\"D\n\x08GeoPoint\x12\x13\n\x04zoom\x18\x01 \x01(\x05\x42\x05\x92?\x02\x38\x08\x12\x10\n\x08latitude\x18\x02 \x01(\x05\x12\x11\n\tlongitude\x18\x03 \x01(\x05\"\\\n\x03Map\x12+\n\x04home\x18\x01 \x01(\x0b\x32\x1d.meshtastic.protobuf.GeoPoint\x12\x14\n\x05style\x18\x02 \x01(\tB\x05\x92?\x02\x08\x14\x12\x12\n\nfollow_gps\x18\x03 \x01(\x08*>\n\x0b\x43ompassMode\x12\x0b\n\x07\x44YNAMIC\x10\x00\x12\x0e\n\nFIXED_RING\x10\x01\x12\x12\n\x0e\x46REEZE_HEADING\x10\x02*%\n\x05Theme\x12\x08\n\x04\x44\x41RK\x10\x00\x12\t\n\x05LIGHT\x10\x01\x12\x07\n\x03RED\x10\x02*\xe0\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\t\n\x05\x43ZECH\x10\x12\x12\n\n\x06\x44\x41NISH\x10\x13\x12\r\n\tHUNGARIAN\x10\x14\x12\x0f\n\x0b\x41ZERBAIJANI\x10\x15\x12\x16\n\x12SIMPLIFIED_CHINESE\x10\x1e\x12\x17\n\x13TRADITIONAL_CHINESE\x10\x1f\x42\x64\n\x14org.meshtastic.protoB\x0e\x44\x65viceUIProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -51,7 +51,7 @@ _globals['_THEME']._serialized_start=1461 _globals['_THEME']._serialized_end=1498 _globals['_LANGUAGE']._serialized_start=1501 - _globals['_LANGUAGE']._serialized_end=1821 + _globals['_LANGUAGE']._serialized_end=1853 _globals['_DEVICEUICONFIG']._serialized_start=95 _globals['_DEVICEUICONFIG']._serialized_end=904 _globals['_DEVICEUICONFIG_GPSCOORDINATEFORMAT']._serialized_start=818 diff --git a/meshtastic/protobuf/device_ui_pb2.pyi b/meshtastic/protobuf/device_ui_pb2.pyi index 065215b3d..f88054f39 100644 --- a/meshtastic/protobuf/device_ui_pb2.pyi +++ b/meshtastic/protobuf/device_ui_pb2.pyi @@ -173,6 +173,14 @@ class _LanguageEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumT """ Danish """ + HUNGARIAN: _Language.ValueType # 20 + """ + Hungarian + """ + AZERBAIJANI: _Language.ValueType # 21 + """ + Azerbaijani + """ SIMPLIFIED_CHINESE: _Language.ValueType # 30 """ Simplified Chinese (experimental) @@ -267,6 +275,14 @@ DANISH: Language.ValueType # 19 """ Danish """ +HUNGARIAN: Language.ValueType # 20 +""" +Hungarian +""" +AZERBAIJANI: Language.ValueType # 21 +""" +Azerbaijani +""" SIMPLIFIED_CHINESE: Language.ValueType # 30 """ Simplified Chinese (experimental) diff --git a/meshtastic/protobuf/deviceonly_legacy_pb2.py b/meshtastic/protobuf/deviceonly_legacy_pb2.py new file mode 100644 index 000000000..61d10e5b0 --- /dev/null +++ b/meshtastic/protobuf/deviceonly_legacy_pb2.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/deviceonly_legacy.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 meshtastic.protobuf import deviceonly_pb2 as meshtastic_dot_protobuf_dot_deviceonly__pb2 +from meshtastic.protobuf import telemetry_pb2 as meshtastic_dot_protobuf_dot_telemetry__pb2 +from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n+meshtastic/protobuf/deviceonly_legacy.proto\x12\x13meshtastic.protobuf\x1a$meshtastic/protobuf/deviceonly.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/nanopb.proto\"\x8c\x03\n\x13NodeInfoLite_Legacy\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\x16\n\x07\x63hannel\x18\x07 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x1d\n\thops_away\x18\t \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x17\n\x08next_hop\x18\x0c \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08\x62itfield\x18\r \x01(\rB\x0c\n\n_hops_away\"\x92\x01\n\x13NodeDatabase_Legacy\x12\x0f\n\x07version\x18\x01 \x01(\r\x12j\n\x05nodes\x18\x02 \x03(\x0b\x32(.meshtastic.protobuf.NodeInfoLite_LegacyB1\x92?.\x92\x01+std::vectorBt\n\x14org.meshtastic.protoB\x10\x44\x65viceOnlyLegacyZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x92?\x0b\xc2\x01\x08b\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.deviceonly_legacy_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020DeviceOnlyLegacyZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000\222?\013\302\001\010' + _NODEINFOLITE_LEGACY.fields_by_name['channel']._options = None + _NODEINFOLITE_LEGACY.fields_by_name['channel']._serialized_options = b'\222?\0028\010' + _NODEINFOLITE_LEGACY.fields_by_name['hops_away']._options = None + _NODEINFOLITE_LEGACY.fields_by_name['hops_away']._serialized_options = b'\222?\0028\010' + _NODEINFOLITE_LEGACY.fields_by_name['next_hop']._options = None + _NODEINFOLITE_LEGACY.fields_by_name['next_hop']._serialized_options = b'\222?\0028\010' + _NODEDATABASE_LEGACY.fields_by_name['nodes']._options = None + _NODEDATABASE_LEGACY.fields_by_name['nodes']._serialized_options = b'\222?.\222\001+std::vector' + _globals['_NODEINFOLITE_LEGACY']._serialized_start=178 + _globals['_NODEINFOLITE_LEGACY']._serialized_end=574 + _globals['_NODEDATABASE_LEGACY']._serialized_start=577 + _globals['_NODEDATABASE_LEGACY']._serialized_end=723 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/deviceonly_legacy_pb2.pyi b/meshtastic/protobuf/deviceonly_legacy_pb2.pyi new file mode 100644 index 000000000..4452acff7 --- /dev/null +++ b/meshtastic/protobuf/deviceonly_legacy_pb2.pyi @@ -0,0 +1,106 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import collections.abc +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.message +import meshtastic.protobuf.deviceonly_pb2 +import meshtastic.protobuf.telemetry_pb2 +import typing + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +@typing.final +class NodeInfoLite_Legacy(google.protobuf.message.Message): + """ + Legacy NodeInfoLite descriptor used only to decode pre-split + /prefs/nodes.proto saves during the v24 -> v25 migration boot. + This preserves the original NodeInfoLite-compatible field numbers needed + to parse old wire bytes cleanly, including user (2), position (3), + device_metrics (6), and the legacy-only compatibility fields via_mqtt (8), + is_favorite (10), and is_ignored (11). Steady-state code does not use + this struct; it is dropped after migration completes. This file should be + removed once DEVICESTATE_MIN_VER advances past 24. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NUM_FIELD_NUMBER: builtins.int + USER_FIELD_NUMBER: builtins.int + POSITION_FIELD_NUMBER: builtins.int + SNR_FIELD_NUMBER: builtins.int + LAST_HEARD_FIELD_NUMBER: builtins.int + DEVICE_METRICS_FIELD_NUMBER: builtins.int + CHANNEL_FIELD_NUMBER: builtins.int + VIA_MQTT_FIELD_NUMBER: builtins.int + HOPS_AWAY_FIELD_NUMBER: builtins.int + IS_FAVORITE_FIELD_NUMBER: builtins.int + IS_IGNORED_FIELD_NUMBER: builtins.int + NEXT_HOP_FIELD_NUMBER: builtins.int + BITFIELD_FIELD_NUMBER: builtins.int + num: builtins.int + snr: builtins.float + last_heard: builtins.int + channel: builtins.int + via_mqtt: builtins.bool + hops_away: builtins.int + is_favorite: builtins.bool + is_ignored: builtins.bool + next_hop: builtins.int + bitfield: builtins.int + @property + def user(self) -> meshtastic.protobuf.deviceonly_pb2.UserLite: ... + @property + def position(self) -> meshtastic.protobuf.deviceonly_pb2.PositionLite: ... + @property + def device_metrics(self) -> meshtastic.protobuf.telemetry_pb2.DeviceMetrics: ... + def __init__( + self, + *, + num: builtins.int = ..., + user: meshtastic.protobuf.deviceonly_pb2.UserLite | None = ..., + position: meshtastic.protobuf.deviceonly_pb2.PositionLite | None = ..., + snr: builtins.float = ..., + last_heard: builtins.int = ..., + device_metrics: meshtastic.protobuf.telemetry_pb2.DeviceMetrics | None = ..., + channel: builtins.int = ..., + via_mqtt: builtins.bool = ..., + hops_away: builtins.int | None = ..., + 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", "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_Legacy = NodeInfoLite_Legacy + +@typing.final +class NodeDatabase_Legacy(google.protobuf.message.Message): + """ + Legacy NodeDatabase shape: one repeated array of fat NodeInfoLite_Legacy + with no satellite position/telemetry arrays. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + VERSION_FIELD_NUMBER: builtins.int + NODES_FIELD_NUMBER: builtins.int + version: builtins.int + @property + def nodes(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NodeInfoLite_Legacy]: ... + def __init__( + self, + *, + version: builtins.int = ..., + nodes: collections.abc.Iterable[global___NodeInfoLite_Legacy] | None = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["nodes", b"nodes", "version", b"version"]) -> None: ... + +global___NodeDatabase_Legacy = NodeDatabase_Legacy diff --git a/meshtastic/protobuf/deviceonly_pb2.py b/meshtastic/protobuf/deviceonly_pb2.py index 59ded56e8..9118afafb 100644 --- a/meshtastic/protobuf/deviceonly_pb2.py +++ b/meshtastic/protobuf/deviceonly_pb2.py @@ -19,7 +19,7 @@ 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 meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/localonly.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.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\"\xb0\x02\n\x08UserLite\x12\x1a\n\x07macaddr\x18\x01 \x01(\x0c\x42\t\x18\x01\x92?\x04\x08\x06x\x01\x12\x18\n\tlong_name\x18\x02 \x01(\tB\x05\x92?\x02\x08(\x12\x19\n\nshort_name\x18\x03 \x01(\tB\x05\x92?\x02\x08\x05\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\x19\n\npublic_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"\x85\x03\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\x16\n\x07\x63hannel\x18\x07 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x1d\n\thops_away\x18\t \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x13\n\x0bis_favorite\x18\n \x01(\x08\x12\x12\n\nis_ignored\x18\x0b \x01(\x08\x12\x17\n\x08next_hop\x18\x0c \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08\x62itfield\x18\r \x01(\rB\x0c\n\n_hops_away\"\xaf\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=\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketB\x05\x92?\x02\x10\x01\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\x12T\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePinB\x05\x92?\x02\x10\x0c\"}\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\"U\n\x0b\x43hannelFile\x12\x35\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.ChannelB\x05\x92?\x02\x10\x08\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.UserBn\n\x14org.meshtastic.protoB\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 meshtastic/protobuf/config.proto\x1a#meshtastic/protobuf/localonly.proto\x1a\x1emeshtastic/protobuf/mesh.proto\x1a#meshtastic/protobuf/telemetry.proto\x1a meshtastic/protobuf/nanopb.proto\"\xb1\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\x12\x16\n\x0eprecision_bits\x18\x06 \x01(\r\"\xb0\x02\n\x08UserLite\x12\x1a\n\x07macaddr\x18\x01 \x01(\x0c\x42\t\x18\x01\x92?\x04\x08\x06x\x01\x12\x18\n\tlong_name\x18\x02 \x01(\tB\x05\x92?\x02\x08(\x12\x19\n\nshort_name\x18\x03 \x01(\tB\x05\x92?\x02\x08\x05\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\x19\n\npublic_key\x18\x07 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"\xf4\x03\n\x0cNodeInfoLite\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x0b\n\x03snr\x18\x04 \x01(\x02\x12\x12\n\nlast_heard\x18\x05 \x01(\x07\x12\x16\n\x07\x63hannel\x18\x07 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\thops_away\x18\t \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x17\n\x08next_hop\x18\x0c \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08\x62itfield\x18\r \x01(\r\x12\x18\n\tlong_name\x18\x0e \x01(\tB\x05\x92?\x02\x08\x19\x12\x19\n\nshort_name\x18\x0f \x01(\tB\x05\x92?\x02\x08\x05\x12;\n\x08hw_model\x18\x10 \x01(\x0e\x32\".meshtastic.protobuf.HardwareModelB\x05\x92?\x02\x38\x08\x12\x42\n\x04role\x18\x11 \x01(\x0e\x32-.meshtastic.protobuf.Config.DeviceConfig.RoleB\x05\x92?\x02\x38\x08\x12\x19\n\npublic_key\x18\x12 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x0e\n\x06snr_q4\x18\x13 \x01(\x11\x42\x0c\n\n_hops_awayJ\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x06\x10\x07J\x04\x08\x08\x10\tJ\x04\x08\n\x10\x0bJ\x04\x08\x0b\x10\x0cR\x04userR\x08positionR\x0e\x64\x65vice_metricsR\x08via_mqttR\x0bis_favoriteR\nis_ignored\"\xaf\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=\n\rreceive_queue\x18\x05 \x03(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketB\x05\x92?\x02\x10\x01\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\x12T\n\x19node_remote_hardware_pins\x18\r \x03(\x0b\x32*.meshtastic.protobuf.NodeRemoteHardwarePinB\x05\x92?\x02\x10\x0c\"U\n\x11NodePositionEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x33\n\x08position\x18\x02 \x01(\x0b\x32!.meshtastic.protobuf.PositionLite\"]\n\x12NodeTelemetryEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12:\n\x0e\x64\x65vice_metrics\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.DeviceMetrics\"i\n\x14NodeEnvironmentEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x44\n\x13\x65nvironment_metrics\x18\x02 \x01(\x0b\x32\'.meshtastic.protobuf.EnvironmentMetrics\"R\n\x0fNodeStatusEntry\x12\x0b\n\x03num\x18\x01 \x01(\r\x12\x32\n\x06status\x18\x02 \x01(\x0b\x32\".meshtastic.protobuf.StatusMessage\"\xb0\x04\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\x12j\n\tpositions\x18\x03 \x03(\x0b\x32&.meshtastic.protobuf.NodePositionEntryB/\x92?,\x92\x01)std::vector\x12l\n\ttelemetry\x18\x04 \x03(\x0b\x32\'.meshtastic.protobuf.NodeTelemetryEntryB0\x92?-\x92\x01*std::vector\x12\x63\n\x06status\x18\x05 \x03(\x0b\x32$.meshtastic.protobuf.NodeStatusEntryB-\x92?*\x92\x01\'std::vector\x12r\n\x0b\x65nvironment\x18\x06 \x03(\x0b\x32).meshtastic.protobuf.NodeEnvironmentEntryB2\x92?/\x92\x01,std::vector\"U\n\x0b\x43hannelFile\x12\x35\n\x08\x63hannels\x18\x01 \x03(\x0b\x32\x1c.meshtastic.protobuf.ChannelB\x05\x92?\x02\x10\x08\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.UserBn\n\x14org.meshtastic.protoB\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) @@ -41,6 +41,16 @@ _NODEINFOLITE.fields_by_name['hops_away']._serialized_options = b'\222?\0028\010' _NODEINFOLITE.fields_by_name['next_hop']._options = None _NODEINFOLITE.fields_by_name['next_hop']._serialized_options = b'\222?\0028\010' + _NODEINFOLITE.fields_by_name['long_name']._options = None + _NODEINFOLITE.fields_by_name['long_name']._serialized_options = b'\222?\002\010\031' + _NODEINFOLITE.fields_by_name['short_name']._options = None + _NODEINFOLITE.fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' + _NODEINFOLITE.fields_by_name['hw_model']._options = None + _NODEINFOLITE.fields_by_name['hw_model']._serialized_options = b'\222?\0028\010' + _NODEINFOLITE.fields_by_name['role']._options = None + _NODEINFOLITE.fields_by_name['role']._serialized_options = b'\222?\0028\010' + _NODEINFOLITE.fields_by_name['public_key']._options = None + _NODEINFOLITE.fields_by_name['public_key']._serialized_options = b'\222?\002\010 ' _DEVICESTATE.fields_by_name['receive_queue']._options = None _DEVICESTATE.fields_by_name['receive_queue']._serialized_options = b'\222?\002\020\001' _DEVICESTATE.fields_by_name['no_save']._options = None @@ -51,20 +61,36 @@ _DEVICESTATE.fields_by_name['node_remote_hardware_pins']._serialized_options = b'\222?\002\020\014' _NODEDATABASE.fields_by_name['nodes']._options = None _NODEDATABASE.fields_by_name['nodes']._serialized_options = b'\222?\'\222\001$std::vector' + _NODEDATABASE.fields_by_name['positions']._options = None + _NODEDATABASE.fields_by_name['positions']._serialized_options = b'\222?,\222\001)std::vector' + _NODEDATABASE.fields_by_name['telemetry']._options = None + _NODEDATABASE.fields_by_name['telemetry']._serialized_options = b'\222?-\222\001*std::vector' + _NODEDATABASE.fields_by_name['status']._options = None + _NODEDATABASE.fields_by_name['status']._serialized_options = b'\222?*\222\001\'std::vector' + _NODEDATABASE.fields_by_name['environment']._options = None + _NODEDATABASE.fields_by_name['environment']._serialized_options = b'\222?/\222\001,std::vector' _CHANNELFILE.fields_by_name['channels']._options = None _CHANNELFILE.fields_by_name['channels']._serialized_options = b'\222?\002\020\010' _globals['_POSITIONLITE']._serialized_start=271 - _globals['_POSITIONLITE']._serialized_end=424 - _globals['_USERLITE']._serialized_start=427 - _globals['_USERLITE']._serialized_end=731 - _globals['_NODEINFOLITE']._serialized_start=734 - _globals['_NODEINFOLITE']._serialized_end=1123 - _globals['_DEVICESTATE']._serialized_start=1126 - _globals['_DEVICESTATE']._serialized_end=1557 - _globals['_NODEDATABASE']._serialized_start=1559 - _globals['_NODEDATABASE']._serialized_end=1684 - _globals['_CHANNELFILE']._serialized_start=1686 - _globals['_CHANNELFILE']._serialized_end=1771 - _globals['_BACKUPPREFERENCES']._serialized_start=1774 - _globals['_BACKUPPREFERENCES']._serialized_end=2036 + _globals['_POSITIONLITE']._serialized_end=448 + _globals['_USERLITE']._serialized_start=451 + _globals['_USERLITE']._serialized_end=755 + _globals['_NODEINFOLITE']._serialized_start=758 + _globals['_NODEINFOLITE']._serialized_end=1258 + _globals['_DEVICESTATE']._serialized_start=1261 + _globals['_DEVICESTATE']._serialized_end=1692 + _globals['_NODEPOSITIONENTRY']._serialized_start=1694 + _globals['_NODEPOSITIONENTRY']._serialized_end=1779 + _globals['_NODETELEMETRYENTRY']._serialized_start=1781 + _globals['_NODETELEMETRYENTRY']._serialized_end=1874 + _globals['_NODEENVIRONMENTENTRY']._serialized_start=1876 + _globals['_NODEENVIRONMENTENTRY']._serialized_end=1981 + _globals['_NODESTATUSENTRY']._serialized_start=1983 + _globals['_NODESTATUSENTRY']._serialized_end=2065 + _globals['_NODEDATABASE']._serialized_start=2068 + _globals['_NODEDATABASE']._serialized_end=2628 + _globals['_CHANNELFILE']._serialized_start=2630 + _globals['_CHANNELFILE']._serialized_end=2715 + _globals['_BACKUPPREFERENCES']._serialized_start=2718 + _globals['_BACKUPPREFERENCES']._serialized_end=2980 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/deviceonly_pb2.pyi b/meshtastic/protobuf/deviceonly_pb2.pyi index 440385ad2..885b7f14c 100644 --- a/meshtastic/protobuf/deviceonly_pb2.pyi +++ b/meshtastic/protobuf/deviceonly_pb2.pyi @@ -30,6 +30,7 @@ class PositionLite(google.protobuf.message.Message): ALTITUDE_FIELD_NUMBER: builtins.int TIME_FIELD_NUMBER: builtins.int LOCATION_SOURCE_FIELD_NUMBER: builtins.int + PRECISION_BITS_FIELD_NUMBER: builtins.int latitude_i: builtins.int """ The new preferred location encoding, multiply by 1e-7 to get degrees @@ -55,6 +56,10 @@ class PositionLite(google.protobuf.message.Message): """ TODO: REPLACE """ + precision_bits: builtins.int + """ + Indicates the bits of precision set by the sending node + """ def __init__( self, *, @@ -63,8 +68,9 @@ class PositionLite(google.protobuf.message.Message): altitude: builtins.int = ..., time: builtins.int = ..., location_source: meshtastic.protobuf.mesh_pb2.Position.LocSource.ValueType = ..., + precision_bits: builtins.int = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["altitude", b"altitude", "latitude_i", b"latitude_i", "location_source", b"location_source", "longitude_i", b"longitude_i", "time", b"time"]) -> None: ... + def ClearField(self, field_name: typing.Literal["altitude", b"altitude", "latitude_i", b"latitude_i", "location_source", b"location_source", "longitude_i", b"longitude_i", "precision_bits", b"precision_bits", "time", b"time"]) -> None: ... global___PositionLite = PositionLite @@ -142,26 +148,26 @@ class NodeInfoLite(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor NUM_FIELD_NUMBER: builtins.int - USER_FIELD_NUMBER: builtins.int - POSITION_FIELD_NUMBER: builtins.int SNR_FIELD_NUMBER: builtins.int LAST_HEARD_FIELD_NUMBER: builtins.int - DEVICE_METRICS_FIELD_NUMBER: builtins.int CHANNEL_FIELD_NUMBER: builtins.int - VIA_MQTT_FIELD_NUMBER: builtins.int HOPS_AWAY_FIELD_NUMBER: builtins.int - IS_FAVORITE_FIELD_NUMBER: builtins.int - IS_IGNORED_FIELD_NUMBER: builtins.int NEXT_HOP_FIELD_NUMBER: builtins.int BITFIELD_FIELD_NUMBER: builtins.int + LONG_NAME_FIELD_NUMBER: builtins.int + SHORT_NAME_FIELD_NUMBER: builtins.int + HW_MODEL_FIELD_NUMBER: builtins.int + ROLE_FIELD_NUMBER: builtins.int + PUBLIC_KEY_FIELD_NUMBER: builtins.int + SNR_Q4_FIELD_NUMBER: builtins.int num: builtins.int """ The node number """ snr: builtins.float """ - Returns the Signal-to-noise ratio (SNR) of the last received message, - as measured by the receiver. Return SNR of the last received message in dB + In-memory SNR of the last received message in dB. Not serialised directly: + always zeroed before encode; persisted as snr_q4 = 19 below. """ last_heard: builtins.int """ @@ -171,72 +177,75 @@ class NodeInfoLite(google.protobuf.message.Message): """ local channel index we heard that node on. Only populated if its not the default channel. """ - via_mqtt: builtins.bool - """ - True if we witnessed the node over MQTT instead of LoRA transport - """ hops_away: builtins.int """ Number of hops away from us this node is (0 if direct neighbor) """ - is_favorite: builtins.bool - """ - True if node is in our favorites list - Persists between NodeDB internal clean ups - """ - is_ignored: builtins.bool - """ - True if node is in our ignored list - Persists between NodeDB internal clean ups - """ next_hop: builtins.int """ 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 - LSB 1 is_muted + Bitfield for storing booleans. See NODEINFO_BITFIELD_* in src/mesh/NodeDB.h. + Bit 11 is NODEINFO_BITFIELD_HAS_RF_HEAR, set once this node has been heard + over our own radio and never cleared afterwards. Bits 12..23 hold a + fingerprint of the LoRa slot it was last heard on. NodeInfo.heard_on_current_lora + is derived from those two together, not stored: it is true when the node has + been heard over RF and its recorded slot matches the slot the radio is + currently committed to. Bits 24..31 are reserved. """ - @property - def user(self) -> global___UserLite: - """ - The user info for this node - """ - - @property - def position(self) -> global___PositionLite: - """ - This position data. Note: before 1.2.14 we would also store the last time we've heard from this node in position.time, that is no longer true. - Position.time now indicates the last time we received a POSITION from that node. - """ + long_name: builtins.str + """Flattened user fields (formerly UserLite). macaddr dropped (deprecated 1.2.11). - @property - def device_metrics(self) -> meshtastic.protobuf.telemetry_pb2.DeviceMetrics: - """ - The latest device metrics for the node. - """ + A full name for this user, i.e. "Kevin Hester". + """ + short_name: builtins.str + """ + A VERY short name, ideally two characters or an emoji. + Suitable for a tiny OLED screen. + """ + hw_model: meshtastic.protobuf.mesh_pb2.HardwareModel.ValueType + """ + Hardware model the user's device is running. + """ + role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType + """ + The user's role in the mesh. + """ + public_key: builtins.bytes + """ + The public key of the user's device, for PKI-based encrypted DMs. + """ + snr_q4: builtins.int + """ + Q4-encoded SNR: dB × 4, sint32 zigzag. Matches RouteDiscovery convention. + Encode: snr_q4 = (int32_t)lroundf(snr * 4.0f). Decode: snr = snr_q4 / 4.0f. + float snr is always zeroed on disk; this field carries all persisted SNR. + A stored 0 does not by itself mean "unknown" here - see NODEINFO_BITFIELD_HAS_SNR in + src/mesh/NodeDB.h for the presence bit that disambiguates a genuine 0 dB reading from + "never measured". + """ def __init__( self, *, num: builtins.int = ..., - user: global___UserLite | None = ..., - position: global___PositionLite | None = ..., snr: builtins.float = ..., last_heard: builtins.int = ..., - device_metrics: meshtastic.protobuf.telemetry_pb2.DeviceMetrics | None = ..., channel: builtins.int = ..., - via_mqtt: builtins.bool = ..., hops_away: builtins.int | None = ..., - is_favorite: builtins.bool = ..., - is_ignored: builtins.bool = ..., next_hop: builtins.int = ..., bitfield: builtins.int = ..., + long_name: builtins.str = ..., + short_name: builtins.str = ..., + hw_model: meshtastic.protobuf.mesh_pb2.HardwareModel.ValueType = ..., + role: meshtastic.protobuf.config_pb2.Config.DeviceConfig.Role.ValueType = ..., + public_key: builtins.bytes = ..., + snr_q4: 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", "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 HasField(self, field_name: typing.Literal["_hops_away", b"_hops_away", "hops_away", b"hops_away"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_hops_away", b"_hops_away", "bitfield", b"bitfield", "channel", b"channel", "hops_away", b"hops_away", "hw_model", b"hw_model", "last_heard", b"last_heard", "long_name", b"long_name", "next_hop", b"next_hop", "num", b"num", "public_key", b"public_key", "role", b"role", "short_name", b"short_name", "snr", b"snr", "snr_q4", b"snr_q4"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["_hops_away", b"_hops_away"]) -> typing.Literal["hops_away"] | None: ... global___NodeInfoLite = NodeInfoLite @@ -337,12 +346,100 @@ class DeviceState(google.protobuf.message.Message): global___DeviceState = DeviceState +@typing.final +class NodePositionEntry(google.protobuf.message.Message): + """Satellite per-node entries; stored alongside the slim NodeInfoLite so nodes + that never report don't pay the embedded cost. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NUM_FIELD_NUMBER: builtins.int + POSITION_FIELD_NUMBER: builtins.int + num: builtins.int + @property + def position(self) -> global___PositionLite: ... + def __init__( + self, + *, + num: builtins.int = ..., + position: global___PositionLite | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["position", b"position"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["num", b"num", "position", b"position"]) -> None: ... + +global___NodePositionEntry = NodePositionEntry + +@typing.final +class NodeTelemetryEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NUM_FIELD_NUMBER: builtins.int + DEVICE_METRICS_FIELD_NUMBER: builtins.int + num: builtins.int + @property + def device_metrics(self) -> meshtastic.protobuf.telemetry_pb2.DeviceMetrics: ... + def __init__( + self, + *, + num: builtins.int = ..., + device_metrics: meshtastic.protobuf.telemetry_pb2.DeviceMetrics | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["device_metrics", b"device_metrics"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["device_metrics", b"device_metrics", "num", b"num"]) -> None: ... + +global___NodeTelemetryEntry = NodeTelemetryEntry + +@typing.final +class NodeEnvironmentEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NUM_FIELD_NUMBER: builtins.int + ENVIRONMENT_METRICS_FIELD_NUMBER: builtins.int + num: builtins.int + @property + def environment_metrics(self) -> meshtastic.protobuf.telemetry_pb2.EnvironmentMetrics: ... + def __init__( + self, + *, + num: builtins.int = ..., + environment_metrics: meshtastic.protobuf.telemetry_pb2.EnvironmentMetrics | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["environment_metrics", b"environment_metrics"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["environment_metrics", b"environment_metrics", "num", b"num"]) -> None: ... + +global___NodeEnvironmentEntry = NodeEnvironmentEntry + +@typing.final +class NodeStatusEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NUM_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + num: builtins.int + @property + def status(self) -> meshtastic.protobuf.mesh_pb2.StatusMessage: ... + def __init__( + self, + *, + num: builtins.int = ..., + status: meshtastic.protobuf.mesh_pb2.StatusMessage | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["status", b"status"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["num", b"num", "status", b"status"]) -> None: ... + +global___NodeStatusEntry = NodeStatusEntry + @typing.final class NodeDatabase(google.protobuf.message.Message): DESCRIPTOR: google.protobuf.descriptor.Descriptor VERSION_FIELD_NUMBER: builtins.int NODES_FIELD_NUMBER: builtins.int + POSITIONS_FIELD_NUMBER: builtins.int + TELEMETRY_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + ENVIRONMENT_FIELD_NUMBER: builtins.int version: builtins.int """ A version integer used to invalidate old save files when we make @@ -355,13 +452,29 @@ class NodeDatabase(google.protobuf.message.Message): New lite version of NodeDB to decrease memory footprint """ + @property + def positions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NodePositionEntry]: + """Per-NodeNum satellite arrays. Constrained platforms (e.g. STM32WL) omit + these via MESHTASTIC_EXCLUDE_*DB build flags. + """ + + @property + def telemetry(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NodeTelemetryEntry]: ... + @property + def status(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NodeStatusEntry]: ... + @property + def environment(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___NodeEnvironmentEntry]: ... def __init__( self, *, version: builtins.int = ..., nodes: collections.abc.Iterable[global___NodeInfoLite] | None = ..., + positions: collections.abc.Iterable[global___NodePositionEntry] | None = ..., + telemetry: collections.abc.Iterable[global___NodeTelemetryEntry] | None = ..., + status: collections.abc.Iterable[global___NodeStatusEntry] | None = ..., + environment: collections.abc.Iterable[global___NodeEnvironmentEntry] | None = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["nodes", b"nodes", "version", b"version"]) -> None: ... + def ClearField(self, field_name: typing.Literal["environment", b"environment", "nodes", b"nodes", "positions", b"positions", "status", b"status", "telemetry", b"telemetry", "version", b"version"]) -> None: ... global___NodeDatabase = NodeDatabase diff --git a/meshtastic/protobuf/field_metadata_pb2.py b/meshtastic/protobuf/field_metadata_pb2.py new file mode 100644 index 000000000..147a7fca6 --- /dev/null +++ b/meshtastic/protobuf/field_metadata_pb2.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/field_metadata.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/field_metadata.proto\x12\x13meshtastic.protobuf\x1a google/protobuf/descriptor.proto\"\xe5\x01\n\rFieldMetadata\x12\x10\n\x08\x64iy_only\x18\x01 \x01(\x08\x12\x12\n\nadmin_only\x18\x02 \x01(\x08\x12\x11\n\tmin_value\x18\x03 \x01(\x01\x12\x11\n\tmax_value\x18\x04 \x01(\x01\x12\x0c\n\x04unit\x18\x05 \x01(\t\x12\x12\n\ndeprecated\x18\x06 \x01(\x08\x12\r\n\x05label\x18\x07 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x08 \x01(\t\x12\x10\n\x08keywords\x18\t \x01(\t\x12\x16\n\x0esince_firmware\x18\n \x01(\t\x12\x18\n\x10\x64\x65precated_since\x18\x0b \x01(\t:[\n\x0e\x66ield_metadata\x12\x1d.google.protobuf.FieldOptions\x18\xb9\x8e\x03 \x01(\x0b\x32\".meshtastic.protobuf.FieldMetadata:d\n\x13\x65num_value_metadata\x12!.google.protobuf.EnumValueOptions\x18\xb9\x8e\x03 \x01(\x0b\x32\".meshtastic.protobuf.FieldMetadataBi\n\x14org.meshtastic.protoB\x13\x46ieldMetadataProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'meshtastic.protobuf.field_metadata_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\023FieldMetadataProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _globals['_FIELDMETADATA']._serialized_start=100 + _globals['_FIELDMETADATA']._serialized_end=329 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/field_metadata_pb2.pyi b/meshtastic/protobuf/field_metadata_pb2.pyi new file mode 100644 index 000000000..f35272634 --- /dev/null +++ b/meshtastic/protobuf/field_metadata_pb2.pyi @@ -0,0 +1,248 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import google.protobuf.descriptor +import google.protobuf.descriptor_pb2 +import google.protobuf.internal.extension_dict +import google.protobuf.message +import typing + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +@typing.final +class FieldMetadata(google.protobuf.message.Message): + """ + Structured, app/UI-relevant metadata describing a protobuf field or enum value. + + Carried in a single FieldOptions extension (`field_metadata` below), so adding + an attribute is a SCHEMA-ONLY change: add a new field to this message (use the + next field number) and every generated registry - KMP/Wire, C, Python, + TypeScript, Rust, Swift - picks it up automatically. No generator code change + is needed, and no additional FieldOptions extension number is consumed. + + The one build step an attribute addition does cost is regenerating + protoc-gen-fieldmeta-swift's own binding for this file + (tools/protoc-gen-fieldmeta-swift/README.md documents the one-liner). That + plugin decodes the option through a generated Swift type rather than through + dynamic reflection as the Go plugin does, so a stale binding cannot see the + new attribute. It fails loudly rather than dropping it silently. + + Constraint: attributes must be SCALAR (bool / 32-bit int / float / string). + A message, enum, bytes, repeated, or map attribute is rejected at generation + time (the generators would otherwise emit meaningless, non-deterministic + values), and so is a 64-bit integer kind, which TypeScript's number cannot + hold exactly. Float attributes must be finite: an open bound is left unset, + not set to inf. A list is therefore a single delimited string - see + `keywords`. See tools/protoc-gen-fieldmeta. + + BOUNDS (`min_value`, `max_value`) are PRESENTATION metadata, deliberately, and + they overlap an existing standard. protovalidate - `(buf.validate.field)`, + buf's successor to protoc-gen-validate - is the industry-standard way to + express a numeric constraint in a schema, and where a constraint must be + ENFORCED that is the thing to reach for, not these two attributes. + + They exist here anyway because protovalidate evaluates CEL against a + descriptor at runtime, and the consumers that most need a bound cannot do + that: nanopb on the firmware has no descriptors and no CEL, and neither do + the generated Wire, prost or swift-protobuf types the clients use. A build- + time attribute is the only form that reaches every target. + + The cost is that a bound stated here and a bound enforced elsewhere can + drift, and nothing detects it. So: state a bound here only when the firmware + genuinely enforces it, treat the firmware as the source of truth, and if + `(buf.validate.field)` is ever adopted for a field, make these mirror it + rather than compete with it. + + STRING attributes are treated as user-facing display text and are emitted for + localization where the target supports it - the Swift target emits + String(localized:defaultValue:comment:) keyed by the field's full name, so the + English here is the SOURCE string and translations live in the consuming app's + catalog. Do not put machine-readable values (regexes, identifiers, format + codes) in a string attribute; they would be handed to translators. + + The exception is a short, named set of MACHINE-READABLE string attributes - + currently `since_firmware` and `deprecated_since` - which the generators emit + as plain literals. A firmware version is compared rather than read, and a + translated one would compare wrongly at runtime. The set is deliberately + closed and lives in the generators (`machineReadableAttributes`); adding to it + is a generator change and should stay rare, because every entry is a string a + translator will never see and therefore a place display text can hide. + + To tag a field, set the option on it, e.g. + uint32 rx_gpio = 8 [(meshtastic.protobuf.field_metadata) = { diy_only: true }]; + + One attribute, `deprecated`, is special: it MIRRORS the field's standard + `[deprecated = true]` option rather than being set inside this annotation. + The generators populate it from that standard option so apps can read + deprecation at runtime (protobuf runtimes strip options, so it is otherwise + invisible). This is the only attribute that costs a generator change. + + Downstream apps use this to drive UI decisions (e.g. hiding DIY-only settings + on pre-assembled boards) directly from the protobuf schema. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + DIY_ONLY_FIELD_NUMBER: builtins.int + ADMIN_ONLY_FIELD_NUMBER: builtins.int + MIN_VALUE_FIELD_NUMBER: builtins.int + MAX_VALUE_FIELD_NUMBER: builtins.int + UNIT_FIELD_NUMBER: builtins.int + DEPRECATED_FIELD_NUMBER: builtins.int + LABEL_FIELD_NUMBER: builtins.int + DESCRIPTION_FIELD_NUMBER: builtins.int + KEYWORDS_FIELD_NUMBER: builtins.int + SINCE_FIRMWARE_FIELD_NUMBER: builtins.int + DEPRECATED_SINCE_FIELD_NUMBER: builtins.int + diy_only: builtins.bool + """ + Field is only relevant to DIY hardware builds. Apps may hide it when + connected to a pre-assembled / commercial board. + """ + admin_only: builtins.bool + """ + Field is only relevant in advanced / administrative contexts and may be + hidden from the default UI. + """ + min_value: builtins.float + """ + Inclusive lower bound, for PRESENTATION: slider and stepper range, and the + client-side check that stops a user entering a value the firmware would + reject anyway. It is NOT the wire contract and nothing enforces it on + receipt - see the note on bounds below. + """ + max_value: builtins.float + """ + Inclusive upper bound, for PRESENTATION. Same status as `min_value`. + """ + unit: builtins.str + """ + Human-facing unit label for the value (e.g. "m", "s", "dBm"). + """ + deprecated: builtins.bool + """ + Field is deprecated. MIRRORS the field's standard `[deprecated = true]` + option - the generators populate this automatically from that option so + every consumer can read it at runtime (protobuf runtimes strip options, so + the standard `deprecated` bit is otherwise invisible to apps). Setting it + by hand in a (meshtastic.protobuf.field_metadata) annotation is a generation-time + ERROR; mark the field `[deprecated = true]` as usual and it flows through + here. + """ + label: builtins.str + """ + Short human-facing name for the field, as a UI would label the control that + edits it (e.g. "Hop Limit"). Source string for localization; see the note on + string attributes above. + """ + description: builtins.str + """ + One-sentence plain-language explanation of what the field does, suitable for + showing under the control (e.g. "How many times a message may be repeated + before it stops being forwarded."). Source string for localization. + """ + keywords: builtins.str + """ + Additional terms a user might search for to find this field, beyond its + label - abbreviations, older names, and related concepts (e.g. for + `hop_limit`: "hops|ttl|range"). Attributes must be scalar, so this is a + single string; entries are separated by "|" and surrounding whitespace is + ignored. "|" is used rather than "," because a keyword may itself contain a + comma. Source string for localization. + """ + since_firmware: builtins.str + """ + The first firmware version that has this field, e.g. "2.7.12". + + A client showing a control for a field the connected node does not have + offers a setting that will be ignored; one hiding a field the node does + have loses a setting that works. Today each client answers that from a + version constant written into its own UI, so the same boundary is stated + independently in each of them - and when firmware adds a field, every + client has to learn the number separately. + + MACHINE-READABLE (see the note on string attributes above): a version is + compared, not read, and is emitted as a plain literal rather than as + localizable text. + + Presentation metadata, like `min_value`: firmware still has to defend + itself, since an older client can always write a field a newer firmware + ignores, and a newer client a field an older one does not know. + + Unset means "as long as anyone needs to care", which is the common case - + annotate a field only where a client genuinely has to make this decision. + """ + deprecated_since: builtins.str + """ + The first firmware version that no longer honours this field, e.g. "2.7.1" + on `compass_north_top`: `compass_orientation` replaced it in 2.3.13, but + firmware went on reading the old field until 2.7.1. The replacement's + arrival and the old field's removal are different releases, which is the + whole reason this is worth writing down. + + Distinct from `deprecated`, which says only THAT a field is superseded. + That is enough to stop offering it on new firmware but not enough to keep + offering it where it still works: a node below this version needs the field, + and a client that hides it on the strength of the boolean alone takes a + working setting away. Both clients do exactly that today. + + So the intended rule is: show the field below this version; at or above it, + treat it as `deprecated` does - hidden unless the node holds a non-default + value, which keeps a stale setting visible rather than silently saved. + + Deprecated is not removed. A field firmware has stopped reading entirely is + a different statement and wants its own annotation rather than this one. + + MACHINE-READABLE, and presentation metadata, on the same terms as + `since_firmware`. + """ + def __init__( + self, + *, + diy_only: builtins.bool | None = ..., + admin_only: builtins.bool | None = ..., + min_value: builtins.float | None = ..., + max_value: builtins.float | None = ..., + unit: builtins.str | None = ..., + deprecated: builtins.bool | None = ..., + label: builtins.str | None = ..., + description: builtins.str | None = ..., + keywords: builtins.str | None = ..., + since_firmware: builtins.str | None = ..., + deprecated_since: builtins.str | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["admin_only", b"admin_only", "deprecated", b"deprecated", "deprecated_since", b"deprecated_since", "description", b"description", "diy_only", b"diy_only", "keywords", b"keywords", "label", b"label", "max_value", b"max_value", "min_value", b"min_value", "since_firmware", b"since_firmware", "unit", b"unit"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["admin_only", b"admin_only", "deprecated", b"deprecated", "deprecated_since", b"deprecated_since", "description", b"description", "diy_only", b"diy_only", "keywords", b"keywords", "label", b"label", "max_value", b"max_value", "min_value", b"min_value", "since_firmware", b"since_firmware", "unit", b"unit"]) -> None: ... + +global___FieldMetadata = FieldMetadata + +FIELD_METADATA_FIELD_NUMBER: builtins.int +ENUM_VALUE_METADATA_FIELD_NUMBER: builtins.int +field_metadata: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.FieldOptions, global___FieldMetadata] +""" +Attach FieldMetadata to a field, e.g. + uint32 rx_gpio = 8 [(meshtastic.protobuf.field_metadata) = { diy_only: true }]; + +Private-use extension number range is 50000-99999. +""" +enum_value_metadata: google.protobuf.internal.extension_dict._ExtensionFieldDescriptor[google.protobuf.descriptor_pb2.EnumValueOptions, global___FieldMetadata] +""" +Attach the same metadata to an ENUM VALUE, e.g. + LONG_FAST = 0 [(meshtastic.protobuf.enum_value_metadata) = { label: "Long Range - Fast" }]; + +A picker's options are enum values, so this is what gives them display text: +without it every client hand-maintains its own copy of "Long Range - Fast", +"United States" and the rest, and they drift. Bitfield flags are enum values +too, which is how a single uint32 field like PositionConfig.position_flags +can name the individual toggles that make it up. + +Reuses the FieldMetadata message so there is one shape, one registry and one +localization path for both. Attributes that only make sense for a numeric +field (min_value, max_value, unit) are simply left unset. + +Extension numbers are scoped per extendee, so sharing 51001 with the +FieldOptions extension above is deliberate and not a conflict. +""" diff --git a/meshtastic/protobuf/interdevice_pb2.py b/meshtastic/protobuf/interdevice_pb2.py index 07b05e2ea..4ca8e5a4b 100644 --- a/meshtastic/protobuf/interdevice_pb2.py +++ b/meshtastic/protobuf/interdevice_pb2.py @@ -14,7 +14,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%meshtastic/protobuf/interdevice.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"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\"g\n\x12InterdeviceMessage\x12\x16\n\x04nmea\x18\x01 \x01(\tB\x06\x92?\x03\x08\x80\x08H\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\x42g\n\x14org.meshtastic.protoB\x11InterdeviceProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%meshtastic/protobuf/interdevice.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xf6\x01\n\x0c\x46ileTransfer\x12\x35\n\toperation\x18\x01 \x01(\x0e\x32\".meshtastic.protobuf.FileOperation\x12\x18\n\x08\x66ilepath\x18\x02 \x01(\tB\x06\x92?\x03\x08\x80\x02\x12\x18\n\x08\x66iledata\x18\x03 \x01(\x0c\x42\x06\x92?\x03\x08\x80 \x12/\n\x06status\x18\x04 \x01(\x0e\x32\x1f.meshtastic.protobuf.FileStatus\x12\x17\n\x07message\x18\x05 \x01(\tB\x06\x92?\x03\x08\xff\x01\x12\x0e\n\x06offset\x18\x06 \x01(\x04\x12\x0e\n\x06length\x18\x07 \x01(\r\x12\x11\n\tfile_size\x18\x08 \x01(\x04\"\xb9\x01\n\x10\x44irectoryListing\x12\x19\n\tdirectory\x18\x01 \x01(\tB\x06\x92?\x03\x08\x80\x02\x12\x1b\n\tfilenames\x18\x02 \x03(\tB\x08\x92?\x05\x10\x10p\xff\x01\x12/\n\x06status\x18\x03 \x01(\x0e\x32\x1f.meshtastic.protobuf.FileStatus\x12\x17\n\x07message\x18\x04 \x01(\tB\x06\x92?\x03\x08\xff\x01\x12\x0e\n\x06offset\x18\x05 \x01(\r\x12\x13\n\x0btotal_count\x18\x06 \x01(\r\"O\n\x0eI2CTransaction\x12\x0f\n\x07\x61\x64\x64ress\x18\x01 \x01(\r\x12\x1a\n\nwrite_data\x18\x02 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x02\x12\x10\n\x08read_len\x18\x03 \x01(\r\"\x92\x03\n\nSdCardInfo\x12\x0f\n\x07present\x18\x01 \x01(\x08\x12;\n\tcard_type\x18\x02 \x01(\x0e\x32(.meshtastic.protobuf.SdCardInfo.CardType\x12\x39\n\x08\x66\x61t_type\x18\x03 \x01(\x0e\x32\'.meshtastic.protobuf.SdCardInfo.FatType\x12\x11\n\tcard_size\x18\x04 \x01(\x04\x12\x12\n\nused_bytes\x18\x05 \x01(\x04\x12\x12\n\nfree_bytes\x18\x06 \x01(\x04\x12\x13\n\x0bstats_valid\x18\x07 \x01(\x08\x12\x0c\n\x04\x62usy\x18\x08 \x01(\x08\x12\x13\n\x0bunformatted\x18\t \x01(\x08\"K\n\x08\x43\x61rdType\x12\x08\n\x04NONE\x10\x00\x12\x07\n\x03MMC\x10\x01\x12\x06\n\x02SD\x10\x02\x12\x08\n\x04SDHC\x10\x03\x12\x08\n\x04SDXC\x10\x04\x12\x10\n\x0cUNKNOWN_CARD\x10\x05\";\n\x07\x46\x61tType\x12\x0f\n\x0bUNKNOWN_FAT\x10\x00\x12\t\n\x05\x46\x41T16\x10\x01\x12\t\n\x05\x46\x41T32\x10\x02\x12\t\n\x05\x45XFAT\x10\x03\"\xac\x01\n\tI2CResult\x12\x35\n\x06status\x18\x01 \x01(\x0e\x32%.meshtastic.protobuf.I2CResult.Status\x12\x19\n\tread_data\x18\x02 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x02\"M\n\x06Status\x12\x0f\n\x0bUNSPECIFIED\x10\x00\x12\x06\n\x02OK\x10\x01\x12\x10\n\x0cNACK_ADDRESS\x10\x02\x12\r\n\tNACK_DATA\x10\x03\x12\t\n\x05\x45RROR\x10\x04\"\x87\x05\n\x12InterdeviceMessage\x12\n\n\x02id\x18\x0f \x01(\r\x12\x16\n\x04nmea\x18\x01 \x01(\tB\x06\x92?\x03\x08\x80\x08H\x00\x12\x15\n\x04\x62\x65\x65p\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10H\x00\x12>\n\x0fi2c_transaction\x18\x03 \x01(\x0b\x32#.meshtastic.protobuf.I2CTransactionH\x00\x12\x34\n\ni2c_result\x18\x04 \x01(\x0b\x32\x1e.meshtastic.protobuf.I2CResultH\x00\x12\x12\n\x08i2c_scan\x18\x05 \x01(\x08H\x00\x12!\n\x0fi2c_scan_result\x18\x06 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x01H\x00\x12:\n\rfile_transfer\x18\x07 \x01(\x0b\x32!.meshtastic.protobuf.FileTransferH\x00\x12\x42\n\x11\x64irectory_listing\x18\x08 \x01(\x0b\x32%.meshtastic.protobuf.DirectoryListingH\x00\x12\x15\n\x0bget_sd_info\x18\t \x01(\x08H\x00\x12\x32\n\x07sd_info\x18\n \x01(\x0b\x32\x1f.meshtastic.protobuf.SdCardInfoH\x00\x12\x37\n\x04ping\x18\x0b \x01(\x0e\x32\'.meshtastic.protobuf.InterdeviceVersionH\x00\x12\x37\n\x04pong\x18\x0c \x01(\x0e\x32\'.meshtastic.protobuf.InterdeviceVersionH\x00\x12\x0e\n\x04nack\x18\r \x01(\x08H\x00\x12\x34\n\nsd_command\x18\x0e \x01(\x0e\x32\x1e.meshtastic.protobuf.SdCommandH\x00\x42\x06\n\x04\x64\x61ta*Z\n\x12InterdeviceVersion\x12#\n\x1fINTERDEVICE_VERSION_UNSPECIFIED\x10\x00\x12\x1f\n\x1bINTERDEVICE_VERSION_CURRENT\x10\x02*7\n\rFileOperation\x12\x07\n\x03GET\x10\x00\x12\x08\n\x04POST\x10\x01\x12\x07\n\x03PUT\x10\x02\x12\n\n\x06\x44\x45LETE\x10\x03*\xa6\x01\n\nFileStatus\x12\x14\n\x10\x46ILE_UNSPECIFIED\x10\x00\x12\x0b\n\x07\x46ILE_OK\x10\x01\x12\r\n\tFILE_BUSY\x10\x02\x12\x10\n\x0c\x46ILE_NO_CARD\x10\x03\x12\x12\n\x0e\x46ILE_NOT_FOUND\x10\x04\x12\x18\n\x14\x46ILE_OFFSET_CONFLICT\x10\x05\x12\x11\n\rFILE_IO_ERROR\x10\x06\x12\x13\n\x0f\x46ILE_NOT_A_FILE\x10\x07*R\n\tSdCommand\x12\x1a\n\x16SD_COMMAND_UNSPECIFIED\x10\x00\x12\x0c\n\x08SD_MOUNT\x10\x01\x12\x0c\n\x08SD_EJECT\x10\x02\x12\r\n\tSD_FORMAT\x10\x03\x42g\n\x14org.meshtastic.protoB\x11InterdeviceProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -22,12 +22,52 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\021InterdeviceProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _FILETRANSFER.fields_by_name['filepath']._options = None + _FILETRANSFER.fields_by_name['filepath']._serialized_options = b'\222?\003\010\200\002' + _FILETRANSFER.fields_by_name['filedata']._options = None + _FILETRANSFER.fields_by_name['filedata']._serialized_options = b'\222?\003\010\200 ' + _FILETRANSFER.fields_by_name['message']._options = None + _FILETRANSFER.fields_by_name['message']._serialized_options = b'\222?\003\010\377\001' + _DIRECTORYLISTING.fields_by_name['directory']._options = None + _DIRECTORYLISTING.fields_by_name['directory']._serialized_options = b'\222?\003\010\200\002' + _DIRECTORYLISTING.fields_by_name['filenames']._options = None + _DIRECTORYLISTING.fields_by_name['filenames']._serialized_options = b'\222?\005\020\020p\377\001' + _DIRECTORYLISTING.fields_by_name['message']._options = None + _DIRECTORYLISTING.fields_by_name['message']._serialized_options = b'\222?\003\010\377\001' + _I2CTRANSACTION.fields_by_name['write_data']._options = None + _I2CTRANSACTION.fields_by_name['write_data']._serialized_options = b'\222?\003\010\200\002' + _I2CRESULT.fields_by_name['read_data']._options = None + _I2CRESULT.fields_by_name['read_data']._serialized_options = b'\222?\003\010\200\002' _INTERDEVICEMESSAGE.fields_by_name['nmea']._options = None _INTERDEVICEMESSAGE.fields_by_name['nmea']._serialized_options = b'\222?\003\010\200\010' - _globals['_MESSAGETYPE']._serialized_start=319 - _globals['_MESSAGETYPE']._serialized_end=532 - _globals['_SENSORDATA']._serialized_start=96 - _globals['_SENSORDATA']._serialized_end=211 - _globals['_INTERDEVICEMESSAGE']._serialized_start=213 - _globals['_INTERDEVICEMESSAGE']._serialized_end=316 + _INTERDEVICEMESSAGE.fields_by_name['beep']._options = None + _INTERDEVICEMESSAGE.fields_by_name['beep']._serialized_options = b'\222?\0028\020' + _INTERDEVICEMESSAGE.fields_by_name['i2c_scan_result']._options = None + _INTERDEVICEMESSAGE.fields_by_name['i2c_scan_result']._serialized_options = b'\222?\003\010\200\001' + _globals['_INTERDEVICEVERSION']._serialized_start=1844 + _globals['_INTERDEVICEVERSION']._serialized_end=1934 + _globals['_FILEOPERATION']._serialized_start=1936 + _globals['_FILEOPERATION']._serialized_end=1991 + _globals['_FILESTATUS']._serialized_start=1994 + _globals['_FILESTATUS']._serialized_end=2160 + _globals['_SDCOMMAND']._serialized_start=2162 + _globals['_SDCOMMAND']._serialized_end=2244 + _globals['_FILETRANSFER']._serialized_start=97 + _globals['_FILETRANSFER']._serialized_end=343 + _globals['_DIRECTORYLISTING']._serialized_start=346 + _globals['_DIRECTORYLISTING']._serialized_end=531 + _globals['_I2CTRANSACTION']._serialized_start=533 + _globals['_I2CTRANSACTION']._serialized_end=612 + _globals['_SDCARDINFO']._serialized_start=615 + _globals['_SDCARDINFO']._serialized_end=1017 + _globals['_SDCARDINFO_CARDTYPE']._serialized_start=881 + _globals['_SDCARDINFO_CARDTYPE']._serialized_end=956 + _globals['_SDCARDINFO_FATTYPE']._serialized_start=958 + _globals['_SDCARDINFO_FATTYPE']._serialized_end=1017 + _globals['_I2CRESULT']._serialized_start=1020 + _globals['_I2CRESULT']._serialized_end=1192 + _globals['_I2CRESULT_STATUS']._serialized_start=1115 + _globals['_I2CRESULT_STATUS']._serialized_end=1192 + _globals['_INTERDEVICEMESSAGE']._serialized_start=1195 + _globals['_INTERDEVICEMESSAGE']._serialized_end=1842 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/interdevice_pb2.pyi b/meshtastic/protobuf/interdevice_pb2.pyi index 6e70f9e28..61c66107d 100644 --- a/meshtastic/protobuf/interdevice_pb2.pyi +++ b/meshtastic/protobuf/interdevice_pb2.pyi @@ -4,7 +4,9 @@ isort:skip_file """ import builtins +import collections.abc import google.protobuf.descriptor +import google.protobuf.internal.containers import google.protobuf.internal.enum_type_wrapper import google.protobuf.message import sys @@ -17,89 +19,484 @@ else: DESCRIPTOR: google.protobuf.descriptor.FileDescriptor -class _MessageType: +class _InterdeviceVersion: ValueType = typing.NewType("ValueType", builtins.int) V: typing_extensions.TypeAlias = ValueType -class _MessageTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_MessageType.ValueType], builtins.type): +class _InterdeviceVersionEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_InterdeviceVersion.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 + INTERDEVICE_VERSION_UNSPECIFIED: _InterdeviceVersion.ValueType # 0 + INTERDEVICE_VERSION_CURRENT: _InterdeviceVersion.ValueType # 2 + """Never use 1: ping/pong were bools before the handshake existed, and a + bool true is the same varint on the wire as the number 1, so firmware + predating the handshake would pass it. + """ + +class InterdeviceVersion(_InterdeviceVersion, metaclass=_InterdeviceVersionEnumTypeWrapper): + """Version of the interdevice protocol spoken on the link. Both sides send + theirs in the ping/pong handshake; a peer reporting a different one runs + firmware that does not match and is not talked to. + + On a change that breaks the other side (renumbered fields, changed + semantics, removed messages), raise the value of CURRENT. Do not add + another entry: this enum carries a single constant, not a history. + """ + +INTERDEVICE_VERSION_UNSPECIFIED: InterdeviceVersion.ValueType # 0 +INTERDEVICE_VERSION_CURRENT: InterdeviceVersion.ValueType # 2 +"""Never use 1: ping/pong were bools before the handshake existed, and a +bool true is the same varint on the wire as the number 1, so firmware +predating the handshake would pass it. +""" +global___InterdeviceVersion = InterdeviceVersion + +class _FileOperation: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _FileOperationEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_FileOperation.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + GET: _FileOperation.ValueType # 0 + POST: _FileOperation.ValueType # 1 + PUT: _FileOperation.ValueType # 2 + DELETE: _FileOperation.ValueType # 3 + +class FileOperation(_FileOperation, metaclass=_FileOperationEnumTypeWrapper): + """Defines the supported file operations""" + +GET: FileOperation.ValueType # 0 +POST: FileOperation.ValueType # 1 +PUT: FileOperation.ValueType # 2 +DELETE: FileOperation.ValueType # 3 +global___FileOperation = FileOperation + +class _FileStatus: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _FileStatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_FileStatus.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + FILE_UNSPECIFIED: _FileStatus.ValueType # 0 + FILE_OK: _FileStatus.ValueType # 1 + FILE_BUSY: _FileStatus.ValueType # 2 + """Retry later: the co-processor is doing card maintenance (mount, + free space scan) and cannot serve the request right now + """ + FILE_NO_CARD: _FileStatus.ValueType # 3 + FILE_NOT_FOUND: _FileStatus.ValueType # 4 + FILE_OFFSET_CONFLICT: _FileStatus.ValueType # 5 + """PUT only: offset did not match the current end of the file. file_size + carries the size the file actually has, so the writer can resync (or + recognize its own chunk as already written after a lost response). + """ + FILE_IO_ERROR: _FileStatus.ValueType # 6 + FILE_NOT_A_FILE: _FileStatus.ValueType # 7 + """path is a directory (GET) or not one (listing)""" + +class FileStatus(_FileStatus, metaclass=_FileStatusEnumTypeWrapper): + """Outcome of a file or directory operation. The requester must be able to + tell a transient condition from a definitive one: BUSY is worth another + try, NOT_FOUND is not. + """ + +FILE_UNSPECIFIED: FileStatus.ValueType # 0 +FILE_OK: FileStatus.ValueType # 1 +FILE_BUSY: FileStatus.ValueType # 2 +"""Retry later: the co-processor is doing card maintenance (mount, +free space scan) and cannot serve the request right now +""" +FILE_NO_CARD: FileStatus.ValueType # 3 +FILE_NOT_FOUND: FileStatus.ValueType # 4 +FILE_OFFSET_CONFLICT: FileStatus.ValueType # 5 +"""PUT only: offset did not match the current end of the file. file_size +carries the size the file actually has, so the writer can resync (or +recognize its own chunk as already written after a lost response). +""" +FILE_IO_ERROR: FileStatus.ValueType # 6 +FILE_NOT_A_FILE: FileStatus.ValueType # 7 +"""path is a directory (GET) or not one (listing)""" +global___FileStatus = FileStatus + +class _SdCommand: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _SdCommandEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_SdCommand.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + SD_COMMAND_UNSPECIFIED: _SdCommand.ValueType # 0 + SD_MOUNT: _SdCommand.ValueType # 1 + """mount a card that is in the slot, also after an eject""" + SD_EJECT: _SdCommand.ValueType # 2 + """flush and release the card so it can be pulled safely""" + SD_FORMAT: _SdCommand.ValueType # 3 + """wipe the card and put a fresh FAT on it, then mount it""" + +class SdCommand(_SdCommand, metaclass=_SdCommandEnumTypeWrapper): + """What to do with the SD card of the co-processor""" + +SD_COMMAND_UNSPECIFIED: SdCommand.ValueType # 0 +SD_MOUNT: SdCommand.ValueType # 1 +"""mount a card that is in the slot, also after an eject""" +SD_EJECT: SdCommand.ValueType # 2 +"""flush and release the card so it can be pulled safely""" +SD_FORMAT: SdCommand.ValueType # 3 +"""wipe the card and put a fresh FAT on it, then mount it""" +global___SdCommand = SdCommand @typing.final -class SensorData(google.protobuf.message.Message): +class FileTransfer(google.protobuf.message.Message): + """Message for file operations""" + 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 + OPERATION_FIELD_NUMBER: builtins.int + FILEPATH_FIELD_NUMBER: builtins.int + FILEDATA_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + MESSAGE_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + LENGTH_FIELD_NUMBER: builtins.int + FILE_SIZE_FIELD_NUMBER: builtins.int + operation: global___FileOperation.ValueType + """File operation (GET, POST, PUT, DELETE)""" + filepath: builtins.str + """Path of the file on the SD card""" + filedata: builtins.bytes + """Chunk content (POST/PUT request, GET response)""" + status: global___FileStatus.ValueType + """Response: outcome of the operation""" + message: builtins.str + """Response: human readable detail, may be empty""" + offset: builtins.int + """Byte offset of this chunk within the file (ranged GET/PUT)""" + length: builtins.int + """GET request: number of bytes to read, 0 = max chunk size. A response + carries at most the filedata max_size (see interdevice.options) per + chunk; larger requests are truncated, visible in the filedata length. + """ + file_size: builtins.int + """GET response: total size of the file""" def __init__( self, *, - type: global___MessageType.ValueType = ..., - float_value: builtins.float = ..., - uint32_value: builtins.int = ..., + operation: global___FileOperation.ValueType = ..., + filepath: builtins.str = ..., + filedata: builtins.bytes = ..., + status: global___FileStatus.ValueType = ..., + message: builtins.str = ..., + offset: builtins.int = ..., + length: builtins.int = ..., + file_size: 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: ... + def ClearField(self, field_name: typing.Literal["file_size", b"file_size", "filedata", b"filedata", "filepath", b"filepath", "length", b"length", "message", b"message", "offset", b"offset", "operation", b"operation", "status", b"status"]) -> None: ... -global___SensorData = SensorData +global___FileTransfer = FileTransfer + +@typing.final +class DirectoryListing(google.protobuf.message.Message): + """Message for structured directory listing""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + DIRECTORY_FIELD_NUMBER: builtins.int + FILENAMES_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + MESSAGE_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + directory: builtins.str + """Path of the directory""" + status: global___FileStatus.ValueType + """Response: outcome of the operation""" + message: builtins.str + """Response: human readable detail, may be empty""" + offset: builtins.int + """Request: skip this many entries (paging)""" + total_count: builtins.int + """Response: total number of entries in the directory""" + @property + def filenames(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """One page of entry names, full FAT LFN length. Subdirectories carry a + trailing slash. Note that a name whose directory prefix pushes the + combined path past the FileTransfer.filepath limit cannot round-trip. + Page size is the max_count in interdevice.options; page through with + offset and total_count. + """ + + def __init__( + self, + *, + directory: builtins.str = ..., + filenames: collections.abc.Iterable[builtins.str] | None = ..., + status: global___FileStatus.ValueType = ..., + message: builtins.str = ..., + offset: builtins.int = ..., + total_count: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["directory", b"directory", "filenames", b"filenames", "message", b"message", "offset", b"offset", "status", b"status", "total_count", b"total_count"]) -> None: ... + +global___DirectoryListing = DirectoryListing + +@typing.final +class I2CTransaction(google.protobuf.message.Message): + """A single I2C transaction: an optional write followed by an optional + read with repeated start, matching the TwoWire usage of sensor drivers + (beginTransmission/write.../endTransmission(false)/requestFrom) + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ADDRESS_FIELD_NUMBER: builtins.int + WRITE_DATA_FIELD_NUMBER: builtins.int + READ_LEN_FIELD_NUMBER: builtins.int + address: builtins.int + """7-bit device address""" + write_data: builtins.bytes + """Bytes to write, may be empty""" + read_len: builtins.int + """Number of bytes to read after the write, 0 = write-only. Bounded by + the read_data max_size of I2CResult (see interdevice.options); larger + requests are truncated, visible in the returned byte count. + """ + def __init__( + self, + *, + address: builtins.int = ..., + write_data: builtins.bytes = ..., + read_len: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["address", b"address", "read_len", b"read_len", "write_data", b"write_data"]) -> None: ... + +global___I2CTransaction = I2CTransaction + +@typing.final +class SdCardInfo(google.protobuf.message.Message): + """SD card statistics""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class _CardType: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _CardTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SdCardInfo._CardType.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + NONE: SdCardInfo._CardType.ValueType # 0 + MMC: SdCardInfo._CardType.ValueType # 1 + SD: SdCardInfo._CardType.ValueType # 2 + SDHC: SdCardInfo._CardType.ValueType # 3 + SDXC: SdCardInfo._CardType.ValueType # 4 + UNKNOWN_CARD: SdCardInfo._CardType.ValueType # 5 + + class CardType(_CardType, metaclass=_CardTypeEnumTypeWrapper): ... + NONE: SdCardInfo.CardType.ValueType # 0 + MMC: SdCardInfo.CardType.ValueType # 1 + SD: SdCardInfo.CardType.ValueType # 2 + SDHC: SdCardInfo.CardType.ValueType # 3 + SDXC: SdCardInfo.CardType.ValueType # 4 + UNKNOWN_CARD: SdCardInfo.CardType.ValueType # 5 + + class _FatType: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _FatTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[SdCardInfo._FatType.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + UNKNOWN_FAT: SdCardInfo._FatType.ValueType # 0 + FAT16: SdCardInfo._FatType.ValueType # 1 + FAT32: SdCardInfo._FatType.ValueType # 2 + EXFAT: SdCardInfo._FatType.ValueType # 3 + + class FatType(_FatType, metaclass=_FatTypeEnumTypeWrapper): ... + UNKNOWN_FAT: SdCardInfo.FatType.ValueType # 0 + FAT16: SdCardInfo.FatType.ValueType # 1 + FAT32: SdCardInfo.FatType.ValueType # 2 + EXFAT: SdCardInfo.FatType.ValueType # 3 + + PRESENT_FIELD_NUMBER: builtins.int + CARD_TYPE_FIELD_NUMBER: builtins.int + FAT_TYPE_FIELD_NUMBER: builtins.int + CARD_SIZE_FIELD_NUMBER: builtins.int + USED_BYTES_FIELD_NUMBER: builtins.int + FREE_BYTES_FIELD_NUMBER: builtins.int + STATS_VALID_FIELD_NUMBER: builtins.int + BUSY_FIELD_NUMBER: builtins.int + UNFORMATTED_FIELD_NUMBER: builtins.int + present: builtins.bool + """Card initialized and usable. False while `busy` is set does not mean + there is no card: the co-processor does not know yet. + """ + card_type: global___SdCardInfo.CardType.ValueType + fat_type: global___SdCardInfo.FatType.ValueType + card_size: builtins.int + """Filesystem size in bytes""" + used_bytes: builtins.int + """Used bytes (may be expensive to compute on FAT32)""" + free_bytes: builtins.int + """Free bytes""" + stats_valid: builtins.bool + """used_bytes/free_bytes are only meaningful when true: the scan behind + them runs in the background after mount and can take a while, and a + full card is otherwise indistinguishable from a scan in progress + """ + busy: builtins.bool + """The co-processor is mounting a card right now, so whether one is + present is not decided yet. Ask again rather than concluding the slot + is empty. + """ + unformatted: builtins.bool + """A card answers in the slot but carries no filesystem that could be + mounted (present is false then). Formatting it makes it usable. + """ + def __init__( + self, + *, + present: builtins.bool = ..., + card_type: global___SdCardInfo.CardType.ValueType = ..., + fat_type: global___SdCardInfo.FatType.ValueType = ..., + card_size: builtins.int = ..., + used_bytes: builtins.int = ..., + free_bytes: builtins.int = ..., + stats_valid: builtins.bool = ..., + busy: builtins.bool = ..., + unformatted: builtins.bool = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["busy", b"busy", "card_size", b"card_size", "card_type", b"card_type", "fat_type", b"fat_type", "free_bytes", b"free_bytes", "present", b"present", "stats_valid", b"stats_valid", "unformatted", b"unformatted", "used_bytes", b"used_bytes"]) -> None: ... + +global___SdCardInfo = SdCardInfo + +@typing.final +class I2CResult(google.protobuf.message.Message): + """Result of an I2CTransaction""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class _Status: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _StatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[I2CResult._Status.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + UNSPECIFIED: I2CResult._Status.ValueType # 0 + """Never sent: an all-defaults (e.g. accidentally empty) message must + not decode as a successful transaction + """ + OK: I2CResult._Status.ValueType # 1 + NACK_ADDRESS: I2CResult._Status.ValueType # 2 + NACK_DATA: I2CResult._Status.ValueType # 3 + ERROR: I2CResult._Status.ValueType # 4 + + class Status(_Status, metaclass=_StatusEnumTypeWrapper): ... + UNSPECIFIED: I2CResult.Status.ValueType # 0 + """Never sent: an all-defaults (e.g. accidentally empty) message must + not decode as a successful transaction + """ + OK: I2CResult.Status.ValueType # 1 + NACK_ADDRESS: I2CResult.Status.ValueType # 2 + NACK_DATA: I2CResult.Status.ValueType # 3 + ERROR: I2CResult.Status.ValueType # 4 + + STATUS_FIELD_NUMBER: builtins.int + READ_DATA_FIELD_NUMBER: builtins.int + status: global___I2CResult.Status.ValueType + read_data: builtins.bytes + """Data read from the device, empty for write-only transactions""" + def __init__( + self, + *, + status: global___I2CResult.Status.ValueType = ..., + read_data: builtins.bytes = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["read_data", b"read_data", "status", b"status"]) -> None: ... + +global___I2CResult = I2CResult @typing.final class InterdeviceMessage(google.protobuf.message.Message): + """Main message for interdevice communication""" + DESCRIPTOR: google.protobuf.descriptor.Descriptor + ID_FIELD_NUMBER: builtins.int NMEA_FIELD_NUMBER: builtins.int - SENSOR_FIELD_NUMBER: builtins.int + BEEP_FIELD_NUMBER: builtins.int + I2C_TRANSACTION_FIELD_NUMBER: builtins.int + I2C_RESULT_FIELD_NUMBER: builtins.int + I2C_SCAN_FIELD_NUMBER: builtins.int + I2C_SCAN_RESULT_FIELD_NUMBER: builtins.int + FILE_TRANSFER_FIELD_NUMBER: builtins.int + DIRECTORY_LISTING_FIELD_NUMBER: builtins.int + GET_SD_INFO_FIELD_NUMBER: builtins.int + SD_INFO_FIELD_NUMBER: builtins.int + PING_FIELD_NUMBER: builtins.int + PONG_FIELD_NUMBER: builtins.int + NACK_FIELD_NUMBER: builtins.int + SD_COMMAND_FIELD_NUMBER: builtins.int + id: builtins.int + """Correlates a response with its request: responses echo the id of the + request they answer. 0 for unsolicited messages (e.g. the nmea stream). + """ nmea: builtins.str + beep: builtins.int + i2c_scan: builtins.bool + """Request: scan the secondary I2C bus""" + i2c_scan_result: builtins.bytes + """Response: 7-bit addresses of discovered devices""" + get_sd_info: builtins.bool + """Request: SD card statistics""" + ping: global___InterdeviceVersion.ValueType + """Link liveness probe and version handshake. The receiver answers ping + with pong, echoing the id. Touches no peripherals, so it works with + nothing attached. Both carry the version the sender speaks; a peer + that answers with a different one speaks another protocol and must + not be used. + """ + pong: global___InterdeviceVersion.ValueType + nack: builtins.bool + """Response: the request could not be decoded or is of an unhandled + type, so the requester fails fast instead of burning its timeout. + Echoes the id when known, 0 when the frame was undecodable. Never + sent in reaction to a nack. + """ + sd_command: global___SdCommand.ValueType + """Request: mount the card, or release it so it can be pulled safely. The + co-processor answers with sd_info. Without an eject the card is mounted + on its own and kept mounted; after one it stays released until a mount + is asked for. + """ @property - def sensor(self) -> global___SensorData: ... + def i2c_transaction(self) -> global___I2CTransaction: ... + @property + def i2c_result(self) -> global___I2CResult: ... + @property + def file_transfer(self) -> global___FileTransfer: ... + @property + def directory_listing(self) -> global___DirectoryListing: ... + @property + def sd_info(self) -> global___SdCardInfo: + """Response""" + def __init__( self, *, + id: builtins.int = ..., nmea: builtins.str = ..., - sensor: global___SensorData | None = ..., + beep: builtins.int = ..., + i2c_transaction: global___I2CTransaction | None = ..., + i2c_result: global___I2CResult | None = ..., + i2c_scan: builtins.bool = ..., + i2c_scan_result: builtins.bytes = ..., + file_transfer: global___FileTransfer | None = ..., + directory_listing: global___DirectoryListing | None = ..., + get_sd_info: builtins.bool = ..., + sd_info: global___SdCardInfo | None = ..., + ping: global___InterdeviceVersion.ValueType = ..., + pong: global___InterdeviceVersion.ValueType = ..., + nack: builtins.bool = ..., + sd_command: global___SdCommand.ValueType = ..., ) -> 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: ... + def HasField(self, field_name: typing.Literal["beep", b"beep", "data", b"data", "directory_listing", b"directory_listing", "file_transfer", b"file_transfer", "get_sd_info", b"get_sd_info", "i2c_result", b"i2c_result", "i2c_scan", b"i2c_scan", "i2c_scan_result", b"i2c_scan_result", "i2c_transaction", b"i2c_transaction", "nack", b"nack", "nmea", b"nmea", "ping", b"ping", "pong", b"pong", "sd_command", b"sd_command", "sd_info", b"sd_info"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["beep", b"beep", "data", b"data", "directory_listing", b"directory_listing", "file_transfer", b"file_transfer", "get_sd_info", b"get_sd_info", "i2c_result", b"i2c_result", "i2c_scan", b"i2c_scan", "i2c_scan_result", b"i2c_scan_result", "i2c_transaction", b"i2c_transaction", "id", b"id", "nack", b"nack", "nmea", b"nmea", "ping", b"ping", "pong", b"pong", "sd_command", b"sd_command", "sd_info", b"sd_info"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["data", b"data"]) -> typing.Literal["nmea", "beep", "i2c_transaction", "i2c_result", "i2c_scan", "i2c_scan_result", "file_transfer", "directory_listing", "get_sd_info", "sd_info", "ping", "pong", "nack", "sd_command"] | None: ... global___InterdeviceMessage = InterdeviceMessage diff --git a/meshtastic/protobuf/localonly_pb2.py b/meshtastic/protobuf/localonly_pb2.py index b9bb26990..6a34042f4 100644 --- a/meshtastic/protobuf/localonly_pb2.py +++ b/meshtastic/protobuf/localonly_pb2.py @@ -15,7 +15,7 @@ from meshtastic.protobuf import module_config_pb2 as meshtastic_dot_protobuf_dot_module__config__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/localonly.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/config.proto\x1a\'meshtastic/protobuf/module_config.proto\"\xfa\x03\n\x0bLocalConfig\x12\x38\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfig\x12<\n\x08position\x18\x02 \x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfig\x12\x36\n\x05power\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfig\x12:\n\x07network\x18\x04 \x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfig\x12:\n\x07\x64isplay\x18\x05 \x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfig\x12\x34\n\x04lora\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfig\x12>\n\tbluetooth\x18\x07 \x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfig\x12\x0f\n\x07version\x18\x08 \x01(\r\x12<\n\x08security\x18\t \x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfig\"\xcf\t\n\x11LocalModuleConfig\x12:\n\x04mqtt\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.ModuleConfig.MQTTConfig\x12>\n\x06serial\x18\x02 \x01(\x0b\x32..meshtastic.protobuf.ModuleConfig.SerialConfig\x12[\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32<.meshtastic.protobuf.ModuleConfig.ExternalNotificationConfig\x12K\n\rstore_forward\x18\x04 \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.StoreForwardConfig\x12\x45\n\nrange_test\x18\x05 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.RangeTestConfig\x12\x44\n\ttelemetry\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.TelemetryConfig\x12M\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.CannedMessageConfig\x12<\n\x05\x61udio\x18\t \x01(\x0b\x32-.meshtastic.protobuf.ModuleConfig.AudioConfig\x12O\n\x0fremote_hardware\x18\n \x01(\x0b\x32\x36.meshtastic.protobuf.ModuleConfig.RemoteHardwareConfig\x12K\n\rneighbor_info\x18\x0b \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.NeighborInfoConfig\x12Q\n\x10\x61mbient_lighting\x18\x0c \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.AmbientLightingConfig\x12Q\n\x10\x64\x65tection_sensor\x18\r \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.DetectionSensorConfig\x12\x46\n\npaxcounter\x18\x0e \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.PaxcounterConfig\x12L\n\rstatusmessage\x18\x0f \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.StatusMessageConfig\x12U\n\x12traffic_management\x18\x10 \x01(\x0b\x32\x39.meshtastic.protobuf.ModuleConfig.TrafficManagementConfig\x12\x38\n\x03tak\x18\x11 \x01(\x0b\x32+.meshtastic.protobuf.ModuleConfig.TAKConfig\x12\x0f\n\x07version\x18\x08 \x01(\rBe\n\x14org.meshtastic.protoB\x0fLocalOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/localonly.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/config.proto\x1a\'meshtastic/protobuf/module_config.proto\"\xfa\x03\n\x0bLocalConfig\x12\x38\n\x06\x64\x65vice\x18\x01 \x01(\x0b\x32(.meshtastic.protobuf.Config.DeviceConfig\x12<\n\x08position\x18\x02 \x01(\x0b\x32*.meshtastic.protobuf.Config.PositionConfig\x12\x36\n\x05power\x18\x03 \x01(\x0b\x32\'.meshtastic.protobuf.Config.PowerConfig\x12:\n\x07network\x18\x04 \x01(\x0b\x32).meshtastic.protobuf.Config.NetworkConfig\x12:\n\x07\x64isplay\x18\x05 \x01(\x0b\x32).meshtastic.protobuf.Config.DisplayConfig\x12\x34\n\x04lora\x18\x06 \x01(\x0b\x32&.meshtastic.protobuf.Config.LoRaConfig\x12>\n\tbluetooth\x18\x07 \x01(\x0b\x32+.meshtastic.protobuf.Config.BluetoothConfig\x12\x0f\n\x07version\x18\x08 \x01(\r\x12<\n\x08security\x18\t \x01(\x0b\x32*.meshtastic.protobuf.Config.SecurityConfig\"\x98\n\n\x11LocalModuleConfig\x12:\n\x04mqtt\x18\x01 \x01(\x0b\x32,.meshtastic.protobuf.ModuleConfig.MQTTConfig\x12>\n\x06serial\x18\x02 \x01(\x0b\x32..meshtastic.protobuf.ModuleConfig.SerialConfig\x12[\n\x15\x65xternal_notification\x18\x03 \x01(\x0b\x32<.meshtastic.protobuf.ModuleConfig.ExternalNotificationConfig\x12K\n\rstore_forward\x18\x04 \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.StoreForwardConfig\x12\x45\n\nrange_test\x18\x05 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.RangeTestConfig\x12\x44\n\ttelemetry\x18\x06 \x01(\x0b\x32\x31.meshtastic.protobuf.ModuleConfig.TelemetryConfig\x12M\n\x0e\x63\x61nned_message\x18\x07 \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.CannedMessageConfig\x12<\n\x05\x61udio\x18\t \x01(\x0b\x32-.meshtastic.protobuf.ModuleConfig.AudioConfig\x12O\n\x0fremote_hardware\x18\n \x01(\x0b\x32\x36.meshtastic.protobuf.ModuleConfig.RemoteHardwareConfig\x12K\n\rneighbor_info\x18\x0b \x01(\x0b\x32\x34.meshtastic.protobuf.ModuleConfig.NeighborInfoConfig\x12Q\n\x10\x61mbient_lighting\x18\x0c \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.AmbientLightingConfig\x12Q\n\x10\x64\x65tection_sensor\x18\r \x01(\x0b\x32\x37.meshtastic.protobuf.ModuleConfig.DetectionSensorConfig\x12\x46\n\npaxcounter\x18\x0e \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.PaxcounterConfig\x12L\n\rstatusmessage\x18\x0f \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.StatusMessageConfig\x12U\n\x12traffic_management\x18\x10 \x01(\x0b\x32\x39.meshtastic.protobuf.ModuleConfig.TrafficManagementConfig\x12\x38\n\x03tak\x18\x11 \x01(\x0b\x32+.meshtastic.protobuf.ModuleConfig.TAKConfig\x12G\n\x0bmesh_beacon\x18\x12 \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.MeshBeaconConfig\x12\x0f\n\x07version\x18\x08 \x01(\rBe\n\x14org.meshtastic.protoB\x0fLocalOnlyProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -26,5 +26,5 @@ _globals['_LOCALCONFIG']._serialized_start=136 _globals['_LOCALCONFIG']._serialized_end=642 _globals['_LOCALMODULECONFIG']._serialized_start=645 - _globals['_LOCALMODULECONFIG']._serialized_end=1876 + _globals['_LOCALMODULECONFIG']._serialized_end=1949 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/localonly_pb2.pyi b/meshtastic/protobuf/localonly_pb2.pyi index b5284ac8d..04ae9d490 100644 --- a/meshtastic/protobuf/localonly_pb2.pyi +++ b/meshtastic/protobuf/localonly_pb2.pyi @@ -122,6 +122,7 @@ class LocalModuleConfig(google.protobuf.message.Message): STATUSMESSAGE_FIELD_NUMBER: builtins.int TRAFFIC_MANAGEMENT_FIELD_NUMBER: builtins.int TAK_FIELD_NUMBER: builtins.int + MESH_BEACON_FIELD_NUMBER: builtins.int VERSION_FIELD_NUMBER: builtins.int version: builtins.int """ @@ -225,6 +226,12 @@ class LocalModuleConfig(google.protobuf.message.Message): TAK Config """ + @property + def mesh_beacon(self) -> meshtastic.protobuf.module_config_pb2.ModuleConfig.MeshBeaconConfig: + """ + MeshBeacon Config + """ + def __init__( self, *, @@ -244,9 +251,10 @@ class LocalModuleConfig(google.protobuf.message.Message): statusmessage: meshtastic.protobuf.module_config_pb2.ModuleConfig.StatusMessageConfig | None = ..., traffic_management: meshtastic.protobuf.module_config_pb2.ModuleConfig.TrafficManagementConfig | None = ..., tak: meshtastic.protobuf.module_config_pb2.ModuleConfig.TAKConfig | None = ..., + mesh_beacon: meshtastic.protobuf.module_config_pb2.ModuleConfig.MeshBeaconConfig | None = ..., version: builtins.int = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "statusmessage", b"statusmessage", "store_forward", b"store_forward", "tak", b"tak", "telemetry", b"telemetry", "traffic_management", b"traffic_management"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "statusmessage", b"statusmessage", "store_forward", b"store_forward", "tak", b"tak", "telemetry", b"telemetry", "traffic_management", b"traffic_management", "version", b"version"]) -> None: ... + def HasField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mesh_beacon", b"mesh_beacon", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "statusmessage", b"statusmessage", "store_forward", b"store_forward", "tak", b"tak", "telemetry", b"telemetry", "traffic_management", b"traffic_management"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mesh_beacon", b"mesh_beacon", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "statusmessage", b"statusmessage", "store_forward", b"store_forward", "tak", b"tak", "telemetry", b"telemetry", "traffic_management", b"traffic_management", "version", b"version"]) -> None: ... global___LocalModuleConfig = LocalModuleConfig diff --git a/meshtastic/protobuf/lorawan_bridge_pb2.py b/meshtastic/protobuf/lorawan_bridge_pb2.py new file mode 100644 index 000000000..7c183a04b --- /dev/null +++ b/meshtastic/protobuf/lorawan_bridge_pb2.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/lorawan_bridge.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 meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(meshtastic/protobuf/lorawan_bridge.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xa3\t\n\rLoRaWANBridge\x12;\n\x06uplink\x18\x01 \x01(\x0b\x32).meshtastic.protobuf.LoRaWANBridge.UplinkH\x00\x12?\n\x08\x64ownlink\x18\x02 \x01(\x0b\x32+.meshtastic.protobuf.LoRaWANBridge.DownlinkH\x00\x12@\n\ttx_result\x18\x03 \x01(\x0b\x32+.meshtastic.protobuf.LoRaWANBridge.TxResultH\x00\x12@\n\x05\x63hunk\x18\x04 \x01(\x0b\x32/.meshtastic.protobuf.LoRaWANBridge.PayloadChunkH\x00\x1a\xe1\x01\n\x06Uplink\x12\x0f\n\x07\x66req_hz\x18\x01 \x01(\x07\x12\x0c\n\x04tmst\x18\x02 \x01(\x07\x12\x17\n\x08rssi_x10\x18\x03 \x01(\x11\x42\x05\x92?\x02\x38\x10\x12\x16\n\x07snr_x10\x18\x04 \x01(\x11\x42\x05\x92?\x02\x38\x10\x12\x1b\n\x0cradio_params\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1a\n\x0b\x66sk_bitrate\x18\t \x01(\rB\x05\x92?\x02\x38\x10\x12\x17\n\x07payload\x18\x06 \x01(\x0c\x42\x06\x92?\x03\x08\xb7\x01\x12\x19\n\npayload_id\x18\x07 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1a\n\x0b\x63hunk_count\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x1a\x9a\x02\n\x08\x44ownlink\x12\x0f\n\x07\x66req_hz\x18\x01 \x01(\x07\x12\x0c\n\x04tmst\x18\x02 \x01(\x07\x12\x1b\n\x0cradio_params\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x18\n\tpower_dbm\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12\x11\n\timmediate\x18\x05 \x01(\x08\x12\x17\n\x0finvert_polarity\x18\x06 \x01(\x08\x12\x0e\n\x06no_crc\x18\x07 \x01(\x08\x12\x11\n\tmay_defer\x18\x08 \x01(\x08\x12\x19\n\nrequest_id\x18\x0c \x01(\rB\x05\x92?\x02\x38\x08\x12\x17\n\x07payload\x18\t \x01(\x0c\x42\x06\x92?\x03\x08\xb7\x01\x12\x19\n\npayload_id\x18\n \x01(\rB\x05\x92?\x02\x38\x08\x12\x1a\n\x0b\x63hunk_count\x18\x0b \x01(\rB\x05\x92?\x02\x38\x08\x1a\x64\n\x0cPayloadChunk\x12\x19\n\npayload_id\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1a\n\x0b\x63hunk_index\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1d\n\rpayload_chunk\x18\x03 \x01(\x0c\x42\x06\x92?\x03\x08\xb7\x01\x1a\x9d\x02\n\x08TxResult\x12\x0c\n\x04tmst\x18\x01 \x01(\x07\x12\x42\n\x06status\x18\x02 \x01(\x0e\x32\x32.meshtastic.protobuf.LoRaWANBridge.TxResult.Status\x12\x19\n\nrequest_id\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\"\xa3\x01\n\x06Status\x12\x08\n\x04NONE\x10\x00\x12\x0c\n\x08TOO_LATE\x10\x01\x12\r\n\tTOO_EARLY\x10\x02\x12\x14\n\x10\x43OLLISION_PACKET\x10\x03\x12\x14\n\x10\x43OLLISION_BEACON\x10\x04\x12\x0b\n\x07TX_FREQ\x10\x05\x12\x0c\n\x08TX_POWER\x10\x06\x12\x10\n\x0cGPS_UNLOCKED\x10\x07\x12\x0c\n\x08\x44\x45\x46\x45RRED\x10\x08\x12\x0b\n\x07\x44ROPPED\x10\tB\t\n\x07variantBi\n\x14org.meshtastic.protoB\x13LoRaWANBridgeProtosZ\"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.lorawan_bridge_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\023LoRaWANBridgeProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _LORAWANBRIDGE_UPLINK.fields_by_name['rssi_x10']._options = None + _LORAWANBRIDGE_UPLINK.fields_by_name['rssi_x10']._serialized_options = b'\222?\0028\020' + _LORAWANBRIDGE_UPLINK.fields_by_name['snr_x10']._options = None + _LORAWANBRIDGE_UPLINK.fields_by_name['snr_x10']._serialized_options = b'\222?\0028\020' + _LORAWANBRIDGE_UPLINK.fields_by_name['radio_params']._options = None + _LORAWANBRIDGE_UPLINK.fields_by_name['radio_params']._serialized_options = b'\222?\0028\010' + _LORAWANBRIDGE_UPLINK.fields_by_name['fsk_bitrate']._options = None + _LORAWANBRIDGE_UPLINK.fields_by_name['fsk_bitrate']._serialized_options = b'\222?\0028\020' + _LORAWANBRIDGE_UPLINK.fields_by_name['payload']._options = None + _LORAWANBRIDGE_UPLINK.fields_by_name['payload']._serialized_options = b'\222?\003\010\267\001' + _LORAWANBRIDGE_UPLINK.fields_by_name['payload_id']._options = None + _LORAWANBRIDGE_UPLINK.fields_by_name['payload_id']._serialized_options = b'\222?\0028\010' + _LORAWANBRIDGE_UPLINK.fields_by_name['chunk_count']._options = None + _LORAWANBRIDGE_UPLINK.fields_by_name['chunk_count']._serialized_options = b'\222?\0028\010' + _LORAWANBRIDGE_DOWNLINK.fields_by_name['radio_params']._options = None + _LORAWANBRIDGE_DOWNLINK.fields_by_name['radio_params']._serialized_options = b'\222?\0028\010' + _LORAWANBRIDGE_DOWNLINK.fields_by_name['power_dbm']._options = None + _LORAWANBRIDGE_DOWNLINK.fields_by_name['power_dbm']._serialized_options = b'\222?\0028\010' + _LORAWANBRIDGE_DOWNLINK.fields_by_name['request_id']._options = None + _LORAWANBRIDGE_DOWNLINK.fields_by_name['request_id']._serialized_options = b'\222?\0028\010' + _LORAWANBRIDGE_DOWNLINK.fields_by_name['payload']._options = None + _LORAWANBRIDGE_DOWNLINK.fields_by_name['payload']._serialized_options = b'\222?\003\010\267\001' + _LORAWANBRIDGE_DOWNLINK.fields_by_name['payload_id']._options = None + _LORAWANBRIDGE_DOWNLINK.fields_by_name['payload_id']._serialized_options = b'\222?\0028\010' + _LORAWANBRIDGE_DOWNLINK.fields_by_name['chunk_count']._options = None + _LORAWANBRIDGE_DOWNLINK.fields_by_name['chunk_count']._serialized_options = b'\222?\0028\010' + _LORAWANBRIDGE_PAYLOADCHUNK.fields_by_name['payload_id']._options = None + _LORAWANBRIDGE_PAYLOADCHUNK.fields_by_name['payload_id']._serialized_options = b'\222?\0028\010' + _LORAWANBRIDGE_PAYLOADCHUNK.fields_by_name['chunk_index']._options = None + _LORAWANBRIDGE_PAYLOADCHUNK.fields_by_name['chunk_index']._serialized_options = b'\222?\0028\010' + _LORAWANBRIDGE_PAYLOADCHUNK.fields_by_name['payload_chunk']._options = None + _LORAWANBRIDGE_PAYLOADCHUNK.fields_by_name['payload_chunk']._serialized_options = b'\222?\003\010\267\001' + _LORAWANBRIDGE_TXRESULT.fields_by_name['request_id']._options = None + _LORAWANBRIDGE_TXRESULT.fields_by_name['request_id']._serialized_options = b'\222?\0028\010' + _globals['_LORAWANBRIDGE']._serialized_start=100 + _globals['_LORAWANBRIDGE']._serialized_end=1287 + _globals['_LORAWANBRIDGE_UPLINK']._serialized_start=376 + _globals['_LORAWANBRIDGE_UPLINK']._serialized_end=601 + _globals['_LORAWANBRIDGE_DOWNLINK']._serialized_start=604 + _globals['_LORAWANBRIDGE_DOWNLINK']._serialized_end=886 + _globals['_LORAWANBRIDGE_PAYLOADCHUNK']._serialized_start=888 + _globals['_LORAWANBRIDGE_PAYLOADCHUNK']._serialized_end=988 + _globals['_LORAWANBRIDGE_TXRESULT']._serialized_start=991 + _globals['_LORAWANBRIDGE_TXRESULT']._serialized_end=1276 + _globals['_LORAWANBRIDGE_TXRESULT_STATUS']._serialized_start=1113 + _globals['_LORAWANBRIDGE_TXRESULT_STATUS']._serialized_end=1276 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/lorawan_bridge_pb2.pyi b/meshtastic/protobuf/lorawan_bridge_pb2.pyi new file mode 100644 index 000000000..82f8eac4b --- /dev/null +++ b/meshtastic/protobuf/lorawan_bridge_pb2.pyi @@ -0,0 +1,329 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import google.protobuf.descriptor +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message +import sys +import typing + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +@typing.final +class LoRaWANBridge(google.protobuf.message.Message): + """ + Payload for LORAWAN_BRIDGE packets. Tunnels raw LoRaWAN PHY payloads and their + RF metadata so a gateway can reach a network server over a mesh. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + @typing.final + class Uplink(google.protobuf.message.Message): + """ + An uplink heard by the gateway, travelling towards the network server. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FREQ_HZ_FIELD_NUMBER: builtins.int + TMST_FIELD_NUMBER: builtins.int + RSSI_X10_FIELD_NUMBER: builtins.int + SNR_X10_FIELD_NUMBER: builtins.int + RADIO_PARAMS_FIELD_NUMBER: builtins.int + FSK_BITRATE_FIELD_NUMBER: builtins.int + PAYLOAD_FIELD_NUMBER: builtins.int + PAYLOAD_ID_FIELD_NUMBER: builtins.int + CHUNK_COUNT_FIELD_NUMBER: builtins.int + freq_hz: builtins.int + """ + Receive frequency in Hz. + """ + tmst: builtins.int + """ + Concentrator receive timestamp in microseconds. Free running, wraps about + every 72 minutes. + """ + rssi_x10: builtins.int + """ + Received signal strength in tenths of a dBm. Fits signed 16 bit. + """ + snr_x10: builtins.int + """ + Signal to noise ratio in tenths of a dB. Fits signed 16 bit. + """ + radio_params: builtins.int + """ + Packed radio settings, 0 to 255. Meaningless when fsk_bitrate is set. + bits 7-5 0 to 7 for SF5 to SF12 + bits 4-2 bandwidth in kHz: 0 125, 1 250, 2 500, 3 203.125, 4 406.25, + 5 812.5, 6 1625, 7 reserved. Codes 0 to 2 are the sub-GHz set + and 3 to 6 the 2.4 GHz set; the two do not overlap. Any future + bandwidth takes the next free code rather than sorting in. + bits 1-0 0 to 3 for 4/5 to 4/8 + """ + fsk_bitrate: builtins.int + """ + FSK bit rate in bits per second. Non-zero only for an FSK frame, in which + case radio_params does not apply. Fits unsigned 16 bit. + """ + payload: builtins.bytes + """ + PHY payload, or its first part when chunk_count is 2. + """ + payload_id: builtins.int + """ + Groups this head with its continuation. 1 to 255, or 0 when not chunked. + """ + chunk_count: builtins.int + """ + 0 when the frame fits one packet, otherwise 2. + """ + def __init__( + self, + *, + freq_hz: builtins.int = ..., + tmst: builtins.int = ..., + rssi_x10: builtins.int = ..., + snr_x10: builtins.int = ..., + radio_params: builtins.int = ..., + fsk_bitrate: builtins.int = ..., + payload: builtins.bytes = ..., + payload_id: builtins.int = ..., + chunk_count: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["chunk_count", b"chunk_count", "freq_hz", b"freq_hz", "fsk_bitrate", b"fsk_bitrate", "payload", b"payload", "payload_id", b"payload_id", "radio_params", b"radio_params", "rssi_x10", b"rssi_x10", "snr_x10", b"snr_x10", "tmst", b"tmst"]) -> None: ... + + @typing.final + class Downlink(google.protobuf.message.Message): + """ + A downlink from the network server, travelling towards the gateway. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + FREQ_HZ_FIELD_NUMBER: builtins.int + TMST_FIELD_NUMBER: builtins.int + RADIO_PARAMS_FIELD_NUMBER: builtins.int + POWER_DBM_FIELD_NUMBER: builtins.int + IMMEDIATE_FIELD_NUMBER: builtins.int + INVERT_POLARITY_FIELD_NUMBER: builtins.int + NO_CRC_FIELD_NUMBER: builtins.int + MAY_DEFER_FIELD_NUMBER: builtins.int + REQUEST_ID_FIELD_NUMBER: builtins.int + PAYLOAD_FIELD_NUMBER: builtins.int + PAYLOAD_ID_FIELD_NUMBER: builtins.int + CHUNK_COUNT_FIELD_NUMBER: builtins.int + freq_hz: builtins.int + """ + Transmit frequency in Hz. + """ + tmst: builtins.int + """ + Concentrator timestamp to transmit at. Ignored when immediate is set. + """ + radio_params: builtins.int + """ + Packed radio settings, encoded as in Uplink.radio_params. FSK downlink is + not supported, so there is no bit rate or frequency deviation here. + """ + power_dbm: builtins.int + """ + Transmit power in dBm, 0 to 255. The gateway clamps it to its region. + """ + immediate: builtins.bool + """ + Transmit as soon as possible instead of at tmst. Used for Class C. + """ + invert_polarity: builtins.bool + """ + Invert LoRa polarity. True for every LoRaWAN downlink. + """ + no_crc: builtins.bool + """ + Disable the physical layer CRC. + """ + may_defer: builtins.bool + """ + Allow the gateway to send this in a later receive window if it arrives too + late. Leave clear for anything tied to a specific uplink. + """ + request_id: builtins.int + """ + Identifies this downlink so its TxResult can be matched to it. 1 to 255. + """ + payload: builtins.bytes + """ + PHY payload, or its first part when chunk_count is 2. + """ + payload_id: builtins.int + """ + Groups this head with its continuation. 1 to 255, or 0 when not chunked. + """ + chunk_count: builtins.int + """ + 0 when the frame fits one packet, otherwise 2. + """ + def __init__( + self, + *, + freq_hz: builtins.int = ..., + tmst: builtins.int = ..., + radio_params: builtins.int = ..., + power_dbm: builtins.int = ..., + immediate: builtins.bool = ..., + invert_polarity: builtins.bool = ..., + no_crc: builtins.bool = ..., + may_defer: builtins.bool = ..., + request_id: builtins.int = ..., + payload: builtins.bytes = ..., + payload_id: builtins.int = ..., + chunk_count: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["chunk_count", b"chunk_count", "freq_hz", b"freq_hz", "immediate", b"immediate", "invert_polarity", b"invert_polarity", "may_defer", b"may_defer", "no_crc", b"no_crc", "payload", b"payload", "payload_id", b"payload_id", "power_dbm", b"power_dbm", "radio_params", b"radio_params", "request_id", b"request_id", "tmst", b"tmst"]) -> None: ... + + @typing.final + class PayloadChunk(google.protobuf.message.Message): + """ + The remainder of a chunked Uplink or Downlink. Carries no RF metadata. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PAYLOAD_ID_FIELD_NUMBER: builtins.int + CHUNK_INDEX_FIELD_NUMBER: builtins.int + PAYLOAD_CHUNK_FIELD_NUMBER: builtins.int + payload_id: builtins.int + """ + Matches payload_id in the head message. Reassembly keys on the sending + node and this value. + """ + chunk_index: builtins.int + """ + Position of this chunk. Always 1. + """ + payload_chunk: builtins.bytes + """ + This part of the PHY payload. + """ + def __init__( + self, + *, + payload_id: builtins.int = ..., + chunk_index: builtins.int = ..., + payload_chunk: builtins.bytes = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["chunk_index", b"chunk_index", "payload_chunk", b"payload_chunk", "payload_id", b"payload_id"]) -> None: ... + + @typing.final + class TxResult(google.protobuf.message.Message): + """ + The outcome of a downlink, reported back towards the network server. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class _Status: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _StatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[LoRaWANBridge.TxResult._Status.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + NONE: LoRaWANBridge.TxResult._Status.ValueType # 0 + TOO_LATE: LoRaWANBridge.TxResult._Status.ValueType # 1 + TOO_EARLY: LoRaWANBridge.TxResult._Status.ValueType # 2 + COLLISION_PACKET: LoRaWANBridge.TxResult._Status.ValueType # 3 + COLLISION_BEACON: LoRaWANBridge.TxResult._Status.ValueType # 4 + TX_FREQ: LoRaWANBridge.TxResult._Status.ValueType # 5 + TX_POWER: LoRaWANBridge.TxResult._Status.ValueType # 6 + GPS_UNLOCKED: LoRaWANBridge.TxResult._Status.ValueType # 7 + DEFERRED: LoRaWANBridge.TxResult._Status.ValueType # 8 + """ + Held by the gateway for a later receive window. + """ + DROPPED: LoRaWANBridge.TxResult._Status.ValueType # 9 + """ + Discarded, either undeferrable or refused by an authorization check. + """ + + class Status(_Status, metaclass=_StatusEnumTypeWrapper): + """ + Values 0 to 7 mirror the Semtech TX_ACK error field. Keep every value non + negative; enums encode as int32. + """ + + NONE: LoRaWANBridge.TxResult.Status.ValueType # 0 + TOO_LATE: LoRaWANBridge.TxResult.Status.ValueType # 1 + TOO_EARLY: LoRaWANBridge.TxResult.Status.ValueType # 2 + COLLISION_PACKET: LoRaWANBridge.TxResult.Status.ValueType # 3 + COLLISION_BEACON: LoRaWANBridge.TxResult.Status.ValueType # 4 + TX_FREQ: LoRaWANBridge.TxResult.Status.ValueType # 5 + TX_POWER: LoRaWANBridge.TxResult.Status.ValueType # 6 + GPS_UNLOCKED: LoRaWANBridge.TxResult.Status.ValueType # 7 + DEFERRED: LoRaWANBridge.TxResult.Status.ValueType # 8 + """ + Held by the gateway for a later receive window. + """ + DROPPED: LoRaWANBridge.TxResult.Status.ValueType # 9 + """ + Discarded, either undeferrable or refused by an authorization check. + """ + + TMST_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + REQUEST_ID_FIELD_NUMBER: builtins.int + tmst: builtins.int + """ + The tmst the downlink was scheduled for. Zero when it was immediate, so + diagnostic only; correlate on request_id. + """ + status: global___LoRaWANBridge.TxResult.Status.ValueType + """ + What happened to it. + """ + request_id: builtins.int + """ + Echoes Downlink.request_id. + """ + def __init__( + self, + *, + tmst: builtins.int = ..., + status: global___LoRaWANBridge.TxResult.Status.ValueType = ..., + request_id: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["request_id", b"request_id", "status", b"status", "tmst", b"tmst"]) -> None: ... + + UPLINK_FIELD_NUMBER: builtins.int + DOWNLINK_FIELD_NUMBER: builtins.int + TX_RESULT_FIELD_NUMBER: builtins.int + CHUNK_FIELD_NUMBER: builtins.int + @property + def uplink(self) -> global___LoRaWANBridge.Uplink: ... + @property + def downlink(self) -> global___LoRaWANBridge.Downlink: ... + @property + def tx_result(self) -> global___LoRaWANBridge.TxResult: ... + @property + def chunk(self) -> global___LoRaWANBridge.PayloadChunk: ... + def __init__( + self, + *, + uplink: global___LoRaWANBridge.Uplink | None = ..., + downlink: global___LoRaWANBridge.Downlink | None = ..., + tx_result: global___LoRaWANBridge.TxResult | None = ..., + chunk: global___LoRaWANBridge.PayloadChunk | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["chunk", b"chunk", "downlink", b"downlink", "tx_result", b"tx_result", "uplink", b"uplink", "variant", b"variant"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["chunk", b"chunk", "downlink", b"downlink", "tx_result", b"tx_result", "uplink", b"uplink", "variant", b"variant"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["variant", b"variant"]) -> typing.Literal["uplink", "downlink", "tx_result", "chunk"] | None: ... + +global___LoRaWANBridge = LoRaWANBridge diff --git a/meshtastic/protobuf/mesh_beacon_pb2.py b/meshtastic/protobuf/mesh_beacon_pb2.py new file mode 100644 index 000000000..1ae8dc619 --- /dev/null +++ b/meshtastic/protobuf/mesh_beacon_pb2.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: meshtastic/protobuf/mesh_beacon.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 meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2 +from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2 +from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%meshtastic/protobuf/mesh_beacon.proto\x12\x13meshtastic.protobuf\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a meshtastic/protobuf/nanopb.proto\"\xc6\x02\n\nMeshBeacon\x12\x16\n\x07message\x18\x01 \x01(\tB\x05\x92?\x02\x08=\x12;\n\roffer_channel\x18\x02 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12G\n\x0coffer_region\x18\x03 \x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12M\n\x0coffer_preset\x18\x04 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPresetH\x00\x88\x01\x01\x12!\n\x14offer_frequency_slot\x18\x05 \x01(\rH\x01\x88\x01\x01\x42\x0f\n\r_offer_presetB\x17\n\x15_offer_frequency_slotBf\n\x14org.meshtastic.protoB\x10MeshBeaconProtosZ\"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.mesh_beacon_pb2', _globals) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\020MeshBeaconProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _MESHBEACON.fields_by_name['message']._options = None + _MESHBEACON.fields_by_name['message']._serialized_options = b'\222?\002\010=' + _globals['_MESHBEACON']._serialized_start=166 + _globals['_MESHBEACON']._serialized_end=492 +# @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/mesh_beacon_pb2.pyi b/meshtastic/protobuf/mesh_beacon_pb2.pyi new file mode 100644 index 000000000..42353d88b --- /dev/null +++ b/meshtastic/protobuf/mesh_beacon_pb2.pyi @@ -0,0 +1,77 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +""" + +import builtins +import google.protobuf.descriptor +import google.protobuf.message +import meshtastic.protobuf.channel_pb2 +import meshtastic.protobuf.config_pb2 +import typing + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +@typing.final +class MeshBeacon(google.protobuf.message.Message): + """ + Payload for MESH_BEACON_APP packets. + Periodically broadcast by nodes in beacon mode. + Listeners deliver the text message to the local inbox and cache any offered + channel/preset for the client app to act on - the firmware never auto-applies them. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGE_FIELD_NUMBER: builtins.int + OFFER_CHANNEL_FIELD_NUMBER: builtins.int + OFFER_REGION_FIELD_NUMBER: builtins.int + OFFER_PRESET_FIELD_NUMBER: builtins.int + OFFER_FREQUENCY_SLOT_FIELD_NUMBER: builtins.int + message: builtins.str + """ + Human-readable beacon message. Max 100 bytes enforced by firmware on send. + """ + offer_region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType + """ + Optional region being advertised alongside offer_preset. + """ + offer_preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType + """ + Optional modem preset being advertised. + Combined with offer_region, tells a client "there is a mesh on this preset/region". + """ + offer_frequency_slot: builtins.int + """ + Frequency slot this mesh uses, 1-based, matching Config.LoRaConfig.channel_num. + OMITTED when a receiver can derive the slot itself from offer_region, offer_channel's + name and offer_preset - an unset offer_preset means the region's default preset. That + covers both a region with a mandated slot and a mesh on the default name hash. + PRESENT means this mesh deliberately deviates from what derivation would produce; a + client should still validate the result against its own region before offering to join. + Do not send 0 - it is the same as omitting the field. + """ + @property + def offer_channel(self) -> meshtastic.protobuf.channel_pb2.ChannelSettings: + """ + Optional channel (name + PSK) being advertised to listening clients. + A client app may offer to switch the user to this channel; firmware never applies it automatically. + """ + + def __init__( + self, + *, + message: builtins.str = ..., + offer_channel: meshtastic.protobuf.channel_pb2.ChannelSettings | None = ..., + offer_region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType = ..., + offer_preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType | None = ..., + offer_frequency_slot: builtins.int | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["_offer_frequency_slot", b"_offer_frequency_slot", "_offer_preset", b"_offer_preset", "offer_channel", b"offer_channel", "offer_frequency_slot", b"offer_frequency_slot", "offer_preset", b"offer_preset"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_offer_frequency_slot", b"_offer_frequency_slot", "_offer_preset", b"_offer_preset", "message", b"message", "offer_channel", b"offer_channel", "offer_frequency_slot", b"offer_frequency_slot", "offer_preset", b"offer_preset", "offer_region", b"offer_region"]) -> None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_offer_frequency_slot", b"_offer_frequency_slot"]) -> typing.Literal["offer_frequency_slot"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_offer_preset", b"_offer_preset"]) -> typing.Literal["offer_preset"] | None: ... + +global___MeshBeacon = MeshBeacon diff --git a/meshtastic/protobuf/mesh_pb2.py b/meshtastic/protobuf/mesh_pb2.py index 5cc8b5867..050329264 100644 --- a/meshtastic/protobuf/mesh_pb2.py +++ b/meshtastic/protobuf/mesh_pb2.py @@ -21,7 +21,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__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/device_ui.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/nanopb.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\"\xbf\x02\n\x04User\x12\x11\n\x02id\x18\x01 \x01(\tB\x05\x92?\x02\x08\x10\x12\x18\n\tlong_name\x18\x02 \x01(\tB\x05\x92?\x02\x08(\x12\x19\n\nshort_name\x18\x03 \x01(\tB\x05\x92?\x02\x08\x05\x12\x1a\n\x07macaddr\x18\x04 \x01(\x0c\x42\t\x18\x01\x92?\x04\x08\x06x\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\x19\n\npublic_key\x18\x08 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"z\n\x0eRouteDiscovery\x12\x14\n\x05route\x18\x01 \x03(\x07\x42\x05\x92?\x02\x10\x08\x12\x1c\n\x0bsnr_towards\x18\x02 \x03(\x05\x42\x07\x92?\x04\x10\x08\x38\x08\x12\x19\n\nroute_back\x18\x03 \x03(\x07\x42\x05\x92?\x02\x10\x08\x12\x19\n\x08snr_back\x18\x04 \x03(\x05\x42\x07\x92?\x04\x10\x08\x38\x08\"\xb4\x04\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\"\xe7\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%\x12\x17\n\x13RATE_LIMIT_EXCEEDED\x10&\x12\x1c\n\x18PKI_SEND_FAIL_PUBLIC_KEY\x10\'B\t\n\x07variant\"\xe3\x01\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x17\n\x07payload\x18\x02 \x01(\x0c\x42\x06\x92?\x03\x08\xe9\x01\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\x1c\n\x08\x62itfield\x18\t \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x42\x0b\n\t_bitfield\"L\n\x0fKeyVerification\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x14\n\x05hash1\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x14\n\x05hash2\x18\x03 \x01(\x0c\x42\x05\x92?\x02\x08 \"\xf1\x03\n\x14StoreForwardPlusPlus\x12V\n\x11sfpp_message_type\x18\x01 \x01(\x0e\x32;.meshtastic.protobuf.StoreForwardPlusPlus.SFPP_message_type\x12\x1b\n\x0cmessage_hash\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\x0b\x63ommit_hash\x18\x03 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x18\n\troot_hash\x18\x04 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x17\n\x07message\x18\x05 \x01(\x0c\x42\x06\x92?\x03\x08\xf0\x01\x12\x17\n\x0f\x65ncapsulated_id\x18\x06 \x01(\r\x12\x17\n\x0f\x65ncapsulated_to\x18\x07 \x01(\r\x12\x19\n\x11\x65ncapsulated_from\x18\x08 \x01(\r\x12\x1b\n\x13\x65ncapsulated_rxtime\x18\t \x01(\r\x12\x13\n\x0b\x63hain_count\x18\n \x01(\r\"\x95\x01\n\x11SFPP_message_type\x12\x12\n\x0e\x43\x41NON_ANNOUNCE\x10\x00\x12\x0f\n\x0b\x43HAIN_QUERY\x10\x01\x12\x10\n\x0cLINK_REQUEST\x10\x03\x12\x10\n\x0cLINK_PROVIDE\x10\x04\x12\x1a\n\x16LINK_PROVIDE_FIRSTHALF\x10\x05\x12\x1b\n\x17LINK_PROVIDE_SECONDHALF\x10\x06\"\xf4\x02\n\x0bRemoteShell\x12\x33\n\x02op\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.RemoteShell.OpCode\x12\x12\n\nsession_id\x18\x02 \x01(\r\x12\x0b\n\x03seq\x18\x03 \x01(\r\x12\x0f\n\x07\x61\x63k_seq\x18\x04 \x01(\r\x12\x17\n\x07payload\x18\x05 \x01(\x0c\x42\x06\x92?\x03\x08\xc8\x01\x12\x0c\n\x04\x63ols\x18\x06 \x01(\r\x12\x0c\n\x04rows\x18\x07 \x01(\r\x12\r\n\x05\x66lags\x18\x08 \x01(\r\x12\x13\n\x0blast_tx_seq\x18\t \x01(\r\x12\x13\n\x0blast_rx_seq\x18\n \x01(\r\"\x8f\x01\n\x06OpCode\x12\x0c\n\x08OP_UNSET\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\t\n\x05INPUT\x10\x02\x12\n\n\x06RESIZE\x10\x03\x12\t\n\x05\x43LOSE\x10\x04\x12\x08\n\x04PING\x10\x05\x12\x07\n\x03\x41\x43K\x10\x06\x12\x0b\n\x07OPEN_OK\x10@\x12\n\n\x06OUTPUT\x10\x41\x12\n\n\x06\x43LOSED\x10\x42\x12\t\n\x05\x45RROR\x10\x43\x12\x08\n\x04PONG\x10\x44\"\xd1\x01\n\x08Waypoint\x12\x11\n\x02id\x18\x01 \x01(\rB\x05\x92?\x02\x08\x10\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\x13\n\x04name\x18\x06 \x01(\tB\x05\x92?\x02\x08\x1e\x12\x1a\n\x0b\x64\x65scription\x18\x07 \x01(\tB\x05\x92?\x02\x08\x64\x12\x0c\n\x04icon\x18\x08 \x01(\x07\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_i\"&\n\rStatusMessage\x12\x15\n\x06status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\x83\x01\n\x16MqttClientProxyMessage\x12\x14\n\x05topic\x18\x01 \x01(\tB\x05\x92?\x02\x08<\x12\x16\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x06\x92?\x03\x08\xb3\x03H\x00\x12\x16\n\x04text\x18\x03 \x01(\tB\x06\x92?\x03\x08\xb3\x03H\x00\x12\x10\n\x08retained\x18\x04 \x01(\x08\x42\x11\n\x0fpayload_variant\"\x92\x08\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x16\n\x07\x63hannel\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12,\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x19.meshtastic.protobuf.DataH\x00\x12\x1b\n\tencrypted\x18\x05 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x02H\x00\x12\x11\n\x02id\x18\x06 \x01(\x07\x42\x05\x92?\x02\x08\x10\x12\x0f\n\x07rx_time\x18\x07 \x01(\x07\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x18\n\thop_limit\x18\t \x01(\rB\x05\x92?\x02\x38\x08\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\x18\n\thop_start\x18\x0f \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\npublic_key\x18\x10 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x15\n\rpki_encrypted\x18\x11 \x01(\x08\x12\x17\n\x08next_hop\x18\x12 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nrelay_node\x18\x13 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08tx_after\x18\x14 \x01(\r\x12O\n\x13transport_mechanism\x18\x15 \x01(\x0e\x32\x32.meshtastic.protobuf.MeshPacket.TransportMechanism\"~\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\"\xcf\x01\n\x12TransportMechanism\x12\x16\n\x12TRANSPORT_INTERNAL\x10\x00\x12\x12\n\x0eTRANSPORT_LORA\x10\x01\x12\x17\n\x13TRANSPORT_LORA_ALT1\x10\x02\x12\x17\n\x13TRANSPORT_LORA_ALT2\x10\x03\x12\x17\n\x13TRANSPORT_LORA_ALT3\x10\x04\x12\x12\n\x0eTRANSPORT_MQTT\x10\x05\x12\x1b\n\x17TRANSPORT_MULTICAST_UDP\x10\x06\x12\x11\n\rTRANSPORT_API\x10\x07\x42\x11\n\x0fpayload_variant\"\x82\x03\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\x16\n\x07\x63hannel\x18\x07 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x1d\n\thops_away\x18\t \x01(\rB\x05\x92?\x02\x38\x08H\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\x12\x10\n\x08is_muted\x18\r \x01(\x08\x42\x0c\n\n_hops_away\"\xe6\x01\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\x18\n\tdevice_id\x18\x0c \x01(\x0c\x42\x05\x92?\x02\x08\x10\x12\x16\n\x07pio_env\x18\r \x01(\tB\x05\x92?\x02\x08(\x12\x45\n\x10\x66irmware_edition\x18\x0e \x01(\x0e\x32$.meshtastic.protobuf.FirmwareEditionB\x05\x92?\x02\x38\x08\x12\x1b\n\x0cnodedb_count\x18\x0f \x01(\rB\x05\x92?\x02\x38\x10\"\xd8\x01\n\tLogRecord\x12\x17\n\x07message\x18\x01 \x01(\tB\x06\x92?\x03\x08\x80\x03\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x15\n\x06source\x18\x03 \x01(\tB\x05\x92?\x02\x08 \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\"e\n\x0bQueueStatus\x12\x12\n\x03res\x18\x01 \x01(\x05\x42\x05\x92?\x02\x38\x08\x12\x13\n\x04\x66ree\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\x06maxlen\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x16\n\x0emesh_packet_id\x18\x04 \x01(\r\"\xbe\x07\n\tFromRadio\x12\x11\n\x02id\x18\x01 \x01(\rB\x05\x92?\x02\x08\x10\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\x12>\n\x0flockdown_status\x18\x12 \x01(\x0b\x32#.meshtastic.protobuf.LockdownStatusH\x00\x42\x11\n\x0fpayload_variant\"\x95\x02\n\x0eLockdownStatus\x12\x38\n\x05state\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.LockdownStatus.State\x12\x1a\n\x0block_reason\x18\x02 \x01(\tB\x05\x92?\x02\x08 \x12\x17\n\x0f\x62oots_remaining\x18\x03 \x01(\r\x12\x19\n\x11valid_until_epoch\x18\x04 \x01(\r\x12\x17\n\x0f\x62\x61\x63koff_seconds\x18\x05 \x01(\r\"`\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x13\n\x0fNEEDS_PROVISION\x10\x01\x12\n\n\x06LOCKED\x10\x02\x12\x0c\n\x08UNLOCKED\x10\x03\x12\x11\n\rUNLOCK_FAILED\x10\x04\"\xb8\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\x17\n\x07message\x18\x04 \x01(\tB\x06\x92?\x03\x08\x90\x03\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\"e\n\x1bKeyVerificationNumberInform\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x1e\n\x0fremote_longname\x18\x02 \x01(\tB\x05\x92?\x02\x08(\x12\x17\n\x0fsecurity_number\x18\x03 \x01(\r\"M\n\x1cKeyVerificationNumberRequest\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x1e\n\x0fremote_longname\x18\x02 \x01(\tB\x05\x92?\x02\x08(\"\x7f\n\x14KeyVerificationFinal\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x1e\n\x0fremote_longname\x18\x02 \x01(\tB\x05\x92?\x02\x08(\x12\x10\n\x08isSender\x18\x03 \x01(\x08\x12&\n\x17verification_characters\x18\x04 \x01(\tB\x05\x92?\x02\x08\n\"\x15\n\x13\x44uplicatedPublicKey\"\x0f\n\rLowEntropyKey\"9\n\x08\x46ileInfo\x12\x19\n\tfile_name\x18\x01 \x01(\tB\x06\x92?\x03\x08\xe4\x01\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\"Q\n\nCompressed\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x14\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x06\x92?\x03\x08\xe9\x01\"\x97\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\x37\n\tneighbors\x18\x04 \x03(\x0b\x32\x1d.meshtastic.protobuf.NeighborB\x05\x92?\x02\x10\n\"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\"\xf0\x02\n\x0e\x44\x65viceMetadata\x12\x1f\n\x10\x66irmware_version\x18\x01 \x01(\tB\x05\x92?\x02\x08\x12\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\"\x1a\n\tHeartbeat\x12\r\n\x05nonce\x18\x01 \x01(\r\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"{\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x1a\n\x0b\x63hunk_count\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10\x12\x1a\n\x0b\x63hunk_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\x12\x1d\n\rpayload_chunk\x18\x04 \x01(\x0c\x42\x06\x92?\x03\x08\xe4\x01\"\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*\xac\x15\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\x0f\n\x0bT_ECHO_PLUS\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\r\n\tMUZI_BASE\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\x0f\n\x0bMUZI_R1_NEO\x10\x65\x12\x0e\n\nT_DECK_PRO\x10\x66\x12\x10\n\x0cT_LORA_PAGER\x10g\x12\x14\n\x10M5STACK_RESERVED\x10h\x12\x0f\n\x0bWISMESH_TAG\x10i\x12\x0b\n\x07RAK3312\x10j\x12\x10\n\x0cTHINKNODE_M5\x10k\x12\x15\n\x11HELTEC_MESH_SOLAR\x10l\x12\x0f\n\x0bT_ECHO_LITE\x10m\x12\r\n\tHELTEC_V4\x10n\x12\x0f\n\x0bM5STACK_C6L\x10o\x12\x19\n\x15M5STACK_CARDPUTER_ADV\x10p\x12\x1e\n\x1aHELTEC_WIRELESS_TRACKER_V2\x10q\x12\x11\n\rT_WATCH_ULTRA\x10r\x12\x10\n\x0cTHINKNODE_M3\x10s\x12\x12\n\x0eWISMESH_TAP_V2\x10t\x12\x0b\n\x07RAK3401\x10u\x12\x0b\n\x07RAK6421\x10v\x12\x10\n\x0cTHINKNODE_M4\x10w\x12\x10\n\x0cTHINKNODE_M6\x10x\x12\x12\n\x0eMESHSTICK_1262\x10y\x12\x10\n\x0cTBEAM_1_WATT\x10z\x12\x14\n\x10T5_S3_EPAPER_PRO\x10{\x12\r\n\tTBEAM_BPF\x10|\x12\x12\n\x0eMINI_EPAPER_S3\x10}\x12\x13\n\x0fTDISPLAY_S3_PRO\x10~\x12\x19\n\x15HELTEC_MESH_NODE_T096\x10\x7f\x12\x18\n\x13TRACKER_T1000_E_PRO\x10\x80\x01\x12\x11\n\x0cTHINKNODE_M7\x10\x81\x01\x12\x11\n\x0cTHINKNODE_M8\x10\x82\x01\x12\x11\n\x0cTHINKNODE_M9\x10\x83\x01\x12\x11\n\x0cHELTEC_V4_R8\x10\x84\x01\x12\x18\n\x13HELTEC_MESH_NODE_T1\x10\x85\x01\x12\x0f\n\nSTATION_G3\x10\x86\x01\x12\x13\n\x0eT_IMPULSE_PLUS\x10\x87\x01\x12\x10\n\x0bT_ECHO_CARD\x10\x88\x01\x12\x19\n\x14SEEED_WIO_TRACKER_L2\x10\x89\x01\x12\x11\n\x0c\x43ROWPANEL_P4\x10\x8a\x01\x12\x19\n\x14HELTEC_MESH_TOWER_V2\x10\x8b\x01\x12\x13\n\x0eMESHNOLOGY_W10\x10\x8c\x01\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*\x7f\n\x0f\x46irmwareEdition\x12\x0b\n\x07VANILLA\x10\x00\x12\x11\n\rSMART_CITIZEN\x10\x01\x12\x0e\n\nOPEN_SAUCE\x10\x10\x12\n\n\x06\x44\x45\x46\x43ON\x10\x11\x12\x0f\n\x0b\x42URNING_MAN\x10\x12\x12\x0e\n\nHAMVENTION\x10\x13\x12\x0f\n\x0b\x44IY_EDITION\x10\x7f*\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\x14org.meshtastic.protoB\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/device_ui.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/nanopb.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\"\xbf\x02\n\x04User\x12\x11\n\x02id\x18\x01 \x01(\tB\x05\x92?\x02\x08\x10\x12\x18\n\tlong_name\x18\x02 \x01(\tB\x05\x92?\x02\x08(\x12\x19\n\nshort_name\x18\x03 \x01(\tB\x05\x92?\x02\x08\x05\x12\x1a\n\x07macaddr\x18\x04 \x01(\x0c\x42\t\x18\x01\x92?\x04\x08\x06x\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\x19\n\npublic_key\x18\x08 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1c\n\x0fis_unmessagable\x18\t \x01(\x08H\x00\x88\x01\x01\x42\x12\n\x10_is_unmessagable\"z\n\x0eRouteDiscovery\x12\x14\n\x05route\x18\x01 \x03(\x07\x42\x05\x92?\x02\x10\x08\x12\x1c\n\x0bsnr_towards\x18\x02 \x03(\x05\x42\x07\x92?\x04\x10\x08\x38\x08\x12\x19\n\nroute_back\x18\x03 \x03(\x07\x42\x05\x92?\x02\x10\x08\x12\x19\n\x08snr_back\x18\x04 \x03(\x05\x42\x07\x92?\x04\x10\x08\x38\x08\"\xce\x04\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\x12\x18\n\tack_proof\x18\x04 \x01(\x0c\x42\x05\x92?\x02\x08\x08\"\xe7\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%\x12\x17\n\x13RATE_LIMIT_EXCEEDED\x10&\x12\x1c\n\x18PKI_SEND_FAIL_PUBLIC_KEY\x10\'B\t\n\x07variant\"\x84\x02\n\x04\x44\x61ta\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x17\n\x07payload\x18\x02 \x01(\x0c\x42\x06\x92?\x03\x08\xe9\x01\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\x1c\n\x08\x62itfield\x18\t \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x1f\n\x10xeddsa_signature\x18\n \x01(\x0c\x42\x05\x92?\x02\x08@B\x0b\n\t_bitfield\"L\n\x0fKeyVerification\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x14\n\x05hash1\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x14\n\x05hash2\x18\x03 \x01(\x0c\x42\x05\x92?\x02\x08 \"\xf1\x03\n\x14StoreForwardPlusPlus\x12V\n\x11sfpp_message_type\x18\x01 \x01(\x0e\x32;.meshtastic.protobuf.StoreForwardPlusPlus.SFPP_message_type\x12\x1b\n\x0cmessage_hash\x18\x02 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x1a\n\x0b\x63ommit_hash\x18\x03 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x18\n\troot_hash\x18\x04 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x17\n\x07message\x18\x05 \x01(\x0c\x42\x06\x92?\x03\x08\xf0\x01\x12\x17\n\x0f\x65ncapsulated_id\x18\x06 \x01(\r\x12\x17\n\x0f\x65ncapsulated_to\x18\x07 \x01(\r\x12\x19\n\x11\x65ncapsulated_from\x18\x08 \x01(\r\x12\x1b\n\x13\x65ncapsulated_rxtime\x18\t \x01(\r\x12\x13\n\x0b\x63hain_count\x18\n \x01(\r\"\x95\x01\n\x11SFPP_message_type\x12\x12\n\x0e\x43\x41NON_ANNOUNCE\x10\x00\x12\x0f\n\x0b\x43HAIN_QUERY\x10\x01\x12\x10\n\x0cLINK_REQUEST\x10\x03\x12\x10\n\x0cLINK_PROVIDE\x10\x04\x12\x1a\n\x16LINK_PROVIDE_FIRSTHALF\x10\x05\x12\x1b\n\x17LINK_PROVIDE_SECONDHALF\x10\x06\"\xf4\x02\n\x0bRemoteShell\x12\x33\n\x02op\x18\x01 \x01(\x0e\x32\'.meshtastic.protobuf.RemoteShell.OpCode\x12\x12\n\nsession_id\x18\x02 \x01(\r\x12\x0b\n\x03seq\x18\x03 \x01(\r\x12\x0f\n\x07\x61\x63k_seq\x18\x04 \x01(\r\x12\x17\n\x07payload\x18\x05 \x01(\x0c\x42\x06\x92?\x03\x08\xc8\x01\x12\x0c\n\x04\x63ols\x18\x06 \x01(\r\x12\x0c\n\x04rows\x18\x07 \x01(\r\x12\r\n\x05\x66lags\x18\x08 \x01(\r\x12\x13\n\x0blast_tx_seq\x18\t \x01(\r\x12\x13\n\x0blast_rx_seq\x18\n \x01(\r\"\x8f\x01\n\x06OpCode\x12\x0c\n\x08OP_UNSET\x10\x00\x12\x08\n\x04OPEN\x10\x01\x12\t\n\x05INPUT\x10\x02\x12\n\n\x06RESIZE\x10\x03\x12\t\n\x05\x43LOSE\x10\x04\x12\x08\n\x04PING\x10\x05\x12\x07\n\x03\x41\x43K\x10\x06\x12\x0b\n\x07OPEN_OK\x10@\x12\n\n\x06OUTPUT\x10\x41\x12\n\n\x06\x43LOSED\x10\x42\x12\t\n\x05\x45RROR\x10\x43\x12\x08\n\x04PONG\x10\x44\"u\n\x0b\x42oundingBox\x12\x18\n\x10longitude_west_i\x18\x01 \x01(\x0f\x12\x18\n\x10latitude_south_i\x18\x02 \x01(\x0f\x12\x18\n\x10longitude_east_i\x18\x03 \x01(\x0f\x12\x18\n\x10latitude_north_i\x18\x04 \x01(\x0f\"\x88\x03\n\x08Waypoint\x12\x11\n\x02id\x18\x01 \x01(\rB\x05\x92?\x02\x08\x10\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\x13\n\x04name\x18\x06 \x01(\tB\x05\x92?\x02\x08\x1e\x12\x1a\n\x0b\x64\x65scription\x18\x07 \x01(\tB\x05\x92?\x02\x08\x64\x12\x0c\n\x04icon\x18\x08 \x01(\x07\x12\x17\n\x0fgeofence_radius\x18\t \x01(\r\x12;\n\x0c\x62ounding_box\x18\n \x01(\x0b\x32 .meshtastic.protobuf.BoundingBoxH\x02\x88\x01\x01\x12\x17\n\x0fnotify_on_enter\x18\x0b \x01(\x08\x12\x16\n\x0enotify_on_exit\x18\x0c \x01(\x08\x12\x1d\n\x15notify_favorites_only\x18\r \x01(\x08\x42\r\n\x0b_latitude_iB\x0e\n\x0c_longitude_iB\x0f\n\r_bounding_box\"&\n\rStatusMessage\x12\x15\n\x06status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\"\x83\x01\n\x16MqttClientProxyMessage\x12\x14\n\x05topic\x18\x01 \x01(\tB\x05\x92?\x02\x08<\x12\x16\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x06\x92?\x03\x08\xb3\x03H\x00\x12\x16\n\x04text\x18\x03 \x01(\tB\x06\x92?\x03\x08\xb3\x03H\x00\x12\x10\n\x08retained\x18\x04 \x01(\x08\x42\x11\n\x0fpayload_variant\"\xab\x0b\n\nMeshPacket\x12\x0c\n\x04\x66rom\x18\x01 \x01(\x07\x12\n\n\x02to\x18\x02 \x01(\x07\x12\x16\n\x07\x63hannel\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12,\n\x07\x64\x65\x63oded\x18\x04 \x01(\x0b\x32\x19.meshtastic.protobuf.DataH\x00\x12\x1b\n\tencrypted\x18\x05 \x01(\x0c\x42\x06\x92?\x03\x08\x80\x02H\x00\x12\x11\n\x02id\x18\x06 \x01(\x07\x42\x05\x92?\x02\x08\x10\x12\x14\n\x07rx_time\x18\x07 \x01(\x07H\x01\x88\x01\x01\x12\x0e\n\x06rx_snr\x18\x08 \x01(\x02\x12\x18\n\thop_limit\x18\t \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08want_ack\x18\n \x01(\x08\x12:\n\x08priority\x18\x0b \x01(\x0e\x32(.meshtastic.protobuf.MeshPacket.Priority\x12\x14\n\x07rx_rssi\x18\x0c \x01(\x05H\x02\x88\x01\x01\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\x18\n\thop_start\x18\x0f \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\npublic_key\x18\x10 \x01(\x0c\x42\x05\x92?\x02\x08 \x12\x15\n\rpki_encrypted\x18\x11 \x01(\x08\x12\x17\n\x08next_hop\x18\x12 \x01(\rB\x05\x92?\x02\x38\x08\x12\x19\n\nrelay_node\x18\x13 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08tx_after\x18\x14 \x01(\r\x12O\n\x13transport_mechanism\x18\x15 \x01(\x0e\x32\x32.meshtastic.protobuf.MeshPacket.TransportMechanism\x12\x15\n\rxeddsa_signed\x18\x16 \x01(\x08\x12H\n\x10\x61\x63k_proof_status\x18\x17 \x01(\x0e\x32..meshtastic.protobuf.MeshPacket.AckProofStatus\x12?\n\x0bslot_parity\x18\x18 \x01(\x0e\x32*.meshtastic.protobuf.MeshPacket.SlotParity\"~\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\"\xea\x01\n\x12TransportMechanism\x12\x16\n\x12TRANSPORT_INTERNAL\x10\x00\x12\x12\n\x0eTRANSPORT_LORA\x10\x01\x12\x17\n\x13TRANSPORT_LORA_ALT1\x10\x02\x12\x17\n\x13TRANSPORT_LORA_ALT2\x10\x03\x12\x17\n\x13TRANSPORT_LORA_ALT3\x10\x04\x12\x12\n\x0eTRANSPORT_MQTT\x10\x05\x12\x1b\n\x17TRANSPORT_MULTICAST_UDP\x10\x06\x12\x11\n\rTRANSPORT_API\x10\x07\x12\x19\n\x15TRANSPORT_UNICAST_UDP\x10\x08\"h\n\x0e\x41\x63kProofStatus\x12\x14\n\x10\x41\x43K_PROOF_ABSENT\x10\x00\x12\x13\n\x0f\x41\x43K_PROOF_VALID\x10\x01\x12\x15\n\x11\x41\x43K_PROOF_INVALID\x10\x02\x12\x14\n\x10\x41\x43K_PROOF_NO_KEY\x10\x03\"N\n\nSlotParity\x12\x15\n\x11SLOT_PARITY_UNSET\x10\x00\x12\x14\n\x10SLOT_PARITY_EVEN\x10\x01\x12\x13\n\x0fSLOT_PARITY_ODD\x10\x02\x42\x11\n\x0fpayload_variantB\n\n\x08_rx_timeB\n\n\x08_rx_rssi\"\xbc\x03\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\x16\n\x07\x63hannel\x18\x07 \x01(\rB\x05\x92?\x02\x38\x08\x12\x10\n\x08via_mqtt\x18\x08 \x01(\x08\x12\x1d\n\thops_away\x18\t \x01(\rB\x05\x92?\x02\x38\x08H\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\x12\x10\n\x08is_muted\x18\r \x01(\x08\x12\x19\n\x11has_xeddsa_signed\x18\x0e \x01(\x08\x12\x1d\n\x15heard_on_current_lora\x18\x0f \x01(\x08\x42\x0c\n\n_hops_away\"\xe6\x01\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\x18\n\tdevice_id\x18\x0c \x01(\x0c\x42\x05\x92?\x02\x08\x10\x12\x16\n\x07pio_env\x18\r \x01(\tB\x05\x92?\x02\x08(\x12\x45\n\x10\x66irmware_edition\x18\x0e \x01(\x0e\x32$.meshtastic.protobuf.FirmwareEditionB\x05\x92?\x02\x38\x08\x12\x1b\n\x0cnodedb_count\x18\x0f \x01(\rB\x05\x92?\x02\x38\x10\"\xd8\x01\n\tLogRecord\x12\x17\n\x07message\x18\x01 \x01(\tB\x06\x92?\x03\x08\x80\x03\x12\x0c\n\x04time\x18\x02 \x01(\x07\x12\x15\n\x06source\x18\x03 \x01(\tB\x05\x92?\x02\x08 \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\"e\n\x0bQueueStatus\x12\x12\n\x03res\x18\x01 \x01(\x05\x42\x05\x92?\x02\x38\x08\x12\x13\n\x04\x66ree\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\x06maxlen\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x16\n\x0emesh_packet_id\x18\x04 \x01(\r\"\x82\x08\n\tFromRadio\x12\x11\n\x02id\x18\x01 \x01(\rB\x05\x92?\x02\x08\x10\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\x12>\n\x0flockdown_status\x18\x12 \x01(\x0b\x32#.meshtastic.protobuf.LockdownStatusH\x00\x12\x42\n\x0eregion_presets\x18\x13 \x01(\x0b\x32(.meshtastic.protobuf.LoRaRegionPresetMapH\x00\x42\x11\n\x0fpayload_variant\"\xa3\x02\n\x0eLockdownStatus\x12\x38\n\x05state\x18\x01 \x01(\x0e\x32).meshtastic.protobuf.LockdownStatus.State\x12\x1a\n\x0block_reason\x18\x02 \x01(\tB\x05\x92?\x02\x08 \x12\x17\n\x0f\x62oots_remaining\x18\x03 \x01(\r\x12\x19\n\x11valid_until_epoch\x18\x04 \x01(\r\x12\x17\n\x0f\x62\x61\x63koff_seconds\x18\x05 \x01(\r\"n\n\x05State\x12\x15\n\x11STATE_UNSPECIFIED\x10\x00\x12\x13\n\x0fNEEDS_PROVISION\x10\x01\x12\n\n\x06LOCKED\x10\x02\x12\x0c\n\x08UNLOCKED\x10\x03\x12\x11\n\rUNLOCK_FAILED\x10\x04\x12\x0c\n\x08\x44ISABLED\x10\x05\"\xb8\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\x17\n\x07message\x18\x04 \x01(\tB\x06\x92?\x03\x08\x90\x03\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\"e\n\x1bKeyVerificationNumberInform\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x1e\n\x0fremote_longname\x18\x02 \x01(\tB\x05\x92?\x02\x08(\x12\x17\n\x0fsecurity_number\x18\x03 \x01(\r\"M\n\x1cKeyVerificationNumberRequest\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x1e\n\x0fremote_longname\x18\x02 \x01(\tB\x05\x92?\x02\x08(\"\x7f\n\x14KeyVerificationFinal\x12\r\n\x05nonce\x18\x01 \x01(\x04\x12\x1e\n\x0fremote_longname\x18\x02 \x01(\tB\x05\x92?\x02\x08(\x12\x10\n\x08isSender\x18\x03 \x01(\x08\x12&\n\x17verification_characters\x18\x04 \x01(\tB\x05\x92?\x02\x08\n\"\x15\n\x13\x44uplicatedPublicKey\"\x0f\n\rLowEntropyKey\"9\n\x08\x46ileInfo\x12\x19\n\tfile_name\x18\x01 \x01(\tB\x06\x92?\x03\x08\xe4\x01\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\"Q\n\nCompressed\x12-\n\x07portnum\x18\x01 \x01(\x0e\x32\x1c.meshtastic.protobuf.PortNum\x12\x14\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x42\x06\x92?\x03\x08\xe9\x01\"\x97\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\x37\n\tneighbors\x18\x04 \x03(\x0b\x32\x1d.meshtastic.protobuf.NeighborB\x05\x92?\x02\x10\n\"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\"\x84\x03\n\x0e\x44\x65viceMetadata\x12\x1f\n\x10\x66irmware_version\x18\x01 \x01(\tB\x05\x92?\x02\x08\x12\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\x12\x12\n\nhas_xeddsa\x18\x0e \x01(\x08\"\xc0\x01\n\x0fLoRaPresetGroup\x12J\n\x07presets\x18\x01 \x03(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPresetB\x05\x92?\x02\x10\x0b\x12J\n\x0e\x64\x65\x66\x61ult_preset\x18\x02 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPreset\x12\x15\n\rlicensed_only\x18\x03 \x01(\x08\"r\n\x11LoRaRegionPresets\x12\x41\n\x06region\x18\x01 \x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12\x1a\n\x0bgroup_index\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\"\x98\x01\n\x13LoRaRegionPresetMap\x12;\n\x06groups\x18\x01 \x03(\x0b\x32$.meshtastic.protobuf.LoRaPresetGroupB\x05\x92?\x02\x10\x08\x12\x44\n\rregion_groups\x18\x02 \x03(\x0b\x32&.meshtastic.protobuf.LoRaRegionPresetsB\x05\x92?\x02\x10&\"\x1a\n\tHeartbeat\x12\r\n\x05nonce\x18\x01 \x01(\r\"^\n\x15NodeRemoteHardwarePin\x12\x10\n\x08node_num\x18\x01 \x01(\r\x12\x33\n\x03pin\x18\x02 \x01(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePin\"{\n\x0e\x43hunkedPayload\x12\x12\n\npayload_id\x18\x01 \x01(\r\x12\x1a\n\x0b\x63hunk_count\x18\x02 \x01(\rB\x05\x92?\x02\x38\x10\x12\x1a\n\x0b\x63hunk_index\x18\x03 \x01(\rB\x05\x92?\x02\x38\x10\x12\x1d\n\rpayload_chunk\x18\x04 \x01(\x0c\x42\x06\x92?\x03\x08\xe4\x01\"\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*\x91\x17\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\x15\n\x11MAKERFABS_TRACKER\x10\x1b\x12\x16\n\x12MAKERFABS_RESERVED\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\x0f\n\x0bT_ECHO_PLUS\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\r\n\tMUZI_BASE\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\x0f\n\x0bMUZI_R1_NEO\x10\x65\x12\x0e\n\nT_DECK_PRO\x10\x66\x12\x10\n\x0cT_LORA_PAGER\x10g\x12\x14\n\x10M5STACK_RESERVED\x10h\x12\x0f\n\x0bWISMESH_TAG\x10i\x12\x0b\n\x07RAK3312\x10j\x12\x10\n\x0cTHINKNODE_M5\x10k\x12\x15\n\x11HELTEC_MESH_SOLAR\x10l\x12\x0f\n\x0bT_ECHO_LITE\x10m\x12\r\n\tHELTEC_V4\x10n\x12\x0f\n\x0bM5STACK_C6L\x10o\x12\x19\n\x15M5STACK_CARDPUTER_ADV\x10p\x12\x1e\n\x1aHELTEC_WIRELESS_TRACKER_V2\x10q\x12\x11\n\rT_WATCH_ULTRA\x10r\x12\x10\n\x0cTHINKNODE_M3\x10s\x12\x12\n\x0eWISMESH_TAP_V2\x10t\x12\x0b\n\x07RAK3401\x10u\x12\x0b\n\x07RAK6421\x10v\x12\x10\n\x0cTHINKNODE_M4\x10w\x12\x10\n\x0cTHINKNODE_M6\x10x\x12\x12\n\x0eMESHSTICK_1262\x10y\x12\x10\n\x0cTBEAM_1_WATT\x10z\x12\x14\n\x10T5_S3_EPAPER_PRO\x10{\x12\r\n\tTBEAM_BPF\x10|\x12\x12\n\x0eMINI_EPAPER_S3\x10}\x12\x13\n\x0fTDISPLAY_S3_PRO\x10~\x12\x19\n\x15HELTEC_MESH_NODE_T096\x10\x7f\x12\x14\n\x0fMESH_TRACKER_X1\x10\x80\x01\x12\x11\n\x0cTHINKNODE_M7\x10\x81\x01\x12\x11\n\x0cTHINKNODE_M8\x10\x82\x01\x12\x11\n\x0cTHINKNODE_M9\x10\x83\x01\x12\x11\n\x0cHELTEC_V4_R8\x10\x84\x01\x12\x18\n\x13HELTEC_MESH_NODE_T1\x10\x85\x01\x12\x0f\n\nSTATION_G3\x10\x86\x01\x12\x13\n\x0eT_IMPULSE_PLUS\x10\x87\x01\x12\x10\n\x0bT_ECHO_CARD\x10\x88\x01\x12\x19\n\x14SEEED_WIO_TRACKER_L2\x10\x89\x01\x12\x11\n\x0c\x43ROWPANEL_P4\x10\x8a\x01\x12\x19\n\x14HELTEC_MESH_TOWER_V2\x10\x8b\x01\x12\x13\n\x0eMESHNOLOGY_W10\x10\x8c\x01\x12\x10\n\x0bHELTEC_RC32\x10\x8d\x01\x12\x10\n\x0bHELTEC_RC52\x10\x8e\x01\x12\x10\n\x0bHELTEC_RCC6\x10\x8f\x01\x12 \n\x1bSEEED_WIO_TRACKER_L1_PRO_1W\x10\x90\x01\x12\x13\n\x0eMESHNOLOGY_W12\x10\x91\x01\x12\x11\n\x0cMESHPAGER_X2\x10\x92\x01\x12\x12\n\rT_CONNECT_PRO\x10\x93\x01\x12\x1a\n\x15\x41XIOMETA_GENESIS_MINI\x10\x94\x01\x12\x1d\n\x18MAKERFABS_NOMAD_TERMINAL\x10\x95\x01\x12\x11\n\x0cTHINKNODE_MX\x10\x96\x01\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*\xa1\x01\n\x0f\x46irmwareEdition\x12\x0b\n\x07VANILLA\x10\x00\x12\x11\n\rSMART_CITIZEN\x10\x01\x12\x0e\n\nOPEN_SAUCE\x10\x10\x12\n\n\x06\x44\x45\x46\x43ON\x10\x11\x12\x0f\n\x0b\x42URNING_MAN\x10\x12\x12\x0e\n\nHAMVENTION\x10\x13\x12\x07\n\x03\x46\x41\x42\x10\x14\x12\x0e\n\nDRAGON_CON\x10\x15\x12\x07\n\x03\x43\x43\x43\x10\x16\x12\x0f\n\x0b\x44IY_EDITION\x10\x7f*\xe7\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\x12\x1a\n\x14STATUSMESSAGE_CONFIG\x10\x80\x80\x02\x12\x1e\n\x18TRAFFICMANAGEMENT_CONFIG\x10\x80\x80\x04\x12\x10\n\nTAK_CONFIG\x10\x80\x80\x08\x12\x17\n\x11MESHBEACON_CONFIG\x10\x80\x80\x10\x42`\n\x14org.meshtastic.protoB\nMeshProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -47,10 +47,14 @@ _ROUTEDISCOVERY.fields_by_name['route_back']._serialized_options = b'\222?\002\020\010' _ROUTEDISCOVERY.fields_by_name['snr_back']._options = None _ROUTEDISCOVERY.fields_by_name['snr_back']._serialized_options = b'\222?\004\020\0108\010' + _ROUTING.fields_by_name['ack_proof']._options = None + _ROUTING.fields_by_name['ack_proof']._serialized_options = b'\222?\002\010\010' _DATA.fields_by_name['payload']._options = None _DATA.fields_by_name['payload']._serialized_options = b'\222?\003\010\351\001' _DATA.fields_by_name['bitfield']._options = None _DATA.fields_by_name['bitfield']._serialized_options = b'\222?\0028\010' + _DATA.fields_by_name['xeddsa_signature']._options = None + _DATA.fields_by_name['xeddsa_signature']._serialized_options = b'\222?\002\010@' _KEYVERIFICATION.fields_by_name['hash1']._options = None _KEYVERIFICATION.fields_by_name['hash1']._serialized_options = b'\222?\002\010 ' _KEYVERIFICATION.fields_by_name['hash2']._options = None @@ -141,22 +145,30 @@ _NEIGHBORINFO.fields_by_name['neighbors']._serialized_options = b'\222?\002\020\n' _DEVICEMETADATA.fields_by_name['firmware_version']._options = None _DEVICEMETADATA.fields_by_name['firmware_version']._serialized_options = b'\222?\002\010\022' + _LORAPRESETGROUP.fields_by_name['presets']._options = None + _LORAPRESETGROUP.fields_by_name['presets']._serialized_options = b'\222?\002\020\013' + _LORAREGIONPRESETS.fields_by_name['group_index']._options = None + _LORAREGIONPRESETS.fields_by_name['group_index']._serialized_options = b'\222?\0028\010' + _LORAREGIONPRESETMAP.fields_by_name['groups']._options = None + _LORAREGIONPRESETMAP.fields_by_name['groups']._serialized_options = b'\222?\002\020\010' + _LORAREGIONPRESETMAP.fields_by_name['region_groups']._options = None + _LORAREGIONPRESETMAP.fields_by_name['region_groups']._serialized_options = b'\222?\002\020&' _CHUNKEDPAYLOAD.fields_by_name['chunk_count']._options = None _CHUNKEDPAYLOAD.fields_by_name['chunk_count']._serialized_options = b'\222?\0028\020' _CHUNKEDPAYLOAD.fields_by_name['chunk_index']._options = None _CHUNKEDPAYLOAD.fields_by_name['chunk_index']._serialized_options = b'\222?\0028\020' _CHUNKEDPAYLOAD.fields_by_name['payload_chunk']._options = None _CHUNKEDPAYLOAD.fields_by_name['payload_chunk']._serialized_options = b'\222?\003\010\344\001' - _globals['_HARDWAREMODEL']._serialized_start=9550 - _globals['_HARDWAREMODEL']._serialized_end=12282 - _globals['_CONSTANTS']._serialized_start=12284 - _globals['_CONSTANTS']._serialized_end=12328 - _globals['_CRITICALERRORCODE']._serialized_start=12331 - _globals['_CRITICALERRORCODE']._serialized_end=12639 - _globals['_FIRMWAREEDITION']._serialized_start=12641 - _globals['_FIRMWAREEDITION']._serialized_end=12768 - _globals['_EXCLUDEDMODULES']._serialized_start=12771 - _globals['_EXCLUDEDMODULES']._serialized_end=13155 + _globals['_HARDWAREMODEL']._serialized_start=10946 + _globals['_HARDWAREMODEL']._serialized_end=13907 + _globals['_CONSTANTS']._serialized_start=13909 + _globals['_CONSTANTS']._serialized_end=13953 + _globals['_CRITICALERRORCODE']._serialized_start=13956 + _globals['_CRITICALERRORCODE']._serialized_end=14264 + _globals['_FIRMWAREEDITION']._serialized_start=14267 + _globals['_FIRMWAREEDITION']._serialized_end=14428 + _globals['_EXCLUDEDMODULES']._serialized_start=14431 + _globals['_EXCLUDEDMODULES']._serialized_end=14918 _globals['_POSITION']._serialized_start=344 _globals['_POSITION']._serialized_end=1265 _globals['_POSITION_LOCSOURCE']._serialized_start=960 @@ -168,83 +180,95 @@ _globals['_ROUTEDISCOVERY']._serialized_start=1589 _globals['_ROUTEDISCOVERY']._serialized_end=1711 _globals['_ROUTING']._serialized_start=1714 - _globals['_ROUTING']._serialized_end=2278 - _globals['_ROUTING_ERROR']._serialized_start=1908 - _globals['_ROUTING_ERROR']._serialized_end=2267 - _globals['_DATA']._serialized_start=2281 - _globals['_DATA']._serialized_end=2508 - _globals['_KEYVERIFICATION']._serialized_start=2510 - _globals['_KEYVERIFICATION']._serialized_end=2586 - _globals['_STOREFORWARDPLUSPLUS']._serialized_start=2589 - _globals['_STOREFORWARDPLUSPLUS']._serialized_end=3086 - _globals['_STOREFORWARDPLUSPLUS_SFPP_MESSAGE_TYPE']._serialized_start=2937 - _globals['_STOREFORWARDPLUSPLUS_SFPP_MESSAGE_TYPE']._serialized_end=3086 - _globals['_REMOTESHELL']._serialized_start=3089 - _globals['_REMOTESHELL']._serialized_end=3461 - _globals['_REMOTESHELL_OPCODE']._serialized_start=3318 - _globals['_REMOTESHELL_OPCODE']._serialized_end=3461 - _globals['_WAYPOINT']._serialized_start=3464 - _globals['_WAYPOINT']._serialized_end=3673 - _globals['_STATUSMESSAGE']._serialized_start=3675 - _globals['_STATUSMESSAGE']._serialized_end=3713 - _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=3716 - _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=3847 - _globals['_MESHPACKET']._serialized_start=3850 - _globals['_MESHPACKET']._serialized_end=4892 - _globals['_MESHPACKET_PRIORITY']._serialized_start=4469 - _globals['_MESHPACKET_PRIORITY']._serialized_end=4595 - _globals['_MESHPACKET_DELAYED']._serialized_start=4597 - _globals['_MESHPACKET_DELAYED']._serialized_end=4663 - _globals['_MESHPACKET_TRANSPORTMECHANISM']._serialized_start=4666 - _globals['_MESHPACKET_TRANSPORTMECHANISM']._serialized_end=4873 - _globals['_NODEINFO']._serialized_start=4895 - _globals['_NODEINFO']._serialized_end=5281 - _globals['_MYNODEINFO']._serialized_start=5284 - _globals['_MYNODEINFO']._serialized_end=5514 - _globals['_LOGRECORD']._serialized_start=5517 - _globals['_LOGRECORD']._serialized_end=5733 - _globals['_LOGRECORD_LEVEL']._serialized_start=5645 - _globals['_LOGRECORD_LEVEL']._serialized_end=5733 - _globals['_QUEUESTATUS']._serialized_start=5735 - _globals['_QUEUESTATUS']._serialized_end=5836 - _globals['_FROMRADIO']._serialized_start=5839 - _globals['_FROMRADIO']._serialized_end=6797 - _globals['_LOCKDOWNSTATUS']._serialized_start=6800 - _globals['_LOCKDOWNSTATUS']._serialized_end=7077 - _globals['_LOCKDOWNSTATUS_STATE']._serialized_start=6981 - _globals['_LOCKDOWNSTATUS_STATE']._serialized_end=7077 - _globals['_CLIENTNOTIFICATION']._serialized_start=7080 - _globals['_CLIENTNOTIFICATION']._serialized_end=7648 - _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_start=7650 - _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_end=7751 - _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_start=7753 - _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_end=7830 - _globals['_KEYVERIFICATIONFINAL']._serialized_start=7832 - _globals['_KEYVERIFICATIONFINAL']._serialized_end=7959 - _globals['_DUPLICATEDPUBLICKEY']._serialized_start=7961 - _globals['_DUPLICATEDPUBLICKEY']._serialized_end=7982 - _globals['_LOWENTROPYKEY']._serialized_start=7984 - _globals['_LOWENTROPYKEY']._serialized_end=7999 - _globals['_FILEINFO']._serialized_start=8001 - _globals['_FILEINFO']._serialized_end=8058 - _globals['_TORADIO']._serialized_start=8061 - _globals['_TORADIO']._serialized_end=8373 - _globals['_COMPRESSED']._serialized_start=8375 - _globals['_COMPRESSED']._serialized_end=8456 - _globals['_NEIGHBORINFO']._serialized_start=8459 - _globals['_NEIGHBORINFO']._serialized_end=8610 - _globals['_NEIGHBOR']._serialized_start=8612 - _globals['_NEIGHBOR']._serialized_end=8712 - _globals['_DEVICEMETADATA']._serialized_start=8715 - _globals['_DEVICEMETADATA']._serialized_end=9083 - _globals['_HEARTBEAT']._serialized_start=9085 - _globals['_HEARTBEAT']._serialized_end=9111 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=9113 - _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=9207 - _globals['_CHUNKEDPAYLOAD']._serialized_start=9209 - _globals['_CHUNKEDPAYLOAD']._serialized_end=9332 - _globals['_RESEND_CHUNKS']._serialized_start=9334 - _globals['_RESEND_CHUNKS']._serialized_end=9365 - _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_start=9368 - _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_end=9547 + _globals['_ROUTING']._serialized_end=2304 + _globals['_ROUTING_ERROR']._serialized_start=1934 + _globals['_ROUTING_ERROR']._serialized_end=2293 + _globals['_DATA']._serialized_start=2307 + _globals['_DATA']._serialized_end=2567 + _globals['_KEYVERIFICATION']._serialized_start=2569 + _globals['_KEYVERIFICATION']._serialized_end=2645 + _globals['_STOREFORWARDPLUSPLUS']._serialized_start=2648 + _globals['_STOREFORWARDPLUSPLUS']._serialized_end=3145 + _globals['_STOREFORWARDPLUSPLUS_SFPP_MESSAGE_TYPE']._serialized_start=2996 + _globals['_STOREFORWARDPLUSPLUS_SFPP_MESSAGE_TYPE']._serialized_end=3145 + _globals['_REMOTESHELL']._serialized_start=3148 + _globals['_REMOTESHELL']._serialized_end=3520 + _globals['_REMOTESHELL_OPCODE']._serialized_start=3377 + _globals['_REMOTESHELL_OPCODE']._serialized_end=3520 + _globals['_BOUNDINGBOX']._serialized_start=3522 + _globals['_BOUNDINGBOX']._serialized_end=3639 + _globals['_WAYPOINT']._serialized_start=3642 + _globals['_WAYPOINT']._serialized_end=4034 + _globals['_STATUSMESSAGE']._serialized_start=4036 + _globals['_STATUSMESSAGE']._serialized_end=4074 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_start=4077 + _globals['_MQTTCLIENTPROXYMESSAGE']._serialized_end=4208 + _globals['_MESHPACKET']._serialized_start=4211 + _globals['_MESHPACKET']._serialized_end=5662 + _globals['_MESHPACKET_PRIORITY']._serialized_start=5002 + _globals['_MESHPACKET_PRIORITY']._serialized_end=5128 + _globals['_MESHPACKET_DELAYED']._serialized_start=5130 + _globals['_MESHPACKET_DELAYED']._serialized_end=5196 + _globals['_MESHPACKET_TRANSPORTMECHANISM']._serialized_start=5199 + _globals['_MESHPACKET_TRANSPORTMECHANISM']._serialized_end=5433 + _globals['_MESHPACKET_ACKPROOFSTATUS']._serialized_start=5435 + _globals['_MESHPACKET_ACKPROOFSTATUS']._serialized_end=5539 + _globals['_MESHPACKET_SLOTPARITY']._serialized_start=5541 + _globals['_MESHPACKET_SLOTPARITY']._serialized_end=5619 + _globals['_NODEINFO']._serialized_start=5665 + _globals['_NODEINFO']._serialized_end=6109 + _globals['_MYNODEINFO']._serialized_start=6112 + _globals['_MYNODEINFO']._serialized_end=6342 + _globals['_LOGRECORD']._serialized_start=6345 + _globals['_LOGRECORD']._serialized_end=6561 + _globals['_LOGRECORD_LEVEL']._serialized_start=6473 + _globals['_LOGRECORD_LEVEL']._serialized_end=6561 + _globals['_QUEUESTATUS']._serialized_start=6563 + _globals['_QUEUESTATUS']._serialized_end=6664 + _globals['_FROMRADIO']._serialized_start=6667 + _globals['_FROMRADIO']._serialized_end=7693 + _globals['_LOCKDOWNSTATUS']._serialized_start=7696 + _globals['_LOCKDOWNSTATUS']._serialized_end=7987 + _globals['_LOCKDOWNSTATUS_STATE']._serialized_start=7877 + _globals['_LOCKDOWNSTATUS_STATE']._serialized_end=7987 + _globals['_CLIENTNOTIFICATION']._serialized_start=7990 + _globals['_CLIENTNOTIFICATION']._serialized_end=8558 + _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_start=8560 + _globals['_KEYVERIFICATIONNUMBERINFORM']._serialized_end=8661 + _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_start=8663 + _globals['_KEYVERIFICATIONNUMBERREQUEST']._serialized_end=8740 + _globals['_KEYVERIFICATIONFINAL']._serialized_start=8742 + _globals['_KEYVERIFICATIONFINAL']._serialized_end=8869 + _globals['_DUPLICATEDPUBLICKEY']._serialized_start=8871 + _globals['_DUPLICATEDPUBLICKEY']._serialized_end=8892 + _globals['_LOWENTROPYKEY']._serialized_start=8894 + _globals['_LOWENTROPYKEY']._serialized_end=8909 + _globals['_FILEINFO']._serialized_start=8911 + _globals['_FILEINFO']._serialized_end=8968 + _globals['_TORADIO']._serialized_start=8971 + _globals['_TORADIO']._serialized_end=9283 + _globals['_COMPRESSED']._serialized_start=9285 + _globals['_COMPRESSED']._serialized_end=9366 + _globals['_NEIGHBORINFO']._serialized_start=9369 + _globals['_NEIGHBORINFO']._serialized_end=9520 + _globals['_NEIGHBOR']._serialized_start=9522 + _globals['_NEIGHBOR']._serialized_end=9622 + _globals['_DEVICEMETADATA']._serialized_start=9625 + _globals['_DEVICEMETADATA']._serialized_end=10013 + _globals['_LORAPRESETGROUP']._serialized_start=10016 + _globals['_LORAPRESETGROUP']._serialized_end=10208 + _globals['_LORAREGIONPRESETS']._serialized_start=10210 + _globals['_LORAREGIONPRESETS']._serialized_end=10324 + _globals['_LORAREGIONPRESETMAP']._serialized_start=10327 + _globals['_LORAREGIONPRESETMAP']._serialized_end=10479 + _globals['_HEARTBEAT']._serialized_start=10481 + _globals['_HEARTBEAT']._serialized_end=10507 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_start=10509 + _globals['_NODEREMOTEHARDWAREPIN']._serialized_end=10603 + _globals['_CHUNKEDPAYLOAD']._serialized_start=10605 + _globals['_CHUNKEDPAYLOAD']._serialized_end=10728 + _globals['_RESEND_CHUNKS']._serialized_start=10730 + _globals['_RESEND_CHUNKS']._serialized_end=10761 + _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_start=10764 + _globals['_CHUNKEDPAYLOADRESPONSE']._serialized_end=10943 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/mesh_pb2.pyi b/meshtastic/protobuf/mesh_pb2.pyi index 1de1ed12b..9db175710 100644 --- a/meshtastic/protobuf/mesh_pb2.pyi +++ b/meshtastic/protobuf/mesh_pb2.pyi @@ -142,13 +142,13 @@ class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._ """ RAK11310 (RP2040 + SX1262) """ - SENSELORA_RP2040: _HardwareModel.ValueType # 27 + MAKERFABS_TRACKER: _HardwareModel.ValueType # 27 """ - Makerfabs SenseLoRA Receiver (RP2040 + RFM96) + Makerfabs Tracker Reserved """ - SENSELORA_S3: _HardwareModel.ValueType # 28 + MAKERFABS_RESERVED: _HardwareModel.ValueType # 28 """ - Makerfabs SenseLoRA Industrial Monitor (ESP32-S3 + RFM96) + Makerfabs Reserved """ CANARYONE: _HardwareModel.ValueType # 29 """ @@ -563,9 +563,9 @@ class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._ """ Heltec Mesh Node T096 board features an nRF52840 CPU and a TFT screen. """ - TRACKER_T1000_E_PRO: _HardwareModel.ValueType # 128 + MESH_TRACKER_X1: _HardwareModel.ValueType # 128 """ - Seeed studio T1000-E Pro tracker card. NRF52840 w/ LR2021 radio, + Seeed studio Mesh Tracker X1card. NRF52840 w/ LR2021 radio, GPS, button, buzzer, and sensors. """ THINKNODE_M7: _HardwareModel.ValueType # 129 @@ -610,6 +610,46 @@ class _HardwareModelEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._ """ Meshnology W10 """ + HELTEC_RC32: _HardwareModel.ValueType # 141 + """ + Heltec ESP32S3 + SX1262 + """ + HELTEC_RC52: _HardwareModel.ValueType # 142 + """ + Heltec NRF52840 + SX1262 + """ + HELTEC_RCC6: _HardwareModel.ValueType # 143 + """ + Heltec ESP32C6 + SX1262 + """ + SEEED_WIO_TRACKER_L1_PRO_1W: _HardwareModel.ValueType # 144 + """ + Seeed Wio Tracker L1 Pro 1W, nRF52840 + SX1262 with 1 W external PA + """ + MESHNOLOGY_W12: _HardwareModel.ValueType # 145 + """ + Meshnology W12 + """ + MESHPAGER_X2: _HardwareModel.ValueType # 146 + """ + Seeed Studio MeshPager X2 + """ + T_CONNECT_PRO: _HardwareModel.ValueType # 147 + """ + Lilygo T-CONNECT PRO + """ + AXIOMETA_GENESIS_MINI: _HardwareModel.ValueType # 148 + """ + Axiometa Axiometa Genesis Mini + """ + MAKERFABS_NOMAD_TERMINAL: _HardwareModel.ValueType # 149 + """ + MakerFabs Nomad Terminal + """ + THINKNODE_MX: _HardwareModel.ValueType # 150 + """ + Elecrow ThinkNode MX + """ PRIVATE_HW: _HardwareModel.ValueType # 255 """ ------------------------------------------------------------------------------------------------------------------------------------------ @@ -735,13 +775,13 @@ RAK11310: HardwareModel.ValueType # 26 """ RAK11310 (RP2040 + SX1262) """ -SENSELORA_RP2040: HardwareModel.ValueType # 27 +MAKERFABS_TRACKER: HardwareModel.ValueType # 27 """ -Makerfabs SenseLoRA Receiver (RP2040 + RFM96) +Makerfabs Tracker Reserved """ -SENSELORA_S3: HardwareModel.ValueType # 28 +MAKERFABS_RESERVED: HardwareModel.ValueType # 28 """ -Makerfabs SenseLoRA Industrial Monitor (ESP32-S3 + RFM96) +Makerfabs Reserved """ CANARYONE: HardwareModel.ValueType # 29 """ @@ -1156,9 +1196,9 @@ HELTEC_MESH_NODE_T096: HardwareModel.ValueType # 127 """ Heltec Mesh Node T096 board features an nRF52840 CPU and a TFT screen. """ -TRACKER_T1000_E_PRO: HardwareModel.ValueType # 128 +MESH_TRACKER_X1: HardwareModel.ValueType # 128 """ -Seeed studio T1000-E Pro tracker card. NRF52840 w/ LR2021 radio, +Seeed studio Mesh Tracker X1card. NRF52840 w/ LR2021 radio, GPS, button, buzzer, and sensors. """ THINKNODE_M7: HardwareModel.ValueType # 129 @@ -1203,6 +1243,46 @@ MESHNOLOGY_W10: HardwareModel.ValueType # 140 """ Meshnology W10 """ +HELTEC_RC32: HardwareModel.ValueType # 141 +""" +Heltec ESP32S3 + SX1262 +""" +HELTEC_RC52: HardwareModel.ValueType # 142 +""" +Heltec NRF52840 + SX1262 +""" +HELTEC_RCC6: HardwareModel.ValueType # 143 +""" +Heltec ESP32C6 + SX1262 +""" +SEEED_WIO_TRACKER_L1_PRO_1W: HardwareModel.ValueType # 144 +""" +Seeed Wio Tracker L1 Pro 1W, nRF52840 + SX1262 with 1 W external PA +""" +MESHNOLOGY_W12: HardwareModel.ValueType # 145 +""" +Meshnology W12 +""" +MESHPAGER_X2: HardwareModel.ValueType # 146 +""" +Seeed Studio MeshPager X2 +""" +T_CONNECT_PRO: HardwareModel.ValueType # 147 +""" +Lilygo T-CONNECT PRO +""" +AXIOMETA_GENESIS_MINI: HardwareModel.ValueType # 148 +""" +Axiometa Axiometa Genesis Mini +""" +MAKERFABS_NOMAD_TERMINAL: HardwareModel.ValueType # 149 +""" +MakerFabs Nomad Terminal +""" +THINKNODE_MX: HardwareModel.ValueType # 150 +""" +Elecrow ThinkNode MX +""" PRIVATE_HW: HardwareModel.ValueType # 255 """ ------------------------------------------------------------------------------------------------------------------------------------------ @@ -1414,6 +1494,18 @@ class _FirmwareEditionEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper """ Hamvention, the Dayton amateur radio convention """ + FAB: _FirmwareEdition.ValueType # 20 + """ + FAB, the international Fab Lab digital fabrication conference + """ + DRAGON_CON: _FirmwareEdition.ValueType # 21 + """ + Dragon Con, the yearly pop culture convention in Atlanta, GA + """ + CCC: _FirmwareEdition.ValueType # 22 + """ + Chaos Communication Congress, the hacker conference held yearly in Germany + """ DIY_EDITION: _FirmwareEdition.ValueType # 127 """ Placeholder for DIY and unofficial events @@ -1449,6 +1541,18 @@ HAMVENTION: FirmwareEdition.ValueType # 19 """ Hamvention, the Dayton amateur radio convention """ +FAB: FirmwareEdition.ValueType # 20 +""" +FAB, the international Fab Lab digital fabrication conference +""" +DRAGON_CON: FirmwareEdition.ValueType # 21 +""" +Dragon Con, the yearly pop culture convention in Atlanta, GA +""" +CCC: FirmwareEdition.ValueType # 22 +""" +Chaos Communication Congress, the hacker conference held yearly in Germany +""" DIY_EDITION: FirmwareEdition.ValueType # 127 """ Placeholder for DIY and unofficial events @@ -1525,6 +1629,22 @@ class _ExcludedModulesEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper """ Network config (not technically a module, but used to indicate network capabilities) """ + STATUSMESSAGE_CONFIG: _ExcludedModules.ValueType # 32768 + """ + Status Message module + """ + TRAFFICMANAGEMENT_CONFIG: _ExcludedModules.ValueType # 65536 + """ + Traffic Management module + """ + TAK_CONFIG: _ExcludedModules.ValueType # 131072 + """ + TAK module + """ + MESHBEACON_CONFIG: _ExcludedModules.ValueType # 262144 + """ + Mesh Beacon module + """ class ExcludedModules(_ExcludedModules, metaclass=_ExcludedModulesEnumTypeWrapper): """ @@ -1597,6 +1717,22 @@ NETWORK_CONFIG: ExcludedModules.ValueType # 16384 """ Network config (not technically a module, but used to indicate network capabilities) """ +STATUSMESSAGE_CONFIG: ExcludedModules.ValueType # 32768 +""" +Status Message module +""" +TRAFFICMANAGEMENT_CONFIG: ExcludedModules.ValueType # 65536 +""" +Traffic Management module +""" +TAK_CONFIG: ExcludedModules.ValueType # 131072 +""" +TAK module +""" +MESHBEACON_CONFIG: ExcludedModules.ValueType # 262144 +""" +Mesh Beacon module +""" global___ExcludedModules = ExcludedModules @typing.final @@ -1797,7 +1933,7 @@ class Position(google.protobuf.message.Message): """ ground_speed: builtins.int """ - Ground speed in m/s and True North TRACK in 1/100 degrees + Ground speed in km/h and True North TRACK in 1/100 degrees Clarification of terms: - "track" is the direction of motion (measured in horizontal plane) - "heading" is where the fuselage points (measured in horizontal plane) @@ -1932,6 +2068,9 @@ class User(google.protobuf.message.Message): long_name: builtins.str """ A full name for this user, i.e. "Kevin Hester" + Limited to 24 bytes of UTF-8: longer names are accepted from senders + built against the older 39-byte limit, but devices truncate them before + storing or rebroadcasting. Clients should enforce 24 bytes in their UI. """ short_name: builtins.str """ @@ -2214,11 +2353,39 @@ class Routing(google.protobuf.message.Message): ROUTE_REQUEST_FIELD_NUMBER: builtins.int ROUTE_REPLY_FIELD_NUMBER: builtins.int ERROR_REASON_FIELD_NUMBER: builtins.int + ACK_PROOF_FIELD_NUMBER: builtins.int error_reason: global___Routing.Error.ValueType """ A failure in delivering a message (usually used for routing control messages, but might be provided in addition to ack.fail_id to provide details on the type of failure). """ + ack_proof: builtins.bytes + """ + Optional proof that this ack/nak was produced by the node that actually received the packet + identified by Data.request_id, rather than by anyone holding the channel key. + + Explicit acks are usually sent on the channel, and channel traffic is encrypted but not + authenticated, so such an ack can be forged by any listener holding the PSK. When the + acknowledged packet WAS PKI encrypted, the two endpoints already share a Curve25519 secret, so + the receiver can prove receipt cheaply rather than signing the ack: + + ack_proof = HMAC-SHA256(shared_key, + "ack" | LE32(from) | LE32(to) | LE32(request_id) | routing)[0..8) + + where shared_key is the same SHA256(X25519(sender_private, receiver_public)) used for PKI + packet encryption, and `routing` is this encoded Routing message without the ack_proof field. + + Each input is load-bearing. request_id stops a captured proof being replayed against a + different outstanding packet. The Routing bytes stop a bit-flip turning a proven success into a + failure: an ack and a nak for one packet otherwise share every other input, and channel + encryption is CTR with no integrity check. Integers are little-endian so the value is a + property of the protocol rather than of the host that computed it. + + Unset when no pairwise key is available, including the PKI_UNKNOWN_PUBKEY and NO_CHANNEL naks, + which are emitted precisely because the packet could not be decrypted. Receivers that do not + understand this field ignore it. It does not replace xeddsa_signature, which remains the only + option for traffic with no pairwise key and the only proof a third party can check. + """ @property def route_request(self) -> global___RouteDiscovery: """ @@ -2237,9 +2404,10 @@ class Routing(google.protobuf.message.Message): route_request: global___RouteDiscovery | None = ..., route_reply: global___RouteDiscovery | None = ..., error_reason: global___Routing.Error.ValueType = ..., + ack_proof: builtins.bytes = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["error_reason", b"error_reason", "route_reply", b"route_reply", "route_request", b"route_request", "variant", b"variant"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["error_reason", b"error_reason", "route_reply", b"route_reply", "route_request", b"route_request", "variant", b"variant"]) -> None: ... + def ClearField(self, field_name: typing.Literal["ack_proof", b"ack_proof", "error_reason", b"error_reason", "route_reply", b"route_reply", "route_request", b"route_request", "variant", b"variant"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["variant", b"variant"]) -> typing.Literal["route_request", "route_reply", "error_reason"] | None: ... global___Routing = Routing @@ -2263,6 +2431,7 @@ class Data(google.protobuf.message.Message): REPLY_ID_FIELD_NUMBER: builtins.int EMOJI_FIELD_NUMBER: builtins.int BITFIELD_FIELD_NUMBER: builtins.int + XEDDSA_SIGNATURE_FIELD_NUMBER: builtins.int portnum: meshtastic.protobuf.portnums_pb2.PortNum.ValueType """ Formerly named typ and of type Type @@ -2309,6 +2478,10 @@ class Data(google.protobuf.message.Message): """ Bitfield for extra flags. First use is to indicate that user approves the packet being uploaded to MQTT. """ + xeddsa_signature: builtins.bytes + """ + XEdDSA signature for the payload + """ def __init__( self, *, @@ -2321,9 +2494,10 @@ class Data(google.protobuf.message.Message): reply_id: builtins.int = ..., emoji: builtins.int = ..., bitfield: builtins.int | None = ..., + xeddsa_signature: builtins.bytes = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["_bitfield", b"_bitfield", "bitfield", b"bitfield"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_bitfield", b"_bitfield", "bitfield", b"bitfield", "dest", b"dest", "emoji", b"emoji", "payload", b"payload", "portnum", b"portnum", "reply_id", b"reply_id", "request_id", b"request_id", "source", b"source", "want_response", b"want_response"]) -> None: ... + def ClearField(self, field_name: typing.Literal["_bitfield", b"_bitfield", "bitfield", b"bitfield", "dest", b"dest", "emoji", b"emoji", "payload", b"payload", "portnum", b"portnum", "reply_id", b"reply_id", "request_id", b"request_id", "source", b"source", "want_response", b"want_response", "xeddsa_signature", b"xeddsa_signature"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["_bitfield", b"_bitfield"]) -> typing.Literal["bitfield"] | None: ... global___Data = Data @@ -2620,6 +2794,51 @@ class RemoteShell(google.protobuf.message.Message): global___RemoteShell = RemoteShell +@typing.final +class BoundingBox(google.protobuf.message.Message): + """ + A rectangular, axis-aligned geographic bounding box. + Used to define a rectangular geofence region for a Waypoint. + Fields are ordered west, south, east, north to match the standard bounding box + convention used by GeoJSON and PMTiles (min longitude, min latitude, max longitude, max latitude), + so the box can drive an offline map extract directly. + All coordinates are in degrees scaled by 1e-7 (same convention as Position and Waypoint). + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LONGITUDE_WEST_I_FIELD_NUMBER: builtins.int + LATITUDE_SOUTH_I_FIELD_NUMBER: builtins.int + LONGITUDE_EAST_I_FIELD_NUMBER: builtins.int + LATITUDE_NORTH_I_FIELD_NUMBER: builtins.int + longitude_west_i: builtins.int + """ + Western edge of the box - minimum longitude (south-west corner) + """ + latitude_south_i: builtins.int + """ + Southern edge of the box - minimum latitude (south-west corner) + """ + longitude_east_i: builtins.int + """ + Eastern edge of the box - maximum longitude (north-east corner) + """ + latitude_north_i: builtins.int + """ + Northern edge of the box - maximum latitude (north-east corner) + """ + def __init__( + self, + *, + longitude_west_i: builtins.int = ..., + latitude_south_i: builtins.int = ..., + longitude_east_i: builtins.int = ..., + latitude_north_i: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["latitude_north_i", b"latitude_north_i", "latitude_south_i", b"latitude_south_i", "longitude_east_i", b"longitude_east_i", "longitude_west_i", b"longitude_west_i"]) -> None: ... + +global___BoundingBox = BoundingBox + @typing.final class Waypoint(google.protobuf.message.Message): """ @@ -2636,6 +2855,11 @@ class Waypoint(google.protobuf.message.Message): NAME_FIELD_NUMBER: builtins.int DESCRIPTION_FIELD_NUMBER: builtins.int ICON_FIELD_NUMBER: builtins.int + GEOFENCE_RADIUS_FIELD_NUMBER: builtins.int + BOUNDING_BOX_FIELD_NUMBER: builtins.int + NOTIFY_ON_ENTER_FIELD_NUMBER: builtins.int + NOTIFY_ON_EXIT_FIELD_NUMBER: builtins.int + NOTIFY_FAVORITES_ONLY_FIELD_NUMBER: builtins.int id: builtins.int """ Id of the waypoint @@ -2669,6 +2893,36 @@ class Waypoint(google.protobuf.message.Message): """ Designator icon for the waypoint in the form of a unicode emoji """ + geofence_radius: builtins.int + """ + If greater than zero, defines a circular geofence centred on this waypoint's + location (latitude_i / longitude_i) with this radius in meters. + Zero means the waypoint has no circular geofence. + """ + notify_on_enter: builtins.bool + """ + If true, a notification should be raised when a tracked node enters this + waypoint's geofence (the circular radius and/or the bounding box). + """ + notify_on_exit: builtins.bool + """ + If true, a notification should be raised when a tracked node exits this + waypoint's geofence (the circular radius and/or the bounding box). + """ + notify_favorites_only: builtins.bool + """ + If true, only raise geofence enter/exit notifications for nodes that are + marked as favorites on the receiving device. Applies to both notify_on_enter + and notify_on_exit. Favorite status is resolved locally per receiver, so the + same waypoint alerts each node only for its own favorites. + """ + @property + def bounding_box(self) -> global___BoundingBox: + """ + Optional rectangular geofence region for this waypoint. + May be used instead of, or in addition to, geofence_radius. + """ + def __init__( self, *, @@ -2680,9 +2934,16 @@ class Waypoint(google.protobuf.message.Message): name: builtins.str = ..., description: builtins.str = ..., icon: builtins.int = ..., + geofence_radius: builtins.int = ..., + bounding_box: global___BoundingBox | None = ..., + notify_on_enter: builtins.bool = ..., + notify_on_exit: builtins.bool = ..., + notify_favorites_only: builtins.bool = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_latitude_i", b"_latitude_i", "_longitude_i", b"_longitude_i", "latitude_i", b"latitude_i", "longitude_i", b"longitude_i"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_latitude_i", b"_latitude_i", "_longitude_i", b"_longitude_i", "description", b"description", "expire", b"expire", "icon", b"icon", "id", b"id", "latitude_i", b"latitude_i", "locked_to", b"locked_to", "longitude_i", b"longitude_i", "name", b"name"]) -> None: ... + def HasField(self, field_name: typing.Literal["_bounding_box", b"_bounding_box", "_latitude_i", b"_latitude_i", "_longitude_i", b"_longitude_i", "bounding_box", b"bounding_box", "latitude_i", b"latitude_i", "longitude_i", b"longitude_i"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_bounding_box", b"_bounding_box", "_latitude_i", b"_latitude_i", "_longitude_i", b"_longitude_i", "bounding_box", b"bounding_box", "description", b"description", "expire", b"expire", "geofence_radius", b"geofence_radius", "icon", b"icon", "id", b"id", "latitude_i", b"latitude_i", "locked_to", b"locked_to", "longitude_i", b"longitude_i", "name", b"name", "notify_favorites_only", b"notify_favorites_only", "notify_on_enter", b"notify_on_enter", "notify_on_exit", b"notify_on_exit"]) -> None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_bounding_box", b"_bounding_box"]) -> typing.Literal["bounding_box"] | None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_latitude_i", b"_latitude_i"]) -> typing.Literal["latitude_i"] | None: ... @typing.overload @@ -2954,6 +3215,10 @@ class MeshPacket(google.protobuf.message.Message): """ Arrived via API connection """ + TRANSPORT_UNICAST_UDP: MeshPacket._TransportMechanism.ValueType # 8 + """ + Arrived via Unicast UDP + """ class TransportMechanism(_TransportMechanism, metaclass=_TransportMechanismEnumTypeWrapper): """ @@ -2992,6 +3257,137 @@ class MeshPacket(google.protobuf.message.Message): """ Arrived via API connection """ + TRANSPORT_UNICAST_UDP: MeshPacket.TransportMechanism.ValueType # 8 + """ + Arrived via Unicast UDP + """ + + class _AckProofStatus: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _AckProofStatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[MeshPacket._AckProofStatus.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + ACK_PROOF_ABSENT: MeshPacket._AckProofStatus.ValueType # 0 + """ + No verdict. The default, and what every ack from firmware predating Routing.ack_proof looks + like, so an absent field and an absent proof read the same. + + Also reported when a proof was carried but not checked: the ack came from a node other than + the one the packet was addressed to (a nak from an intermediate, for example), the packet was + no longer awaiting an ack, or the proof was malformed. A build without PKI never checks one. + A proof is only checked while the packet it acknowledges is still pending, so on a multi-hop + path an overheard relay can settle the packet first and leave a genuine receipt reading ABSENT. + """ + ACK_PROOF_VALID: MeshPacket._AckProofStatus.ValueType # 1 + """ + A proof was carried and verified against the public key of the node the acknowledged packet + was addressed to. The only value that means "the recipient received it". + + Verifying against the key of whoever the ack claims to be from is NOT sufficient: the proof + only shows its author holds a pairwise secret with us, and every keyed peer holds one, so + any of them could otherwise mint a receipt for a packet addressed to someone else. + """ + ACK_PROOF_INVALID: MeshPacket._AckProofStatus.ValueType # 2 + """ + A proof was carried and did not verify. Someone produced an ack for an outstanding packet + without holding the pairwise secret, so this is an attempted forgery rather than a quiet + absence, and is worth surfacing differently from ACK_PROOF_ABSENT. + """ + ACK_PROOF_NO_KEY: MeshPacket._AckProofStatus.ValueType # 3 + """ + A proof was carried but no authoritative public key was available to check it against, so + the ack is neither proven nor disproven. + """ + + class AckProofStatus(_AckProofStatus, metaclass=_AckProofStatusEnumTypeWrapper): + """ + Outcome of checking Routing.ack_proof on a received ack or nak. + + Reported, never enforced: an ack without a usable proof is acted on exactly as it was before + proofs existed. The value exists so a client can tell a proven delivery receipt from an + unproven one, and can tell "nobody proved this" from "somebody tried and failed". + """ + + ACK_PROOF_ABSENT: MeshPacket.AckProofStatus.ValueType # 0 + """ + No verdict. The default, and what every ack from firmware predating Routing.ack_proof looks + like, so an absent field and an absent proof read the same. + + Also reported when a proof was carried but not checked: the ack came from a node other than + the one the packet was addressed to (a nak from an intermediate, for example), the packet was + no longer awaiting an ack, or the proof was malformed. A build without PKI never checks one. + A proof is only checked while the packet it acknowledges is still pending, so on a multi-hop + path an overheard relay can settle the packet first and leave a genuine receipt reading ABSENT. + """ + ACK_PROOF_VALID: MeshPacket.AckProofStatus.ValueType # 1 + """ + A proof was carried and verified against the public key of the node the acknowledged packet + was addressed to. The only value that means "the recipient received it". + + Verifying against the key of whoever the ack claims to be from is NOT sufficient: the proof + only shows its author holds a pairwise secret with us, and every keyed peer holds one, so + any of them could otherwise mint a receipt for a packet addressed to someone else. + """ + ACK_PROOF_INVALID: MeshPacket.AckProofStatus.ValueType # 2 + """ + A proof was carried and did not verify. Someone produced an ack for an outstanding packet + without holding the pairwise secret, so this is an attempted forgery rather than a quiet + absence, and is worth surfacing differently from ACK_PROOF_ABSENT. + """ + ACK_PROOF_NO_KEY: MeshPacket.AckProofStatus.ValueType # 3 + """ + A proof was carried but no authoritative public key was available to check it against, so + the ack is neither proven nor disproven. + """ + + class _SlotParity: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _SlotParityEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[MeshPacket._SlotParity.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + SLOT_PARITY_UNSET: MeshPacket._SlotParity.ValueType # 0 + """ + No parity asked for: the ordinary backoff draw over the whole contention window. + """ + SLOT_PARITY_EVEN: MeshPacket._SlotParity.ValueType # 1 + """ + Only even-numbered slots, counted from the end of the last frame on air. + """ + SLOT_PARITY_ODD: MeshPacket._SlotParity.ValueType # 2 + """ + Only odd-numbered slots, counted from the end of the last frame on air. + """ + + class SlotParity(_SlotParity, metaclass=_SlotParityEnumTypeWrapper): + """ + Which slots of the CSMA backoff grid a transmission may draw from. + + Never sent over the radio links. Like priority, it steers how the local node schedules the + packet: a module sets it on a packet it is queueing, and the radio driver reads it when it + draws the backoff for that packet. + + A node normally draws any slot of the contention window, counted from the moment it draws. + A packet that asks for a parity instead has its slots counted from the end of the last frame + this node sent or heard, and only slots of that parity are taken, so two senders on opposite + parities that redraw after the same frame never land on the same slot, and so are always at + least a slot apart. Useful for a pair of nodes exchanging a stream, where the two ends + otherwise collide with each other far more often than with the rest of the mesh. + """ + + SLOT_PARITY_UNSET: MeshPacket.SlotParity.ValueType # 0 + """ + No parity asked for: the ordinary backoff draw over the whole contention window. + """ + SLOT_PARITY_EVEN: MeshPacket.SlotParity.ValueType # 1 + """ + Only even-numbered slots, counted from the end of the last frame on air. + """ + SLOT_PARITY_ODD: MeshPacket.SlotParity.ValueType # 2 + """ + Only odd-numbered slots, counted from the end of the last frame on air. + """ FROM_FIELD_NUMBER: builtins.int TO_FIELD_NUMBER: builtins.int @@ -3014,6 +3410,9 @@ class MeshPacket(google.protobuf.message.Message): RELAY_NODE_FIELD_NUMBER: builtins.int TX_AFTER_FIELD_NUMBER: builtins.int TRANSPORT_MECHANISM_FIELD_NUMBER: builtins.int + XEDDSA_SIGNED_FIELD_NUMBER: builtins.int + ACK_PROOF_STATUS_FIELD_NUMBER: builtins.int + SLOT_PARITY_FIELD_NUMBER: builtins.int to: builtins.int """ The (immediate) destination for this packet @@ -3053,6 +3452,12 @@ class MeshPacket(google.protobuf.message.Message): Note: this field is _never_ sent on the radio link itself (to save space) Times are typically not sent over the mesh, but they will be added to any Packet (chain of SubPacket) sent to the phone (so the phone can know exact time of reception) + Explicit presence: firmware cannot always attach a trustworthy wall-clock timestamp at the + moment of reception - a node with no GPS and no phone connected yet has no time source at + all. has_rx_time disambiguates that state from a genuine (if coincidental) 1970-01-01 + reading. A packet delivered with this field absent may still be re-timestamped once a valid + clock becomes available, before the phone ever sees it - "absent" is not guaranteed + permanent, only "not yet known at last observation". """ rx_snr: builtins.float """ @@ -3087,6 +3492,9 @@ class MeshPacket(google.protobuf.message.Message): rx_rssi: builtins.int """ rssi of received packet. Only sent to phone for dispay purposes. + Explicit presence: rssi 0 is a legitimate reading on some radios (SX126x can report exactly + 0 dBm; SX127x's formula can even go positive). has_rx_rssi disambiguates; a replayed packet + built from history should leave this field absent rather than emitting 0. """ delayed: global___MeshPacket.Delayed.ValueType """ @@ -3100,6 +3508,10 @@ class MeshPacket(google.protobuf.message.Message): """ Hop limit with which the original packet started. Sent via LoRa using three bits in the unencrypted header. When receiving a packet, the difference between hop_start and hop_limit gives how many hops it traveled. + hop_start == 0 does not necessarily mean a direct (0-hop) neighbor: firmware prior to 2.3.0 + never populated this field, so a receiver can only trust hop_start == 0 as genuine once it has + decoded the packet and confirmed the sender's bitfield is present (added in 2.5.0). Until then, + or for a sender that never sets that bitfield, treat hop_start == 0 as unknown, not direct. """ public_key: builtins.bytes """ @@ -3129,6 +3541,28 @@ class MeshPacket(google.protobuf.message.Message): """ Indicates which transport mechanism this packet arrived over """ + xeddsa_signed: builtins.bool + """ + Indicates whether the packet has a valid signature + """ + ack_proof_status: global___MeshPacket.AckProofStatus.ValueType + """ + *Never* sent over the radio links. + Set by the firmware on a received ack or nak, reporting whether its Routing.ack_proof proved + that the node we addressed is the one acknowledging. Clients are not supposed to set this, and + the firmware clears whatever arrives here before evaluating a packet - an inbound value is + attacker-controlled, since MQTT and the client API both carry whole MeshPacket protobufs. + + Distinct from xeddsa_signed, which is an identity signature any holder of the sender's public + key can check. This is a pairwise MAC that only the original sender can check, and it attests + to delivery rather than to authorship. + """ + slot_parity: global___MeshPacket.SlotParity.ValueType + """ + Never sent over the radio links. + Which parity of the CSMA backoff slot grid this packet may be sent in; see SlotParity. + Set by whoever queues the packet, and read by the radio driver when it draws the backoff. + """ @property def decoded(self) -> global___Data: """ @@ -3143,12 +3577,12 @@ class MeshPacket(google.protobuf.message.Message): decoded: global___Data | None = ..., encrypted: builtins.bytes = ..., id: builtins.int = ..., - rx_time: builtins.int = ..., + rx_time: builtins.int | None = ..., rx_snr: builtins.float = ..., hop_limit: builtins.int = ..., want_ack: builtins.bool = ..., priority: global___MeshPacket.Priority.ValueType = ..., - rx_rssi: builtins.int = ..., + rx_rssi: builtins.int | None = ..., delayed: global___MeshPacket.Delayed.ValueType = ..., via_mqtt: builtins.bool = ..., hop_start: builtins.int = ..., @@ -3158,9 +3592,17 @@ class MeshPacket(google.protobuf.message.Message): relay_node: builtins.int = ..., tx_after: builtins.int = ..., transport_mechanism: global___MeshPacket.TransportMechanism.ValueType = ..., + xeddsa_signed: builtins.bool = ..., + ack_proof_status: global___MeshPacket.AckProofStatus.ValueType = ..., + slot_parity: global___MeshPacket.SlotParity.ValueType = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["decoded", b"decoded", "encrypted", b"encrypted", "payload_variant", b"payload_variant"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["channel", b"channel", "decoded", b"decoded", "delayed", b"delayed", "encrypted", b"encrypted", "from", b"from", "hop_limit", b"hop_limit", "hop_start", b"hop_start", "id", b"id", "next_hop", b"next_hop", "payload_variant", b"payload_variant", "pki_encrypted", b"pki_encrypted", "priority", b"priority", "public_key", b"public_key", "relay_node", b"relay_node", "rx_rssi", b"rx_rssi", "rx_snr", b"rx_snr", "rx_time", b"rx_time", "to", b"to", "transport_mechanism", b"transport_mechanism", "tx_after", b"tx_after", "via_mqtt", b"via_mqtt", "want_ack", b"want_ack"]) -> None: ... + def HasField(self, field_name: typing.Literal["_rx_rssi", b"_rx_rssi", "_rx_time", b"_rx_time", "decoded", b"decoded", "encrypted", b"encrypted", "payload_variant", b"payload_variant", "rx_rssi", b"rx_rssi", "rx_time", b"rx_time"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_rx_rssi", b"_rx_rssi", "_rx_time", b"_rx_time", "ack_proof_status", b"ack_proof_status", "channel", b"channel", "decoded", b"decoded", "delayed", b"delayed", "encrypted", b"encrypted", "from", b"from", "hop_limit", b"hop_limit", "hop_start", b"hop_start", "id", b"id", "next_hop", b"next_hop", "payload_variant", b"payload_variant", "pki_encrypted", b"pki_encrypted", "priority", b"priority", "public_key", b"public_key", "relay_node", b"relay_node", "rx_rssi", b"rx_rssi", "rx_snr", b"rx_snr", "rx_time", b"rx_time", "slot_parity", b"slot_parity", "to", b"to", "transport_mechanism", b"transport_mechanism", "tx_after", b"tx_after", "via_mqtt", b"via_mqtt", "want_ack", b"want_ack", "xeddsa_signed", b"xeddsa_signed"]) -> None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_rx_rssi", b"_rx_rssi"]) -> typing.Literal["rx_rssi"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_rx_time", b"_rx_time"]) -> typing.Literal["rx_time"] | None: ... + @typing.overload def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["decoded", "encrypted"] | None: ... global___MeshPacket = MeshPacket @@ -3201,6 +3643,8 @@ class NodeInfo(google.protobuf.message.Message): IS_IGNORED_FIELD_NUMBER: builtins.int IS_KEY_MANUALLY_VERIFIED_FIELD_NUMBER: builtins.int IS_MUTED_FIELD_NUMBER: builtins.int + HAS_XEDDSA_SIGNED_FIELD_NUMBER: builtins.int + HEARD_ON_CURRENT_LORA_FIELD_NUMBER: builtins.int num: builtins.int """ The node number @@ -3253,6 +3697,29 @@ class NodeInfo(google.protobuf.message.Message): True if node has been muted Persistes between NodeDB internal clean ups """ + has_xeddsa_signed: builtins.bool + """ + True if node is signing its packets via XEdDSA + Persists between NodeDB internal clean ups + LSB 1 of the bitfield + """ + heard_on_current_lora: builtins.bool + """ + True if we have heard this node over RF on the LoRa configuration the + radio is using right now. Derived on the device rather than stored: each + node records the frequency slot it was last heard on, and this reports + whether that slot matches the one the radio is currently committed to. + The slot covers the region, modem preset (or the custom bandwidth/spread + factor/coding rate when use_preset is false), override_frequency, + channel_num and the primary channel name. + Because it is derived, leaving a configuration and returning to it + restores the previous answers, so a client sweeping through presets to + listen for traffic does not disturb them. + Not set for nodes heard only over MQTT, which reach us over the internet + rather than over our own radio - see via_mqtt - nor for nodes added as a + shared contact, which have never been heard over RF at all. + Derived from LSB 11 and bits 12..23 of NodeInfoLite.bitfield. + """ @property def user(self) -> global___User: """ @@ -3288,9 +3755,11 @@ class NodeInfo(google.protobuf.message.Message): is_ignored: builtins.bool = ..., is_key_manually_verified: builtins.bool = ..., is_muted: builtins.bool = ..., + has_xeddsa_signed: builtins.bool = ..., + heard_on_current_lora: 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", "is_key_manually_verified", b"is_key_manually_verified", "is_muted", b"is_muted", "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", "has_xeddsa_signed", b"has_xeddsa_signed", "heard_on_current_lora", b"heard_on_current_lora", "hops_away", b"hops_away", "is_favorite", b"is_favorite", "is_ignored", b"is_ignored", "is_key_manually_verified", b"is_key_manually_verified", "is_muted", b"is_muted", "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 @@ -3529,6 +3998,7 @@ class FromRadio(google.protobuf.message.Message): CLIENTNOTIFICATION_FIELD_NUMBER: builtins.int DEVICEUICONFIG_FIELD_NUMBER: builtins.int LOCKDOWN_STATUS_FIELD_NUMBER: builtins.int + REGION_PRESETS_FIELD_NUMBER: builtins.int id: builtins.int """ The packet id, used to allow the phone to request missing read packets from the FIFO, @@ -3644,6 +4114,16 @@ class FromRadio(google.protobuf.message.Message): encoding state as magic-string prefixes inside ClientNotification. """ + @property + def region_presets(self) -> global___LoRaRegionPresetMap: + """ + Map of which modem presets are legal in each LoRa region. Sent once + during the want_config handshake (right after `metadata`, before the + first `channel`) so client UIs can prevent the user from selecting an + illegal region+preset combination. A region that does not appear in + any group carries no constraint info and should not be restricted. + """ + def __init__( self, *, @@ -3665,10 +4145,11 @@ class FromRadio(google.protobuf.message.Message): clientNotification: global___ClientNotification | None = ..., deviceuiConfig: meshtastic.protobuf.device_ui_pb2.DeviceUIConfig | None = ..., lockdown_status: global___LockdownStatus | None = ..., + region_presets: global___LoRaRegionPresetMap | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["channel", b"channel", "clientNotification", b"clientNotification", "config", b"config", "config_complete_id", b"config_complete_id", "deviceuiConfig", b"deviceuiConfig", "fileInfo", b"fileInfo", "lockdown_status", b"lockdown_status", "log_record", b"log_record", "metadata", b"metadata", "moduleConfig", b"moduleConfig", "mqttClientProxyMessage", b"mqttClientProxyMessage", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queueStatus", b"queueStatus", "rebooted", b"rebooted", "xmodemPacket", b"xmodemPacket"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["channel", b"channel", "clientNotification", b"clientNotification", "config", b"config", "config_complete_id", b"config_complete_id", "deviceuiConfig", b"deviceuiConfig", "fileInfo", b"fileInfo", "id", b"id", "lockdown_status", b"lockdown_status", "log_record", b"log_record", "metadata", b"metadata", "moduleConfig", b"moduleConfig", "mqttClientProxyMessage", b"mqttClientProxyMessage", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queueStatus", b"queueStatus", "rebooted", b"rebooted", "xmodemPacket", b"xmodemPacket"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["packet", "my_info", "node_info", "config", "log_record", "config_complete_id", "rebooted", "moduleConfig", "channel", "queueStatus", "xmodemPacket", "metadata", "mqttClientProxyMessage", "fileInfo", "clientNotification", "deviceuiConfig", "lockdown_status"] | None: ... + def HasField(self, field_name: typing.Literal["channel", b"channel", "clientNotification", b"clientNotification", "config", b"config", "config_complete_id", b"config_complete_id", "deviceuiConfig", b"deviceuiConfig", "fileInfo", b"fileInfo", "lockdown_status", b"lockdown_status", "log_record", b"log_record", "metadata", b"metadata", "moduleConfig", b"moduleConfig", "mqttClientProxyMessage", b"mqttClientProxyMessage", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queueStatus", b"queueStatus", "rebooted", b"rebooted", "region_presets", b"region_presets", "xmodemPacket", b"xmodemPacket"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["channel", b"channel", "clientNotification", b"clientNotification", "config", b"config", "config_complete_id", b"config_complete_id", "deviceuiConfig", b"deviceuiConfig", "fileInfo", b"fileInfo", "id", b"id", "lockdown_status", b"lockdown_status", "log_record", b"log_record", "metadata", b"metadata", "moduleConfig", b"moduleConfig", "mqttClientProxyMessage", b"mqttClientProxyMessage", "my_info", b"my_info", "node_info", b"node_info", "packet", b"packet", "payload_variant", b"payload_variant", "queueStatus", b"queueStatus", "rebooted", b"rebooted", "region_presets", b"region_presets", "xmodemPacket", b"xmodemPacket"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["packet", "my_info", "node_info", "config", "log_record", "config_complete_id", "rebooted", "moduleConfig", "channel", "queueStatus", "xmodemPacket", "metadata", "mqttClientProxyMessage", "fileInfo", "clientNotification", "deviceuiConfig", "lockdown_status", "region_presets"] | None: ... global___FromRadio = FromRadio @@ -3713,6 +4194,15 @@ class LockdownStatus(google.protobuf.message.Message): """ Passphrase rejected. backoff_seconds is non-zero when rate-limited. """ + DISABLED: LockdownStatus._State.ValueType # 5 + """ + Lockdown is supported by this firmware but not currently active + (no passphrase has been provisioned, or it was disabled via + AdminMessage.lockdown_auth.disable). The device is operating in + normal, non-encrypted mode. Clients render the lockdown-mode + toggle as OFF on receiving this. Distinct from NEEDS_PROVISION, + which is only used during an in-progress enable flow. + """ class State(_State, metaclass=_StateEnumTypeWrapper): ... STATE_UNSPECIFIED: LockdownStatus.State.ValueType # 0 @@ -3739,6 +4229,15 @@ class LockdownStatus(google.protobuf.message.Message): """ Passphrase rejected. backoff_seconds is non-zero when rate-limited. """ + DISABLED: LockdownStatus.State.ValueType # 5 + """ + Lockdown is supported by this firmware but not currently active + (no passphrase has been provisioned, or it was disabled via + AdminMessage.lockdown_auth.disable). The device is operating in + normal, non-encrypted mode. Clients render the lockdown-mode + toggle as OFF on receiving this. Distinct from NEEDS_PROVISION, + which is only used during an in-progress enable flow. + """ STATE_FIELD_NUMBER: builtins.int LOCK_REASON_FIELD_NUMBER: builtins.int @@ -3750,15 +4249,15 @@ class LockdownStatus(google.protobuf.message.Message): lock_reason: builtins.str """ For LOCKED: machine-readable reason. Known values: - "needs_auth" — storage already unlocked, client must auth - "token_missing" — no boot token on flash - "token_expired" — boot token wall-clock TTL elapsed - "token_boots_zero" — boot token boot-count TTL exhausted - "token_hmac_fail" — token tampered or wrong device - "token_dek_fail" — token DEK decrypt failed - "token_wrong_size" — token file corrupted - "token_bad_magic" — token file corrupted - "not_provisioned" — should generally use NEEDS_PROVISION state instead + "needs_auth" - storage already unlocked, client must auth + "token_missing" - no boot token on flash + "token_expired" - boot token wall-clock TTL elapsed + "token_boots_zero" - boot token boot-count TTL exhausted + "token_hmac_fail" - token tampered or wrong device + "token_dek_fail" - token DEK decrypt failed + "token_wrong_size" - token file corrupted + "token_bad_magic" - token file corrupted + "not_provisioned" - should generally use NEEDS_PROVISION state instead Other values may be added; clients should treat unknown values as "locked, ask for passphrase". """ @@ -4174,6 +4673,7 @@ class DeviceMetadata(google.protobuf.message.Message): HASREMOTEHARDWARE_FIELD_NUMBER: builtins.int HASPKC_FIELD_NUMBER: builtins.int EXCLUDED_MODULES_FIELD_NUMBER: builtins.int + HAS_XEDDSA_FIELD_NUMBER: builtins.int firmware_version: builtins.str """ Device firmware version string @@ -4223,6 +4723,11 @@ class DeviceMetadata(google.protobuf.message.Message): Bit field of boolean for excluded modules (bitwise OR of ExcludedModules) """ + has_xeddsa: builtins.bool + """ + Indicates whether this firmware build includes XEdDSA packet signature verification. + This is a read-only capability and must be false when XEdDSA is not compiled in. + """ def __init__( self, *, @@ -4238,11 +4743,126 @@ class DeviceMetadata(google.protobuf.message.Message): hasRemoteHardware: builtins.bool = ..., hasPKC: builtins.bool = ..., excluded_modules: builtins.int = ..., + has_xeddsa: builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["canShutdown", b"canShutdown", "device_state_version", b"device_state_version", "excluded_modules", b"excluded_modules", "firmware_version", b"firmware_version", "hasBluetooth", b"hasBluetooth", "hasEthernet", b"hasEthernet", "hasPKC", b"hasPKC", "hasRemoteHardware", b"hasRemoteHardware", "hasWifi", b"hasWifi", "hw_model", b"hw_model", "position_flags", b"position_flags", "role", b"role"]) -> None: ... + def ClearField(self, field_name: typing.Literal["canShutdown", b"canShutdown", "device_state_version", b"device_state_version", "excluded_modules", b"excluded_modules", "firmware_version", b"firmware_version", "hasBluetooth", b"hasBluetooth", "hasEthernet", b"hasEthernet", "hasPKC", b"hasPKC", "hasRemoteHardware", b"hasRemoteHardware", "hasWifi", b"hasWifi", "has_xeddsa", b"has_xeddsa", "hw_model", b"hw_model", "position_flags", b"position_flags", "role", b"role"]) -> None: ... global___DeviceMetadata = DeviceMetadata +@typing.final +class LoRaPresetGroup(google.protobuf.message.Message): + """ + A distinct set of legal modem presets shared by one or more LoRa regions. + Regions that have an identical preset list / default / licensing reference + the same group (by index) via LoRaRegionPresetMap.region_groups. This keeps + the whole map small enough to fit in a single FromRadio packet, since most + regions share the one standard preset list. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PRESETS_FIELD_NUMBER: builtins.int + DEFAULT_PRESET_FIELD_NUMBER: builtins.int + LICENSED_ONLY_FIELD_NUMBER: builtins.int + default_preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType + """ + The firmware's default modem preset for regions in this group. + Always one of `presets`. Clients should select this when switching to one + of these regions, or when the current preset is not legal in the new region. + """ + licensed_only: builtins.bool + """ + True if regions referencing this group are for licensed operators only + (e.g. amateur / ham radio bands). Clients should warn or gate accordingly. + """ + @property + def presets(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType]: + """ + The modem presets that are legal for every region referencing this group. + """ + + def __init__( + self, + *, + presets: collections.abc.Iterable[meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType] | None = ..., + default_preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType = ..., + licensed_only: builtins.bool = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["default_preset", b"default_preset", "licensed_only", b"licensed_only", "presets", b"presets"]) -> None: ... + +global___LoRaPresetGroup = LoRaPresetGroup + +@typing.final +class LoRaRegionPresets(google.protobuf.message.Message): + """ + Associates a single LoRa region with its preset group. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + REGION_FIELD_NUMBER: builtins.int + GROUP_INDEX_FIELD_NUMBER: builtins.int + region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType + """ + The LoRa region this entry describes. + """ + group_index: builtins.int + """ + Index into LoRaRegionPresetMap.groups for the preset list that is legal + in `region`. + """ + def __init__( + self, + *, + region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType = ..., + group_index: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["group_index", b"group_index", "region", b"region"]) -> None: ... + +global___LoRaRegionPresets = LoRaRegionPresets + +@typing.final +class LoRaRegionPresetMap(google.protobuf.message.Message): + """ + Map describing which modem presets are valid for each LoRa region. Sent by + the firmware during the want_config handshake (as FromRadio.region_presets) + so that client UIs can prevent illegal region+preset selections. + + Delivery is grouped to save space: `groups` holds each distinct preset list, + and `region_groups` maps every known region to one of those groups by index. + A region that does NOT appear in `region_groups` carries no constraint + information and should not be restricted by the client (e.g. firmware that + predates this message, or a region with no firmware table entry). Clients + must also tolerate this whole message being absent. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + GROUPS_FIELD_NUMBER: builtins.int + REGION_GROUPS_FIELD_NUMBER: builtins.int + @property + def groups(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___LoRaPresetGroup]: + """ + One entry per distinct (preset-list, default, licensing) combination. + Referenced by index from `region_groups`. + """ + + @property + def region_groups(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___LoRaRegionPresets]: + """ + One entry per known LoRa region, pointing at its preset group. + """ + + def __init__( + self, + *, + groups: collections.abc.Iterable[global___LoRaPresetGroup] | None = ..., + region_groups: collections.abc.Iterable[global___LoRaRegionPresets] | None = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["groups", b"groups", "region_groups", b"region_groups"]) -> None: ... + +global___LoRaRegionPresetMap = LoRaRegionPresetMap + @typing.final class Heartbeat(google.protobuf.message.Message): """ diff --git a/meshtastic/protobuf/module_config_pb2.py b/meshtastic/protobuf/module_config_pb2.py index 0bebf1a73..69996a49b 100644 --- a/meshtastic/protobuf/module_config_pb2.py +++ b/meshtastic/protobuf/module_config_pb2.py @@ -12,10 +12,13 @@ from meshtastic.protobuf import atak_pb2 as meshtastic_dot_protobuf_dot_atak__pb2 +from meshtastic.protobuf import channel_pb2 as meshtastic_dot_protobuf_dot_channel__pb2 +from meshtastic.protobuf import config_pb2 as meshtastic_dot_protobuf_dot_config__pb2 +from meshtastic.protobuf import field_metadata_pb2 as meshtastic_dot_protobuf_dot_field__metadata__pb2 from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\'meshtastic/protobuf/module_config.proto\x12\x13meshtastic.protobuf\x1a\x1emeshtastic/protobuf/atak.proto\x1a meshtastic/protobuf/nanopb.proto\"\x9f\x30\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\x12N\n\rstatusmessage\x18\x0e \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.StatusMessageConfigH\x00\x12W\n\x12traffic_management\x18\x0f \x01(\x0b\x32\x39.meshtastic.protobuf.ModuleConfig.TrafficManagementConfigH\x00\x12:\n\x03tak\x18\x10 \x01(\x0b\x32+.meshtastic.protobuf.ModuleConfig.TAKConfigH\x00\x1a\xd9\x02\n\nMQTTConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x16\n\x07\x61\x64\x64ress\x18\x02 \x01(\tB\x05\x92?\x02\x08@\x12\x17\n\x08username\x18\x03 \x01(\tB\x05\x92?\x02\x08@\x12\x17\n\x08password\x18\x04 \x01(\tB\x05\x92?\x02\x08 \x12\x1a\n\x12\x65ncryption_enabled\x18\x05 \x01(\x08\x12\x18\n\x0cjson_enabled\x18\x06 \x01(\x08\x42\x02\x18\x01\x12\x13\n\x0btls_enabled\x18\x07 \x01(\x08\x12\x13\n\x04root\x18\x08 \x01(\tB\x05\x92?\x02\x08 \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\x92\x01\n\x14RemoteHardwareConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1a\x61llow_undefined_pin_access\x18\x02 \x01(\x08\x12\x45\n\x0e\x61vailable_pins\x18\x03 \x03(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePinB\x05\x92?\x02\x10\x04\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\xb5\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\x13\n\x04name\x18\x05 \x01(\tB\x05\x92?\x02\x08\x14\x12\x1a\n\x0bmonitor_pin\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12j\n\x16\x64\x65tection_trigger_type\x18\x07 \x01(\x0e\x32\x43.meshtastic.protobuf.ModuleConfig.DetectionSensorConfig.TriggerTypeB\x05\x92?\x02\x08\x08\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\x90\x03\n\x0b\x41udioConfig\x12\x16\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x12\x16\n\x07ptt_pin\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12I\n\x07\x62itrate\x18\x03 \x01(\x0e\x32\x38.meshtastic.protobuf.ModuleConfig.AudioConfig.Audio_Baud\x12\x15\n\x06i2s_ws\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12\x15\n\x06i2s_sd\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x12\x16\n\x07i2s_din\x18\x06 \x01(\rB\x05\x92?\x02\x38\x08\x12\x16\n\x07i2s_sck\x18\x07 \x01(\rB\x05\x92?\x02\x38\x08\"\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\xd3\x03\n\x17TrafficManagementConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x1e\n\x16position_dedup_enabled\x18\x02 \x01(\x08\x12\x1f\n\x17position_precision_bits\x18\x03 \x01(\r\x12\"\n\x1aposition_min_interval_secs\x18\x04 \x01(\r\x12 \n\x18nodeinfo_direct_response\x18\x05 \x01(\x08\x12)\n!nodeinfo_direct_response_max_hops\x18\x06 \x01(\r\x12\x1a\n\x12rate_limit_enabled\x18\x07 \x01(\x08\x12\x1e\n\x16rate_limit_window_secs\x18\x08 \x01(\r\x12\x1e\n\x16rate_limit_max_packets\x18\t \x01(\r\x12\x1c\n\x14\x64rop_unknown_enabled\x18\n \x01(\x08\x12 \n\x18unknown_packet_threshold\x18\x0b \x01(\r\x12\x1d\n\x15\x65xhaust_hop_telemetry\x18\x0c \x01(\x08\x12\x1c\n\x14\x65xhaust_hop_position\x18\r \x01(\x08\x12\x1c\n\x14router_preserve_hops\x18\x0e \x01(\x08\x1a\xb5\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\"\x93\x01\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\x12\r\n\tMS_CONFIG\x10\x08\x12\x07\n\x03LOG\x10\t\x12\x0b\n\x07LOGTEXT\x10\n\x1a\xfe\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\x1b\n\x0coutput_vibra\x18\x08 \x01(\rB\x05\x92?\x02\x38\x08\x12\x1c\n\routput_buzzer\x18\t \x01(\rB\x05\x92?\x02\x38\x08\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\x1a\n\x0bnag_timeout\x18\x0e \x01(\rB\x05\x92?\x02\x38\x10\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\x1aY\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\x12\x17\n\x0f\x63lear_on_reboot\x18\x04 \x01(\x08\x1a\x8f\x04\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\x12 \n\x18\x64\x65vice_telemetry_enabled\x18\x0e \x01(\x08\x12\"\n\x1a\x61ir_quality_screen_enabled\x18\x0f \x01(\x08\x1a\xfe\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\x13\n\x07\x65nabled\x18\t \x01(\x08\x42\x02\x18\x01\x12#\n\x12\x61llow_input_source\x18\n \x01(\tB\x07\x18\x01\x92?\x02\x08\x10\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\x81\x01\n\x15\x41mbientLightingConfig\x12\x11\n\tled_state\x18\x01 \x01(\x08\x12\x16\n\x07\x63urrent\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08\x12\x12\n\x03red\x18\x03 \x01(\rB\x05\x92?\x02\x38\x08\x12\x14\n\x05green\x18\x04 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x04\x62lue\x18\x05 \x01(\rB\x05\x92?\x02\x38\x08\x1a\x31\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\x1a\x63\n\tTAKConfig\x12\'\n\x04team\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.Team\x12-\n\x04role\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.MemberRoleB\x11\n\x0fpayload_variant\"{\n\x11RemoteHardwarePin\x12\x17\n\x08gpio_pin\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x04name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x0f\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\x42h\n\x14org.meshtastic.protoB\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\x1a\x1emeshtastic/protobuf/atak.proto\x1a!meshtastic/protobuf/channel.proto\x1a meshtastic/protobuf/config.proto\x1a(meshtastic/protobuf/field_metadata.proto\x1a meshtastic/protobuf/nanopb.proto\"\xdf{\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\x12\\\n\rstatusmessage\x18\x0e \x01(\x0b\x32\x35.meshtastic.protobuf.ModuleConfig.StatusMessageConfigB\x0c\xca\xf3\x18\x08R\x06\x32.7.20H\x00\x12\x64\n\x12traffic_management\x18\x0f \x01(\x0b\x32\x39.meshtastic.protobuf.ModuleConfig.TrafficManagementConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12G\n\x03tak\x18\x10 \x01(\x0b\x32+.meshtastic.protobuf.ModuleConfig.TAKConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x12V\n\x0bmesh_beacon\x18\x11 \x01(\x0b\x32\x32.meshtastic.protobuf.ModuleConfig.MeshBeaconConfigB\x0b\xca\xf3\x18\x07R\x05\x32.8.0H\x00\x1a\xff\x07\n\nMQTTConfig\x12\x38\n\x07\x65nabled\x18\x01 \x01(\x08\x42\'\xca\xf3\x18#:\x0cMQTT EnabledB\x13\x45nable MQTT gateway\x12\x38\n\x07\x61\x64\x64ress\x18\x02 \x01(\tB\'\x92?\x02\x08@\xca\xf3\x18\x1e:\x07\x41\x64\x64ressB\x13MQTT server address\x12\x34\n\x08username\x18\x03 \x01(\tB\"\x92?\x02\x08@\xca\xf3\x18\x19:\x08UsernameB\rMQTT username\x12\x34\n\x08password\x18\x04 \x01(\tB\"\x92?\x02\x08 \xca\xf3\x18\x19:\x08PasswordB\rMQTT password\x12T\n\x12\x65ncryption_enabled\x18\x05 \x01(\x08\x42\x38\xca\xf3\x18\x34:\x12\x45ncryption EnabledB\x1eSend encrypted packets to MQTT\x12#\n\x0cjson_enabled\x18\x06 \x01(\x08\x42\r\x18\x01\xca\xf3\x18\x07Z\x05\x32.8.0\x12^\n\x0btls_enabled\x18\x07 \x01(\x08\x42I\xca\xf3\x18\x45:\x0bTLS EnabledB6TLS is required for the public Meshtastic MQTT server.\x12\x34\n\x04root\x18\x08 \x01(\tB&\x92?\x02\x08 \xca\xf3\x18\x1d:\nRoot TopicB\x0fMQTT root topic\x12{\n\x17proxy_to_client_enabled\x18\t \x01(\x08\x42Z\xca\xf3\x18V:\x11MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.\x12\xb0\x02\n\x15map_reporting_enabled\x18\n \x01(\x08\x42\x90\x02\xca\xf3\x18\x8b\x02:\rMap ReportingB\xf9\x01Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name.\x12P\n\x13map_report_settings\x18\x0b \x01(\x0b\x32\x33.meshtastic.protobuf.ModuleConfig.MapReportSettings\x1a\xcb\x02\n\x11MapReportSettings\x12\x62\n\x15publish_interval_secs\x18\x01 \x01(\rBC\xca\xf3\x18?*\x01s:\x14Map Publish IntervalB$How often a map report is published.\x12\x1a\n\x12position_precision\x18\x02 \x01(\r\x12\xb5\x01\n\x16should_report_location\x18\x03 \x01(\x08\x42\x94\x01\xca\xf3\x18\x8f\x01:\x0fReport LocationBuI have read and understand the above. I voluntarily consent to the unencrypted transmission of my node data via MQTT.R\x05\x32.6.8\x1a\x92\x01\n\x14RemoteHardwareConfig\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\"\n\x1a\x61llow_undefined_pin_access\x18\x02 \x01(\x08\x12\x45\n\x0e\x61vailable_pins\x18\x03 \x03(\x0b\x32&.meshtastic.protobuf.RemoteHardwarePinB\x05\x92?\x02\x10\x04\x1a\xe1\x03\n\x12NeighborInfoConfig\x12\xb2\x01\n\x07\x65nabled\x18\x01 \x01(\x08\x42\xa0\x01\xca\xf3\x18\x9b\x01:\x15Neighbor Info EnabledB\x81\x01\x45nable neighbor info broadcasting. Periodically sends information about directly-heard neighbors to help visualize mesh topology.\x12X\n\x0fupdate_interval\x18\x02 \x01(\rB?\xca\xf3\x18;*\x01s:\x0fUpdate IntervalB%How often to broadcast neighbor info.\x12\xbb\x01\n\x12transmit_over_lora\x18\x03 \x01(\x08\x42\x9e\x01\xca\xf3\x18\x99\x01:\x12Transmit over LoRaB\x82\x01Whether to transmit neighbor info over LoRa in addition to MQTT and PhoneAPI. Not available on channels with default key and name.\x1a\x8a\x0b\n\x15\x44\x65tectionSensorConfig\x12\x83\x02\n\x07\x65nabled\x18\x01 \x01(\x08\x42\xf1\x01\xca\xf3\x18\xec\x01:\x18\x44\x65tection Sensor EnabledB\xcf\x01\x45nables the detection sensor module, it needs to be enabled on both the node with the sensor, and any nodes that you want to receive detection sensor text messages or view the detection sensor log and chart.\x12~\n\x16minimum_broadcast_secs\x18\x02 \x01(\rB^\xca\xf3\x18Z*\x01s:)Minimum time between detection broadcastsB*Minimum time between detection broadcasts.\x12\xa1\x01\n\x14state_broadcast_secs\x18\x03 \x01(\rB\x82\x01\xca\xf3\x18~*\x01s:\x18State Broadcast IntervalB_How often to send the detection sensor state to the mesh, whether or not anything was detected.\x12|\n\tsend_bell\x18\x04 \x01(\x08\x42i\xca\xf3\x18\x65:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.\x12<\n\x04name\x18\x05 \x01(\tB.\x92?\x02\x08\x14\xca\xf3\x18%:\x04NameB\x1dSensor name for mesh messages\x12X\n\x0bmonitor_pin\x18\x06 \x01(\rBC\x92?\x02\x38\x08\xca\xf3\x18::\x13GPIO Pin to monitorB#GPIO pin watched for state changes.\x12\x92\x01\n\x16\x64\x65tection_trigger_type\x18\x07 \x01(\x0e\x32\x43.meshtastic.protobuf.ModuleConfig.DetectionSensorConfig.TriggerTypeB-\x92?\x02\x08\x08\xca\xf3\x18$:\x0bTriggerTypeB\x15Type of trigger event\x12\xa3\x01\n\nuse_pullup\x18\x08 \x01(\x08\x42\x8e\x01\xca\xf3\x18\x89\x01:\x14Uses pullup resistorBqWhether or not use INPUT_PULLUP mode for GPIO pin. Only applicable if the board uses pull-up resistors on the pin\"\xf5\x01\n\x0bTriggerType\x12\x18\n\tLOGIC_LOW\x10\x00\x1a\t\xca\xf3\x18\x05:\x03Low\x12\x1a\n\nLOGIC_HIGH\x10\x01\x1a\n\xca\xf3\x18\x06:\x04High\x12$\n\x0c\x46\x41LLING_EDGE\x10\x02\x1a\x12\xca\xf3\x18\x0e:\x0c\x46\x61lling Edge\x12\"\n\x0bRISING_EDGE\x10\x03\x1a\x11\xca\xf3\x18\r:\x0bRising Edge\x12\x31\n\x16\x45ITHER_EDGE_ACTIVE_LOW\x10\x04\x1a\x15\xca\xf3\x18\x11:\x0f\x45ither Edge Low\x12\x33\n\x17\x45ITHER_EDGE_ACTIVE_HIGH\x10\x05\x1a\x16\xca\xf3\x18\x12:\x10\x45ither Edge High\x1a\x94\x07\n\x0b\x41udioConfig\x12z\n\x0e\x63odec2_enabled\x18\x01 \x01(\x08\x42\x62\xca\xf3\x18^:\x0e\x43odec2 EnabledBLEnable Codec2 audio encoding/decoding for voice communication over the mesh.\x12\x42\n\x07ptt_pin\x18\x02 \x01(\rB1\x92?\x02\x38\x08\xca\xf3\x18(:\x07PTT PinB\x1dPush-to-talk GPIO pin number.\x12\xd3\x01\n\x07\x62itrate\x18\x03 \x01(\x0e\x32\x38.meshtastic.protobuf.ModuleConfig.AudioConfig.Audio_BaudB\x87\x01\xca\xf3\x18\x82\x01:\x07\x42itrateBwThe Codec2 bitrate to use. The sample rate is always 8 kHz. Lower bitrates use less bandwidth but reduce audio quality.\x12!\n\x06i2s_ws\x18\x04 \x01(\rB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08:\x06I2S WS\x12!\n\x06i2s_sd\x18\x05 \x01(\rB\x11\x92?\x02\x38\x08\xca\xf3\x18\x08:\x06I2S SD\x12#\n\x07i2s_din\x18\x06 \x01(\rB\x12\x92?\x02\x38\x08\xca\xf3\x18\t:\x07I2S DIN\x12#\n\x07i2s_sck\x18\x07 \x01(\rB\x12\x92?\x02\x38\x08\xca\xf3\x18\t:\x07I2S SCK\"\xde\x02\n\nAudio_Baud\x12!\n\x0e\x43ODEC2_DEFAULT\x10\x00\x1a\r\xca\xf3\x18\t:\x07\x44\x65\x66\x61ult\x12\x1f\n\x0b\x43ODEC2_3200\x10\x01\x1a\x0e\xca\xf3\x18\n:\x08\x33\x32\x30\x30 bps\x12\x1f\n\x0b\x43ODEC2_2400\x10\x02\x1a\x0e\xca\xf3\x18\n:\x08\x32\x34\x30\x30 bps\x12\x1f\n\x0b\x43ODEC2_1600\x10\x03\x1a\x0e\xca\xf3\x18\n:\x08\x31\x36\x30\x30 bps\x12\x1f\n\x0b\x43ODEC2_1400\x10\x04\x1a\x0e\xca\xf3\x18\n:\x08\x31\x34\x30\x30 bps\x12\x1f\n\x0b\x43ODEC2_1300\x10\x05\x1a\x0e\xca\xf3\x18\n:\x08\x31\x33\x30\x30 bps\x12\x1f\n\x0b\x43ODEC2_1200\x10\x06\x1a\x0e\xca\xf3\x18\n:\x08\x31\x32\x30\x30 bps\x12\x12\n\nCODEC2_700\x10\x07\x1a\x02\x08\x01\x12\x13\n\x0b\x43ODEC2_700B\x10\x08\x1a\x02\x08\x01\x12\x1f\n\x0b\x43ODEC2_700C\x10\t\x1a\x0e\xca\xf3\x18\n:\x08\x37\x30\x30\x43 bps\x12\x1d\n\nCODEC2_450\x10\n\x1a\r\xca\xf3\x18\t:\x07\x34\x35\x30 bps\x1a\xa9\x04\n\x10PaxcounterConfig\x12\xd5\x01\n\x07\x65nabled\x18\x01 \x01(\x08\x42\xc3\x01\xca\xf3\x18\xbe\x01:\x13PAX Counter EnabledB\xa6\x01When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work.\x12\x83\x01\n\x1apaxcounter_update_interval\x18\x02 \x01(\rB_\xca\xf3\x18[*\x01s:\x0fUpdate IntervalBEHow often we can send a message to the mesh when people are detected.\x12\\\n\x0ewifi_threshold\x18\x03 \x01(\x05\x42\x44\xca\xf3\x18@*\x03\x64\x42m:\x0eWiFi ThresholdB)RSSI threshold for counting WiFi devices.\x12Y\n\rble_threshold\x18\x04 \x01(\x05\x42\x42\xca\xf3\x18>*\x03\x64\x42m:\rBLE ThresholdB(RSSI threshold for counting BLE devices.\x1a\xe2\x06\n\x17TrafficManagementConfig\x12\x8b\x01\n\x1aposition_min_interval_secs\x18\x04 \x01(\rBg\xca\xf3\x18\x63*\x01s:\x19Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.\x12x\n!nodeinfo_direct_response_max_hops\x18\x06 \x01(\rBM\xca\xf3\x18I:\x18\x44irect NodeInfo Max HopsB-Only answer requestors within this many hops.\x12\x65\n\x16rate_limit_window_secs\x18\x08 \x01(\rBE\xca\xf3\x18\x41*\x01s:\x11Rate Limit WindowB)The time window packets are counted over.\x12l\n\x16rate_limit_max_packets\x18\t \x01(\rBL\xca\xf3\x18H:\x16Rate Limit Max PacketsB.The most packets one node may send per window.\x12s\n\x18unknown_packet_threshold\x18\x0b \x01(\rBQ\xca\xf3\x18M:\x18Unknown Packet ThresholdB1How many per window before the sender is dropped.J\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x03\x10\x04J\x04\x08\x05\x10\x06J\x04\x08\x07\x10\x08J\x04\x08\n\x10\x0bJ\x04\x08\x0c\x10\rJ\x04\x08\r\x10\x0eJ\x04\x08\x0e\x10\x0fR\x07\x65nabledR\x16position_dedup_enabledR\x17position_precision_bitsR\x18nodeinfo_direct_responseR\x12rate_limit_enabledR\x14\x64rop_unknown_enabledR\x15\x65xhaust_hop_telemetryR\x14\x65xhaust_hop_positionR\x14router_preserve_hops\x1a\xae\x0b\n\x0cSerialConfig\x12;\n\x07\x65nabled\x18\x01 \x01(\x08\x42*\xca\xf3\x18&:\x0eSerial EnabledB\x14\x45nable serial module\x12Z\n\x04\x65\x63ho\x18\x02 \x01(\x08\x42L\xca\xf3\x18H:\x04\x45\x63hoB@If set, any packets you send will be echoed back to your device.\x12=\n\x03rxd\x18\x03 \x01(\rB0\xca\xf3\x18,:\x1bReceive data (rxd) GPIO pinB\rRX pin number\x12>\n\x03txd\x18\x04 \x01(\rB1\xca\xf3\x18-:\x1cTransmit data (txd) GPIO pinB\rTX pin number\x12\x66\n\x04\x62\x61ud\x18\x05 \x01(\x0e\x32:.meshtastic.protobuf.ModuleConfig.SerialConfig.Serial_BaudB\x1c\xca\xf3\x18\x18:\x04\x42\x61udB\x10Serial baud rate\x12\x62\n\x07timeout\x18\x06 \x01(\rBQ\xca\xf3\x18M:\x07TimeoutBBThe amount of time to wait before we consider your packet as done.\x12r\n\x04mode\x18\x07 \x01(\x0e\x32:.meshtastic.protobuf.ModuleConfig.SerialConfig.Serial_ModeB(\xca\xf3\x18$:\x04ModeB\x1cSerial module operation mode\x12$\n\x1coverride_console_serial_port\x18\x08 \x01(\x08\"\xa2\x04\n\x0bSerial_Baud\x12\x1f\n\x0c\x42\x41UD_DEFAULT\x10\x00\x1a\r\xca\xf3\x18\t:\x07\x44\x65\x66\x61ult\x12\x1c\n\x08\x42\x41UD_110\x10\x01\x1a\x0e\xca\xf3\x18\n:\x08\x31\x31\x30 Baud\x12\x1c\n\x08\x42\x41UD_300\x10\x02\x1a\x0e\xca\xf3\x18\n:\x08\x33\x30\x30 Baud\x12\x1c\n\x08\x42\x41UD_600\x10\x03\x1a\x0e\xca\xf3\x18\n:\x08\x36\x30\x30 Baud\x12\x1e\n\tBAUD_1200\x10\x04\x1a\x0f\xca\xf3\x18\x0b:\t1200 Baud\x12\x1e\n\tBAUD_2400\x10\x05\x1a\x0f\xca\xf3\x18\x0b:\t2400 Baud\x12\x1e\n\tBAUD_4800\x10\x06\x1a\x0f\xca\xf3\x18\x0b:\t4800 Baud\x12\x1e\n\tBAUD_9600\x10\x07\x1a\x0f\xca\xf3\x18\x0b:\t9600 Baud\x12 \n\nBAUD_19200\x10\x08\x1a\x10\xca\xf3\x18\x0c:\n19200 Baud\x12 \n\nBAUD_38400\x10\t\x1a\x10\xca\xf3\x18\x0c:\n38400 Baud\x12 \n\nBAUD_57600\x10\n\x1a\x10\xca\xf3\x18\x0c:\n57600 Baud\x12\"\n\x0b\x42\x41UD_115200\x10\x0b\x1a\x11\xca\xf3\x18\r:\x0b\x31\x31\x35\x32\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_230400\x10\x0c\x1a\x11\xca\xf3\x18\r:\x0b\x32\x33\x30\x34\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_460800\x10\r\x1a\x11\xca\xf3\x18\r:\x0b\x34\x36\x30\x38\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_576000\x10\x0e\x1a\x11\xca\xf3\x18\r:\x0b\x35\x37\x36\x30\x30\x30 Baud\x12\"\n\x0b\x42\x41UD_921600\x10\x0f\x1a\x11\xca\xf3\x18\r:\x0b\x39\x32\x31\x36\x30\x30 Baud\"\xfa\x01\n\x0bSerial_Mode\x12\x1a\n\x07\x44\x45\x46\x41ULT\x10\x00\x1a\r\xca\xf3\x18\t:\x07\x44\x65\x66\x61ult\x12\x18\n\x06SIMPLE\x10\x01\x1a\x0c\xca\xf3\x18\x08:\x06Simple\x12\x1a\n\x05PROTO\x10\x02\x1a\x0f\xca\xf3\x18\x0b:\tProtobufs\x12\x1f\n\x07TEXTMSG\x10\x03\x1a\x12\xca\xf3\x18\x0e:\x0cText Message\x12\x1e\n\x04NMEA\x10\x04\x1a\x14\xca\xf3\x18\x10:\x0eNMEA Positions\x12\x1a\n\x07\x43\x41LTOPO\x10\x05\x1a\r\xca\xf3\x18\t:\x07\x43\x41LTOPO\x12\x08\n\x04WS85\x10\x06\x12\r\n\tVE_DIRECT\x10\x07\x12\r\n\tMS_CONFIG\x10\x08\x12\x07\n\x03LOG\x10\t\x12\x0b\n\x07LOGTEXT\x10\n\x1a\xae\r\n\x1a\x45xternalNotificationConfig\x12S\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x42\xca\xf3\x18>:\x1d\x45xternal Notification EnabledB\x1d\x45nable external notifications\x12`\n\toutput_ms\x18\x02 \x01(\rBM\xca\xf3\x18I*\x02ms:\x14GPIO Output DurationB-In GPIO mode, how long to keep the output on.\x12s\n\x06output\x18\x03 \x01(\rBc\xca\xf3\x18_:\x0fOutput pin GPIOBLGPIO pin driven on notification. Defaults to the board\'s EXT_NOTIFY_OUT pin.\x12R\n\x0coutput_vibra\x18\x08 \x01(\rB<\x92?\x02\x38\x08\xca\xf3\x18\x33:\x15Output pin vibra GPIOB\x1aVibration motor output pin\x12K\n\routput_buzzer\x18\t \x01(\rB4\x92?\x02\x38\x08\xca\xf3\x18+:\x16Output pin buzzer GPIOB\x11\x42uzzer output pin\x12q\n\x06\x61\x63tive\x18\x04 \x01(\x08\x42\x61\xca\xf3\x18]:\x06\x41\x63tiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.\x12V\n\ralert_message\x18\x05 \x01(\x08\x42?\xca\xf3\x18;:\x1e\x41lert when receiving a messageB\x19\x41lert on incoming message\x12\x65\n\x13\x61lert_message_vibra\x18\n \x01(\x08\x42H\xca\xf3\x18\x44:\x11Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message\x12h\n\x14\x61lert_message_buzzer\x18\x0b \x01(\x08\x42J\xca\xf3\x18\x46:*Alert GPIO buzzer when receiving a messageB\x18\x42uzz on incoming message\x12N\n\nalert_bell\x18\x06 \x01(\x08\x42:\xca\xf3\x18\x36:\x1b\x41lert when receiving a bellB\x17\x41lert on bell character\x12g\n\x10\x61lert_bell_vibra\x18\x0c \x01(\x08\x42M\xca\xf3\x18I:,Alert GPIO vibra motor when receiving a bellB\x19Vibrate on bell character\x12`\n\x11\x61lert_bell_buzzer\x18\r \x01(\x08\x42\x45\xca\xf3\x18\x41:\'Alert GPIO buzzer when receiving a bellB\x16\x42uzz on bell character\x12\xee\x01\n\x07use_pwm\x18\x07 \x01(\x08\x42\xdc\x01\xca\xf3\x18\xd7\x01:\x0eUse PWM BuzzerB\xc4\x01Use a PWM output (like the RAK Buzzer) for tunes instead of an on/off output. This will ignore the output, output duration and active settings and use the device config buzzer GPIO option instead.\x12P\n\x0bnag_timeout\x18\x0e \x01(\rB;\x92?\x02\x38\x10\xca\xf3\x18\x32*\x01s:\x0bNag TimeoutB How long the notification lasts.\x12\xc8\x01\n\x11use_i2s_as_buzzer\x18\x0f \x01(\x08\x42\xac\x01\xca\xf3\x18\xa7\x01:\x11Use I2S As BuzzerB\x91\x01\x45nables devices with native I2S audio output to use the RTTTL over speaker like a buzzer. T-Watch S3 and T-Deck for example have this capability.\x1a\xe1\x03\n\x12StoreForwardConfig\x12W\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x46\xca\xf3\x18\x42:\x19Store and Forward EnabledB%Enables the store and forward module.\x12]\n\theartbeat\x18\x02 \x01(\x08\x42J\xca\xf3\x18\x46:\x0eSend HeartbeatB4Send a heartbeat to advertise the server\'s presence.\x12(\n\x07records\x18\x03 \x01(\rB\x17\xca\xf3\x18\x13:\x11Number of records\x12\x34\n\x12history_return_max\x18\x04 \x01(\rB\x18\xca\xf3\x18\x14:\x12History Return Max\x12:\n\x15history_return_window\x18\x05 \x01(\rB\x1b\xca\xf3\x18\x17:\x15History Return Window\x12w\n\tis_server\x18\x06 \x01(\x08\x42\x64\xca\xf3\x18`:\x06ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.\x1a\xfa\x02\n\x0fRangeTestConfig\x12\x43\n\x07\x65nabled\x18\x01 \x01(\x08\x42\x32\xca\xf3\x18.:\x12Range Test EnabledB\x18\x45nable range test module\x12q\n\x06sender\x18\x02 \x01(\rBa\xca\xf3\x18]*\x01s:\x0fSender IntervalBGThis device will send out range test messages on the selected interval.\x12\x87\x01\n\x04save\x18\x03 \x01(\x08\x42y\xca\xf3\x18u:\x04SaveBmSaves a CSV with the range test message details, currently only available on ESP32 devices with a web server.\x12%\n\x0f\x63lear_on_reboot\x18\x04 \x01(\x08\x42\x0c\xca\xf3\x18\x08R\x06\x32.7.11\x1a\x97\x0b\n\x0fTelemetryConfig\x12r\n\x16\x64\x65vice_update_interval\x18\x01 \x01(\rBR\xca\xf3\x18N*\x01s:\x17\x44\x65vice Metrics IntervalB0How often device metrics are sent over the mesh.\x12\x81\x01\n\x1b\x65nvironment_update_interval\x18\x02 \x01(\rB\\\xca\xf3\x18X*\x01s:\x1c\x45nvironment Metrics IntervalB5How often environment metrics are sent over the mesh.\x12l\n\x1f\x65nvironment_measurement_enabled\x18\x03 \x01(\x08\x42\x43\xca\xf3\x18?:\x1b\x45nvironment Metrics EnabledB Collect environment measurements\x12k\n\x1a\x65nvironment_screen_enabled\x18\x04 \x01(\x08\x42G\xca\xf3\x18\x43:\x15Show on device screenB*Display environment measurements on device\x12\x63\n\x1e\x65nvironment_display_fahrenheit\x18\x05 \x01(\x08\x42;\xca\xf3\x18\x37:\x12\x44isplay FahrenheitB!Display environment in Fahrenheit\x12[\n\x13\x61ir_quality_enabled\x18\x06 \x01(\x08\x42>\xca\xf3\x18::\x1b\x41ir Quality Metrics EnabledB\x1b\x43ollect air quality metrics\x12z\n\x14\x61ir_quality_interval\x18\x07 \x01(\rB\\\xca\xf3\x18X*\x01s:\x1c\x41ir Quality Metrics IntervalB5How often air quality metrics are sent over the mesh.\x12Y\n\x19power_measurement_enabled\x18\x08 \x01(\x08\x42\x36\xca\xf3\x18\x32:\x19Power Measurement EnabledB\x15\x43ollect power metrics\x12o\n\x15power_update_interval\x18\t \x01(\rBP\xca\xf3\x18L*\x01s:\x16Power Metrics IntervalB/How often power metrics are sent over the mesh.\x12Q\n\x14power_screen_enabled\x18\n \x01(\x08\x42\x33\xca\xf3\x18/:\x0cPower ScreenB\x1f\x44isplay power metrics on device\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\x12\xbe\x01\n\x18\x64\x65vice_telemetry_enabled\x18\x0e \x01(\x08\x42\x9b\x01\xca\xf3\x18\x96\x01:\x18\x42roadcast Device MetricsBrEnable broadcasting device metrics to the mesh network. When disabled, metrics are only sent to connected clients.R\x06\x32.7.13\x12\x30\n\x1a\x61ir_quality_screen_enabled\x18\x0f \x01(\x08\x42\x0c\xca\xf3\x18\x08R\x06\x32.7.18\x1a\xf0\t\n\x13\x43\x61nnedMessageConfig\x12>\n\x0frotary1_enabled\x18\x01 \x01(\x08\x42%\xca\xf3\x18!:\x08Rotary 1B\x15\x45nable rotary encoder\x12K\n\x11inputbroker_pin_a\x18\x02 \x01(\rB0\xca\xf3\x18,:\x05Pin AB#GPIO pin for rotary encoder A port.\x12K\n\x11inputbroker_pin_b\x18\x03 \x01(\rB0\xca\xf3\x18,:\x05Pin BB#GPIO pin for rotary encoder B port.\x12W\n\x15inputbroker_pin_press\x18\x04 \x01(\rB8\xca\xf3\x18\x34:\tPress PinB\'GPIO pin for rotary encoder Press port.\x12\xa4\x01\n\x14inputbroker_event_cw\x18\x05 \x01(\x0e\x32\x44.meshtastic.protobuf.ModuleConfig.CannedMessageConfig.InputEventCharB@\xca\xf3\x18<:\x16\x43lockwise Rotary EventB\"Input event for clockwise rotation\x12\xb5\x01\n\x15inputbroker_event_ccw\x18\x06 \x01(\x0e\x32\x44.meshtastic.protobuf.ModuleConfig.CannedMessageConfig.InputEventCharBP\xca\xf3\x18L:\x1e\x43ounter Clockwise Rotary EventB*Input event for counter-clockwise rotation\x12\x9f\x01\n\x17inputbroker_event_press\x18\x07 \x01(\x0e\x32\x44.meshtastic.protobuf.ModuleConfig.CannedMessageConfig.InputEventCharB8\xca\xf3\x18\x34:\x13\x45ncoder Press EventB\x1dInput event for encoder press\x12\x45\n\x0fupdown1_enabled\x18\x08 \x01(\x08\x42,\xca\xf3\x18(:\tUp Down 1B\x1b\x45nable up/down/select input\x12\x1e\n\x07\x65nabled\x18\t \x01(\x08\x42\r\x18\x01\xca\xf3\x18\x07Z\x05\x32.7.0\x12.\n\x12\x61llow_input_source\x18\n \x01(\tB\x12\x18\x01\x92?\x02\x08\x10\xca\xf3\x18\x07Z\x05\x32.7.0\x12\x45\n\tsend_bell\x18\x0b \x01(\x08\x42\x32\xca\xf3\x18.:\tSend BellB!Send bell character with messages\"\xc6\x01\n\x0eInputEventChar\x12\x14\n\x04NONE\x10\x00\x1a\n\xca\xf3\x18\x06:\x04None\x12\x10\n\x02UP\x10\x11\x1a\x08\xca\xf3\x18\x04:\x02Up\x12\x14\n\x04\x44OWN\x10\x12\x1a\n\xca\xf3\x18\x06:\x04\x44own\x12\x14\n\x04LEFT\x10\x13\x1a\n\xca\xf3\x18\x06:\x04Left\x12\x16\n\x05RIGHT\x10\x14\x1a\x0b\xca\xf3\x18\x07:\x05Right\x12\x18\n\x06SELECT\x10\n\x1a\x0c\xca\xf3\x18\x08:\x06Select\x12\x14\n\x04\x42\x41\x43K\x10\x1b\x1a\n\xca\xf3\x18\x06:\x04\x42\x61\x63k\x12\x18\n\x06\x43\x41NCEL\x10\x18\x1a\x0c\xca\xf3\x18\x08:\x06\x43\x61ncel\x1a\xe7\x04\n\x15\x41mbientLightingConfig\x12\x41\n\tled_state\x18\x01 \x01(\x08\x42.\xca\xf3\x18*:\tLED StateB\x1dThe state of the LED (on/off)\x12y\n\x07\x63urrent\x18\x02 \x01(\rBh\x92?\x02\x38\x08\xca\xf3\x18_\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\x00?@:\x07\x43urrentB!Drive current for the LED output.J\x1fled|brightness|ambient|lighting\x12\x80\x01\n\x03red\x18\x03 \x01(\rBs\x92?\x02\x38\x08\xca\xf3\x18j\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\xe0o@:\x03RedB*The red level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting\x12\x86\x01\n\x05green\x18\x04 \x01(\rBw\x92?\x02\x38\x08\xca\xf3\x18n\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\xe0o@:\x05GreenB,The green level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting\x12\x83\x01\n\x04\x62lue\x18\x05 \x01(\rBu\x92?\x02\x38\x08\xca\xf3\x18l\x19\x00\x00\x00\x00\x00\x00\x00\x00!\x00\x00\x00\x00\x00\xe0o@:\x04\x42lueB+The blue level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting\x1a\x31\n\x13StatusMessageConfig\x12\x1a\n\x0bnode_status\x18\x01 \x01(\tB\x05\x92?\x02\x08P\x1a\xe6\x08\n\x10MeshBeaconConfig\x12\r\n\x05\x66lags\x18\x01 \x01(\r\x12+\n\x1e\x62roadcast_offer_frequency_slot\x18\x02 \x01(\rH\x00\x88\x01\x01\x12L\n\x11\x62roadcast_message\x18\x04 \x01(\tB1\x92?\x02\x08=\xca\xf3\x18(:\x07MessageB\x1dMessage for beacon broadcasts\x12\x45\n\x17\x62roadcast_offer_channel\x18\x05 \x01(\x0b\x32$.meshtastic.protobuf.ChannelSettings\x12Q\n\x16\x62roadcast_offer_region\x18\x06 \x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12W\n\x16\x62roadcast_offer_preset\x18\x07 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPresetH\x01\x88\x01\x01\x12T\n\x17\x62roadcast_interval_secs\x18\x0b \x01(\rB3\xca\xf3\x18/*\x01s:\x08IntervalB How often a beacon is broadcast.\x12\x64\n\x11\x62roadcast_targets\x18\r \x03(\x0b\x32\x42.meshtastic.protobuf.ModuleConfig.MeshBeaconConfig.BroadcastTargetB\x05\x92?\x02\x10\x04\x1a\x86\x02\n\x0f\x42roadcastTarget\x12G\n\x06preset\x18\x01 \x01(\x0e\x32\x32.meshtastic.protobuf.Config.LoRaConfig.ModemPresetH\x00\x88\x01\x01\x12\x41\n\x06region\x18\x02 \x01(\x0e\x32\x31.meshtastic.protobuf.Config.LoRaConfig.RegionCode\x12\x1a\n\rchannel_index\x18\x04 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0e\x66requency_slot\x18\x05 \x01(\rH\x02\x88\x01\x01\x42\t\n\x07_presetB\x10\n\x0e_channel_indexB\x11\n\x0f_frequency_slot\"b\n\x05\x46lags\x12\r\n\tFLAG_NONE\x10\x00\x12\x17\n\x13\x46LAG_LISTEN_ENABLED\x10\x01\x12\x1a\n\x16\x46LAG_BROADCAST_ENABLED\x10\x02\x12\x15\n\x11\x46LAG_LEGACY_SPLIT\x10\x04\x42!\n\x1f_broadcast_offer_frequency_slotB\x19\n\x17_broadcast_offer_presetJ\x04\x08\x03\x10\x04J\x04\x08\x08\x10\tJ\x04\x08\t\x10\nJ\x04\x08\n\x10\x0bR\x16\x62roadcast_send_as_nodeR\x14\x62roadcast_on_channelR\x13\x62roadcast_on_regionR\x13\x62roadcast_on_preset\x1a\x9c\x01\n\tTAKConfig\x12\x43\n\x04team\x18\x01 \x01(\x0e\x32\x19.meshtastic.protobuf.TeamB\x1a\xca\xf3\x18\x16:\x04TeamB\x0eTAK team color\x12J\n\x04role\x18\x02 \x01(\x0e\x32\x1f.meshtastic.protobuf.MemberRoleB\x1b\xca\xf3\x18\x17:\x04RoleB\x0fTAK member roleB\x11\n\x0fpayload_variant\"{\n\x11RemoteHardwarePin\x12\x17\n\x08gpio_pin\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08\x12\x13\n\x04name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x0f\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\x42h\n\x14org.meshtastic.protoB\x12ModuleConfigProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -23,106 +26,378 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\022ModuleConfigProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _MODULECONFIG_MQTTCONFIG.fields_by_name['enabled']._options = None + _MODULECONFIG_MQTTCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030#:\014MQTT EnabledB\023Enable MQTT gateway' _MODULECONFIG_MQTTCONFIG.fields_by_name['address']._options = None - _MODULECONFIG_MQTTCONFIG.fields_by_name['address']._serialized_options = b'\222?\002\010@' + _MODULECONFIG_MQTTCONFIG.fields_by_name['address']._serialized_options = b'\222?\002\010@\312\363\030\036:\007AddressB\023MQTT server address' _MODULECONFIG_MQTTCONFIG.fields_by_name['username']._options = None - _MODULECONFIG_MQTTCONFIG.fields_by_name['username']._serialized_options = b'\222?\002\010@' + _MODULECONFIG_MQTTCONFIG.fields_by_name['username']._serialized_options = b'\222?\002\010@\312\363\030\031:\010UsernameB\rMQTT username' _MODULECONFIG_MQTTCONFIG.fields_by_name['password']._options = None - _MODULECONFIG_MQTTCONFIG.fields_by_name['password']._serialized_options = b'\222?\002\010 ' + _MODULECONFIG_MQTTCONFIG.fields_by_name['password']._serialized_options = b'\222?\002\010 \312\363\030\031:\010PasswordB\rMQTT password' + _MODULECONFIG_MQTTCONFIG.fields_by_name['encryption_enabled']._options = None + _MODULECONFIG_MQTTCONFIG.fields_by_name['encryption_enabled']._serialized_options = b'\312\363\0304:\022Encryption EnabledB\036Send encrypted packets to MQTT' _MODULECONFIG_MQTTCONFIG.fields_by_name['json_enabled']._options = None - _MODULECONFIG_MQTTCONFIG.fields_by_name['json_enabled']._serialized_options = b'\030\001' + _MODULECONFIG_MQTTCONFIG.fields_by_name['json_enabled']._serialized_options = b'\030\001\312\363\030\007Z\0052.8.0' + _MODULECONFIG_MQTTCONFIG.fields_by_name['tls_enabled']._options = None + _MODULECONFIG_MQTTCONFIG.fields_by_name['tls_enabled']._serialized_options = b'\312\363\030E:\013TLS EnabledB6TLS is required for the public Meshtastic MQTT server.' _MODULECONFIG_MQTTCONFIG.fields_by_name['root']._options = None - _MODULECONFIG_MQTTCONFIG.fields_by_name['root']._serialized_options = b'\222?\002\010 ' + _MODULECONFIG_MQTTCONFIG.fields_by_name['root']._serialized_options = b'\222?\002\010 \312\363\030\035:\nRoot TopicB\017MQTT root topic' + _MODULECONFIG_MQTTCONFIG.fields_by_name['proxy_to_client_enabled']._options = None + _MODULECONFIG_MQTTCONFIG.fields_by_name['proxy_to_client_enabled']._serialized_options = b'\312\363\030V:\021MQTT Client ProxyBAUtilizes the network connection on your phone to connect to MQTT.' + _MODULECONFIG_MQTTCONFIG.fields_by_name['map_reporting_enabled']._options = None + _MODULECONFIG_MQTTCONFIG.fields_by_name['map_reporting_enabled']._serialized_options = b'\312\363\030\213\002:\rMap ReportingB\371\001Your node will periodically send an unencrypted map report packet to the configured MQTT server, this includes id, short and long name, approximate location, hardware model, role, firmware version, LoRa region, modem preset and primary channel name.' + _MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['publish_interval_secs']._options = None + _MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['publish_interval_secs']._serialized_options = b'\312\363\030?*\001s:\024Map Publish IntervalB$How often a map report is published.' + _MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['should_report_location']._options = None + _MODULECONFIG_MAPREPORTSETTINGS.fields_by_name['should_report_location']._serialized_options = b'\312\363\030\217\001:\017Report LocationBuI have read and understand the above. I voluntarily consent to the unencrypted transmission of my node data via MQTT.R\0052.6.8' _MODULECONFIG_REMOTEHARDWARECONFIG.fields_by_name['available_pins']._options = None _MODULECONFIG_REMOTEHARDWARECONFIG.fields_by_name['available_pins']._serialized_options = b'\222?\002\020\004' + _MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['enabled']._options = None + _MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030\233\001:\025Neighbor Info EnabledB\201\001Enable neighbor info broadcasting. Periodically sends information about directly-heard neighbors to help visualize mesh topology.' + _MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['update_interval']._options = None + _MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['update_interval']._serialized_options = b'\312\363\030;*\001s:\017Update IntervalB%How often to broadcast neighbor info.' + _MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['transmit_over_lora']._options = None + _MODULECONFIG_NEIGHBORINFOCONFIG.fields_by_name['transmit_over_lora']._serialized_options = b'\312\363\030\231\001:\022Transmit over LoRaB\202\001Whether to transmit neighbor info over LoRa in addition to MQTT and PhoneAPI. Not available on channels with default key and name.' + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_LOW"]._options = None + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_LOW"]._serialized_options = b'\312\363\030\005:\003Low' + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_HIGH"]._options = None + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["LOGIC_HIGH"]._serialized_options = b'\312\363\030\006:\004High' + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["FALLING_EDGE"]._options = None + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["FALLING_EDGE"]._serialized_options = b'\312\363\030\016:\014Falling Edge' + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["RISING_EDGE"]._options = None + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["RISING_EDGE"]._serialized_options = b'\312\363\030\r:\013Rising Edge' + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_LOW"]._options = None + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_LOW"]._serialized_options = b'\312\363\030\021:\017Either Edge Low' + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_HIGH"]._options = None + _MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE.values_by_name["EITHER_EDGE_ACTIVE_HIGH"]._serialized_options = b'\312\363\030\022:\020Either Edge High' + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['enabled']._options = None + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030\354\001:\030Detection Sensor EnabledB\317\001Enables the detection sensor module, it needs to be enabled on both the node with the sensor, and any nodes that you want to receive detection sensor text messages or view the detection sensor log and chart.' + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['minimum_broadcast_secs']._options = None + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['minimum_broadcast_secs']._serialized_options = b'\312\363\030Z*\001s:)Minimum time between detection broadcastsB*Minimum time between detection broadcasts.' + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['state_broadcast_secs']._options = None + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['state_broadcast_secs']._serialized_options = b'\312\363\030~*\001s:\030State Broadcast IntervalB_How often to send the detection sensor state to the mesh, whether or not anything was detected.' + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['send_bell']._options = None + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['send_bell']._serialized_options = b'\312\363\030e:\tSend BellBXSend ASCII bell with alert message. Useful for triggering external notification on bell.' _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['name']._options = None - _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['name']._serialized_options = b'\222?\002\010\024' + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['name']._serialized_options = b'\222?\002\010\024\312\363\030%:\004NameB\035Sensor name for mesh messages' _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['monitor_pin']._options = None - _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['monitor_pin']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['monitor_pin']._serialized_options = b'\222?\0028\010\312\363\030::\023GPIO Pin to monitorB#GPIO pin watched for state changes.' _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['detection_trigger_type']._options = None - _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['detection_trigger_type']._serialized_options = b'\222?\002\010\010' + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['detection_trigger_type']._serialized_options = b'\222?\002\010\010\312\363\030$:\013TriggerTypeB\025Type of trigger event' + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['use_pullup']._options = None + _MODULECONFIG_DETECTIONSENSORCONFIG.fields_by_name['use_pullup']._serialized_options = b'\312\363\030\211\001:\024Uses pullup resistorBqWhether or not use INPUT_PULLUP mode for GPIO pin. Only applicable if the board uses pull-up resistors on the pin' + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_DEFAULT"]._options = None + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default' + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_3200"]._options = None + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_3200"]._serialized_options = b'\312\363\030\n:\0103200 bps' + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_2400"]._options = None + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_2400"]._serialized_options = b'\312\363\030\n:\0102400 bps' + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1600"]._options = None + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1600"]._serialized_options = b'\312\363\030\n:\0101600 bps' + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1400"]._options = None + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1400"]._serialized_options = b'\312\363\030\n:\0101400 bps' + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1300"]._options = None + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1300"]._serialized_options = b'\312\363\030\n:\0101300 bps' + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1200"]._options = None + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_1200"]._serialized_options = b'\312\363\030\n:\0101200 bps' + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700"]._options = None + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700"]._serialized_options = b'\010\001' + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700B"]._options = None + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700B"]._serialized_options = b'\010\001' + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700C"]._options = None + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_700C"]._serialized_options = b'\312\363\030\n:\010700C bps' + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_450"]._options = None + _MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD.values_by_name["CODEC2_450"]._serialized_options = b'\312\363\030\t:\007450 bps' + _MODULECONFIG_AUDIOCONFIG.fields_by_name['codec2_enabled']._options = None + _MODULECONFIG_AUDIOCONFIG.fields_by_name['codec2_enabled']._serialized_options = b'\312\363\030^:\016Codec2 EnabledBLEnable Codec2 audio encoding/decoding for voice communication over the mesh.' _MODULECONFIG_AUDIOCONFIG.fields_by_name['ptt_pin']._options = None - _MODULECONFIG_AUDIOCONFIG.fields_by_name['ptt_pin']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_AUDIOCONFIG.fields_by_name['ptt_pin']._serialized_options = b'\222?\0028\010\312\363\030(:\007PTT PinB\035Push-to-talk GPIO pin number.' + _MODULECONFIG_AUDIOCONFIG.fields_by_name['bitrate']._options = None + _MODULECONFIG_AUDIOCONFIG.fields_by_name['bitrate']._serialized_options = b'\312\363\030\202\001:\007BitrateBwThe Codec2 bitrate to use. The sample rate is always 8 kHz. Lower bitrates use less bandwidth but reduce audio quality.' _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_ws']._options = None - _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_ws']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_ws']._serialized_options = b'\222?\0028\010\312\363\030\010:\006I2S WS' _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sd']._options = None - _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sd']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sd']._serialized_options = b'\222?\0028\010\312\363\030\010:\006I2S SD' _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_din']._options = None - _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_din']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_din']._serialized_options = b'\222?\0028\010\312\363\030\t:\007I2S DIN' _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sck']._options = None - _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sck']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_AUDIOCONFIG.fields_by_name['i2s_sck']._serialized_options = b'\222?\0028\010\312\363\030\t:\007I2S SCK' + _MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['enabled']._options = None + _MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030\276\001:\023PAX Counter EnabledB\246\001When enabled the PAX Counter module counts the number of people passing by using WiFi and Bluetooth. Both WiFI and Bluetooth must be disabled for PAX counter to work.' + _MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['paxcounter_update_interval']._options = None + _MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['paxcounter_update_interval']._serialized_options = b'\312\363\030[*\001s:\017Update IntervalBEHow often we can send a message to the mesh when people are detected.' + _MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['wifi_threshold']._options = None + _MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['wifi_threshold']._serialized_options = b'\312\363\030@*\003dBm:\016WiFi ThresholdB)RSSI threshold for counting WiFi devices.' + _MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['ble_threshold']._options = None + _MODULECONFIG_PAXCOUNTERCONFIG.fields_by_name['ble_threshold']._serialized_options = b'\312\363\030>*\003dBm:\rBLE ThresholdB(RSSI threshold for counting BLE devices.' + _MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['position_min_interval_secs']._options = None + _MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['position_min_interval_secs']._serialized_options = b'\312\363\030c*\001s:\031Minimum Position IntervalBCPositions from the same node arriving sooner than this are dropped.' + _MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['nodeinfo_direct_response_max_hops']._options = None + _MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['nodeinfo_direct_response_max_hops']._serialized_options = b'\312\363\030I:\030Direct NodeInfo Max HopsB-Only answer requestors within this many hops.' + _MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_window_secs']._options = None + _MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_window_secs']._serialized_options = b'\312\363\030A*\001s:\021Rate Limit WindowB)The time window packets are counted over.' + _MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_max_packets']._options = None + _MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['rate_limit_max_packets']._serialized_options = b'\312\363\030H:\026Rate Limit Max PacketsB.The most packets one node may send per window.' + _MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['unknown_packet_threshold']._options = None + _MODULECONFIG_TRAFFICMANAGEMENTCONFIG.fields_by_name['unknown_packet_threshold']._serialized_options = b'\312\363\030M:\030Unknown Packet ThresholdB1How many per window before the sender is dropped.' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_DEFAULT"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_110"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_110"]._serialized_options = b'\312\363\030\n:\010110 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_300"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_300"]._serialized_options = b'\312\363\030\n:\010300 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_600"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_600"]._serialized_options = b'\312\363\030\n:\010600 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_1200"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_1200"]._serialized_options = b'\312\363\030\013:\t1200 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_2400"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_2400"]._serialized_options = b'\312\363\030\013:\t2400 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_4800"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_4800"]._serialized_options = b'\312\363\030\013:\t4800 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_9600"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_9600"]._serialized_options = b'\312\363\030\013:\t9600 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_19200"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_19200"]._serialized_options = b'\312\363\030\014:\n19200 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_38400"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_38400"]._serialized_options = b'\312\363\030\014:\n38400 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_57600"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_57600"]._serialized_options = b'\312\363\030\014:\n57600 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_115200"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_115200"]._serialized_options = b'\312\363\030\r:\013115200 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_230400"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_230400"]._serialized_options = b'\312\363\030\r:\013230400 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_460800"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_460800"]._serialized_options = b'\312\363\030\r:\013460800 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_576000"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_576000"]._serialized_options = b'\312\363\030\r:\013576000 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_921600"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_BAUD.values_by_name["BAUD_921600"]._serialized_options = b'\312\363\030\r:\013921600 Baud' + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["DEFAULT"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["DEFAULT"]._serialized_options = b'\312\363\030\t:\007Default' + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["SIMPLE"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["SIMPLE"]._serialized_options = b'\312\363\030\010:\006Simple' + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["PROTO"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["PROTO"]._serialized_options = b'\312\363\030\013:\tProtobufs' + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["TEXTMSG"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["TEXTMSG"]._serialized_options = b'\312\363\030\016:\014Text Message' + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["NMEA"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["NMEA"]._serialized_options = b'\312\363\030\020:\016NMEA Positions' + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["CALTOPO"]._options = None + _MODULECONFIG_SERIALCONFIG_SERIAL_MODE.values_by_name["CALTOPO"]._serialized_options = b'\312\363\030\t:\007CALTOPO' + _MODULECONFIG_SERIALCONFIG.fields_by_name['enabled']._options = None + _MODULECONFIG_SERIALCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030&:\016Serial EnabledB\024Enable serial module' + _MODULECONFIG_SERIALCONFIG.fields_by_name['echo']._options = None + _MODULECONFIG_SERIALCONFIG.fields_by_name['echo']._serialized_options = b'\312\363\030H:\004EchoB@If set, any packets you send will be echoed back to your device.' + _MODULECONFIG_SERIALCONFIG.fields_by_name['rxd']._options = None + _MODULECONFIG_SERIALCONFIG.fields_by_name['rxd']._serialized_options = b'\312\363\030,:\033Receive data (rxd) GPIO pinB\rRX pin number' + _MODULECONFIG_SERIALCONFIG.fields_by_name['txd']._options = None + _MODULECONFIG_SERIALCONFIG.fields_by_name['txd']._serialized_options = b'\312\363\030-:\034Transmit data (txd) GPIO pinB\rTX pin number' + _MODULECONFIG_SERIALCONFIG.fields_by_name['baud']._options = None + _MODULECONFIG_SERIALCONFIG.fields_by_name['baud']._serialized_options = b'\312\363\030\030:\004BaudB\020Serial baud rate' + _MODULECONFIG_SERIALCONFIG.fields_by_name['timeout']._options = None + _MODULECONFIG_SERIALCONFIG.fields_by_name['timeout']._serialized_options = b'\312\363\030M:\007TimeoutBBThe amount of time to wait before we consider your packet as done.' + _MODULECONFIG_SERIALCONFIG.fields_by_name['mode']._options = None + _MODULECONFIG_SERIALCONFIG.fields_by_name['mode']._serialized_options = b'\312\363\030$:\004ModeB\034Serial module operation mode' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['enabled']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030>:\035External Notification EnabledB\035Enable external notifications' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_ms']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_ms']._serialized_options = b'\312\363\030I*\002ms:\024GPIO Output DurationB-In GPIO mode, how long to keep the output on.' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output']._serialized_options = b'\312\363\030_:\017Output pin GPIOBLGPIO pin driven on notification. Defaults to the board\'s EXT_NOTIFY_OUT pin.' _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_vibra']._options = None - _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_vibra']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_vibra']._serialized_options = b'\222?\0028\010\312\363\0303:\025Output pin vibra GPIOB\032Vibration motor output pin' _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_buzzer']._options = None - _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_buzzer']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['output_buzzer']._serialized_options = b'\222?\0028\010\312\363\030+:\026Output pin buzzer GPIOB\021Buzzer output pin' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['active']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['active']._serialized_options = b'\312\363\030]:\006ActiveBSIf enabled, the \'output\' Pin will be pulled active high, disabled means active low.' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message']._serialized_options = b'\312\363\030;:\036Alert when receiving a messageB\031Alert on incoming message' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_vibra']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_vibra']._serialized_options = b'\312\363\030D:\021Vibra Motor AlertB/Alert GPIO vibra motor when receiving a message' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_buzzer']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_message_buzzer']._serialized_options = b'\312\363\030F:*Alert GPIO buzzer when receiving a messageB\030Buzz on incoming message' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell']._serialized_options = b'\312\363\0306:\033Alert when receiving a bellB\027Alert on bell character' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_vibra']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_vibra']._serialized_options = b'\312\363\030I:,Alert GPIO vibra motor when receiving a bellB\031Vibrate on bell character' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_buzzer']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['alert_bell_buzzer']._serialized_options = b'\312\363\030A:\'Alert GPIO buzzer when receiving a bellB\026Buzz on bell character' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_pwm']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_pwm']._serialized_options = b'\312\363\030\327\001:\016Use PWM BuzzerB\304\001Use a PWM output (like the RAK Buzzer) for tunes instead of an on/off output. This will ignore the output, output duration and active settings and use the device config buzzer GPIO option instead.' _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['nag_timeout']._options = None - _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['nag_timeout']._serialized_options = b'\222?\0028\020' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['nag_timeout']._serialized_options = b'\222?\0028\020\312\363\0302*\001s:\013Nag TimeoutB How long the notification lasts.' + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_i2s_as_buzzer']._options = None + _MODULECONFIG_EXTERNALNOTIFICATIONCONFIG.fields_by_name['use_i2s_as_buzzer']._serialized_options = b'\312\363\030\247\001:\021Use I2S As BuzzerB\221\001Enables devices with native I2S audio output to use the RTTTL over speaker like a buzzer. T-Watch S3 and T-Deck for example have this capability.' + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['enabled']._options = None + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030B:\031Store and Forward EnabledB%Enables the store and forward module.' + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['heartbeat']._options = None + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['heartbeat']._serialized_options = b'\312\363\030F:\016Send HeartbeatB4Send a heartbeat to advertise the server\'s presence.' + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['records']._options = None + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['records']._serialized_options = b'\312\363\030\023:\021Number of records' + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_max']._options = None + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_max']._serialized_options = b'\312\363\030\024:\022History Return Max' + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_window']._options = None + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['history_return_window']._serialized_options = b'\312\363\030\027:\025History Return Window' + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['is_server']._options = None + _MODULECONFIG_STOREFORWARDCONFIG.fields_by_name['is_server']._serialized_options = b'\312\363\030`:\006ServerBVEnable this device as a Store and Forward server. Requires an ESP32 device with PSRAM.' + _MODULECONFIG_RANGETESTCONFIG.fields_by_name['enabled']._options = None + _MODULECONFIG_RANGETESTCONFIG.fields_by_name['enabled']._serialized_options = b'\312\363\030.:\022Range Test EnabledB\030Enable range test module' + _MODULECONFIG_RANGETESTCONFIG.fields_by_name['sender']._options = None + _MODULECONFIG_RANGETESTCONFIG.fields_by_name['sender']._serialized_options = b'\312\363\030]*\001s:\017Sender IntervalBGThis device will send out range test messages on the selected interval.' + _MODULECONFIG_RANGETESTCONFIG.fields_by_name['save']._options = None + _MODULECONFIG_RANGETESTCONFIG.fields_by_name['save']._serialized_options = b'\312\363\030u:\004SaveBmSaves a CSV with the range test message details, currently only available on ESP32 devices with a web server.' + _MODULECONFIG_RANGETESTCONFIG.fields_by_name['clear_on_reboot']._options = None + _MODULECONFIG_RANGETESTCONFIG.fields_by_name['clear_on_reboot']._serialized_options = b'\312\363\030\010R\0062.7.11' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_update_interval']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_update_interval']._serialized_options = b'\312\363\030N*\001s:\027Device Metrics IntervalB0How often device metrics are sent over the mesh.' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_update_interval']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_update_interval']._serialized_options = b'\312\363\030X*\001s:\034Environment Metrics IntervalB5How often environment metrics are sent over the mesh.' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_measurement_enabled']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_measurement_enabled']._serialized_options = b'\312\363\030?:\033Environment Metrics EnabledB Collect environment measurements' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_screen_enabled']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_screen_enabled']._serialized_options = b'\312\363\030C:\025Show on device screenB*Display environment measurements on device' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_display_fahrenheit']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['environment_display_fahrenheit']._serialized_options = b'\312\363\0307:\022Display FahrenheitB!Display environment in Fahrenheit' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_enabled']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_enabled']._serialized_options = b'\312\363\030::\033Air Quality Metrics EnabledB\033Collect air quality metrics' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_interval']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_interval']._serialized_options = b'\312\363\030X*\001s:\034Air Quality Metrics IntervalB5How often air quality metrics are sent over the mesh.' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_measurement_enabled']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_measurement_enabled']._serialized_options = b'\312\363\0302:\031Power Measurement EnabledB\025Collect power metrics' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_update_interval']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_update_interval']._serialized_options = b'\312\363\030L*\001s:\026Power Metrics IntervalB/How often power metrics are sent over the mesh.' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_screen_enabled']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['power_screen_enabled']._serialized_options = b'\312\363\030/:\014Power ScreenB\037Display power metrics on device' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_telemetry_enabled']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['device_telemetry_enabled']._serialized_options = b'\312\363\030\226\001:\030Broadcast Device MetricsBrEnable broadcasting device metrics to the mesh network. When disabled, metrics are only sent to connected clients.R\0062.7.13' + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_screen_enabled']._options = None + _MODULECONFIG_TELEMETRYCONFIG.fields_by_name['air_quality_screen_enabled']._serialized_options = b'\312\363\030\010R\0062.7.18' + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["NONE"]._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["NONE"]._serialized_options = b'\312\363\030\006:\004None' + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["UP"]._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["UP"]._serialized_options = b'\312\363\030\004:\002Up' + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["DOWN"]._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["DOWN"]._serialized_options = b'\312\363\030\006:\004Down' + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["LEFT"]._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["LEFT"]._serialized_options = b'\312\363\030\006:\004Left' + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["RIGHT"]._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["RIGHT"]._serialized_options = b'\312\363\030\007:\005Right' + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["SELECT"]._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["SELECT"]._serialized_options = b'\312\363\030\010:\006Select' + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["BACK"]._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["BACK"]._serialized_options = b'\312\363\030\006:\004Back' + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["CANCEL"]._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR.values_by_name["CANCEL"]._serialized_options = b'\312\363\030\010:\006Cancel' + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['rotary1_enabled']._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['rotary1_enabled']._serialized_options = b'\312\363\030!:\010Rotary 1B\025Enable rotary encoder' + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_a']._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_a']._serialized_options = b'\312\363\030,:\005Pin AB#GPIO pin for rotary encoder A port.' + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_b']._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_b']._serialized_options = b'\312\363\030,:\005Pin BB#GPIO pin for rotary encoder B port.' + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_press']._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_pin_press']._serialized_options = b'\312\363\0304:\tPress PinB\'GPIO pin for rotary encoder Press port.' + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_cw']._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_cw']._serialized_options = b'\312\363\030<:\026Clockwise Rotary EventB\"Input event for clockwise rotation' + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_ccw']._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_ccw']._serialized_options = b'\312\363\030L:\036Counter Clockwise Rotary EventB*Input event for counter-clockwise rotation' + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_press']._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['inputbroker_event_press']._serialized_options = b'\312\363\0304:\023Encoder Press EventB\035Input event for encoder press' + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['updown1_enabled']._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['updown1_enabled']._serialized_options = b'\312\363\030(:\tUp Down 1B\033Enable up/down/select input' _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['enabled']._options = None - _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['enabled']._serialized_options = b'\030\001' + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['enabled']._serialized_options = b'\030\001\312\363\030\007Z\0052.7.0' _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['allow_input_source']._options = None - _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['allow_input_source']._serialized_options = b'\030\001\222?\002\010\020' + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['allow_input_source']._serialized_options = b'\030\001\222?\002\010\020\312\363\030\007Z\0052.7.0' + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['send_bell']._options = None + _MODULECONFIG_CANNEDMESSAGECONFIG.fields_by_name['send_bell']._serialized_options = b'\312\363\030.:\tSend BellB!Send bell character with messages' + _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['led_state']._options = None + _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['led_state']._serialized_options = b'\312\363\030*:\tLED StateB\035The state of the LED (on/off)' _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['current']._options = None - _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['current']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['current']._serialized_options = b'\222?\0028\010\312\363\030_\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\000?@:\007CurrentB!Drive current for the LED output.J\037led|brightness|ambient|lighting' _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['red']._options = None - _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['red']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['red']._serialized_options = b'\222?\0028\010\312\363\030j\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\340o@:\003RedB*The red level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting' _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['green']._options = None - _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['green']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['green']._serialized_options = b'\222?\0028\010\312\363\030n\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\340o@:\005GreenB,The green level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting' _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['blue']._options = None - _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['blue']._serialized_options = b'\222?\0028\010' + _MODULECONFIG_AMBIENTLIGHTINGCONFIG.fields_by_name['blue']._serialized_options = b'\222?\0028\010\312\363\030l\031\000\000\000\000\000\000\000\000!\000\000\000\000\000\340o@:\004BlueB+The blue level of the ambient lighting LED.J%color|colour|rgb|led|ambient|lighting' _MODULECONFIG_STATUSMESSAGECONFIG.fields_by_name['node_status']._options = None _MODULECONFIG_STATUSMESSAGECONFIG.fields_by_name['node_status']._serialized_options = b'\222?\002\010P' + _MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_message']._options = None + _MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_message']._serialized_options = b'\222?\002\010=\312\363\030(:\007MessageB\035Message for beacon broadcasts' + _MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_interval_secs']._options = None + _MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_interval_secs']._serialized_options = b'\312\363\030/*\001s:\010IntervalB How often a beacon is broadcast.' + _MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_targets']._options = None + _MODULECONFIG_MESHBEACONCONFIG.fields_by_name['broadcast_targets']._serialized_options = b'\222?\002\020\004' + _MODULECONFIG_TAKCONFIG.fields_by_name['team']._options = None + _MODULECONFIG_TAKCONFIG.fields_by_name['team']._serialized_options = b'\312\363\030\026:\004TeamB\016TAK team color' + _MODULECONFIG_TAKCONFIG.fields_by_name['role']._options = None + _MODULECONFIG_TAKCONFIG.fields_by_name['role']._serialized_options = b'\312\363\030\027:\004RoleB\017TAK member role' + _MODULECONFIG.fields_by_name['statusmessage']._options = None + _MODULECONFIG.fields_by_name['statusmessage']._serialized_options = b'\312\363\030\010R\0062.7.20' + _MODULECONFIG.fields_by_name['traffic_management']._options = None + _MODULECONFIG.fields_by_name['traffic_management']._serialized_options = b'\312\363\030\007R\0052.8.0' + _MODULECONFIG.fields_by_name['tak']._options = None + _MODULECONFIG.fields_by_name['tak']._serialized_options = b'\312\363\030\007R\0052.8.0' + _MODULECONFIG.fields_by_name['mesh_beacon']._options = None + _MODULECONFIG.fields_by_name['mesh_beacon']._serialized_options = b'\312\363\030\007R\0052.8.0' _REMOTEHARDWAREPIN.fields_by_name['gpio_pin']._options = None _REMOTEHARDWAREPIN.fields_by_name['gpio_pin']._serialized_options = b'\222?\0028\010' _REMOTEHARDWAREPIN.fields_by_name['name']._options = None _REMOTEHARDWAREPIN.fields_by_name['name']._serialized_options = b'\222?\002\010\017' - _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=6433 - _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=6506 - _globals['_MODULECONFIG']._serialized_start=131 - _globals['_MODULECONFIG']._serialized_end=6306 - _globals['_MODULECONFIG_MQTTCONFIG']._serialized_start=1375 - _globals['_MODULECONFIG_MQTTCONFIG']._serialized_end=1720 - _globals['_MODULECONFIG_MAPREPORTSETTINGS']._serialized_start=1722 - _globals['_MODULECONFIG_MAPREPORTSETTINGS']._serialized_end=1832 - _globals['_MODULECONFIG_REMOTEHARDWARECONFIG']._serialized_start=1835 - _globals['_MODULECONFIG_REMOTEHARDWARECONFIG']._serialized_end=1981 - _globals['_MODULECONFIG_NEIGHBORINFOCONFIG']._serialized_start=1983 - _globals['_MODULECONFIG_NEIGHBORINFOCONFIG']._serialized_end=2073 - _globals['_MODULECONFIG_DETECTIONSENSORCONFIG']._serialized_start=2076 - _globals['_MODULECONFIG_DETECTIONSENSORCONFIG']._serialized_end=2513 - _globals['_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_start=2377 - _globals['_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_end=2513 - _globals['_MODULECONFIG_AUDIOCONFIG']._serialized_start=2516 - _globals['_MODULECONFIG_AUDIOCONFIG']._serialized_end=2916 - _globals['_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD']._serialized_start=2749 - _globals['_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD']._serialized_end=2916 - _globals['_MODULECONFIG_PAXCOUNTERCONFIG']._serialized_start=2918 - _globals['_MODULECONFIG_PAXCOUNTERCONFIG']._serialized_end=3036 - _globals['_MODULECONFIG_TRAFFICMANAGEMENTCONFIG']._serialized_start=3039 - _globals['_MODULECONFIG_TRAFFICMANAGEMENTCONFIG']._serialized_end=3506 - _globals['_MODULECONFIG_SERIALCONFIG']._serialized_start=3509 - _globals['_MODULECONFIG_SERIALCONFIG']._serialized_end=4202 - _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD']._serialized_start=3786 - _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD']._serialized_end=4052 - _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_MODE']._serialized_start=4055 - _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_MODE']._serialized_end=4202 - _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_start=4205 - _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_end=4587 - _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_start=4590 - _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_end=4741 - _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_start=4743 - _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_end=4832 - _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_start=4835 - _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_end=5362 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_start=5365 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_end=6003 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_start=5904 - _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_end=6003 - _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_start=6006 - _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_end=6135 - _globals['_MODULECONFIG_STATUSMESSAGECONFIG']._serialized_start=6137 - _globals['_MODULECONFIG_STATUSMESSAGECONFIG']._serialized_end=6186 - _globals['_MODULECONFIG_TAKCONFIG']._serialized_start=6188 - _globals['_MODULECONFIG_TAKCONFIG']._serialized_end=6287 - _globals['_REMOTEHARDWAREPIN']._serialized_start=6308 - _globals['_REMOTEHARDWAREPIN']._serialized_end=6431 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_start=16208 + _globals['_REMOTEHARDWAREPINTYPE']._serialized_end=16281 + _globals['_MODULECONFIG']._serialized_start=242 + _globals['_MODULECONFIG']._serialized_end=16081 + _globals['_MODULECONFIG_MQTTCONFIG']._serialized_start=1614 + _globals['_MODULECONFIG_MQTTCONFIG']._serialized_end=2637 + _globals['_MODULECONFIG_MAPREPORTSETTINGS']._serialized_start=2640 + _globals['_MODULECONFIG_MAPREPORTSETTINGS']._serialized_end=2971 + _globals['_MODULECONFIG_REMOTEHARDWARECONFIG']._serialized_start=2974 + _globals['_MODULECONFIG_REMOTEHARDWARECONFIG']._serialized_end=3120 + _globals['_MODULECONFIG_NEIGHBORINFOCONFIG']._serialized_start=3123 + _globals['_MODULECONFIG_NEIGHBORINFOCONFIG']._serialized_end=3604 + _globals['_MODULECONFIG_DETECTIONSENSORCONFIG']._serialized_start=3607 + _globals['_MODULECONFIG_DETECTIONSENSORCONFIG']._serialized_end=5025 + _globals['_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_start=4780 + _globals['_MODULECONFIG_DETECTIONSENSORCONFIG_TRIGGERTYPE']._serialized_end=5025 + _globals['_MODULECONFIG_AUDIOCONFIG']._serialized_start=5028 + _globals['_MODULECONFIG_AUDIOCONFIG']._serialized_end=5944 + _globals['_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD']._serialized_start=5594 + _globals['_MODULECONFIG_AUDIOCONFIG_AUDIO_BAUD']._serialized_end=5944 + _globals['_MODULECONFIG_PAXCOUNTERCONFIG']._serialized_start=5947 + _globals['_MODULECONFIG_PAXCOUNTERCONFIG']._serialized_end=6500 + _globals['_MODULECONFIG_TRAFFICMANAGEMENTCONFIG']._serialized_start=6503 + _globals['_MODULECONFIG_TRAFFICMANAGEMENTCONFIG']._serialized_end=7369 + _globals['_MODULECONFIG_SERIALCONFIG']._serialized_start=7372 + _globals['_MODULECONFIG_SERIALCONFIG']._serialized_end=8826 + _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD']._serialized_start=8027 + _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_BAUD']._serialized_end=8573 + _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_MODE']._serialized_start=8576 + _globals['_MODULECONFIG_SERIALCONFIG_SERIAL_MODE']._serialized_end=8826 + _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_start=8829 + _globals['_MODULECONFIG_EXTERNALNOTIFICATIONCONFIG']._serialized_end=10539 + _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_start=10542 + _globals['_MODULECONFIG_STOREFORWARDCONFIG']._serialized_end=11023 + _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_start=11026 + _globals['_MODULECONFIG_RANGETESTCONFIG']._serialized_end=11404 + _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_start=11407 + _globals['_MODULECONFIG_TELEMETRYCONFIG']._serialized_end=12838 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_start=12841 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG']._serialized_end=14105 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_start=13907 + _globals['_MODULECONFIG_CANNEDMESSAGECONFIG_INPUTEVENTCHAR']._serialized_end=14105 + _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_start=14108 + _globals['_MODULECONFIG_AMBIENTLIGHTINGCONFIG']._serialized_end=14723 + _globals['_MODULECONFIG_STATUSMESSAGECONFIG']._serialized_start=14725 + _globals['_MODULECONFIG_STATUSMESSAGECONFIG']._serialized_end=14774 + _globals['_MODULECONFIG_MESHBEACONCONFIG']._serialized_start=14777 + _globals['_MODULECONFIG_MESHBEACONCONFIG']._serialized_end=15903 + _globals['_MODULECONFIG_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_start=15367 + _globals['_MODULECONFIG_MESHBEACONCONFIG_BROADCASTTARGET']._serialized_end=15629 + _globals['_MODULECONFIG_MESHBEACONCONFIG_FLAGS']._serialized_start=15631 + _globals['_MODULECONFIG_MESHBEACONCONFIG_FLAGS']._serialized_end=15729 + _globals['_MODULECONFIG_TAKCONFIG']._serialized_start=15906 + _globals['_MODULECONFIG_TAKCONFIG']._serialized_end=16062 + _globals['_REMOTEHARDWAREPIN']._serialized_start=16083 + _globals['_REMOTEHARDWAREPIN']._serialized_end=16206 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/module_config_pb2.pyi b/meshtastic/protobuf/module_config_pb2.pyi index b9d8a5a8a..0ea8e0cb4 100644 --- a/meshtastic/protobuf/module_config_pb2.pyi +++ b/meshtastic/protobuf/module_config_pb2.pyi @@ -10,6 +10,8 @@ import google.protobuf.internal.containers import google.protobuf.internal.enum_type_wrapper import google.protobuf.message import meshtastic.protobuf.atak_pb2 +import meshtastic.protobuf.channel_pb2 +import meshtastic.protobuf.config_pb2 import sys import typing @@ -389,7 +391,19 @@ class ModuleConfig(google.protobuf.message.Message): CODEC2_1300: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 5 CODEC2_1200: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 6 CODEC2_700: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 7 + """ + Removed from libcodec2 upstream. A device configured to one of these + falls back to CODEC2_700C. + """ CODEC2_700B: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 8 + CODEC2_700C: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 9 + """ + Replaces CODEC2_700. Default for new configurations. + """ + CODEC2_450: ModuleConfig.AudioConfig._Audio_Baud.ValueType # 10 + """ + Lowest rate, and the only one usable on slower modem presets. + """ class Audio_Baud(_Audio_Baud, metaclass=_Audio_BaudEnumTypeWrapper): """ @@ -404,7 +418,19 @@ class ModuleConfig(google.protobuf.message.Message): CODEC2_1300: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 5 CODEC2_1200: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 6 CODEC2_700: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 7 + """ + Removed from libcodec2 upstream. A device configured to one of these + falls back to CODEC2_700C. + """ CODEC2_700B: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 8 + CODEC2_700C: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 9 + """ + Replaces CODEC2_700. Default for new configurations. + """ + CODEC2_450: ModuleConfig.AudioConfig.Audio_Baud.ValueType # 10 + """ + Lowest rate, and the only one usable on slower modem presets. + """ CODEC2_ENABLED_FIELD_NUMBER: builtins.int PTT_PIN_FIELD_NUMBER: builtins.int @@ -423,7 +449,7 @@ class ModuleConfig(google.protobuf.message.Message): """ bitrate: global___ModuleConfig.AudioConfig.Audio_Baud.ValueType """ - The audio sample rate to use for codec2 + The codec2 bitrate to encode at. Sample rate is always 8 kHz. """ i2s_ws: builtins.int """ @@ -497,100 +523,57 @@ class ModuleConfig(google.protobuf.message.Message): class TrafficManagementConfig(google.protobuf.message.Message): """ Config for the Traffic Management module. - Provides packet inspection and traffic shaping to help reduce channel utilization + Provides packet inspection and traffic shaping to help reduce channel utilization. + Every field uses the proto3 zero value to mean "disabled"; there is no + "use the firmware default" sentinel. Firmware installs its own defaults when it + first creates this config, and a client that writes 0 turns that feature off. """ DESCRIPTOR: google.protobuf.descriptor.Descriptor - ENABLED_FIELD_NUMBER: builtins.int - POSITION_DEDUP_ENABLED_FIELD_NUMBER: builtins.int - POSITION_PRECISION_BITS_FIELD_NUMBER: builtins.int POSITION_MIN_INTERVAL_SECS_FIELD_NUMBER: builtins.int - NODEINFO_DIRECT_RESPONSE_FIELD_NUMBER: builtins.int NODEINFO_DIRECT_RESPONSE_MAX_HOPS_FIELD_NUMBER: builtins.int - RATE_LIMIT_ENABLED_FIELD_NUMBER: builtins.int RATE_LIMIT_WINDOW_SECS_FIELD_NUMBER: builtins.int RATE_LIMIT_MAX_PACKETS_FIELD_NUMBER: builtins.int - DROP_UNKNOWN_ENABLED_FIELD_NUMBER: builtins.int UNKNOWN_PACKET_THRESHOLD_FIELD_NUMBER: builtins.int - EXHAUST_HOP_TELEMETRY_FIELD_NUMBER: builtins.int - EXHAUST_HOP_POSITION_FIELD_NUMBER: builtins.int - ROUTER_PRESERVE_HOPS_FIELD_NUMBER: builtins.int - enabled: builtins.bool - """ - Master enable for traffic management module - """ - position_dedup_enabled: builtins.bool - """ - Enable position deduplication to drop redundant position broadcasts - """ - position_precision_bits: builtins.int - """ - Number of bits of precision for position deduplication (0-32) - """ position_min_interval_secs: builtins.int """ - Minimum interval in seconds between position updates from the same node - """ - nodeinfo_direct_response: builtins.bool - """ - Enable direct response to NodeInfo requests from local cache + Minimum interval in seconds between position updates from the same node. + A non-zero value implicitly enables the suppression window; 0 disables it. + Firmware default: 21600 (6 hours), installed when this config is first created. """ nodeinfo_direct_response_max_hops: builtins.int """ - Minimum hop distance from requestor before responding to NodeInfo requests - """ - rate_limit_enabled: builtins.bool - """ - Enable per-node rate limiting to throttle chatty nodes + Maximum hop distance from the requestor at which direct NodeInfo responses + are served from the local cache. A non-zero value implicitly enables direct + response; 0 disables it. """ rate_limit_window_secs: builtins.int """ - Time window in seconds for rate limiting calculations + Time window in seconds for per-node rate limiting. + A non-zero value implicitly enables rate limiting; 0 disables it. """ rate_limit_max_packets: builtins.int """ - Maximum packets allowed per node within the rate limit window - """ - drop_unknown_enabled: builtins.bool - """ - Enable dropping of unknown/undecryptable packets per rate_limit_window_secs + Maximum packets allowed per node within the rate limit window. + A non-zero value implicitly enables rate limiting; 0 disables it. """ unknown_packet_threshold: builtins.int """ - Number of unknown packets before dropping from a node - """ - exhaust_hop_telemetry: builtins.bool - """ - Set hop_limit to 0 for relayed telemetry broadcasts (own packets unaffected) - """ - exhaust_hop_position: builtins.bool - """ - Set hop_limit to 0 for relayed position broadcasts (own packets unaffected) - """ - router_preserve_hops: builtins.bool - """ - Preserve hop_limit for router-to-router traffic + Maximum unknown/undecryptable packets per rate window before the source + is dropped. A non-zero value implicitly enables unknown-packet filtering; + 0 disables it. """ def __init__( self, *, - enabled: builtins.bool = ..., - position_dedup_enabled: builtins.bool = ..., - position_precision_bits: builtins.int = ..., position_min_interval_secs: builtins.int = ..., - nodeinfo_direct_response: builtins.bool = ..., nodeinfo_direct_response_max_hops: builtins.int = ..., - rate_limit_enabled: builtins.bool = ..., rate_limit_window_secs: builtins.int = ..., rate_limit_max_packets: builtins.int = ..., - drop_unknown_enabled: builtins.bool = ..., unknown_packet_threshold: builtins.int = ..., - exhaust_hop_telemetry: builtins.bool = ..., - exhaust_hop_position: builtins.bool = ..., - router_preserve_hops: builtins.bool = ..., ) -> None: ... - def ClearField(self, field_name: typing.Literal["drop_unknown_enabled", b"drop_unknown_enabled", "enabled", b"enabled", "exhaust_hop_position", b"exhaust_hop_position", "exhaust_hop_telemetry", b"exhaust_hop_telemetry", "nodeinfo_direct_response", b"nodeinfo_direct_response", "nodeinfo_direct_response_max_hops", b"nodeinfo_direct_response_max_hops", "position_dedup_enabled", b"position_dedup_enabled", "position_min_interval_secs", b"position_min_interval_secs", "position_precision_bits", b"position_precision_bits", "rate_limit_enabled", b"rate_limit_enabled", "rate_limit_max_packets", b"rate_limit_max_packets", "rate_limit_window_secs", b"rate_limit_window_secs", "router_preserve_hops", b"router_preserve_hops", "unknown_packet_threshold", b"unknown_packet_threshold"]) -> None: ... + def ClearField(self, field_name: typing.Literal["nodeinfo_direct_response_max_hops", b"nodeinfo_direct_response_max_hops", "position_min_interval_secs", b"position_min_interval_secs", "rate_limit_max_packets", b"rate_limit_max_packets", "rate_limit_window_secs", b"rate_limit_window_secs", "unknown_packet_threshold", b"unknown_packet_threshold"]) -> None: ... @typing.final class SerialConfig(google.protobuf.message.Message): @@ -1302,6 +1285,200 @@ class ModuleConfig(google.protobuf.message.Message): ) -> None: ... def ClearField(self, field_name: typing.Literal["node_status", b"node_status"]) -> None: ... + @typing.final + class MeshBeaconConfig(google.protobuf.message.Message): + """ + MeshBeacon module config + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + class _Flags: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + + class _FlagsEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[ModuleConfig.MeshBeaconConfig._Flags.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + FLAG_NONE: ModuleConfig.MeshBeaconConfig._Flags.ValueType # 0 + """ + No options enabled. + """ + FLAG_LISTEN_ENABLED: ModuleConfig.MeshBeaconConfig._Flags.ValueType # 1 + """ + Enable receiving MESH_BEACON_APP packets from other nodes. + The text portion is delivered to the local message inbox. + Offered channel/preset are stored for the client app to act on. + """ + FLAG_BROADCAST_ENABLED: ModuleConfig.MeshBeaconConfig._Flags.ValueType # 2 + """ + Enable periodically broadcasting MESH_BEACON_APP packets from this node. + """ + FLAG_LEGACY_SPLIT: ModuleConfig.MeshBeaconConfig._Flags.ValueType # 4 + """ + When both text and offer content are present, split the beacon into a separate + MESH_BEACON_APP (offer only) and TEXT_MESSAGE_APP (text only) packet, so firmware + that only decodes TEXT_MESSAGE_APP still receives the human-readable text. + """ + + class Flags(_Flags, metaclass=_FlagsEnumTypeWrapper): + """ + Boolean options for the beacon module, packed into the `flags` bitfield below. + OR the FLAG_* values together; a flag is on when its bit is set. + """ + + FLAG_NONE: ModuleConfig.MeshBeaconConfig.Flags.ValueType # 0 + """ + No options enabled. + """ + FLAG_LISTEN_ENABLED: ModuleConfig.MeshBeaconConfig.Flags.ValueType # 1 + """ + Enable receiving MESH_BEACON_APP packets from other nodes. + The text portion is delivered to the local message inbox. + Offered channel/preset are stored for the client app to act on. + """ + FLAG_BROADCAST_ENABLED: ModuleConfig.MeshBeaconConfig.Flags.ValueType # 2 + """ + Enable periodically broadcasting MESH_BEACON_APP packets from this node. + """ + FLAG_LEGACY_SPLIT: ModuleConfig.MeshBeaconConfig.Flags.ValueType # 4 + """ + When both text and offer content are present, split the beacon into a separate + MESH_BEACON_APP (offer only) and TEXT_MESSAGE_APP (text only) packet, so firmware + that only decodes TEXT_MESSAGE_APP still receives the human-readable text. + """ + + @typing.final + class BroadcastTarget(google.protobuf.message.Message): + """ + One entry in the broadcast destination list. + Each entry names one set of radio settings to send a beacon copy on. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PRESET_FIELD_NUMBER: builtins.int + REGION_FIELD_NUMBER: builtins.int + CHANNEL_INDEX_FIELD_NUMBER: builtins.int + FREQUENCY_SLOT_FIELD_NUMBER: builtins.int + preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType + """ + Modem preset to use for this target. + Falls back to the running config preset if unset. + """ + region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType + """ + Region to use for this target. UNSET means use the running config region. + """ + channel_index: builtins.int + """Tag 3 was an embedded ChannelSettings; replaced by channel_index (tag 4) to keep + ModuleConfig within the BLE FromRadio size budget. Branch unreleased, so tag 3 is a gap. + + + Index into the device's channel table (0..MAX_NUM_CHANNELS-1) of the channel to + transmit this target's beacon on. The referenced channel must already be configured + on the node (its key is needed to encrypt). If unset, the default channel for the + preset is used. + """ + frequency_slot: builtins.int + """ + Frequency slot to transmit this target's beacon on, 1-based, matching + Config.LoRaConfig.channel_num. Unset means derive it the way any node on this + channel would: the region's override slot if it has one, otherwise the hash of the + target channel's name. Do not send 0 - it is the same as unset. + """ + def __init__( + self, + *, + preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType | None = ..., + region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType = ..., + channel_index: builtins.int | None = ..., + frequency_slot: builtins.int | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["_channel_index", b"_channel_index", "_frequency_slot", b"_frequency_slot", "_preset", b"_preset", "channel_index", b"channel_index", "frequency_slot", b"frequency_slot", "preset", b"preset"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_channel_index", b"_channel_index", "_frequency_slot", b"_frequency_slot", "_preset", b"_preset", "channel_index", b"channel_index", "frequency_slot", b"frequency_slot", "preset", b"preset", "region", b"region"]) -> None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_channel_index", b"_channel_index"]) -> typing.Literal["channel_index"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_frequency_slot", b"_frequency_slot"]) -> typing.Literal["frequency_slot"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_preset", b"_preset"]) -> typing.Literal["preset"] | None: ... + + FLAGS_FIELD_NUMBER: builtins.int + BROADCAST_OFFER_FREQUENCY_SLOT_FIELD_NUMBER: builtins.int + BROADCAST_MESSAGE_FIELD_NUMBER: builtins.int + BROADCAST_OFFER_CHANNEL_FIELD_NUMBER: builtins.int + BROADCAST_OFFER_REGION_FIELD_NUMBER: builtins.int + BROADCAST_OFFER_PRESET_FIELD_NUMBER: builtins.int + BROADCAST_INTERVAL_SECS_FIELD_NUMBER: builtins.int + BROADCAST_TARGETS_FIELD_NUMBER: builtins.int + flags: builtins.int + """ + Bitwise-OR of Flags values (listen / broadcast / legacy-split toggles). + """ + broadcast_offer_frequency_slot: builtins.int + """ + Frequency slot to advertise, 1-based, matching Config.LoRaConfig.channel_num. + Unset means the receiver derives it from the advertised region, channel name and + preset, which covers a region that mandates a slot and a mesh on the default hash. + Set it only where the mesh deliberately pins a non-default slot. Do not send 0. + """ + broadcast_message: builtins.str + """ + Message to include in each beacon broadcast. + Every beacon copy carries this on the air, so it is the largest single cost in both + this config and the packet it produces. Held to 60 bytes for that reason. The nanopb + max_size is 61 because it counts the terminator, which is what leaves a client a + round 60. + """ + broadcast_offer_region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType + """ + Optional region to advertise in the MeshBeacon offer_region field. + """ + broadcast_offer_preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType + """ + Optional modem preset to advertise in the MeshBeacon offer_preset field. + """ + broadcast_interval_secs: builtins.int + """ + How often to broadcast, in seconds. Min 3600 (1 h), default 3600. + """ + @property + def broadcast_offer_channel(self) -> meshtastic.protobuf.channel_pb2.ChannelSettings: + """ + Optional channel (name + PSK) to advertise in the MeshBeacon offer_channel field. + """ + + @property + def broadcast_targets(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___ModuleConfig.MeshBeaconConfig.BroadcastTarget]: + """ + Broadcast destination list. + The broadcaster sends one beacon copy per distinct destination, in sequence, temporarily + switching the radio to that entry's preset/region/channel for each. + When empty, a single beacon is sent on the node's running preset and region over the + primary channel. + Entries that resolve to the same effective preset, region and channel are deduplicated, so + a duplicate entry does not produce a second transmission. + """ + + def __init__( + self, + *, + flags: builtins.int = ..., + broadcast_offer_frequency_slot: builtins.int | None = ..., + broadcast_message: builtins.str = ..., + broadcast_offer_channel: meshtastic.protobuf.channel_pb2.ChannelSettings | None = ..., + broadcast_offer_region: meshtastic.protobuf.config_pb2.Config.LoRaConfig.RegionCode.ValueType = ..., + broadcast_offer_preset: meshtastic.protobuf.config_pb2.Config.LoRaConfig.ModemPreset.ValueType | None = ..., + broadcast_interval_secs: builtins.int = ..., + broadcast_targets: collections.abc.Iterable[global___ModuleConfig.MeshBeaconConfig.BroadcastTarget] | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["_broadcast_offer_frequency_slot", b"_broadcast_offer_frequency_slot", "_broadcast_offer_preset", b"_broadcast_offer_preset", "broadcast_offer_channel", b"broadcast_offer_channel", "broadcast_offer_frequency_slot", b"broadcast_offer_frequency_slot", "broadcast_offer_preset", b"broadcast_offer_preset"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_broadcast_offer_frequency_slot", b"_broadcast_offer_frequency_slot", "_broadcast_offer_preset", b"_broadcast_offer_preset", "broadcast_interval_secs", b"broadcast_interval_secs", "broadcast_message", b"broadcast_message", "broadcast_offer_channel", b"broadcast_offer_channel", "broadcast_offer_frequency_slot", b"broadcast_offer_frequency_slot", "broadcast_offer_preset", b"broadcast_offer_preset", "broadcast_offer_region", b"broadcast_offer_region", "broadcast_targets", b"broadcast_targets", "flags", b"flags"]) -> None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_broadcast_offer_frequency_slot", b"_broadcast_offer_frequency_slot"]) -> typing.Literal["broadcast_offer_frequency_slot"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_broadcast_offer_preset", b"_broadcast_offer_preset"]) -> typing.Literal["broadcast_offer_preset"] | None: ... + @typing.final class TAKConfig(google.protobuf.message.Message): """ @@ -1346,6 +1523,7 @@ class ModuleConfig(google.protobuf.message.Message): STATUSMESSAGE_FIELD_NUMBER: builtins.int TRAFFIC_MANAGEMENT_FIELD_NUMBER: builtins.int TAK_FIELD_NUMBER: builtins.int + MESH_BEACON_FIELD_NUMBER: builtins.int @property def mqtt(self) -> global___ModuleConfig.MQTTConfig: """ @@ -1442,6 +1620,12 @@ class ModuleConfig(google.protobuf.message.Message): TAK team/role configuration for TAK_TRACKER """ + @property + def mesh_beacon(self) -> global___ModuleConfig.MeshBeaconConfig: + """ + MeshBeacon module config + """ + def __init__( self, *, @@ -1461,10 +1645,11 @@ class ModuleConfig(google.protobuf.message.Message): statusmessage: global___ModuleConfig.StatusMessageConfig | None = ..., traffic_management: global___ModuleConfig.TrafficManagementConfig | None = ..., tak: global___ModuleConfig.TAKConfig | None = ..., + mesh_beacon: global___ModuleConfig.MeshBeaconConfig | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "payload_variant", b"payload_variant", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "statusmessage", b"statusmessage", "store_forward", b"store_forward", "tak", b"tak", "telemetry", b"telemetry", "traffic_management", b"traffic_management"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "payload_variant", b"payload_variant", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "statusmessage", b"statusmessage", "store_forward", b"store_forward", "tak", b"tak", "telemetry", b"telemetry", "traffic_management", b"traffic_management"]) -> None: ... - def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["mqtt", "serial", "external_notification", "store_forward", "range_test", "telemetry", "canned_message", "audio", "remote_hardware", "neighbor_info", "ambient_lighting", "detection_sensor", "paxcounter", "statusmessage", "traffic_management", "tak"] | None: ... + def HasField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mesh_beacon", b"mesh_beacon", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "payload_variant", b"payload_variant", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "statusmessage", b"statusmessage", "store_forward", b"store_forward", "tak", b"tak", "telemetry", b"telemetry", "traffic_management", b"traffic_management"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["ambient_lighting", b"ambient_lighting", "audio", b"audio", "canned_message", b"canned_message", "detection_sensor", b"detection_sensor", "external_notification", b"external_notification", "mesh_beacon", b"mesh_beacon", "mqtt", b"mqtt", "neighbor_info", b"neighbor_info", "paxcounter", b"paxcounter", "payload_variant", b"payload_variant", "range_test", b"range_test", "remote_hardware", b"remote_hardware", "serial", b"serial", "statusmessage", b"statusmessage", "store_forward", b"store_forward", "tak", b"tak", "telemetry", b"telemetry", "traffic_management", b"traffic_management"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["payload_variant", b"payload_variant"]) -> typing.Literal["mqtt", "serial", "external_notification", "store_forward", "range_test", "telemetry", "canned_message", "audio", "remote_hardware", "neighbor_info", "ambient_lighting", "detection_sensor", "paxcounter", "statusmessage", "traffic_management", "tak", "mesh_beacon"] | None: ... global___ModuleConfig = ModuleConfig diff --git a/meshtastic/protobuf/mqtt_pb2.py b/meshtastic/protobuf/mqtt_pb2.py index 54e091803..e606a4210 100644 --- a/meshtastic/protobuf/mqtt_pb2.py +++ b/meshtastic/protobuf/mqtt_pb2.py @@ -16,7 +16,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__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\x1a meshtastic/protobuf/nanopb.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\"\x9f\x04\n\tMapReport\x12\x18\n\tlong_name\x18\x01 \x01(\tB\x05\x92?\x02\x08(\x12\x19\n\nshort_name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x05\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\x1f\n\x10\x66irmware_version\x18\x05 \x01(\tB\x05\x92?\x02\x08\x12\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%\n\x16num_online_local_nodes\x18\r \x01(\rB\x05\x92?\x02\x38\x10\x12!\n\x19has_opted_report_location\x18\x0e \x01(\x08\x42`\n\x14org.meshtastic.protoB\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\x1a meshtastic/protobuf/nanopb.proto\"\x7f\n\x0fServiceEnvelope\x12\x36\n\x06packet\x18\x01 \x01(\x0b\x32\x1f.meshtastic.protobuf.MeshPacketB\x05\x92?\x02\x18\x04\x12\x19\n\nchannel_id\x18\x02 \x01(\tB\x05\x92?\x02\x18\x04\x12\x19\n\ngateway_id\x18\x03 \x01(\tB\x05\x92?\x02\x18\x04\"\x9f\x04\n\tMapReport\x12\x18\n\tlong_name\x18\x01 \x01(\tB\x05\x92?\x02\x08\x19\x12\x19\n\nshort_name\x18\x02 \x01(\tB\x05\x92?\x02\x08\x05\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\x1f\n\x10\x66irmware_version\x18\x05 \x01(\tB\x05\x92?\x02\x08\x12\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%\n\x16num_online_local_nodes\x18\r \x01(\rB\x05\x92?\x02\x38\x10\x12!\n\x19has_opted_report_location\x18\x0e \x01(\x08\x42`\n\x14org.meshtastic.protoB\nMQTTProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -24,8 +24,14 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\nMQTTProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _SERVICEENVELOPE.fields_by_name['packet']._options = None + _SERVICEENVELOPE.fields_by_name['packet']._serialized_options = b'\222?\002\030\004' + _SERVICEENVELOPE.fields_by_name['channel_id']._options = None + _SERVICEENVELOPE.fields_by_name['channel_id']._serialized_options = b'\222?\002\030\004' + _SERVICEENVELOPE.fields_by_name['gateway_id']._options = None + _SERVICEENVELOPE.fields_by_name['gateway_id']._serialized_options = b'\222?\002\030\004' _MAPREPORT.fields_by_name['long_name']._options = None - _MAPREPORT.fields_by_name['long_name']._serialized_options = b'\222?\002\010(' + _MAPREPORT.fields_by_name['long_name']._serialized_options = b'\222?\002\010\031' _MAPREPORT.fields_by_name['short_name']._options = None _MAPREPORT.fields_by_name['short_name']._serialized_options = b'\222?\002\010\005' _MAPREPORT.fields_by_name['firmware_version']._options = None @@ -33,7 +39,7 @@ _MAPREPORT.fields_by_name['num_online_local_nodes']._options = None _MAPREPORT.fields_by_name['num_online_local_nodes']._serialized_options = b'\222?\0028\020' _globals['_SERVICEENVELOPE']._serialized_start=155 - _globals['_SERVICEENVELOPE']._serialized_end=261 - _globals['_MAPREPORT']._serialized_start=264 - _globals['_MAPREPORT']._serialized_end=807 + _globals['_SERVICEENVELOPE']._serialized_end=282 + _globals['_MAPREPORT']._serialized_start=285 + _globals['_MAPREPORT']._serialized_end=828 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/portnums_pb2.py b/meshtastic/protobuf/portnums_pb2.py index 24212330f..137314375 100644 --- a/meshtastic/protobuf/portnums_pb2.py +++ b/meshtastic/protobuf/portnums_pb2.py @@ -13,7 +13,7 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\"meshtastic/protobuf/portnums.proto\x12\x13meshtastic.protobuf*\xfd\x05\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\x14\n\x10REMOTE_SHELL_APP\x10\r\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x1e\n\x1aSTORE_FORWARD_PLUSPLUS_APP\x10#\x12\x13\n\x0fNODE_STATUS_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\x12\n\x0eLORAWAN_BRIDGE\x10K\x12\x18\n\x14RETICULUM_TUNNEL_APP\x10L\x12\x0f\n\x0b\x43\x41YENNE_APP\x10M\x12\x12\n\x0e\x41TAK_PLUGIN_V2\x10N\x12\x12\n\x0eGROUPALARM_APP\x10p\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\x14org.meshtastic.protoB\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*\xb4\x06\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\x14\n\x10REMOTE_SHELL_APP\x10\r\x12\r\n\tREPLY_APP\x10 \x12\x11\n\rIP_TUNNEL_APP\x10!\x12\x12\n\x0ePAXCOUNTER_APP\x10\"\x12\x1e\n\x1aSTORE_FORWARD_PLUSPLUS_APP\x10#\x12\x13\n\x0fNODE_STATUS_APP\x10$\x12\x13\n\x0fMESH_BEACON_APP\x10%\x12\x0e\n\nPAGING_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\x12\n\x0eLORAWAN_BRIDGE\x10K\x12\x18\n\x14RETICULUM_TUNNEL_APP\x10L\x12\x0f\n\x0b\x43\x41YENNE_APP\x10M\x12\x12\n\x0e\x41TAK_PLUGIN_V2\x10N\x12\x10\n\x0cLORA_OTA_APP\x10O\x12\x12\n\x0eGROUPALARM_APP\x10p\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\x14org.meshtastic.protoB\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 @@ DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\010PortnumsZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' _globals['_PORTNUM']._serialized_start=60 - _globals['_PORTNUM']._serialized_end=825 + _globals['_PORTNUM']._serialized_end=880 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/portnums_pb2.pyi b/meshtastic/protobuf/portnums_pb2.pyi index a16cef291..bc6bafbaa 100644 --- a/meshtastic/protobuf/portnums_pb2.pyi +++ b/meshtastic/protobuf/portnums_pb2.pyi @@ -135,6 +135,21 @@ class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy This module allows setting an extra string of status for a node. Broadcasts on change and on a timer, possibly once a day. """ + MESH_BEACON_APP: _PortNum.ValueType # 37 + """ + Beacon module broadcast packets. + ENCODING: protobuf + Periodically broadcast by nodes in beacon mode; received by nodes with MeshBeaconConfig.FLAG_LISTEN_ENABLED. + Carries a text message plus optional channel/preset offers for client apps. + """ + PAGING_APP: _PortNum.ValueType # 38 + """ + Acknowledged paging: alerts a person is expected to physically acknowledge, and the + acknowledgements themselves. + ENCODING: protobuf PagingPacket + Distinct from ALERT_APP, which is a text message the recipient never confirms, and from a + routing or delivery ACK, which says the packet arrived rather than that someone saw it. + """ SERIAL_APP: _PortNum.ValueType # 64 """ Provides a hardware serial interface to send and receive from the Meshtastic network. @@ -204,7 +219,7 @@ class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy LORAWAN_BRIDGE: _PortNum.ValueType # 75 """ LoraWAN Payload Transport - ENCODING: compact binary LoRaWAN uplink (10-byte RF metadata + PHY payload) - see LoRaWANBridgeModule + ENCODING: LoRaWANBridge protobuf, see lorawan_bridge.proto """ RETICULUM_TUNNEL_APP: _PortNum.ValueType # 76 """ @@ -223,6 +238,11 @@ class _PortNumEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTy Portnum for payloads from the official Meshtastic ATAK plugin using TAKPacketV2 with zstd dictionary compression. """ + LORA_OTA_APP: _PortNum.ValueType # 79 + """signed firmware updates over lora. + + ENCODING: binary (ota-common transport frames) + """ GROUPALARM_APP: _PortNum.ValueType # 112 """ GroupAlarm integration @@ -374,6 +394,21 @@ ENCODING: protobuf This module allows setting an extra string of status for a node. Broadcasts on change and on a timer, possibly once a day. """ +MESH_BEACON_APP: PortNum.ValueType # 37 +""" +Beacon module broadcast packets. +ENCODING: protobuf +Periodically broadcast by nodes in beacon mode; received by nodes with MeshBeaconConfig.FLAG_LISTEN_ENABLED. +Carries a text message plus optional channel/preset offers for client apps. +""" +PAGING_APP: PortNum.ValueType # 38 +""" +Acknowledged paging: alerts a person is expected to physically acknowledge, and the +acknowledgements themselves. +ENCODING: protobuf PagingPacket +Distinct from ALERT_APP, which is a text message the recipient never confirms, and from a +routing or delivery ACK, which says the packet arrived rather than that someone saw it. +""" SERIAL_APP: PortNum.ValueType # 64 """ Provides a hardware serial interface to send and receive from the Meshtastic network. @@ -443,7 +478,7 @@ PowerStress based monitoring support (for automated power consumption testing) LORAWAN_BRIDGE: PortNum.ValueType # 75 """ LoraWAN Payload Transport -ENCODING: compact binary LoRaWAN uplink (10-byte RF metadata + PHY payload) - see LoRaWANBridgeModule +ENCODING: LoRaWANBridge protobuf, see lorawan_bridge.proto """ RETICULUM_TUNNEL_APP: PortNum.ValueType # 76 """ @@ -462,6 +497,11 @@ ATAK Plugin V2 Portnum for payloads from the official Meshtastic ATAK plugin using TAKPacketV2 with zstd dictionary compression. """ +LORA_OTA_APP: PortNum.ValueType # 79 +"""signed firmware updates over lora. + +ENCODING: binary (ota-common transport frames) +""" GROUPALARM_APP: PortNum.ValueType # 112 """ GroupAlarm integration diff --git a/meshtastic/protobuf/storeforward_pb2.py b/meshtastic/protobuf/storeforward_pb2.py index 7ff93bdef..83fb87bc3 100644 --- a/meshtastic/protobuf/storeforward_pb2.py +++ b/meshtastic/protobuf/storeforward_pb2.py @@ -14,7 +14,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&meshtastic/protobuf/storeforward.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xc8\x07\n\x0fStoreAndForward\x12@\n\x02rr\x18\x01 \x01(\x0e\x32\x34.meshtastic.protobuf.StoreAndForward.RequestResponse\x12@\n\x05stats\x18\x02 \x01(\x0b\x32/.meshtastic.protobuf.StoreAndForward.StatisticsH\x00\x12?\n\x07history\x18\x03 \x01(\x0b\x32,.meshtastic.protobuf.StoreAndForward.HistoryH\x00\x12\x43\n\theartbeat\x18\x04 \x01(\x0b\x32..meshtastic.protobuf.StoreAndForward.HeartbeatH\x00\x12\x16\n\x04text\x18\x05 \x01(\x0c\x42\x06\x92?\x03\x08\xe9\x01H\x00\x1a\xcd\x01\n\nStatistics\x12\x16\n\x0emessages_total\x18\x01 \x01(\r\x12\x16\n\x0emessages_saved\x18\x02 \x01(\r\x12\x14\n\x0cmessages_max\x18\x03 \x01(\r\x12\x0f\n\x07up_time\x18\x04 \x01(\r\x12\x10\n\x08requests\x18\x05 \x01(\r\x12\x18\n\x10requests_history\x18\x06 \x01(\r\x12\x11\n\theartbeat\x18\x07 \x01(\x08\x12\x12\n\nreturn_max\x18\x08 \x01(\r\x12\x15\n\rreturn_window\x18\t \x01(\r\x1aI\n\x07History\x12\x18\n\x10history_messages\x18\x01 \x01(\r\x12\x0e\n\x06window\x18\x02 \x01(\r\x12\x14\n\x0clast_request\x18\x03 \x01(\r\x1a.\n\tHeartbeat\x12\x0e\n\x06period\x18\x01 \x01(\r\x12\x11\n\tsecondary\x18\x02 \x01(\r\"\xbc\x02\n\x0fRequestResponse\x12\t\n\x05UNSET\x10\x00\x12\x10\n\x0cROUTER_ERROR\x10\x01\x12\x14\n\x10ROUTER_HEARTBEAT\x10\x02\x12\x0f\n\x0bROUTER_PING\x10\x03\x12\x0f\n\x0bROUTER_PONG\x10\x04\x12\x0f\n\x0bROUTER_BUSY\x10\x05\x12\x12\n\x0eROUTER_HISTORY\x10\x06\x12\x10\n\x0cROUTER_STATS\x10\x07\x12\x16\n\x12ROUTER_TEXT_DIRECT\x10\x08\x12\x19\n\x15ROUTER_TEXT_BROADCAST\x10\t\x12\x10\n\x0c\x43LIENT_ERROR\x10@\x12\x12\n\x0e\x43LIENT_HISTORY\x10\x41\x12\x10\n\x0c\x43LIENT_STATS\x10\x42\x12\x0f\n\x0b\x43LIENT_PING\x10\x43\x12\x0f\n\x0b\x43LIENT_PONG\x10\x44\x12\x10\n\x0c\x43LIENT_ABORT\x10jB\t\n\x07variantBk\n\x14org.meshtastic.protoB\x15StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&meshtastic/protobuf/storeforward.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\xdd\x07\n\x0fStoreAndForward\x12@\n\x02rr\x18\x01 \x01(\x0e\x32\x34.meshtastic.protobuf.StoreAndForward.RequestResponse\x12@\n\x05stats\x18\x02 \x01(\x0b\x32/.meshtastic.protobuf.StoreAndForward.StatisticsH\x00\x12?\n\x07history\x18\x03 \x01(\x0b\x32,.meshtastic.protobuf.StoreAndForward.HistoryH\x00\x12\x43\n\theartbeat\x18\x04 \x01(\x0b\x32..meshtastic.protobuf.StoreAndForward.HeartbeatH\x00\x12\x16\n\x04text\x18\x05 \x01(\x0c\x42\x06\x92?\x03\x08\xe9\x01H\x00\x12\x13\n\x0boriginal_id\x18\x06 \x01(\r\x1a\xcd\x01\n\nStatistics\x12\x16\n\x0emessages_total\x18\x01 \x01(\r\x12\x16\n\x0emessages_saved\x18\x02 \x01(\r\x12\x14\n\x0cmessages_max\x18\x03 \x01(\r\x12\x0f\n\x07up_time\x18\x04 \x01(\r\x12\x10\n\x08requests\x18\x05 \x01(\r\x12\x18\n\x10requests_history\x18\x06 \x01(\r\x12\x11\n\theartbeat\x18\x07 \x01(\x08\x12\x12\n\nreturn_max\x18\x08 \x01(\r\x12\x15\n\rreturn_window\x18\t \x01(\r\x1aI\n\x07History\x12\x18\n\x10history_messages\x18\x01 \x01(\r\x12\x0e\n\x06window\x18\x02 \x01(\r\x12\x14\n\x0clast_request\x18\x03 \x01(\r\x1a.\n\tHeartbeat\x12\x0e\n\x06period\x18\x01 \x01(\r\x12\x11\n\tsecondary\x18\x02 \x01(\r\"\xbc\x02\n\x0fRequestResponse\x12\t\n\x05UNSET\x10\x00\x12\x10\n\x0cROUTER_ERROR\x10\x01\x12\x14\n\x10ROUTER_HEARTBEAT\x10\x02\x12\x0f\n\x0bROUTER_PING\x10\x03\x12\x0f\n\x0bROUTER_PONG\x10\x04\x12\x0f\n\x0bROUTER_BUSY\x10\x05\x12\x12\n\x0eROUTER_HISTORY\x10\x06\x12\x10\n\x0cROUTER_STATS\x10\x07\x12\x16\n\x12ROUTER_TEXT_DIRECT\x10\x08\x12\x19\n\x15ROUTER_TEXT_BROADCAST\x10\t\x12\x10\n\x0c\x43LIENT_ERROR\x10@\x12\x12\n\x0e\x43LIENT_HISTORY\x10\x41\x12\x10\n\x0c\x43LIENT_STATS\x10\x42\x12\x0f\n\x0b\x43LIENT_PING\x10\x43\x12\x0f\n\x0b\x43LIENT_PONG\x10\x44\x12\x10\n\x0c\x43LIENT_ABORT\x10jB\t\n\x07variantBk\n\x14org.meshtastic.protoB\x15StoreAndForwardProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -25,13 +25,13 @@ _STOREANDFORWARD.fields_by_name['text']._options = None _STOREANDFORWARD.fields_by_name['text']._serialized_options = b'\222?\003\010\351\001' _globals['_STOREANDFORWARD']._serialized_start=98 - _globals['_STOREANDFORWARD']._serialized_end=1066 - _globals['_STOREANDFORWARD_STATISTICS']._serialized_start=408 - _globals['_STOREANDFORWARD_STATISTICS']._serialized_end=613 - _globals['_STOREANDFORWARD_HISTORY']._serialized_start=615 - _globals['_STOREANDFORWARD_HISTORY']._serialized_end=688 - _globals['_STOREANDFORWARD_HEARTBEAT']._serialized_start=690 - _globals['_STOREANDFORWARD_HEARTBEAT']._serialized_end=736 - _globals['_STOREANDFORWARD_REQUESTRESPONSE']._serialized_start=739 - _globals['_STOREANDFORWARD_REQUESTRESPONSE']._serialized_end=1055 + _globals['_STOREANDFORWARD']._serialized_end=1087 + _globals['_STOREANDFORWARD_STATISTICS']._serialized_start=429 + _globals['_STOREANDFORWARD_STATISTICS']._serialized_end=634 + _globals['_STOREANDFORWARD_HISTORY']._serialized_start=636 + _globals['_STOREANDFORWARD_HISTORY']._serialized_end=709 + _globals['_STOREANDFORWARD_HEARTBEAT']._serialized_start=711 + _globals['_STOREANDFORWARD_HEARTBEAT']._serialized_end=757 + _globals['_STOREANDFORWARD_REQUESTRESPONSE']._serialized_start=760 + _globals['_STOREANDFORWARD_REQUESTRESPONSE']._serialized_end=1076 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/storeforward_pb2.pyi b/meshtastic/protobuf/storeforward_pb2.pyi index aff4f74fb..89cf46ff8 100644 --- a/meshtastic/protobuf/storeforward_pb2.pyi +++ b/meshtastic/protobuf/storeforward_pb2.pyi @@ -303,6 +303,7 @@ class StoreAndForward(google.protobuf.message.Message): HISTORY_FIELD_NUMBER: builtins.int HEARTBEAT_FIELD_NUMBER: builtins.int TEXT_FIELD_NUMBER: builtins.int + ORIGINAL_ID_FIELD_NUMBER: builtins.int rr: global___StoreAndForward.RequestResponse.ValueType """ TODO: REPLACE @@ -311,6 +312,10 @@ class StoreAndForward(google.protobuf.message.Message): """ Text from history message. """ + original_id: builtins.int + """ + Contains the original ID of the contained message. + """ @property def stats(self) -> global___StoreAndForward.Statistics: """ @@ -337,9 +342,10 @@ class StoreAndForward(google.protobuf.message.Message): history: global___StoreAndForward.History | None = ..., heartbeat: global___StoreAndForward.Heartbeat | None = ..., text: builtins.bytes = ..., + original_id: builtins.int = ..., ) -> None: ... def HasField(self, field_name: typing.Literal["heartbeat", b"heartbeat", "history", b"history", "stats", b"stats", "text", b"text", "variant", b"variant"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["heartbeat", b"heartbeat", "history", b"history", "rr", b"rr", "stats", b"stats", "text", b"text", "variant", b"variant"]) -> None: ... + def ClearField(self, field_name: typing.Literal["heartbeat", b"heartbeat", "history", b"history", "original_id", b"original_id", "rr", b"rr", "stats", b"stats", "text", b"text", "variant", b"variant"]) -> None: ... def WhichOneof(self, oneof_group: typing.Literal["variant", b"variant"]) -> typing.Literal["stats", "history", "heartbeat", "text"] | None: ... global___StoreAndForward = StoreAndForward diff --git a/meshtastic/protobuf/telemetry_pb2.py b/meshtastic/protobuf/telemetry_pb2.py index 8fefe687c..f77e6b0f8 100644 --- a/meshtastic/protobuf/telemetry_pb2.py +++ b/meshtastic/protobuf/telemetry_pb2.py @@ -14,7 +14,7 @@ from meshtastic.protobuf import nanopb_pb2 as meshtastic_dot_protobuf_dot_nanopb__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#meshtastic/protobuf/telemetry.proto\x12\x13meshtastic.protobuf\x1a meshtastic/protobuf/nanopb.proto\"\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\"\xbc\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\x17\n\x03iaq\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10H\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\"\n\x0ewind_direction\x18\r \x01(\rB\x05\x92?\x02\x38\x10H\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!\n\rsoil_moisture\x18\x15 \x01(\rB\x05\x92?\x02\x38\x08H\x14\x88\x01\x01\x12\x1d\n\x10soil_temperature\x18\x16 \x01(\x02H\x15\x88\x01\x01\x12#\n\x14one_wire_temperature\x18\x17 \x03(\x02\x42\x05\x92?\x02\x10\x08\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\"\xae\x05\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\x12\x18\n\x0b\x63h4_voltage\x18\x07 \x01(\x02H\x06\x88\x01\x01\x12\x18\n\x0b\x63h4_current\x18\x08 \x01(\x02H\x07\x88\x01\x01\x12\x18\n\x0b\x63h5_voltage\x18\t \x01(\x02H\x08\x88\x01\x01\x12\x18\n\x0b\x63h5_current\x18\n \x01(\x02H\t\x88\x01\x01\x12\x18\n\x0b\x63h6_voltage\x18\x0b \x01(\x02H\n\x88\x01\x01\x12\x18\n\x0b\x63h6_current\x18\x0c \x01(\x02H\x0b\x88\x01\x01\x12\x18\n\x0b\x63h7_voltage\x18\r \x01(\x02H\x0c\x88\x01\x01\x12\x18\n\x0b\x63h7_current\x18\x0e \x01(\x02H\r\x88\x01\x01\x12\x18\n\x0b\x63h8_voltage\x18\x0f \x01(\x02H\x0e\x88\x01\x01\x12\x18\n\x0b\x63h8_current\x18\x10 \x01(\x02H\x0f\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_currentB\x0e\n\x0c_ch4_voltageB\x0e\n\x0c_ch4_currentB\x0e\n\x0c_ch5_voltageB\x0e\n\x0c_ch5_currentB\x0e\n\x0c_ch6_voltageB\x0e\n\x0c_ch6_currentB\x0e\n\x0c_ch7_voltageB\x0e\n\x0c_ch7_currentB\x0e\n\x0c_ch8_voltageB\x0e\n\x0c_ch8_current\"\xb1\t\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\x12\x1c\n\x0f\x63o2_temperature\x18\x0e \x01(\x02H\r\x88\x01\x01\x12\x19\n\x0c\x63o2_humidity\x18\x0f \x01(\x02H\x0e\x88\x01\x01\x12\x1e\n\x11\x66orm_formaldehyde\x18\x10 \x01(\x02H\x0f\x88\x01\x01\x12\x1a\n\rform_humidity\x18\x11 \x01(\x02H\x10\x88\x01\x01\x12\x1d\n\x10\x66orm_temperature\x18\x12 \x01(\x02H\x11\x88\x01\x01\x12\x1a\n\rpm40_standard\x18\x13 \x01(\rH\x12\x88\x01\x01\x12\x1b\n\x0eparticles_40um\x18\x14 \x01(\rH\x13\x88\x01\x01\x12\x1b\n\x0epm_temperature\x18\x15 \x01(\x02H\x14\x88\x01\x01\x12\x18\n\x0bpm_humidity\x18\x16 \x01(\x02H\x15\x88\x01\x01\x12\x17\n\npm_voc_idx\x18\x17 \x01(\x02H\x16\x88\x01\x01\x12\x17\n\npm_nox_idx\x18\x18 \x01(\x02H\x17\x88\x01\x01\x12\x1a\n\rparticles_tps\x18\x19 \x01(\x02H\x18\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_co2B\x12\n\x10_co2_temperatureB\x0f\n\r_co2_humidityB\x14\n\x12_form_formaldehydeB\x10\n\x0e_form_humidityB\x13\n\x11_form_temperatureB\x10\n\x0e_pm40_standardB\x11\n\x0f_particles_40umB\x11\n\x0f_pm_temperatureB\x0e\n\x0c_pm_humidityB\r\n\x0b_pm_voc_idxB\r\n\x0b_pm_nox_idxB\x10\n\x0e_particles_tps\"\x94\x03\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\x1f\n\x10num_online_nodes\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x1e\n\x0fnum_total_nodes\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\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\x12\x1d\n\x0enum_tx_dropped\x18\x0e \x01(\rB\x05\x92?\x02\x38\x10\x12\x13\n\x0bnoise_floor\x18\x0f \x01(\x05\"\xe4\x01\n\x16TrafficManagementStats\x12\x19\n\x11packets_inspected\x18\x01 \x01(\r\x12\x1c\n\x14position_dedup_drops\x18\x02 \x01(\r\x12\x1b\n\x13nodeinfo_cache_hits\x18\x03 \x01(\r\x12\x18\n\x10rate_limit_drops\x18\x04 \x01(\r\x12\x1c\n\x14unknown_packet_drops\x18\x05 \x01(\r\x12\x1d\n\x15hop_exhausted_packets\x18\x06 \x01(\r\x12\x1d\n\x15router_hops_preserved\x18\x07 \x01(\r\"\x89\x01\n\rHealthMetrics\x12\x1d\n\theart_bpm\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x18\n\x04spO2\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08H\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\"\xae\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\x14\n\x05load1\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x14\n\x05load5\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x15\n\x06load15\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\x12 \n\x0buser_string\x18\t \x01(\tB\x06\x92?\x03\x08\xc8\x01H\x02\x88\x01\x01\x42\x12\n\x10_diskfree2_bytesB\x12\n\x10_diskfree3_bytesB\x0e\n\x0c_user_string\"\xae\x04\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\x12O\n\x18traffic_management_stats\x18\t \x01(\x0b\x32+.meshtastic.protobuf.TrafficManagementStatsH\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\"\xf0\x01\n\nSEN5XState\x12\x1a\n\x12last_cleaning_time\x18\x01 \x01(\r\x12\x1b\n\x13last_cleaning_valid\x18\x02 \x01(\x08\x12\x15\n\rone_shot_mode\x18\x03 \x01(\x08\x12\x1b\n\x0evoc_state_time\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x0fvoc_state_valid\x18\x05 \x01(\x08H\x01\x88\x01\x01\x12\x1c\n\x0fvoc_state_array\x18\x06 \x01(\x06H\x02\x88\x01\x01\x42\x11\n\x0f_voc_state_timeB\x12\n\x10_voc_state_validB\x12\n\x10_voc_state_array*\xdc\x05\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\'\x12\x0b\n\x07\x41\x44S1X15\x10(\x12\x0f\n\x0b\x41\x44S1X15_ALT\x10)\x12\t\n\x05SFA30\x10*\x12\t\n\x05SEN5X\x10+\x12\x0b\n\x07TSL2561\x10,\x12\n\n\x06\x42H1750\x10-\x12\x0b\n\x07HDC1080\x10.\x12\t\n\x05SHT21\x10/\x12\t\n\x05STC31\x10\x30\x12\t\n\x05SCD30\x10\x31\x12\t\n\x05SHTXX\x10\x32\x12\n\n\x06\x44S248X\x10\x33\x12\r\n\tMMC5983MA\x10\x34\x12\r\n\tICM42607P\x10\x35\x42\x65\n\x14org.meshtastic.protoB\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\x1a meshtastic/protobuf/nanopb.proto\"\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\"\xc3\x11\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\x17\n\x03iaq\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10H\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\"\n\x0ewind_direction\x18\r \x01(\rB\x05\x92?\x02\x38\x10H\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!\n\rsoil_moisture\x18\x15 \x01(\rB\x05\x92?\x02\x38\x08H\x14\x88\x01\x01\x12\x1d\n\x10soil_temperature\x18\x16 \x01(\x02H\x15\x88\x01\x01\x12%\n\x14one_wire_temperature\x18\x17 \x03(\x02\x42\x07\x18\x01\x92?\x02\x18\x03\x12\x1c\n\x0f\x61\x64\x63_voltage_ch0\x18\x18 \x01(\x02H\x16\x88\x01\x01\x12\x1c\n\x0f\x61\x64\x63_voltage_ch1\x18\x19 \x01(\x02H\x17\x88\x01\x01\x12\x1c\n\x0f\x61\x64\x63_voltage_ch2\x18\x1a \x01(\x02H\x18\x88\x01\x01\x12\x1c\n\x0f\x61\x64\x63_voltage_ch3\x18\x1b \x01(\x02H\x19\x88\x01\x01\x12\x1c\n\x0f\x61\x64\x63_voltage_ch4\x18\x1c \x01(\x02H\x1a\x88\x01\x01\x12\x1c\n\x0f\x61\x64\x63_voltage_ch5\x18\x1d \x01(\x02H\x1b\x88\x01\x01\x12\x1c\n\x0f\x61\x64\x63_voltage_ch6\x18\x1e \x01(\x02H\x1c\x88\x01\x01\x12\x1c\n\x0f\x61\x64\x63_voltage_ch7\x18\x1f \x01(\x02H\x1d\x88\x01\x01\x12%\n\x18one_wire_temperature_ch0\x18 \x01(\x02H\x1e\x88\x01\x01\x12%\n\x18one_wire_temperature_ch1\x18! \x01(\x02H\x1f\x88\x01\x01\x12%\n\x18one_wire_temperature_ch2\x18\" \x01(\x02H \x88\x01\x01\x12%\n\x18one_wire_temperature_ch3\x18# \x01(\x02H!\x88\x01\x01\x12%\n\x18one_wire_temperature_ch4\x18$ \x01(\x02H\"\x88\x01\x01\x12%\n\x18one_wire_temperature_ch5\x18% \x01(\x02H#\x88\x01\x01\x12%\n\x18one_wire_temperature_ch6\x18& \x01(\x02H$\x88\x01\x01\x12%\n\x18one_wire_temperature_ch7\x18\' \x01(\x02H%\x88\x01\x01\x12&\n\x19lightning_strike_count_1h\x18( \x01(\rH&\x88\x01\x01\x12\"\n\x15lightning_distance_km\x18) \x01(\x02H\'\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_temperatureB\x12\n\x10_adc_voltage_ch0B\x12\n\x10_adc_voltage_ch1B\x12\n\x10_adc_voltage_ch2B\x12\n\x10_adc_voltage_ch3B\x12\n\x10_adc_voltage_ch4B\x12\n\x10_adc_voltage_ch5B\x12\n\x10_adc_voltage_ch6B\x12\n\x10_adc_voltage_ch7B\x1b\n\x19_one_wire_temperature_ch0B\x1b\n\x19_one_wire_temperature_ch1B\x1b\n\x19_one_wire_temperature_ch2B\x1b\n\x19_one_wire_temperature_ch3B\x1b\n\x19_one_wire_temperature_ch4B\x1b\n\x19_one_wire_temperature_ch5B\x1b\n\x19_one_wire_temperature_ch6B\x1b\n\x19_one_wire_temperature_ch7B\x1c\n\x1a_lightning_strike_count_1hB\x18\n\x16_lightning_distance_kmJ\x04\x08*\x10\x39R\x07soil_phR\x02phR\x17\x65lectrical_conductivityR\x08salinityR\x08nitrogenR\nphosphorusR\tpotassiumR\x10\x64issolved_oxygenR\x03orpR\x16\x63hemical_oxygen_demandR\tturbidityR\x07nitrateR\x08\x61mmoniumR\x19\x62iochemical_oxygen_demandR\x10solar_irradiance\"\x98\x05\n\x10SoilWaterMetrics\x12\x14\n\x07soil_ph\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x0f\n\x02ph\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12$\n\x17\x65lectrical_conductivity\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12\x15\n\x08salinity\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12\x15\n\x08nitrogen\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12\x17\n\nphosphorus\x18\x06 \x01(\x02H\x05\x88\x01\x01\x12\x16\n\tpotassium\x18\x07 \x01(\x02H\x06\x88\x01\x01\x12\x1d\n\x10\x64issolved_oxygen\x18\x08 \x01(\x02H\x07\x88\x01\x01\x12\x10\n\x03orp\x18\t \x01(\x02H\x08\x88\x01\x01\x12#\n\x16\x63hemical_oxygen_demand\x18\n \x01(\x02H\t\x88\x01\x01\x12\x16\n\tturbidity\x18\x0b \x01(\x02H\n\x88\x01\x01\x12\x14\n\x07nitrate\x18\x0c \x01(\x02H\x0b\x88\x01\x01\x12\x15\n\x08\x61mmonium\x18\r \x01(\x02H\x0c\x88\x01\x01\x12&\n\x19\x62iochemical_oxygen_demand\x18\x0e \x01(\x02H\r\x88\x01\x01\x12\x1d\n\x10solar_irradiance\x18\x0f \x01(\x02H\x0e\x88\x01\x01\x42\n\n\x08_soil_phB\x05\n\x03_phB\x1a\n\x18_electrical_conductivityB\x0b\n\t_salinityB\x0b\n\t_nitrogenB\r\n\x0b_phosphorusB\x0c\n\n_potassiumB\x13\n\x11_dissolved_oxygenB\x06\n\x04_orpB\x19\n\x17_chemical_oxygen_demandB\x0c\n\n_turbidityB\n\n\x08_nitrateB\x0b\n\t_ammoniumB\x1c\n\x1a_biochemical_oxygen_demandB\x13\n\x11_solar_irradiance\"\xd6\x05\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\x12\x1c\n\x0b\x63h4_voltage\x18\x07 \x01(\x02\x42\x02\x18\x01H\x06\x88\x01\x01\x12\x1c\n\x0b\x63h4_current\x18\x08 \x01(\x02\x42\x02\x18\x01H\x07\x88\x01\x01\x12\x1c\n\x0b\x63h5_voltage\x18\t \x01(\x02\x42\x02\x18\x01H\x08\x88\x01\x01\x12\x1c\n\x0b\x63h5_current\x18\n \x01(\x02\x42\x02\x18\x01H\t\x88\x01\x01\x12\x1c\n\x0b\x63h6_voltage\x18\x0b \x01(\x02\x42\x02\x18\x01H\n\x88\x01\x01\x12\x1c\n\x0b\x63h6_current\x18\x0c \x01(\x02\x42\x02\x18\x01H\x0b\x88\x01\x01\x12\x1c\n\x0b\x63h7_voltage\x18\r \x01(\x02\x42\x02\x18\x01H\x0c\x88\x01\x01\x12\x1c\n\x0b\x63h7_current\x18\x0e \x01(\x02\x42\x02\x18\x01H\r\x88\x01\x01\x12\x1c\n\x0b\x63h8_voltage\x18\x0f \x01(\x02\x42\x02\x18\x01H\x0e\x88\x01\x01\x12\x1c\n\x0b\x63h8_current\x18\x10 \x01(\x02\x42\x02\x18\x01H\x0f\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_currentB\x0e\n\x0c_ch4_voltageB\x0e\n\x0c_ch4_currentB\x0e\n\x0c_ch5_voltageB\x0e\n\x0c_ch5_currentB\x0e\n\x0c_ch6_voltageB\x0e\n\x0c_ch6_currentB\x0e\n\x0c_ch7_voltageB\x0e\n\x0c_ch7_currentB\x0e\n\x0c_ch8_voltageB\x0e\n\x0c_ch8_current\"\xe3\t\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\x12\x1c\n\x0f\x63o2_temperature\x18\x0e \x01(\x02H\r\x88\x01\x01\x12\x19\n\x0c\x63o2_humidity\x18\x0f \x01(\x02H\x0e\x88\x01\x01\x12\x1e\n\x11\x66orm_formaldehyde\x18\x10 \x01(\x02H\x0f\x88\x01\x01\x12\x1a\n\rform_humidity\x18\x11 \x01(\x02H\x10\x88\x01\x01\x12\x1d\n\x10\x66orm_temperature\x18\x12 \x01(\x02H\x11\x88\x01\x01\x12\x1a\n\rpm40_standard\x18\x13 \x01(\rH\x12\x88\x01\x01\x12\x1b\n\x0eparticles_40um\x18\x14 \x01(\rH\x13\x88\x01\x01\x12\x1b\n\x0epm_temperature\x18\x15 \x01(\x02H\x14\x88\x01\x01\x12\x18\n\x0bpm_humidity\x18\x16 \x01(\x02H\x15\x88\x01\x01\x12\x17\n\npm_voc_idx\x18\x17 \x01(\x02H\x16\x88\x01\x01\x12\x17\n\npm_nox_idx\x18\x18 \x01(\x02H\x17\x88\x01\x01\x12\x1a\n\rparticles_tps\x18\x19 \x01(\x02H\x18\x88\x01\x01\x12\x1c\n\x0fpm_status_flags\x18\x1a \x01(\rH\x19\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_co2B\x12\n\x10_co2_temperatureB\x0f\n\r_co2_humidityB\x14\n\x12_form_formaldehydeB\x10\n\x0e_form_humidityB\x13\n\x11_form_temperatureB\x10\n\x0e_pm40_standardB\x11\n\x0f_particles_40umB\x11\n\x0f_pm_temperatureB\x0e\n\x0c_pm_humidityB\r\n\x0b_pm_voc_idxB\r\n\x0b_pm_nox_idxB\x10\n\x0e_particles_tpsB\x12\n\x10_pm_status_flags\"\x94\x03\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\x1f\n\x10num_online_nodes\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x1e\n\x0fnum_total_nodes\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\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\x12\x1d\n\x0enum_tx_dropped\x18\x0e \x01(\rB\x05\x92?\x02\x38\x10\x12\x13\n\x0bnoise_floor\x18\x0f \x01(\x05\"\xe4\x01\n\x16TrafficManagementStats\x12\x19\n\x11packets_inspected\x18\x01 \x01(\r\x12\x1c\n\x14position_dedup_drops\x18\x02 \x01(\r\x12\x1b\n\x13nodeinfo_cache_hits\x18\x03 \x01(\r\x12\x18\n\x10rate_limit_drops\x18\x04 \x01(\r\x12\x1c\n\x14unknown_packet_drops\x18\x05 \x01(\r\x12\x1d\n\x15hop_exhausted_packets\x18\x06 \x01(\r\x12\x1d\n\x15router_hops_preserved\x18\x07 \x01(\r\"\x89\x01\n\rHealthMetrics\x12\x1d\n\theart_bpm\x18\x01 \x01(\rB\x05\x92?\x02\x38\x08H\x00\x88\x01\x01\x12\x18\n\x04spO2\x18\x02 \x01(\rB\x05\x92?\x02\x38\x08H\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\"\xae\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\x14\n\x05load1\x18\x06 \x01(\rB\x05\x92?\x02\x38\x10\x12\x14\n\x05load5\x18\x07 \x01(\rB\x05\x92?\x02\x38\x10\x12\x15\n\x06load15\x18\x08 \x01(\rB\x05\x92?\x02\x38\x10\x12 \n\x0buser_string\x18\t \x01(\tB\x06\x92?\x03\x08\xa1\x01H\x02\x88\x01\x01\x42\x12\n\x10_diskfree2_bytesB\x12\n\x10_diskfree3_bytesB\x0e\n\x0c_user_string\"\xf3\x04\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\x12O\n\x18traffic_management_stats\x18\t \x01(\x0b\x32+.meshtastic.protobuf.TrafficManagementStatsH\x00\x12\x43\n\x12soil_water_metrics\x18\x0b \x01(\x0b\x32%.meshtastic.protobuf.SoilWaterMetricsH\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\"$\n\x0b\x41S3935State\x12\x15\n\rtuning_cap_pf\x18\x01 \x01(\r\"\xf0\x01\n\nSEN5XState\x12\x1a\n\x12last_cleaning_time\x18\x01 \x01(\r\x12\x1b\n\x13last_cleaning_valid\x18\x02 \x01(\x08\x12\x15\n\rone_shot_mode\x18\x03 \x01(\x08\x12\x1b\n\x0evoc_state_time\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x0fvoc_state_valid\x18\x05 \x01(\x08H\x01\x88\x01\x01\x12\x1c\n\x0fvoc_state_array\x18\x06 \x01(\x06H\x02\x88\x01\x01\x42\x11\n\x0f_voc_state_timeB\x12\n\x10_voc_state_validB\x12\n\x10_voc_state_array\"\xf0\x01\n\nSEN6XState\x12\x1a\n\x12last_cleaning_time\x18\x01 \x01(\r\x12\x1b\n\x13last_cleaning_valid\x18\x02 \x01(\x08\x12\x15\n\rone_shot_mode\x18\x03 \x01(\x08\x12\x1b\n\x0evoc_state_time\x18\x04 \x01(\rH\x00\x88\x01\x01\x12\x1c\n\x0fvoc_state_valid\x18\x05 \x01(\x08H\x01\x88\x01\x01\x12\x1c\n\x0fvoc_state_array\x18\x06 \x01(\x06H\x02\x88\x01\x01\x42\x11\n\x0f_voc_state_timeB\x12\n\x10_voc_state_validB\x12\n\x10_voc_state_array*\x9a\x06\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\r\n\x05SHTC3\x10\x07\x1a\x02\x08\x01\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\r\n\x05SHT31\x10\x0c\x1a\x02\x08\x01\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\r\n\x05SHT4X\x10\x11\x1a\x02\x08\x01\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\'\x12\x0b\n\x07\x41\x44S1X15\x10(\x12\x0f\n\x0b\x41\x44S1X15_ALT\x10)\x12\t\n\x05SFA30\x10*\x12\t\n\x05SEN5X\x10+\x12\x0b\n\x07TSL2561\x10,\x12\n\n\x06\x42H1750\x10-\x12\x0b\n\x07HDC1080\x10.\x12\r\n\x05SHT21\x10/\x1a\x02\x08\x01\x12\t\n\x05STC31\x10\x30\x12\t\n\x05SCD30\x10\x31\x12\t\n\x05SHTXX\x10\x32\x12\n\n\x06\x44S248X\x10\x33\x12\r\n\tMMC5983MA\x10\x34\x12\r\n\tICM42607P\x10\x35\x12\t\n\x05SPA06\x10\x36\x12\n\n\x06HM330X\x10\x37\x12\t\n\x05SEN6X\x10\x38\x12\n\n\x06\x41S3935\x10\x39\x42\x65\n\x14org.meshtastic.protoB\x0fTelemetryProtosZ\"github.com/meshtastic/go/generated\xaa\x02\x14Meshtastic.Protobufs\xba\x02\x00\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -22,6 +22,14 @@ if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None DESCRIPTOR._serialized_options = b'\n\024org.meshtastic.protoB\017TelemetryProtosZ\"github.com/meshtastic/go/generated\252\002\024Meshtastic.Protobufs\272\002\000' + _TELEMETRYSENSORTYPE.values_by_name["SHTC3"]._options = None + _TELEMETRYSENSORTYPE.values_by_name["SHTC3"]._serialized_options = b'\010\001' + _TELEMETRYSENSORTYPE.values_by_name["SHT31"]._options = None + _TELEMETRYSENSORTYPE.values_by_name["SHT31"]._serialized_options = b'\010\001' + _TELEMETRYSENSORTYPE.values_by_name["SHT4X"]._options = None + _TELEMETRYSENSORTYPE.values_by_name["SHT4X"]._serialized_options = b'\010\001' + _TELEMETRYSENSORTYPE.values_by_name["SHT21"]._options = None + _TELEMETRYSENSORTYPE.values_by_name["SHT21"]._serialized_options = b'\010\001' _ENVIRONMENTMETRICS.fields_by_name['iaq']._options = None _ENVIRONMENTMETRICS.fields_by_name['iaq']._serialized_options = b'\222?\0028\020' _ENVIRONMENTMETRICS.fields_by_name['wind_direction']._options = None @@ -29,7 +37,27 @@ _ENVIRONMENTMETRICS.fields_by_name['soil_moisture']._options = None _ENVIRONMENTMETRICS.fields_by_name['soil_moisture']._serialized_options = b'\222?\0028\010' _ENVIRONMENTMETRICS.fields_by_name['one_wire_temperature']._options = None - _ENVIRONMENTMETRICS.fields_by_name['one_wire_temperature']._serialized_options = b'\222?\002\020\010' + _ENVIRONMENTMETRICS.fields_by_name['one_wire_temperature']._serialized_options = b'\030\001\222?\002\030\003' + _POWERMETRICS.fields_by_name['ch4_voltage']._options = None + _POWERMETRICS.fields_by_name['ch4_voltage']._serialized_options = b'\030\001' + _POWERMETRICS.fields_by_name['ch4_current']._options = None + _POWERMETRICS.fields_by_name['ch4_current']._serialized_options = b'\030\001' + _POWERMETRICS.fields_by_name['ch5_voltage']._options = None + _POWERMETRICS.fields_by_name['ch5_voltage']._serialized_options = b'\030\001' + _POWERMETRICS.fields_by_name['ch5_current']._options = None + _POWERMETRICS.fields_by_name['ch5_current']._serialized_options = b'\030\001' + _POWERMETRICS.fields_by_name['ch6_voltage']._options = None + _POWERMETRICS.fields_by_name['ch6_voltage']._serialized_options = b'\030\001' + _POWERMETRICS.fields_by_name['ch6_current']._options = None + _POWERMETRICS.fields_by_name['ch6_current']._serialized_options = b'\030\001' + _POWERMETRICS.fields_by_name['ch7_voltage']._options = None + _POWERMETRICS.fields_by_name['ch7_voltage']._serialized_options = b'\030\001' + _POWERMETRICS.fields_by_name['ch7_current']._options = None + _POWERMETRICS.fields_by_name['ch7_current']._serialized_options = b'\030\001' + _POWERMETRICS.fields_by_name['ch8_voltage']._options = None + _POWERMETRICS.fields_by_name['ch8_voltage']._serialized_options = b'\030\001' + _POWERMETRICS.fields_by_name['ch8_current']._options = None + _POWERMETRICS.fields_by_name['ch8_current']._serialized_options = b'\030\001' _LOCALSTATS.fields_by_name['num_online_nodes']._options = None _LOCALSTATS.fields_by_name['num_online_nodes']._serialized_options = b'\222?\0028\020' _LOCALSTATS.fields_by_name['num_total_nodes']._options = None @@ -47,29 +75,35 @@ _HOSTMETRICS.fields_by_name['load15']._options = None _HOSTMETRICS.fields_by_name['load15']._serialized_options = b'\222?\0028\020' _HOSTMETRICS.fields_by_name['user_string']._options = None - _HOSTMETRICS.fields_by_name['user_string']._serialized_options = b'\222?\003\010\310\001' - _globals['_TELEMETRYSENSORTYPE']._serialized_start=5144 - _globals['_TELEMETRYSENSORTYPE']._serialized_end=5876 + _HOSTMETRICS.fields_by_name['user_string']._serialized_options = b'\222?\003\010\241\001' + _globals['_TELEMETRYSENSORTYPE']._serialized_start=7538 + _globals['_TELEMETRYSENSORTYPE']._serialized_end=8332 _globals['_DEVICEMETRICS']._serialized_start=95 _globals['_DEVICEMETRICS']._serialized_end=338 _globals['_ENVIRONMENTMETRICS']._serialized_start=341 - _globals['_ENVIRONMENTMETRICS']._serialized_end=1297 - _globals['_POWERMETRICS']._serialized_start=1300 - _globals['_POWERMETRICS']._serialized_end=1986 - _globals['_AIRQUALITYMETRICS']._serialized_start=1989 - _globals['_AIRQUALITYMETRICS']._serialized_end=3190 - _globals['_LOCALSTATS']._serialized_start=3193 - _globals['_LOCALSTATS']._serialized_end=3597 - _globals['_TRAFFICMANAGEMENTSTATS']._serialized_start=3600 - _globals['_TRAFFICMANAGEMENTSTATS']._serialized_end=3828 - _globals['_HEALTHMETRICS']._serialized_start=3831 - _globals['_HEALTHMETRICS']._serialized_end=3968 - _globals['_HOSTMETRICS']._serialized_start=3971 - _globals['_HOSTMETRICS']._serialized_end=4273 - _globals['_TELEMETRY']._serialized_start=4276 - _globals['_TELEMETRY']._serialized_end=4834 - _globals['_NAU7802CONFIG']._serialized_start=4836 - _globals['_NAU7802CONFIG']._serialized_end=4898 - _globals['_SEN5XSTATE']._serialized_start=4901 - _globals['_SEN5XSTATE']._serialized_end=5141 + _globals['_ENVIRONMENTMETRICS']._serialized_end=2584 + _globals['_SOILWATERMETRICS']._serialized_start=2587 + _globals['_SOILWATERMETRICS']._serialized_end=3251 + _globals['_POWERMETRICS']._serialized_start=3254 + _globals['_POWERMETRICS']._serialized_end=3980 + _globals['_AIRQUALITYMETRICS']._serialized_start=3983 + _globals['_AIRQUALITYMETRICS']._serialized_end=5234 + _globals['_LOCALSTATS']._serialized_start=5237 + _globals['_LOCALSTATS']._serialized_end=5641 + _globals['_TRAFFICMANAGEMENTSTATS']._serialized_start=5644 + _globals['_TRAFFICMANAGEMENTSTATS']._serialized_end=5872 + _globals['_HEALTHMETRICS']._serialized_start=5875 + _globals['_HEALTHMETRICS']._serialized_end=6012 + _globals['_HOSTMETRICS']._serialized_start=6015 + _globals['_HOSTMETRICS']._serialized_end=6317 + _globals['_TELEMETRY']._serialized_start=6320 + _globals['_TELEMETRY']._serialized_end=6947 + _globals['_NAU7802CONFIG']._serialized_start=6949 + _globals['_NAU7802CONFIG']._serialized_end=7011 + _globals['_AS3935STATE']._serialized_start=7013 + _globals['_AS3935STATE']._serialized_end=7049 + _globals['_SEN5XSTATE']._serialized_start=7052 + _globals['_SEN5XSTATE']._serialized_end=7292 + _globals['_SEN6XSTATE']._serialized_start=7295 + _globals['_SEN6XSTATE']._serialized_end=7535 # @@protoc_insertion_point(module_scope) diff --git a/meshtastic/protobuf/telemetry_pb2.pyi b/meshtastic/protobuf/telemetry_pb2.pyi index 13a44fba5..f78242e80 100644 --- a/meshtastic/protobuf/telemetry_pb2.pyi +++ b/meshtastic/protobuf/telemetry_pb2.pyi @@ -239,7 +239,23 @@ class _TelemetrySensorTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wra """ ICM42607P: _TelemetrySensorType.ValueType # 53 """ - ICM-42607-P 6‑Axis IMU + ICM-42607-P 6-Axis IMU + """ + SPA06: _TelemetrySensorType.ValueType # 54 + """ + SPA06 pressure and temperature + """ + HM330X: _TelemetrySensorType.ValueType # 55 + """ + HM330X PM SENSOR + """ + SEN6X: _TelemetrySensorType.ValueType # 56 + """ + Sensirion SEN6X PM/RHT/VOC/NOx/CO2/HCHO sensor family (SEN62, SEN63C, SEN65, SEN66, SEN68, SEN69C) + """ + AS3935: _TelemetrySensorType.ValueType # 57 + """ + AS3935 Franklin lightning sensor """ class TelemetrySensorType(_TelemetrySensorType, metaclass=_TelemetrySensorTypeEnumTypeWrapper): @@ -461,7 +477,23 @@ MMC5983MA 3-Axis Digital Magnetic Sensor """ ICM42607P: TelemetrySensorType.ValueType # 53 """ -ICM-42607-P 6‑Axis IMU +ICM-42607-P 6-Axis IMU +""" +SPA06: TelemetrySensorType.ValueType # 54 +""" +SPA06 pressure and temperature +""" +HM330X: TelemetrySensorType.ValueType # 55 +""" +HM330X PM SENSOR +""" +SEN6X: TelemetrySensorType.ValueType # 56 +""" +Sensirion SEN6X PM/RHT/VOC/NOx/CO2/HCHO sensor family (SEN62, SEN63C, SEN65, SEN66, SEN68, SEN69C) +""" +AS3935: TelemetrySensorType.ValueType # 57 +""" +AS3935 Franklin lightning sensor """ global___TelemetrySensorType = TelemetrySensorType @@ -553,6 +585,24 @@ class EnvironmentMetrics(google.protobuf.message.Message): SOIL_MOISTURE_FIELD_NUMBER: builtins.int SOIL_TEMPERATURE_FIELD_NUMBER: builtins.int ONE_WIRE_TEMPERATURE_FIELD_NUMBER: builtins.int + ADC_VOLTAGE_CH0_FIELD_NUMBER: builtins.int + ADC_VOLTAGE_CH1_FIELD_NUMBER: builtins.int + ADC_VOLTAGE_CH2_FIELD_NUMBER: builtins.int + ADC_VOLTAGE_CH3_FIELD_NUMBER: builtins.int + ADC_VOLTAGE_CH4_FIELD_NUMBER: builtins.int + ADC_VOLTAGE_CH5_FIELD_NUMBER: builtins.int + ADC_VOLTAGE_CH6_FIELD_NUMBER: builtins.int + ADC_VOLTAGE_CH7_FIELD_NUMBER: builtins.int + ONE_WIRE_TEMPERATURE_CH0_FIELD_NUMBER: builtins.int + ONE_WIRE_TEMPERATURE_CH1_FIELD_NUMBER: builtins.int + ONE_WIRE_TEMPERATURE_CH2_FIELD_NUMBER: builtins.int + ONE_WIRE_TEMPERATURE_CH3_FIELD_NUMBER: builtins.int + ONE_WIRE_TEMPERATURE_CH4_FIELD_NUMBER: builtins.int + ONE_WIRE_TEMPERATURE_CH5_FIELD_NUMBER: builtins.int + ONE_WIRE_TEMPERATURE_CH6_FIELD_NUMBER: builtins.int + ONE_WIRE_TEMPERATURE_CH7_FIELD_NUMBER: builtins.int + LIGHTNING_STRIKE_COUNT_1H_FIELD_NUMBER: builtins.int + LIGHTNING_DISTANCE_KM_FIELD_NUMBER: builtins.int temperature: builtins.float """ Temperature measured @@ -643,10 +693,82 @@ class EnvironmentMetrics(google.protobuf.message.Message): """ Soil temperature measured (*C) """ + adc_voltage_ch0: builtins.float + """ + Multi-channel ADC Voltage Channel 0 (V) + """ + adc_voltage_ch1: builtins.float + """ + Multi-channel ADC Voltage Channel 1 (V) + """ + adc_voltage_ch2: builtins.float + """ + Multi-channel ADC Voltage Channel 2 (V) + """ + adc_voltage_ch3: builtins.float + """ + Multi-channel ADC Voltage Channel 3 (V) + """ + adc_voltage_ch4: builtins.float + """ + Multi-channel ADC Voltage Channel 4 (V) + """ + adc_voltage_ch5: builtins.float + """ + Multi-channel ADC Voltage Channel 5 (V) + """ + adc_voltage_ch6: builtins.float + """ + Multi-channel ADC Voltage Channel 6 (V) + """ + adc_voltage_ch7: builtins.float + """ + Multi-channel ADC Voltage Channel 7 (V) + """ + one_wire_temperature_ch0: builtins.float + """ + Multi-channel One-Wire Temperature Channel 0 (*C) + """ + one_wire_temperature_ch1: builtins.float + """ + Multi-channel One-Wire Temperature Channel 1 (*C) + """ + one_wire_temperature_ch2: builtins.float + """ + Multi-channel One-Wire Temperature Channel 2 (*C) + """ + one_wire_temperature_ch3: builtins.float + """ + Multi-channel One-Wire Temperature Channel 3 (*C) + """ + one_wire_temperature_ch4: builtins.float + """ + Multi-channel One-Wire Temperature Channel 4 (*C) + """ + one_wire_temperature_ch5: builtins.float + """ + Multi-channel One-Wire Temperature Channel 5 (*C) + """ + one_wire_temperature_ch6: builtins.float + """ + Multi-channel One-Wire Temperature Channel 6 (*C) + """ + one_wire_temperature_ch7: builtins.float + """ + Multi-channel One-Wire Temperature Channel 7 (*C) + """ + lightning_strike_count_1h: builtins.int + """ + Lightning strikes detected in the last hour + """ + lightning_distance_km: builtins.float + """ + Estimated distance to the leading edge of the storm, in km + """ @property def one_wire_temperature(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.float]: """ - One-wire temperature (*C) + Never implemented, but Voltage may be mis-interpreted by old clients as temperature """ def __init__( @@ -675,9 +797,43 @@ class EnvironmentMetrics(google.protobuf.message.Message): soil_moisture: builtins.int | None = ..., soil_temperature: builtins.float | None = ..., one_wire_temperature: collections.abc.Iterable[builtins.float] | None = ..., + adc_voltage_ch0: builtins.float | None = ..., + adc_voltage_ch1: builtins.float | None = ..., + adc_voltage_ch2: builtins.float | None = ..., + adc_voltage_ch3: builtins.float | None = ..., + adc_voltage_ch4: builtins.float | None = ..., + adc_voltage_ch5: builtins.float | None = ..., + adc_voltage_ch6: builtins.float | None = ..., + adc_voltage_ch7: builtins.float | None = ..., + one_wire_temperature_ch0: builtins.float | None = ..., + one_wire_temperature_ch1: builtins.float | None = ..., + one_wire_temperature_ch2: builtins.float | None = ..., + one_wire_temperature_ch3: builtins.float | None = ..., + one_wire_temperature_ch4: builtins.float | None = ..., + one_wire_temperature_ch5: builtins.float | None = ..., + one_wire_temperature_ch6: builtins.float | None = ..., + one_wire_temperature_ch7: builtins.float | None = ..., + lightning_strike_count_1h: builtins.int | None = ..., + lightning_distance_km: 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", "_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", "one_wire_temperature", b"one_wire_temperature", "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: ... + def HasField(self, field_name: typing.Literal["_adc_voltage_ch0", b"_adc_voltage_ch0", "_adc_voltage_ch1", b"_adc_voltage_ch1", "_adc_voltage_ch2", b"_adc_voltage_ch2", "_adc_voltage_ch3", b"_adc_voltage_ch3", "_adc_voltage_ch4", b"_adc_voltage_ch4", "_adc_voltage_ch5", b"_adc_voltage_ch5", "_adc_voltage_ch6", b"_adc_voltage_ch6", "_adc_voltage_ch7", b"_adc_voltage_ch7", "_barometric_pressure", b"_barometric_pressure", "_current", b"_current", "_distance", b"_distance", "_gas_resistance", b"_gas_resistance", "_iaq", b"_iaq", "_ir_lux", b"_ir_lux", "_lightning_distance_km", b"_lightning_distance_km", "_lightning_strike_count_1h", b"_lightning_strike_count_1h", "_lux", b"_lux", "_one_wire_temperature_ch0", b"_one_wire_temperature_ch0", "_one_wire_temperature_ch1", b"_one_wire_temperature_ch1", "_one_wire_temperature_ch2", b"_one_wire_temperature_ch2", "_one_wire_temperature_ch3", b"_one_wire_temperature_ch3", "_one_wire_temperature_ch4", b"_one_wire_temperature_ch4", "_one_wire_temperature_ch5", b"_one_wire_temperature_ch5", "_one_wire_temperature_ch6", b"_one_wire_temperature_ch6", "_one_wire_temperature_ch7", b"_one_wire_temperature_ch7", "_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", "adc_voltage_ch0", b"adc_voltage_ch0", "adc_voltage_ch1", b"adc_voltage_ch1", "adc_voltage_ch2", b"adc_voltage_ch2", "adc_voltage_ch3", b"adc_voltage_ch3", "adc_voltage_ch4", b"adc_voltage_ch4", "adc_voltage_ch5", b"adc_voltage_ch5", "adc_voltage_ch6", b"adc_voltage_ch6", "adc_voltage_ch7", b"adc_voltage_ch7", "barometric_pressure", b"barometric_pressure", "current", b"current", "distance", b"distance", "gas_resistance", b"gas_resistance", "iaq", b"iaq", "ir_lux", b"ir_lux", "lightning_distance_km", b"lightning_distance_km", "lightning_strike_count_1h", b"lightning_strike_count_1h", "lux", b"lux", "one_wire_temperature_ch0", b"one_wire_temperature_ch0", "one_wire_temperature_ch1", b"one_wire_temperature_ch1", "one_wire_temperature_ch2", b"one_wire_temperature_ch2", "one_wire_temperature_ch3", b"one_wire_temperature_ch3", "one_wire_temperature_ch4", b"one_wire_temperature_ch4", "one_wire_temperature_ch5", b"one_wire_temperature_ch5", "one_wire_temperature_ch6", b"one_wire_temperature_ch6", "one_wire_temperature_ch7", b"one_wire_temperature_ch7", "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["_adc_voltage_ch0", b"_adc_voltage_ch0", "_adc_voltage_ch1", b"_adc_voltage_ch1", "_adc_voltage_ch2", b"_adc_voltage_ch2", "_adc_voltage_ch3", b"_adc_voltage_ch3", "_adc_voltage_ch4", b"_adc_voltage_ch4", "_adc_voltage_ch5", b"_adc_voltage_ch5", "_adc_voltage_ch6", b"_adc_voltage_ch6", "_adc_voltage_ch7", b"_adc_voltage_ch7", "_barometric_pressure", b"_barometric_pressure", "_current", b"_current", "_distance", b"_distance", "_gas_resistance", b"_gas_resistance", "_iaq", b"_iaq", "_ir_lux", b"_ir_lux", "_lightning_distance_km", b"_lightning_distance_km", "_lightning_strike_count_1h", b"_lightning_strike_count_1h", "_lux", b"_lux", "_one_wire_temperature_ch0", b"_one_wire_temperature_ch0", "_one_wire_temperature_ch1", b"_one_wire_temperature_ch1", "_one_wire_temperature_ch2", b"_one_wire_temperature_ch2", "_one_wire_temperature_ch3", b"_one_wire_temperature_ch3", "_one_wire_temperature_ch4", b"_one_wire_temperature_ch4", "_one_wire_temperature_ch5", b"_one_wire_temperature_ch5", "_one_wire_temperature_ch6", b"_one_wire_temperature_ch6", "_one_wire_temperature_ch7", b"_one_wire_temperature_ch7", "_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", "adc_voltage_ch0", b"adc_voltage_ch0", "adc_voltage_ch1", b"adc_voltage_ch1", "adc_voltage_ch2", b"adc_voltage_ch2", "adc_voltage_ch3", b"adc_voltage_ch3", "adc_voltage_ch4", b"adc_voltage_ch4", "adc_voltage_ch5", b"adc_voltage_ch5", "adc_voltage_ch6", b"adc_voltage_ch6", "adc_voltage_ch7", b"adc_voltage_ch7", "barometric_pressure", b"barometric_pressure", "current", b"current", "distance", b"distance", "gas_resistance", b"gas_resistance", "iaq", b"iaq", "ir_lux", b"ir_lux", "lightning_distance_km", b"lightning_distance_km", "lightning_strike_count_1h", b"lightning_strike_count_1h", "lux", b"lux", "one_wire_temperature", b"one_wire_temperature", "one_wire_temperature_ch0", b"one_wire_temperature_ch0", "one_wire_temperature_ch1", b"one_wire_temperature_ch1", "one_wire_temperature_ch2", b"one_wire_temperature_ch2", "one_wire_temperature_ch3", b"one_wire_temperature_ch3", "one_wire_temperature_ch4", b"one_wire_temperature_ch4", "one_wire_temperature_ch5", b"one_wire_temperature_ch5", "one_wire_temperature_ch6", b"one_wire_temperature_ch6", "one_wire_temperature_ch7", b"one_wire_temperature_ch7", "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["_adc_voltage_ch0", b"_adc_voltage_ch0"]) -> typing.Literal["adc_voltage_ch0"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_adc_voltage_ch1", b"_adc_voltage_ch1"]) -> typing.Literal["adc_voltage_ch1"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_adc_voltage_ch2", b"_adc_voltage_ch2"]) -> typing.Literal["adc_voltage_ch2"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_adc_voltage_ch3", b"_adc_voltage_ch3"]) -> typing.Literal["adc_voltage_ch3"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_adc_voltage_ch4", b"_adc_voltage_ch4"]) -> typing.Literal["adc_voltage_ch4"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_adc_voltage_ch5", b"_adc_voltage_ch5"]) -> typing.Literal["adc_voltage_ch5"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_adc_voltage_ch6", b"_adc_voltage_ch6"]) -> typing.Literal["adc_voltage_ch6"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_adc_voltage_ch7", b"_adc_voltage_ch7"]) -> typing.Literal["adc_voltage_ch7"] | None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_barometric_pressure", b"_barometric_pressure"]) -> typing.Literal["barometric_pressure"] | None: ... @typing.overload @@ -691,8 +847,28 @@ class EnvironmentMetrics(google.protobuf.message.Message): @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_ir_lux", b"_ir_lux"]) -> typing.Literal["ir_lux"] | None: ... @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_lightning_distance_km", b"_lightning_distance_km"]) -> typing.Literal["lightning_distance_km"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_lightning_strike_count_1h", b"_lightning_strike_count_1h"]) -> typing.Literal["lightning_strike_count_1h"] | None: ... + @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_lux", b"_lux"]) -> typing.Literal["lux"] | None: ... @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_one_wire_temperature_ch0", b"_one_wire_temperature_ch0"]) -> typing.Literal["one_wire_temperature_ch0"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_one_wire_temperature_ch1", b"_one_wire_temperature_ch1"]) -> typing.Literal["one_wire_temperature_ch1"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_one_wire_temperature_ch2", b"_one_wire_temperature_ch2"]) -> typing.Literal["one_wire_temperature_ch2"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_one_wire_temperature_ch3", b"_one_wire_temperature_ch3"]) -> typing.Literal["one_wire_temperature_ch3"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_one_wire_temperature_ch4", b"_one_wire_temperature_ch4"]) -> typing.Literal["one_wire_temperature_ch4"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_one_wire_temperature_ch5", b"_one_wire_temperature_ch5"]) -> typing.Literal["one_wire_temperature_ch5"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_one_wire_temperature_ch6", b"_one_wire_temperature_ch6"]) -> typing.Literal["one_wire_temperature_ch6"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_one_wire_temperature_ch7", b"_one_wire_temperature_ch7"]) -> typing.Literal["one_wire_temperature_ch7"] | None: ... + @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_radiation", b"_radiation"]) -> typing.Literal["radiation"] | None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_rainfall_1h", b"_rainfall_1h"]) -> typing.Literal["rainfall_1h"] | None: ... @@ -725,6 +901,147 @@ class EnvironmentMetrics(google.protobuf.message.Message): global___EnvironmentMetrics = EnvironmentMetrics +@typing.final +class SoilWaterMetrics(google.protobuf.message.Message): + """ + Soil and water probe metrics. + + Chemistry reported by soil probes (RS-485/SDI-12 NPK probes) and by + water-quality sondes. Split out of EnvironmentMetrics so that message stays + within the mesh payload budget. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SOIL_PH_FIELD_NUMBER: builtins.int + PH_FIELD_NUMBER: builtins.int + ELECTRICAL_CONDUCTIVITY_FIELD_NUMBER: builtins.int + SALINITY_FIELD_NUMBER: builtins.int + NITROGEN_FIELD_NUMBER: builtins.int + PHOSPHORUS_FIELD_NUMBER: builtins.int + POTASSIUM_FIELD_NUMBER: builtins.int + DISSOLVED_OXYGEN_FIELD_NUMBER: builtins.int + ORP_FIELD_NUMBER: builtins.int + CHEMICAL_OXYGEN_DEMAND_FIELD_NUMBER: builtins.int + TURBIDITY_FIELD_NUMBER: builtins.int + NITRATE_FIELD_NUMBER: builtins.int + AMMONIUM_FIELD_NUMBER: builtins.int + BIOCHEMICAL_OXYGEN_DEMAND_FIELD_NUMBER: builtins.int + SOLAR_IRRADIANCE_FIELD_NUMBER: builtins.int + soil_ph: builtins.float + """ + Soil pH, 0-14 + """ + ph: builtins.float + """ + pH of water or other solution, 0-14 + """ + electrical_conductivity: builtins.float + """ + Electrical conductivity in mS/cm + """ + salinity: builtins.float + """ + Salinity in mg/l + """ + nitrogen: builtins.float + """ + Nitrogen concentration in mg/kg + """ + phosphorus: builtins.float + """ + Phosphorus concentration in mg/kg + """ + potassium: builtins.float + """ + Potassium concentration in mg/kg + """ + dissolved_oxygen: builtins.float + """ + Dissolved oxygen in mg/l + """ + orp: builtins.float + """ + Oxidation-reduction potential (ORP) in mV + """ + chemical_oxygen_demand: builtins.float + """ + Chemical oxygen demand in mg/l + """ + turbidity: builtins.float + """ + Turbidity in NTU + """ + nitrate: builtins.float + """ + Nitrate concentration in ppm + """ + ammonium: builtins.float + """ + Ammonium concentration in ppm + """ + biochemical_oxygen_demand: builtins.float + """ + Biochemical oxygen demand in mg/l + """ + solar_irradiance: builtins.float + """ + Solar irradiance in W/m^2 (distinct from the radiation field's uR/h) + """ + def __init__( + self, + *, + soil_ph: builtins.float | None = ..., + ph: builtins.float | None = ..., + electrical_conductivity: builtins.float | None = ..., + salinity: builtins.float | None = ..., + nitrogen: builtins.float | None = ..., + phosphorus: builtins.float | None = ..., + potassium: builtins.float | None = ..., + dissolved_oxygen: builtins.float | None = ..., + orp: builtins.float | None = ..., + chemical_oxygen_demand: builtins.float | None = ..., + turbidity: builtins.float | None = ..., + nitrate: builtins.float | None = ..., + ammonium: builtins.float | None = ..., + biochemical_oxygen_demand: builtins.float | None = ..., + solar_irradiance: builtins.float | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["_ammonium", b"_ammonium", "_biochemical_oxygen_demand", b"_biochemical_oxygen_demand", "_chemical_oxygen_demand", b"_chemical_oxygen_demand", "_dissolved_oxygen", b"_dissolved_oxygen", "_electrical_conductivity", b"_electrical_conductivity", "_nitrate", b"_nitrate", "_nitrogen", b"_nitrogen", "_orp", b"_orp", "_ph", b"_ph", "_phosphorus", b"_phosphorus", "_potassium", b"_potassium", "_salinity", b"_salinity", "_soil_ph", b"_soil_ph", "_solar_irradiance", b"_solar_irradiance", "_turbidity", b"_turbidity", "ammonium", b"ammonium", "biochemical_oxygen_demand", b"biochemical_oxygen_demand", "chemical_oxygen_demand", b"chemical_oxygen_demand", "dissolved_oxygen", b"dissolved_oxygen", "electrical_conductivity", b"electrical_conductivity", "nitrate", b"nitrate", "nitrogen", b"nitrogen", "orp", b"orp", "ph", b"ph", "phosphorus", b"phosphorus", "potassium", b"potassium", "salinity", b"salinity", "soil_ph", b"soil_ph", "solar_irradiance", b"solar_irradiance", "turbidity", b"turbidity"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_ammonium", b"_ammonium", "_biochemical_oxygen_demand", b"_biochemical_oxygen_demand", "_chemical_oxygen_demand", b"_chemical_oxygen_demand", "_dissolved_oxygen", b"_dissolved_oxygen", "_electrical_conductivity", b"_electrical_conductivity", "_nitrate", b"_nitrate", "_nitrogen", b"_nitrogen", "_orp", b"_orp", "_ph", b"_ph", "_phosphorus", b"_phosphorus", "_potassium", b"_potassium", "_salinity", b"_salinity", "_soil_ph", b"_soil_ph", "_solar_irradiance", b"_solar_irradiance", "_turbidity", b"_turbidity", "ammonium", b"ammonium", "biochemical_oxygen_demand", b"biochemical_oxygen_demand", "chemical_oxygen_demand", b"chemical_oxygen_demand", "dissolved_oxygen", b"dissolved_oxygen", "electrical_conductivity", b"electrical_conductivity", "nitrate", b"nitrate", "nitrogen", b"nitrogen", "orp", b"orp", "ph", b"ph", "phosphorus", b"phosphorus", "potassium", b"potassium", "salinity", b"salinity", "soil_ph", b"soil_ph", "solar_irradiance", b"solar_irradiance", "turbidity", b"turbidity"]) -> None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_ammonium", b"_ammonium"]) -> typing.Literal["ammonium"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_biochemical_oxygen_demand", b"_biochemical_oxygen_demand"]) -> typing.Literal["biochemical_oxygen_demand"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_chemical_oxygen_demand", b"_chemical_oxygen_demand"]) -> typing.Literal["chemical_oxygen_demand"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_dissolved_oxygen", b"_dissolved_oxygen"]) -> typing.Literal["dissolved_oxygen"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_electrical_conductivity", b"_electrical_conductivity"]) -> typing.Literal["electrical_conductivity"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_nitrate", b"_nitrate"]) -> typing.Literal["nitrate"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_nitrogen", b"_nitrogen"]) -> typing.Literal["nitrogen"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_orp", b"_orp"]) -> typing.Literal["orp"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_ph", b"_ph"]) -> typing.Literal["ph"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_phosphorus", b"_phosphorus"]) -> typing.Literal["phosphorus"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_potassium", b"_potassium"]) -> typing.Literal["potassium"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_salinity", b"_salinity"]) -> typing.Literal["salinity"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_soil_ph", b"_soil_ph"]) -> typing.Literal["soil_ph"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_solar_irradiance", b"_solar_irradiance"]) -> typing.Literal["solar_irradiance"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_turbidity", b"_turbidity"]) -> typing.Literal["turbidity"] | None: ... + +global___SoilWaterMetrics = SoilWaterMetrics + @typing.final class PowerMetrics(google.protobuf.message.Message): """ @@ -775,43 +1092,43 @@ class PowerMetrics(google.protobuf.message.Message): """ ch4_voltage: builtins.float """ - Voltage (Ch4) + Voltage (Ch4) - TODO Remove """ ch4_current: builtins.float """ - Current (Ch4) + Current (Ch4) - TODO Remove """ ch5_voltage: builtins.float """ - Voltage (Ch5) + Voltage (Ch5) - TODO Remove """ ch5_current: builtins.float """ - Current (Ch5) + Current (Ch5) - TODO Remove """ ch6_voltage: builtins.float """ - Voltage (Ch6) + Voltage (Ch6) - TODO Remove """ ch6_current: builtins.float """ - Current (Ch6) + Current (Ch6) - TODO Remove """ ch7_voltage: builtins.float """ - Voltage (Ch7) + Voltage (Ch7) - TODO Remove """ ch7_current: builtins.float """ - Current (Ch7) + Current (Ch7) - TODO Remove """ ch8_voltage: builtins.float """ - Voltage (Ch8) + Voltage (Ch8) - TODO Remove """ ch8_current: builtins.float """ - Current (Ch8) + Current (Ch8) - TODO Remove """ def __init__( self, @@ -903,6 +1220,7 @@ class AirQualityMetrics(google.protobuf.message.Message): PM_VOC_IDX_FIELD_NUMBER: builtins.int PM_NOX_IDX_FIELD_NUMBER: builtins.int PARTICLES_TPS_FIELD_NUMBER: builtins.int + PM_STATUS_FLAGS_FIELD_NUMBER: builtins.int pm10_standard: builtins.int """ Concentration Units Standard PM1.0 in ug/m3 @@ -1003,6 +1321,13 @@ class AirQualityMetrics(google.protobuf.message.Message): """ Typical Particle Size in um """ + pm_status_flags: builtins.int + """ + Raw PM sensor device status/error register bitmask, as defined by the sensor's own datasheet + (currently populated by the SEN6X family: bit 4 fan error, bit 6 RH&T error, bit 7 gas/VOC-NOx + error, bit 9 CO2 error (SEN66), bit 10 HCHO error, bit 11 PM error, bit 12 CO2 error (SEN63C/SEN69C), + bit 21 fan speed warning) + """ def __init__( self, *, @@ -1031,9 +1356,10 @@ class AirQualityMetrics(google.protobuf.message.Message): pm_voc_idx: builtins.float | None = ..., pm_nox_idx: builtins.float | None = ..., particles_tps: builtins.float | None = ..., + pm_status_flags: builtins.int | None = ..., ) -> None: ... - def HasField(self, field_name: typing.Literal["_co2", b"_co2", "_co2_humidity", b"_co2_humidity", "_co2_temperature", b"_co2_temperature", "_form_formaldehyde", b"_form_formaldehyde", "_form_humidity", b"_form_humidity", "_form_temperature", b"_form_temperature", "_particles_03um", b"_particles_03um", "_particles_05um", b"_particles_05um", "_particles_100um", b"_particles_100um", "_particles_10um", b"_particles_10um", "_particles_25um", b"_particles_25um", "_particles_40um", b"_particles_40um", "_particles_50um", b"_particles_50um", "_particles_tps", b"_particles_tps", "_pm100_environmental", b"_pm100_environmental", "_pm100_standard", b"_pm100_standard", "_pm10_environmental", b"_pm10_environmental", "_pm10_standard", b"_pm10_standard", "_pm25_environmental", b"_pm25_environmental", "_pm25_standard", b"_pm25_standard", "_pm40_standard", b"_pm40_standard", "_pm_humidity", b"_pm_humidity", "_pm_nox_idx", b"_pm_nox_idx", "_pm_temperature", b"_pm_temperature", "_pm_voc_idx", b"_pm_voc_idx", "co2", b"co2", "co2_humidity", b"co2_humidity", "co2_temperature", b"co2_temperature", "form_formaldehyde", b"form_formaldehyde", "form_humidity", b"form_humidity", "form_temperature", b"form_temperature", "particles_03um", b"particles_03um", "particles_05um", b"particles_05um", "particles_100um", b"particles_100um", "particles_10um", b"particles_10um", "particles_25um", b"particles_25um", "particles_40um", b"particles_40um", "particles_50um", b"particles_50um", "particles_tps", b"particles_tps", "pm100_environmental", b"pm100_environmental", "pm100_standard", b"pm100_standard", "pm10_environmental", b"pm10_environmental", "pm10_standard", b"pm10_standard", "pm25_environmental", b"pm25_environmental", "pm25_standard", b"pm25_standard", "pm40_standard", b"pm40_standard", "pm_humidity", b"pm_humidity", "pm_nox_idx", b"pm_nox_idx", "pm_temperature", b"pm_temperature", "pm_voc_idx", b"pm_voc_idx"]) -> builtins.bool: ... - def ClearField(self, field_name: typing.Literal["_co2", b"_co2", "_co2_humidity", b"_co2_humidity", "_co2_temperature", b"_co2_temperature", "_form_formaldehyde", b"_form_formaldehyde", "_form_humidity", b"_form_humidity", "_form_temperature", b"_form_temperature", "_particles_03um", b"_particles_03um", "_particles_05um", b"_particles_05um", "_particles_100um", b"_particles_100um", "_particles_10um", b"_particles_10um", "_particles_25um", b"_particles_25um", "_particles_40um", b"_particles_40um", "_particles_50um", b"_particles_50um", "_particles_tps", b"_particles_tps", "_pm100_environmental", b"_pm100_environmental", "_pm100_standard", b"_pm100_standard", "_pm10_environmental", b"_pm10_environmental", "_pm10_standard", b"_pm10_standard", "_pm25_environmental", b"_pm25_environmental", "_pm25_standard", b"_pm25_standard", "_pm40_standard", b"_pm40_standard", "_pm_humidity", b"_pm_humidity", "_pm_nox_idx", b"_pm_nox_idx", "_pm_temperature", b"_pm_temperature", "_pm_voc_idx", b"_pm_voc_idx", "co2", b"co2", "co2_humidity", b"co2_humidity", "co2_temperature", b"co2_temperature", "form_formaldehyde", b"form_formaldehyde", "form_humidity", b"form_humidity", "form_temperature", b"form_temperature", "particles_03um", b"particles_03um", "particles_05um", b"particles_05um", "particles_100um", b"particles_100um", "particles_10um", b"particles_10um", "particles_25um", b"particles_25um", "particles_40um", b"particles_40um", "particles_50um", b"particles_50um", "particles_tps", b"particles_tps", "pm100_environmental", b"pm100_environmental", "pm100_standard", b"pm100_standard", "pm10_environmental", b"pm10_environmental", "pm10_standard", b"pm10_standard", "pm25_environmental", b"pm25_environmental", "pm25_standard", b"pm25_standard", "pm40_standard", b"pm40_standard", "pm_humidity", b"pm_humidity", "pm_nox_idx", b"pm_nox_idx", "pm_temperature", b"pm_temperature", "pm_voc_idx", b"pm_voc_idx"]) -> None: ... + def HasField(self, field_name: typing.Literal["_co2", b"_co2", "_co2_humidity", b"_co2_humidity", "_co2_temperature", b"_co2_temperature", "_form_formaldehyde", b"_form_formaldehyde", "_form_humidity", b"_form_humidity", "_form_temperature", b"_form_temperature", "_particles_03um", b"_particles_03um", "_particles_05um", b"_particles_05um", "_particles_100um", b"_particles_100um", "_particles_10um", b"_particles_10um", "_particles_25um", b"_particles_25um", "_particles_40um", b"_particles_40um", "_particles_50um", b"_particles_50um", "_particles_tps", b"_particles_tps", "_pm100_environmental", b"_pm100_environmental", "_pm100_standard", b"_pm100_standard", "_pm10_environmental", b"_pm10_environmental", "_pm10_standard", b"_pm10_standard", "_pm25_environmental", b"_pm25_environmental", "_pm25_standard", b"_pm25_standard", "_pm40_standard", b"_pm40_standard", "_pm_humidity", b"_pm_humidity", "_pm_nox_idx", b"_pm_nox_idx", "_pm_status_flags", b"_pm_status_flags", "_pm_temperature", b"_pm_temperature", "_pm_voc_idx", b"_pm_voc_idx", "co2", b"co2", "co2_humidity", b"co2_humidity", "co2_temperature", b"co2_temperature", "form_formaldehyde", b"form_formaldehyde", "form_humidity", b"form_humidity", "form_temperature", b"form_temperature", "particles_03um", b"particles_03um", "particles_05um", b"particles_05um", "particles_100um", b"particles_100um", "particles_10um", b"particles_10um", "particles_25um", b"particles_25um", "particles_40um", b"particles_40um", "particles_50um", b"particles_50um", "particles_tps", b"particles_tps", "pm100_environmental", b"pm100_environmental", "pm100_standard", b"pm100_standard", "pm10_environmental", b"pm10_environmental", "pm10_standard", b"pm10_standard", "pm25_environmental", b"pm25_environmental", "pm25_standard", b"pm25_standard", "pm40_standard", b"pm40_standard", "pm_humidity", b"pm_humidity", "pm_nox_idx", b"pm_nox_idx", "pm_status_flags", b"pm_status_flags", "pm_temperature", b"pm_temperature", "pm_voc_idx", b"pm_voc_idx"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_co2", b"_co2", "_co2_humidity", b"_co2_humidity", "_co2_temperature", b"_co2_temperature", "_form_formaldehyde", b"_form_formaldehyde", "_form_humidity", b"_form_humidity", "_form_temperature", b"_form_temperature", "_particles_03um", b"_particles_03um", "_particles_05um", b"_particles_05um", "_particles_100um", b"_particles_100um", "_particles_10um", b"_particles_10um", "_particles_25um", b"_particles_25um", "_particles_40um", b"_particles_40um", "_particles_50um", b"_particles_50um", "_particles_tps", b"_particles_tps", "_pm100_environmental", b"_pm100_environmental", "_pm100_standard", b"_pm100_standard", "_pm10_environmental", b"_pm10_environmental", "_pm10_standard", b"_pm10_standard", "_pm25_environmental", b"_pm25_environmental", "_pm25_standard", b"_pm25_standard", "_pm40_standard", b"_pm40_standard", "_pm_humidity", b"_pm_humidity", "_pm_nox_idx", b"_pm_nox_idx", "_pm_status_flags", b"_pm_status_flags", "_pm_temperature", b"_pm_temperature", "_pm_voc_idx", b"_pm_voc_idx", "co2", b"co2", "co2_humidity", b"co2_humidity", "co2_temperature", b"co2_temperature", "form_formaldehyde", b"form_formaldehyde", "form_humidity", b"form_humidity", "form_temperature", b"form_temperature", "particles_03um", b"particles_03um", "particles_05um", b"particles_05um", "particles_100um", b"particles_100um", "particles_10um", b"particles_10um", "particles_25um", b"particles_25um", "particles_40um", b"particles_40um", "particles_50um", b"particles_50um", "particles_tps", b"particles_tps", "pm100_environmental", b"pm100_environmental", "pm100_standard", b"pm100_standard", "pm10_environmental", b"pm10_environmental", "pm10_standard", b"pm10_standard", "pm25_environmental", b"pm25_environmental", "pm25_standard", b"pm25_standard", "pm40_standard", b"pm40_standard", "pm_humidity", b"pm_humidity", "pm_nox_idx", b"pm_nox_idx", "pm_status_flags", b"pm_status_flags", "pm_temperature", b"pm_temperature", "pm_voc_idx", b"pm_voc_idx"]) -> None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_co2", b"_co2"]) -> typing.Literal["co2"] | None: ... @typing.overload @@ -1081,6 +1407,8 @@ class AirQualityMetrics(google.protobuf.message.Message): @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_pm_nox_idx", b"_pm_nox_idx"]) -> typing.Literal["pm_nox_idx"] | None: ... @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_pm_status_flags", b"_pm_status_flags"]) -> typing.Literal["pm_status_flags"] | None: ... + @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_pm_temperature", b"_pm_temperature"]) -> typing.Literal["pm_temperature"] | None: ... @typing.overload def WhichOneof(self, oneof_group: typing.Literal["_pm_voc_idx", b"_pm_voc_idx"]) -> typing.Literal["pm_voc_idx"] | None: ... @@ -1389,6 +1717,7 @@ class Telemetry(google.protobuf.message.Message): HEALTH_METRICS_FIELD_NUMBER: builtins.int HOST_METRICS_FIELD_NUMBER: builtins.int TRAFFIC_MANAGEMENT_STATS_FIELD_NUMBER: builtins.int + SOIL_WATER_METRICS_FIELD_NUMBER: builtins.int time: builtins.int """ Seconds since 1970 - or 0 for unknown/unset @@ -1441,6 +1770,12 @@ class Telemetry(google.protobuf.message.Message): Traffic management statistics """ + @property + def soil_water_metrics(self) -> global___SoilWaterMetrics: + """ + Soil and water probe metrics + """ + def __init__( self, *, @@ -1453,10 +1788,11 @@ class Telemetry(google.protobuf.message.Message): health_metrics: global___HealthMetrics | None = ..., host_metrics: global___HostMetrics | None = ..., traffic_management_stats: global___TrafficManagementStats | None = ..., + soil_water_metrics: global___SoilWaterMetrics | 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", "host_metrics", b"host_metrics", "local_stats", b"local_stats", "power_metrics", b"power_metrics", "traffic_management_stats", b"traffic_management_stats", "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", "traffic_management_stats", b"traffic_management_stats", "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", "traffic_management_stats"] | 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", "soil_water_metrics", b"soil_water_metrics", "traffic_management_stats", b"traffic_management_stats", "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", "soil_water_metrics", b"soil_water_metrics", "time", b"time", "traffic_management_stats", b"traffic_management_stats", "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", "traffic_management_stats", "soil_water_metrics"] | None: ... global___Telemetry = Telemetry @@ -1488,10 +1824,33 @@ class Nau7802Config(google.protobuf.message.Message): global___Nau7802Config = Nau7802Config +@typing.final +class AS3935State(google.protobuf.message.Message): + """ + AS3935 lightning sensor state, for saving to flash + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TUNING_CAP_PF_FIELD_NUMBER: builtins.int + tuning_cap_pf: builtins.int + """ + Antenna tuning capacitance in pF, 0 to 120 in steps of 8. The chip does not retain + this across power loss, so it is stored here and re-applied on every boot. + """ + def __init__( + self, + *, + tuning_cap_pf: builtins.int = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["tuning_cap_pf", b"tuning_cap_pf"]) -> None: ... + +global___AS3935State = AS3935State + @typing.final class SEN5XState(google.protobuf.message.Message): """ - SEN5X State, for saving to flash + SEN5X State, for saving to flash (to be merged with SEN6XState) """ DESCRIPTOR: google.protobuf.descriptor.Descriptor @@ -1546,3 +1905,62 @@ class SEN5XState(google.protobuf.message.Message): def WhichOneof(self, oneof_group: typing.Literal["_voc_state_valid", b"_voc_state_valid"]) -> typing.Literal["voc_state_valid"] | None: ... global___SEN5XState = SEN5XState + +@typing.final +class SEN6XState(google.protobuf.message.Message): + """ + SEN6X State, for saving to flash + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LAST_CLEANING_TIME_FIELD_NUMBER: builtins.int + LAST_CLEANING_VALID_FIELD_NUMBER: builtins.int + ONE_SHOT_MODE_FIELD_NUMBER: builtins.int + VOC_STATE_TIME_FIELD_NUMBER: builtins.int + VOC_STATE_VALID_FIELD_NUMBER: builtins.int + VOC_STATE_ARRAY_FIELD_NUMBER: builtins.int + last_cleaning_time: builtins.int + """ + Last cleaning time for SEN6X + """ + last_cleaning_valid: builtins.bool + """ + Last cleaning time for SEN6X - valid flag + """ + one_shot_mode: builtins.bool + """ + Config flag for one-shot mode (see admin.proto) + """ + voc_state_time: builtins.int + """ + Last VOC state time, for models with a VOC sensor (SEN65, SEN66, SEN68, SEN69C) + """ + voc_state_valid: builtins.bool + """ + Last VOC state validity flag, for models with a VOC sensor (SEN65, SEN66, SEN68, SEN69C) + """ + voc_state_array: builtins.int + """ + VOC state array (8x uint8t), for models with a VOC sensor (SEN65, SEN66, SEN68, SEN69C) + """ + def __init__( + self, + *, + last_cleaning_time: builtins.int = ..., + last_cleaning_valid: builtins.bool = ..., + one_shot_mode: builtins.bool = ..., + voc_state_time: builtins.int | None = ..., + voc_state_valid: builtins.bool | None = ..., + voc_state_array: builtins.int | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["_voc_state_array", b"_voc_state_array", "_voc_state_time", b"_voc_state_time", "_voc_state_valid", b"_voc_state_valid", "voc_state_array", b"voc_state_array", "voc_state_time", b"voc_state_time", "voc_state_valid", b"voc_state_valid"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["_voc_state_array", b"_voc_state_array", "_voc_state_time", b"_voc_state_time", "_voc_state_valid", b"_voc_state_valid", "last_cleaning_time", b"last_cleaning_time", "last_cleaning_valid", b"last_cleaning_valid", "one_shot_mode", b"one_shot_mode", "voc_state_array", b"voc_state_array", "voc_state_time", b"voc_state_time", "voc_state_valid", b"voc_state_valid"]) -> None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_voc_state_array", b"_voc_state_array"]) -> typing.Literal["voc_state_array"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_voc_state_time", b"_voc_state_time"]) -> typing.Literal["voc_state_time"] | None: ... + @typing.overload + def WhichOneof(self, oneof_group: typing.Literal["_voc_state_valid", b"_voc_state_valid"]) -> typing.Literal["voc_state_valid"] | None: ... + +global___SEN6XState = SEN6XState diff --git a/meshtastic/tests/test_inject_nanopb_options.py b/meshtastic/tests/test_inject_nanopb_options.py index 852b72b3a..1174a7a26 100644 --- a/meshtastic/tests/test_inject_nanopb_options.py +++ b/meshtastic/tests/test_inject_nanopb_options.py @@ -20,7 +20,10 @@ from meshtastic.protobuf import ( atak_pb2, config_pb2, + field_metadata_pb2, + interdevice_pb2, mesh_pb2, + mqtt_pb2, nanopb_pb2, telemetry_pb2, ) @@ -468,6 +471,198 @@ def test_inject_multiple_options_on_one_field(): assert "(nanopb).int_size = IS_8" in result +# --------------------------------------------------------------------------- +# inject_into_proto — multi-line declarations (upstream field_metadata format) +# --------------------------------------------------------------------------- + + +@pytest.mark.unit +def test_inject_multiline_options_field(): + """A field with a multi-line options block gets nanopb options appended to + the existing block, collapsed onto one line, existing options preserved.""" + proto = """\ + syntax = "proto3"; + message NetworkConfig { + string wifi_ssid = 3 [(meshtastic.protobuf.field_metadata) = { + label: "SSID" + description: "WiFi network name to connect to" + }]; + } + """ + result = _inject(proto, specific={("NetworkConfig", "wifi_ssid"): {"max_size": 33}}) + assert ( + 'wifi_ssid = 3 [(meshtastic.protobuf.field_metadata) = { label: "SSID" ' + 'description: "WiFi network name to connect to" }, (nanopb).max_size = 33];' + ) in result + + +@pytest.mark.unit +def test_inject_multiline_field_without_options_left_unchanged(): + """A multi-line declaration with no applicable options keeps its original + multi-line formatting instead of being collapsed.""" + proto = """\ + syntax = "proto3"; + message Foo { + string plain = 1 [(meshtastic.protobuf.field_metadata) = { + label: "Plain" + }]; + } + """ + result = _inject(proto, specific={("Other", "plain"): {"max_size": 10}}) + assert "(nanopb)" not in result + assert 'string plain = 1 [(meshtastic.protobuf.field_metadata) = {' in result + assert 'label: "Plain"' in result + assert "}];" in result + + +@pytest.mark.unit +def test_inject_field_with_trailing_comment(): + """A declaration with a trailing // comment after the ';' still gets its + options, and the comment is preserved.""" + proto = """\ + syntax = "proto3"; + message CasevacReport { + uint32 epw = 12; // enemy prisoner of war + } + """ + result = _inject(proto, specific={("CasevacReport", "epw"): {"int_size": 8}}) + assert "uint32 epw = 12 [(nanopb).int_size = IS_8]; // enemy prisoner of war" in result + + +@pytest.mark.unit +def test_inject_multiline_field_with_trailing_comment(): + """A multi-line declaration terminated by '};' followed by a comment.""" + proto = """\ + syntax = "proto3"; + message DeviceConfig { + string tzdef = 11 [(meshtastic.protobuf.field_metadata) = { + label: "Time Zone" + }]; // POSIX timezone definition + } + """ + result = _inject(proto, specific={("DeviceConfig", "tzdef"): {"max_size": 65}}) + assert ( + 'string tzdef = 11 [(meshtastic.protobuf.field_metadata) = { label: "Time Zone" }, ' + "(nanopb).max_size = 65]; // POSIX timezone definition" + ) in result + + +@pytest.mark.unit +def test_inject_multiline_field_with_brackets_in_strings(): + """']' and ';' inside string values in a multi-line options block do not + terminate the declaration early.""" + proto = """\ + syntax = "proto3"; + message Foo { + string keywords = 1 [(meshtastic.protobuf.field_metadata) = { + keywords: "a]b;c" + description: "see [docs]; ok" + }]; + } + """ + result = _inject(proto, specific={("Foo", "keywords"): {"max_size": 32}}) + assert 'keywords: "a]b;c"' in result + assert "(nanopb).max_size = 32" in result + + +@pytest.mark.unit +def test_inject_multiline_enum_value_braces_do_not_corrupt_context(): + """Multi-line enum value declarations (including a lone '}' line inside + their options block) must not pop the message context: a later field in + the same message still gets its options (regression: DeviceConfig).""" + proto = """\ + syntax = "proto3"; + message DeviceConfig { + enum Role { + CLIENT = 0 [(meshtastic.protobuf.enum_value_metadata) = { + label: "Client" + }]; + REPEATER = 4 [ + deprecated = true, + (meshtastic.protobuf.enum_value_metadata) = { + label: "Repeater" + } + ]; + } + BuzzerMode buzzer_mode = 13 [(meshtastic.protobuf.field_metadata) = {since_firmware: "2.7.0"}]; + } + """ + result = _inject(proto, specific={("DeviceConfig", "buzzer_mode"): {"int_size": 8}}) + assert result.count("(nanopb)") == 1 + assert ( + 'buzzer_mode = 13 [(meshtastic.protobuf.field_metadata) = {since_firmware: "2.7.0"}, ' + "(nanopb).int_size = IS_8];" + ) in result + + +@pytest.mark.unit +def test_inject_multiline_field_close_does_not_pop_scope(): + """The '}];' closer of a multi-line field options block must not pop the + message context: later sibling messages still get their options + (regression: LoRaConfig options were skipped after DeviceConfig).""" + proto = """\ + syntax = "proto3"; + message Config { + message DeviceConfig { + string tzdef = 11 [(meshtastic.protobuf.field_metadata) = { + label: "Time Zone" + }]; + } + message LoRaConfig { + int32 tx_power = 10 [(meshtastic.protobuf.field_metadata) = { + label: "Transmit Power" + }]; + } + } + """ + result = _inject( + proto, + specific={ + ("DeviceConfig", "tzdef"): {"max_size": 65}, + ("LoRaConfig", "tx_power"): {"int_size": 8}, + }, + ) + assert result.count("(nanopb)") == 2 + assert "(nanopb).max_size = 65" in result + assert "(nanopb).int_size = IS_8" in result + + +@pytest.mark.unit +def test_inject_extend_block_braces_do_not_pop_scope(): + """A closing brace of an extend block must not pop the enclosing message + context: a later field of the same message still gets its options.""" + proto = """\ + syntax = "proto3"; + import "google/protobuf/descriptor.proto"; + message Outer { + string a = 1; + extend google.protobuf.FieldOptions { + optional Foo my_opt = 50001; + } + string b = 2; + } + """ + result = _inject(proto, specific={("Outer", "b"): {"max_size": 16}}) + assert "string b = 2 [(nanopb).max_size = 16];" in result + + +@pytest.mark.unit +def test_inject_option_line_not_treated_as_field(): + """An 'option name = number;' line is not a field declaration, even when a + wildcard pattern matches its name.""" + proto = """\ + syntax = "proto3"; + message Foo { + option my_setting = 5; + string my_setting = 1; + } + """ + result = _inject(proto, wildcard={"my_setting": {"max_size": 16}}) + assert result.count("(nanopb)") == 1 + assert "option my_setting = 5;" in result + assert "string my_setting = 1 [(nanopb).max_size = 16];" in result + + # --------------------------------------------------------------------------- # inject_into_proto — import insertion # --------------------------------------------------------------------------- @@ -640,7 +835,72 @@ def test_descriptor_multilevel_nested_route_link_uid(): @pytest.mark.unit def test_descriptor_telemetry_environment_one_wire_temperature(): - """EnvironmentMetrics.one_wire_temperature has max_count = 8 from telemetry.options.""" + """EnvironmentMetrics.one_wire_temperature has type = FT_IGNORE from telemetry.options.""" env = telemetry_pb2.DESCRIPTOR.message_types_by_name["EnvironmentMetrics"] opts = _field_opts(env, "one_wire_temperature") - assert opts.max_count == 8 + assert opts.type == nanopb_pb2.FT_IGNORE + + +@pytest.mark.unit +def test_descriptor_mqtt_service_envelope_pointer_fields(): + """ServiceEnvelope fields carry type = FT_POINTER from mqtt.options.""" + envelope = mqtt_pb2.DESCRIPTOR.message_types_by_name["ServiceEnvelope"] + for name in ("packet", "channel_id", "gateway_id"): + assert _field_opts(envelope, name).type == nanopb_pb2.FT_POINTER + + +@pytest.mark.unit +def test_descriptor_deviceconfig_tzdef_metadata_preserved(): + """tzdef keeps its nanopb max_size AND its field_metadata despite the + multi-line options block (regression: options were silently dropped).""" + config = config_pb2.DESCRIPTOR.message_types_by_name["Config"] + device = config.nested_types_by_name["DeviceConfig"] + opts = _field_opts(config, "DeviceConfig", "tzdef") + assert opts.max_size == 65 + meta = device.fields_by_name["tzdef"].GetOptions().Extensions[ + field_metadata_pb2.field_metadata + ] + assert meta.label == "Time Zone" + + +@pytest.mark.unit +def test_descriptor_deviceconfig_buzzer_mode(): + """buzzer_mode carries int_size = IS_8 and its since_firmware metadata + (regression: enum Role's multi-line values corrupted the context).""" + config = config_pb2.DESCRIPTOR.message_types_by_name["Config"] + device = config.nested_types_by_name["DeviceConfig"] + assert _field_opts(config, "DeviceConfig", "buzzer_mode").int_size == nanopb_pb2.IS_8 + meta = device.fields_by_name["buzzer_mode"].GetOptions().Extensions[ + field_metadata_pb2.field_metadata + ] + assert meta.since_firmware == "2.7.0" + + +@pytest.mark.unit +def test_descriptor_atak_casevacreport_epw(): + """epw, declared with a trailing // comment, still gets int_size = IS_8 + (regression: trailing comments stopped the fast path matching).""" + atak = atak_pb2.DESCRIPTOR.message_types_by_name["CasevacReport"] + assert _field_opts(atak, "epw").int_size == nanopb_pb2.IS_8 + + +@pytest.mark.unit +def test_descriptor_interdevice_trailing_comment_fields(): + """interdevice fields declared with trailing // comments keep their + nanopb constraints.""" + mod = interdevice_pb2.DESCRIPTOR.message_types_by_name + assert _field_opts(mod["FileTransfer"], "filepath").max_size == 256 + assert _field_opts(mod["FileTransfer"], "filedata").max_size == 4096 + assert _field_opts(mod["I2CTransaction"], "write_data").max_size == 256 + + +@pytest.mark.unit +def test_descriptor_enum_value_metadata_label(): + """Role.CLIENT carries its enum_value_metadata label through the whole + pipeline, proving the enum value metadata options resolve and embed.""" + config = config_pb2.DESCRIPTOR.message_types_by_name["Config"] + role = config.nested_types_by_name["DeviceConfig"].enum_types_by_name["Role"] + meta = role.values_by_name["CLIENT"].GetOptions().Extensions[ + field_metadata_pb2.enum_value_metadata + ] + assert meta.label == "Client" diff --git a/meshtastic/tests/test_mesh_interface_traffic_management.py b/meshtastic/tests/test_mesh_interface_traffic_management.py index f1aa4f9bb..c8bb907fc 100644 --- a/meshtastic/tests/test_mesh_interface_traffic_management.py +++ b/meshtastic/tests/test_mesh_interface_traffic_management.py @@ -12,11 +12,11 @@ def test_handleFromRadio_with_traffic_management_module_config(): """Test _handleFromRadio with moduleConfig.traffic_management.""" iface = MeshInterface(noProto=True) from_radio = mesh_pb2.FromRadio() - from_radio.moduleConfig.traffic_management.enabled = True - from_radio.moduleConfig.traffic_management.rate_limit_enabled = True + from_radio.moduleConfig.traffic_management.position_min_interval_secs = 30 + from_radio.moduleConfig.traffic_management.rate_limit_window_secs = 60 iface._handleFromRadio(from_radio.SerializeToString()) - assert iface.localNode.moduleConfig.traffic_management.enabled is True - assert iface.localNode.moduleConfig.traffic_management.rate_limit_enabled is True + assert iface.localNode.moduleConfig.traffic_management.position_min_interval_secs == 30 + assert iface.localNode.moduleConfig.traffic_management.rate_limit_window_secs == 60 iface.close() diff --git a/meshtastic/tests/test_node.py b/meshtastic/tests/test_node.py index 0c8d07d55..425350628 100644 --- a/meshtastic/tests/test_node.py +++ b/meshtastic/tests/test_node.py @@ -1153,8 +1153,8 @@ def test_writeConfig_traffic_management(): """Test writeConfig with traffic_management module config.""" iface = MagicMock(autospec=SerialInterface) anode = Node(iface, 123, noProto=True) - anode.moduleConfig.traffic_management.enabled = True - anode.moduleConfig.traffic_management.rate_limit_enabled = True + anode.moduleConfig.traffic_management.position_min_interval_secs = 30 + anode.moduleConfig.traffic_management.rate_limit_window_secs = 60 sent_admin = [] @@ -1167,8 +1167,8 @@ def capture_send(p, *args, **kwargs): # pylint: disable=W0613 assert len(sent_admin) == 1 assert sent_admin[0].HasField("set_module_config") assert sent_admin[0].set_module_config.HasField("traffic_management") - assert sent_admin[0].set_module_config.traffic_management.enabled is True - assert sent_admin[0].set_module_config.traffic_management.rate_limit_enabled is True + assert sent_admin[0].set_module_config.traffic_management.position_min_interval_secs == 30 + assert sent_admin[0].set_module_config.traffic_management.rate_limit_window_secs == 60 # TODO diff --git a/meshtastic/tests/test_util.py b/meshtastic/tests/test_util.py index db4701b79..830311a2e 100644 --- a/meshtastic/tests/test_util.py +++ b/meshtastic/tests/test_util.py @@ -896,8 +896,12 @@ def test_to_node_num_hypothesis_roundtrip(n): "DETECTIONSENSOR_CONFIG", "PAXCOUNTER_CONFIG", "BLUETOOTH_CONFIG", "NETWORK_CONFIG", ]), - (_EXCLUDED_MODULES, 0x8000, ["UNKNOWN_ADDITIONAL_FLAGS(32768)"]), - (_EXCLUDED_MODULES, 0x8001, ["MQTT_CONFIG", "UNKNOWN_ADDITIONAL_FLAGS(32768)"]), + (_EXCLUDED_MODULES, 0x8000, ["STATUSMESSAGE_CONFIG"]), + (_EXCLUDED_MODULES, 0x8001, ["MQTT_CONFIG", "STATUSMESSAGE_CONFIG"]), + # bit 27 is beyond every currently-defined ExcludedModules value, so it + # still exercises the unknown-remainder path + (_EXCLUDED_MODULES, 0x8000000, ["UNKNOWN_ADDITIONAL_FLAGS(134217728)"]), + (_EXCLUDED_MODULES, 0x8000001, ["MQTT_CONFIG", "UNKNOWN_ADDITIONAL_FLAGS(134217728)"]), (_POSITION_FLAGS, 0, []), (_POSITION_FLAGS, 0x09, ["ALTITUDE", "DOP"]), (_POSITION_FLAGS, 0x1FF, [ diff --git a/protobufs b/protobufs index da60cee58..8017acbb0 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit da60cee584c6dc1efbb4a3809b98666505179b85 +Subproject commit 8017acbb0828703e980323bee3dd605fb7366058